import type { Metadata } from "next"; import BlogPostClient from "./BlogPostClient"; import { BlogPostingJsonLd, BreadcrumbJsonLd } from "@/components/public/JsonLd"; const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:4000/api"; async function fetchPost(slug: string) { try { const res = await fetch(`${apiUrl}/posts/${slug}`, { next: { revalidate: 300 }, }); if (!res.ok) return null; return res.json(); } catch { return null; } } interface Props { params: Promise<{ slug: string }>; } export async function generateMetadata({ params }: Props): Promise { const { slug } = await params; const post = await fetchPost(slug); if (!post) { return { title: "Post Not Found" }; } const description = post.excerpt || `Read "${post.title}" on the Belgian Bitcoin Embassy blog.`; const author = post.authorName || "Belgian Bitcoin Embassy"; const ogImageUrl = `/og?title=${encodeURIComponent(post.title)}&type=blog`; return { title: post.title, description, openGraph: { type: "article", title: post.title, description, publishedTime: post.publishedAt || post.createdAt, authors: [author], images: [{ url: ogImageUrl, width: 1200, height: 630, alt: post.title }], }, twitter: { card: "summary_large_image", title: post.title, description, images: [ogImageUrl], }, alternates: { canonical: `/blog/${slug}` }, }; } export default async function BlogDetailPage({ params }: Props) { const { slug } = await params; const post = await fetchPost(slug); return ( <> {post && ( <> )} ); }