import { Typography } from "@/components/docs/typography"; import { buttonVariants } from "@/components/ui/button"; import { Author, getAllBlogStaticPaths, getBlogForSlug } from "@/lib/markdown"; import { ArrowLeftIcon } from "lucide-react"; import Link from "next/link"; import { notFound } from "next/navigation"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { formatDate } from "@/lib/utils"; import { ScrollToTop } from "@/components/docs/scroll-to-top"; type PageProps = { params: { slug: string }; }; export async function generateMetadata({ params: { slug } }: PageProps) { const res = await getBlogForSlug(slug); if (!res) return null; const { frontmatter } = res; return { title: frontmatter.title, description: frontmatter.description, }; } export async function generateStaticParams() { const val = await getAllBlogStaticPaths(); if (!val) return []; return val.map((it) => ({ slug: it })); } export default async function BlogPage({ params: { slug } }: PageProps) { const res = await getBlogForSlug(slug); if (!res) notFound(); return (
Back to blog

{formatDate(res.frontmatter.date)}

{res.frontmatter.title}

Posted by

{res.content}
); } function Authors({ authors }: { authors: Author[] }) { return (
{authors.map((author) => { return ( {author.username.slice(0, 2).toUpperCase()}

{author.username}

@{author.handle}

); })}
); }