mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-29 10:17:55 +02:00
79 lines
2.4 KiB
TypeScript
79 lines
2.4 KiB
TypeScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
import React, {type ReactNode} from 'react';
|
|
import clsx from 'clsx';
|
|
import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common';
|
|
import {
|
|
BlogPostProvider,
|
|
useBlogPost,
|
|
} from '@docusaurus/plugin-content-blog/client';
|
|
import BlogLayout from '@theme/BlogLayout';
|
|
import BlogPostItem from '@theme/BlogPostItem';
|
|
import BlogPostPaginator from '@theme/BlogPostPaginator';
|
|
import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
|
|
import BlogPostPageStructuredData from '@theme/BlogPostPage/StructuredData';
|
|
import TOC from '@theme/TOC';
|
|
import type {Props} from '@theme/BlogPostPage';
|
|
import Unlisted from '@theme/Unlisted';
|
|
import type {BlogSidebar} from '@docusaurus/plugin-content-blog';
|
|
|
|
function BlogPostPageContent({
|
|
sidebar,
|
|
children,
|
|
}: {
|
|
sidebar: BlogSidebar;
|
|
children: ReactNode;
|
|
}): JSX.Element {
|
|
const {metadata, toc} = useBlogPost();
|
|
const {nextItem, prevItem, frontMatter, unlisted} = metadata;
|
|
const {
|
|
hide_table_of_contents: hideTableOfContents,
|
|
toc_min_heading_level: tocMinHeadingLevel,
|
|
toc_max_heading_level: tocMaxHeadingLevel,
|
|
} = frontMatter;
|
|
return (
|
|
<BlogLayout
|
|
sidebar={sidebar}
|
|
toc={
|
|
!hideTableOfContents && toc.length > 0 ? (
|
|
<TOC
|
|
toc={toc}
|
|
minHeadingLevel={tocMinHeadingLevel}
|
|
maxHeadingLevel={tocMaxHeadingLevel}
|
|
/>
|
|
) : undefined
|
|
}>
|
|
{unlisted && <Unlisted />}
|
|
|
|
<BlogPostItem>{children}</BlogPostItem>
|
|
|
|
{(nextItem || prevItem) && (
|
|
<BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
|
|
)}
|
|
</BlogLayout>
|
|
);
|
|
}
|
|
|
|
export default function BlogPostPage(props: Props): JSX.Element {
|
|
const BlogPostContent = props.content;
|
|
return (
|
|
<BlogPostProvider content={props.content} isBlogPostPage>
|
|
<HtmlClassNameProvider
|
|
className={clsx(
|
|
ThemeClassNames.wrapper.blogPages,
|
|
ThemeClassNames.page.blogPostPage,
|
|
)}>
|
|
<BlogPostPageMetadata />
|
|
<BlogPostPageStructuredData />
|
|
<BlogPostPageContent sidebar={props.sidebar}>
|
|
<BlogPostContent />
|
|
</BlogPostPageContent>
|
|
</HtmlClassNameProvider>
|
|
</BlogPostProvider>
|
|
);
|
|
}
|