diff --git a/app/cases/[slug]/page.tsx b/app/cases/[slug]/page.tsx new file mode 100644 index 0000000..e3130ab --- /dev/null +++ b/app/cases/[slug]/page.tsx @@ -0,0 +1,146 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import { caseStudies, siteName, siteUrl } from "@/lib/site-content"; + +interface CasePageProps { + params: Promise<{ slug: string }>; +} + +export function generateStaticParams() { + return caseStudies.map((caseStudy) => ({ slug: caseStudy.id })); +} + +export async function generateMetadata({ + params, +}: CasePageProps): Promise { + const { slug } = await params; + const caseStudy = caseStudies.find((item) => item.id === slug); + + if (!caseStudy) return { title: `Case não encontrado | ${siteName}` }; + + const url = `${siteUrl}/cases/${caseStudy.id}`; + return { + title: `${caseStudy.title}: ${caseStudy.subtitle} | ${siteName}`, + description: caseStudy.summary, + alternates: { canonical: url }, + openGraph: { + title: caseStudy.title, + description: caseStudy.summary, + url, + siteName, + type: "article", + }, + }; +} + +export default async function CasePage({ params }: CasePageProps) { + const { slug } = await params; + const caseStudy = caseStudies.find((item) => item.id === slug); + if (!caseStudy) notFound(); + + const url = `${siteUrl}/cases/${caseStudy.id}`; + const jsonLd = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Article", + headline: caseStudy.title, + description: caseStudy.summary, + mainEntityOfPage: url, + author: { "@id": `${siteUrl}/#person` }, + about: caseStudy.stack, + }, + { + "@type": "BreadcrumbList", + itemListElement: [ + { "@type": "ListItem", position: 1, name: "Inicio", item: siteUrl }, + { + "@type": "ListItem", + position: 2, + name: "Cases", + item: `${siteUrl}/cases`, + }, + { + "@type": "ListItem", + position: 3, + name: caseStudy.title, + item: url, + }, + ], + }, + ], + }; + + return ( +
+