import { postsPerPage } from '@/app/layout.config'; import { NumberedPagination } from '@/components/numbered-pagination'; import { PostCard } from '@/components/posts/post-card'; import { Section } from '@/components/section'; import { createMetadata } from '@/lib/metadata'; import { getSortedByDatePosts } from '@/lib/source'; import type { Metadata, ResolvingMetadata } from 'next'; import { notFound, redirect } from 'next/navigation'; export const dynamicParams = false; const totalPosts = getSortedByDatePosts().length; const pageCount = Math.ceil(totalPosts / postsPerPage); const CurrentPostsCount = ({ startIndex, endIndex, }: { startIndex: number; endIndex: number; }) => { const start = startIndex + 1; const end = endIndex < totalPosts ? endIndex : totalPosts; if (start === end) return ({start}); return ( ({start}-{end}) ); }; const Pagination = ({ pageIndex }: { pageIndex: number }) => { const handlePageChange = async (page: number) => { 'use server'; redirect(`/posts?page=${page}`); }; return (
); }; export default async function Page(props: { searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const searchParams = await props.searchParams; const pageIndex = searchParams.page ? Number.parseInt(searchParams.page[0] ?? '', 10) - 1 : 0; if (pageIndex < 0 || pageIndex >= pageCount) notFound(); const startIndex = pageIndex * postsPerPage; const endIndex = startIndex + postsPerPage; const posts = getSortedByDatePosts().slice(startIndex, endIndex); return ( <>

All {totalPosts} Posts{' '}

{posts.map((post) => { const date = new Date(post.data.date).toDateString(); return ( ); })}
{pageCount > 1 && } ); } export const generateStaticParams = () => { const slugs = Array.from({ length: pageCount }, (_, index) => ({ slug: [(index + 1).toString()], })); return [{ slug: [] }, ...slugs]; }; type Props = { params: Promise<{ slug: string[] }>; searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }; export async function generateMetadata( props: Props, parent: ResolvingMetadata, ): Promise { const params = await props.params; const searchParams = await props.searchParams; const pageIndex = searchParams.page ? Number.parseInt(searchParams.page as string, 10) : 1; const isFirstPage = pageIndex === 1 || !searchParams.page; const pageTitle = isFirstPage ? 'Posts' : `Posts - Page ${pageIndex}`; const canonicalUrl = isFirstPage ? '/posts' : `/posts?page=${pageIndex}`; return createMetadata({ title: pageTitle, description: `Posts${!isFirstPage ? ` - Page ${pageIndex}` : ''}`, openGraph: { url: canonicalUrl, }, alternates: { canonical: canonicalUrl, }, }); }