j-chim's picture
Add dynamic thumbnails for orgs
e068beb
Raw
History Blame Contribute Delete
2.28 kB
import type { Metadata } from "next"
import { getEvaluatorSummaryBySlug } from "@/lib/data-backend"
import { routeIdFromSegments, routeIdToPath } from "@/lib/utils"
/**
* Server-side metadata for the evaluator (reporting-org) detail page. The
* page itself is a client component, so this sibling layout owns the
* OpenGraph payload so social/chat unfurls carry the evaluator's name + a
* per-evaluator thumbnail (rendered by /api/og/evaluators/<slug>) instead
* of the site-wide card. Mirrors app/models/[...id]/layout.tsx.
*/
export async function generateMetadata(props: {
params: Promise<{ id: string | string[] }>
}): Promise<Metadata> {
const { id } = await props.params
const slug = routeIdFromSegments(id)
let evaluatorName = "Evaluator"
let evalCount: number | null = null
let verifiedCount: number | null = null
try {
const summary = await getEvaluatorSummaryBySlug(slug)
if (summary) {
evaluatorName = summary.name ?? evaluatorName
evalCount = summary.evalCount ?? null
verifiedCount = summary.verifiedCount ?? null
}
} catch {
// Fall through to generic copy.
}
const idSlug = routeIdToPath(slug)
const title = evaluatorName
const description =
evalCount != null
? `${evaluatorName} β€” ${evalCount.toLocaleString("en-US")} ${evalCount === 1 ? "evaluation" : "evaluations"} reported${
verifiedCount != null && verifiedCount > 0
? `, ${verifiedCount.toLocaleString("en-US")} verified`
: ""
}, with reproducibility, completeness, provenance, and comparability signals on Evaluation Cards.`
: `${evaluatorName} β€” reported evaluations on Evaluation Cards.`
const imageUrl = `/api/og/evaluators/${idSlug}`
return {
title,
description,
openGraph: {
title,
description,
type: "article",
images: [
{
url: imageUrl,
width: 1200,
height: 630,
alt: `${evaluatorName} β€” Evaluation Cards`,
},
],
},
twitter: {
card: "summary_large_image",
title,
description,
images: [imageUrl],
},
}
}
export default function EvaluatorDetailLayout({
children,
}: Readonly<{ children: React.ReactNode }>) {
return children
}