blob: 2e8d47ede494f919b4b4eaa1c0a3bf2eaac497ae [file]
import React from 'react';
import {PageMetadata} from '@docusaurus/theme-common';
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import {useContentRouteData} from '@site/src/utils/contentRoute';
export default function BlogPostPageMetadata(): JSX.Element {
const {assets, metadata} = useBlogPost();
const {title, description, date, tags, authors, frontMatter} = metadata;
const {
i18n: {currentLocale, defaultLocale},
siteConfig: {url},
} = useDocusaurusContext();
const page = useContentRouteData();
const {keywords} = frontMatter;
const image = assets.image ?? frontMatter.image;
// The blog plugin falls back per file: a post without a translated
// counterpart is the default locale's article. It keeps the localized URL,
// but the default locale's copy is the one worth ranking.
const isDefaultLocalePost =
page ? page.fallback : currentLocale !== defaultLocale && !(metadata.source ?? '').startsWith(`@site/i18n/${currentLocale}/`);
return (
<PageMetadata
title={frontMatter.title_meta ?? title}
description={description}
keywords={keywords}
image={image}>
{isDefaultLocalePost && <link rel="canonical" href={url + (page?.navigationRoutes[defaultLocale] ?? metadata.permalink)} />}
{(page && !page.indexable) && <meta name="robots" content="noindex, follow" />}
<meta property="og:type" content="article" />
<meta property="article:published_time" content={date} />
{/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
{authors.some((author) => author.url) && (
<meta
property="article:author"
content={authors
.map((author) => author.url)
.filter(Boolean)
.join(',')}
/>
)}
{tags.length > 0 && (
<meta
property="article:tag"
content={tags.map((tag) => tag.label).join(',')}
/>
)}
</PageMetadata>
);
}