import type { Metadata } from "next"; import { notFound, permanentRedirect } from "next/navigation"; import { Media } from "@/components/Media"; import { PageHero } from "@/components/PageHero"; import { RichContent } from "@/components/RichContent"; import { getBlogById } from "@/lib/api"; import { formatDate } from "@/lib/format"; import { PLACEHOLDER } from "@/lib/data"; import { blogHref, blogTitleSlug } from "@/lib/paths"; import { SITE } from "@/lib/site"; type Props = { params: Promise<{ id: string; slug: string }>; }; export async function generateMetadata({ params }: Props): Promise { const { id } = await params; try { const blog = await getBlogById(id); if (!blog) return { title: SITE.nameFa }; return { title: `${blog.title} | ${SITE.nameFa}`, description: blog.abstract?.trim() || SITE.aboutShort, alternates: { canonical: blogHref(blog) }, }; } catch { return { title: SITE.nameFa }; } } export default async function BlogDetailPage({ params }: Props) { const { id, slug } = await params; const blog = await getBlogById(id); if (!blog) notFound(); if (decodeURIComponent(slug) !== blogTitleSlug(blog.title)) { permanentRedirect(blogHref(blog)); } const author = [blog.author?.firstName, blog.author?.lastName].filter(Boolean).join(" "); return ( <>
{blog.publishedAt || blog.createdAt ? : null} {blog.categoryName ? {blog.categoryName} : null} {author ? {author} : null}
{blog.abstract ?

{blog.abstract}

: null}
); }