import { Sidebar } from '@/components/sidebar'; import { blog } from '@konobangu/cms'; import { Body } from '@konobangu/cms/components/body'; import { Feed } from '@konobangu/cms/components/feed'; import { Image } from '@konobangu/cms/components/image'; import { TableOfContents } from '@konobangu/cms/components/toc'; import { env } from '@konobangu/env'; import { JsonLd } from '@konobangu/seo/json-ld'; import { createMetadata } from '@konobangu/seo/metadata'; import { ArrowLeftIcon } from '@radix-ui/react-icons'; import type { Metadata } from 'next'; import { draftMode } from 'next/headers'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import Balancer from 'react-wrap-balancer'; type BlogPostProperties = { readonly params: Promise<{ slug: string; }>; }; export const generateMetadata = async ({ params, }: BlogPostProperties): Promise => { const { slug } = await params; const post = await blog.getPost(slug); if (!post) { return {}; } return createMetadata({ title: post._title, description: post.description, image: post.image.url, }); }; export const generateStaticParams = async (): Promise<{ slug: string }[]> => { const posts = await blog.getPosts(); return posts.map(({ _slug }) => ({ slug: _slug })); }; const BlogPost = async ({ params }: BlogPostProperties) => { const { slug } = await params; const draft = await draftMode(); return ( {/* biome-ignore lint/suspicious/useAwait: "Server Actions must be async" */} {async ([data]) => { 'use server'; const [page] = data.blog.posts.items; if (!page) { notFound(); } return ( <>
Back to Blog

{page._title}

{page.description}

{page.image ? ( {page.image.alt ) : undefined}
} readingTime={`${page.body.readingTime} min read`} date={new Date(page.date)} />
); }}
); }; export default BlogPost;