import type { Metadata } from "next"; import Link from "next/link"; import { notFound } from "next/navigation"; import { safeJsonLd } from "@/lib/jsonld"; import { buildBreadcrumbList } from "@/lib/seo"; import { caseStudies, getRelatedServices, intentCtas, siteName, siteUrl, } from "@/lib/site-content"; interface CasePageProps { params: Promise<{ slug: string }>; } const sourceShaPattern = /\/blob\/([0-9a-f]{40})\//; function getSourceSha(url: string) { return sourceShaPattern.exec(url)?.[1]; } 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" }; const url = `${siteUrl}/cases/${caseStudy.id}`; return { title: `${caseStudy.title} | Case de Engenharia de Software`, description: caseStudy.summary, alternates: { canonical: url }, openGraph: { title: caseStudy.title, description: caseStudy.summary, url, siteName, type: "article", }, twitter: { card: "summary_large_image", title: caseStudy.title, description: caseStudy.summary, }, }; } export default async function CasePage({ params }: CasePageProps) { const { slug } = await params; const caseStudy = caseStudies.find((item) => item.id === slug); if (!caseStudy) notFound(); const pageUrl = `${siteUrl}/cases/${caseStudy.id}`; const relatedServices = getRelatedServices(caseStudy.id); const jsonLd = { "@context": "https://schema.org", "@graph": [ buildBreadcrumbList(pageUrl, [ ["Início", siteUrl], ["Cases", `${siteUrl}/cases`], [caseStudy.title, pageUrl], ] as const), ], }; return (

Case de engenharia de software

{caseStudy.title}: {caseStudy.subtitle}

{caseStudy.detail?.answer.text ?? caseStudy.summary}

{!caseStudy.detail ? (

{caseStudy.impact}

) : null}
    {caseStudy.stack.map((item) => (
  • {item}
  • ))}
{caseStudy.demoUrl ? ( Abrir demonstração ) : null} {caseStudy.githubUrl ? ( Ver código ) : null}
{caseStudy.detail ? (

Desafio verificável

{caseStudy.detail.challenge.text}

Decisões de implementação

    {caseStudy.detail.implementation.map((statement) => (
  • {statement.text}
  • ))}

Limites desta evidência

    {caseStudy.detail.boundaries.map((boundary) => (
  • {boundary.text}
  • ))}

Fontes

    {caseStudy.detail.sources.map((source) => { const sha = getSourceSha(source.url); return (
  • Fonte: {source.label} {sha ? ( Commit: {sha} ) : null}
  • ); })}
) : null} {relatedServices.length > 0 ? (

Serviços relacionados

{relatedServices.map((service) => ( Ver serviço relacionado: {service.navLabel} ))}
) : null}

Próximos caminhos

{intentCtas.project.label} {intentCtas.consulting.label}
); }