import { Typography } from "@/components/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/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 (
{formatDate(res.frontmatter.date)}
Posted by
{author.username}
@{author.handle}