import { loader } from "fumadocs-core/source"; import type { Metadata } from "next"; import Image from "next/image"; import { notFound } from "next/navigation"; import { blog } from "@/.source/server"; import { BreadcrumbNav } from "@/components/seo/breadcrumb-nav"; import { ArticleJsonLd } from "@/components/seo/json-ld"; import { formatDate } from "@/lib/utils"; import { getMDXComponents } from "@/mdx-components"; const source = loader({ baseUrl: "/blog", source: blog.toFumadocsSource(), }); interface BlogData { title: string; description: string; date: string; image?: string; author?: string; authorAvatar?: string; tags?: string[]; body: React.ComponentType<{ components?: Record; }>; } interface BlogPageItem { url: string; slugs: string[]; data: BlogData; } export async function generateStaticParams() { return source.getPages().map((page) => ({ slug: (page as BlogPageItem).slugs.join("/"), })); } export async function generateMetadata(props: { params: Promise<{ slug: string }>; }): Promise { const { slug } = await props.params; const page = (source.getPages() as BlogPageItem[]).find( (p) => p.slugs.join("/") === slug, ); if (!page) return {}; return { title: `${page.data.title} | SurfSense Blog`, description: page.data.description, alternates: { canonical: `https://surfsense.com/blog/${slug}`, }, openGraph: { title: page.data.title, description: page.data.description, type: "article", publishedTime: page.data.date, authors: [page.data.author ?? "SurfSense Team"], tags: page.data.tags, images: page.data.image ? [{ url: page.data.image }] : [{ url: "/og-image.png" }], }, twitter: { card: "summary_large_image", title: page.data.title, description: page.data.description, images: page.data.image ? [page.data.image] : ["/og-image.png"], }, }; } export default async function BlogPostPage(props: { params: Promise<{ slug: string }>; }) { const { slug } = await props.params; const page = (source.getPages() as BlogPageItem[]).find( (p) => p.slugs.join("/") === slug, ); if (!page) notFound(); const MDX = page.data.body; const date = new Date(page.data.date); return (
{page.data.image && (
{page.data.title}
)}

{page.data.title}

{page.data.tags && page.data.tags.length > 0 && (
{page.data.tags.map((tag: string) => ( {tag} ))}
)}
{page.data.authorAvatar && ( {page.data.author )} {page.data.author ?? "SurfSense Team"} ยท
); }