/** * 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 Link from '@docusaurus/Link'; import {translate} from '@docusaurus/Translate'; import {PageMetadata} from '@docusaurus/theme-common'; import {useDateTimeFormat} from '@docusaurus/theme-common/internal'; import Layout from '@theme/Layout'; import type {ArchiveBlogPost, Props} from '@theme/BlogArchivePage'; import Heading from '@theme/Heading'; type YearProp = { year: string; posts: ArchiveBlogPost[]; }; function Year({year, posts}: YearProp) { const dateTimeFormat = useDateTimeFormat({ day: 'numeric', month: 'long', timeZone: 'UTC', }); const formatDate = (lastUpdated: string) => dateTimeFormat.format(new Date(lastUpdated)); return ( <> {year} ); } function YearsSection({years}: {years: YearProp[]}) { return (
{years.map((_props, idx) => (
))}
); } function listPostsByYears(blogPosts: readonly ArchiveBlogPost[]): YearProp[] { const postsByYear = blogPosts.reduce((posts, post) => { const year = post.metadata.date.split('-')[0]!; const yearPosts = posts.get(year) ?? []; return posts.set(year, [post, ...yearPosts]); }, new Map()); return Array.from(postsByYear, ([year, posts]) => ({ year, posts, })); } export default function BlogArchive({archive}: Props): ReactNode { const title = translate({ id: 'theme.blog.archive.title', message: 'Archive', description: 'The page & hero title of the blog archive page', }); const description = translate({ id: 'theme.blog.archive.description', message: 'Archive', description: 'The page & hero description of the blog archive page', }); const years = listPostsByYears(archive.blogPosts); return ( <>
{title}

{description}

{years.length > 0 && }
); }