import { metadata } from '@/app/metadata' import { ImageWrapper } from '@/components/common/ImageWrapper' import { ShareLinks } from '@/components/common/ShareLinks' import { TableOfContents } from '@/components/common/TableOfContents' import { getAllPostSlugs, getNextAndPreviousPosts, getPostBySlug } from '@/lib/posts' import { slugify } from '@/utils/slug' import type { Metadata } from 'next' import Link from 'next/link' export async function generateStaticParams() { return getAllPostSlugs().map((slug) => ({ slug })) } export const dynamicParams = false export async function generateMetadata({ params, }: { params: Promise<{ slug: string }> }): Promise { const { slug } = await params const { meta } = await getPostBySlug(slug) return { title: `${meta.title} | ${metadata.title!.toString()}`, description: meta.description, openGraph: { type: 'article', title: `${meta.title} | ${metadata.title!.toString()}`, description: meta.description, url: process.env.SITE_URL + `/posts/${slug}`, images: meta.coverImage ? [meta.coverImage] : undefined, tags: meta.tags, ...(meta.updated && { modifiedTime: new Date(meta.updated).toISOString() }), siteName: metadata.title!.toString(), }, } } export default async function Post({ params }: { params: Promise<{ slug: string }> }) { const { slug } = await params const { meta, content, tableOfContents } = await getPostBySlug(slug) const { next, previous } = getNextAndPreviousPosts(slug) return (
{meta.category && ( {meta.category} )}

{meta.title}

Posted
· {meta.updated && ( <>
Updated
· )} {meta.readingTimeText}

{meta.description}

{meta.coverImage && }
{content}
{meta.tags && (

Tags

{meta.tags.map((tag) => ( {tag} ))}
)}
{previous ? ( ← {previous.title} ) : (
)} {next ? ( {next.title} → ) : (
)}
) }