import { ImageResponse } from "next/og"; import { API_URL } from "@/config/constants"; import { resolveFacilityAlias } from "@/app/facilityAliases"; import { buildAbsoluteUrl } from "@/app/seo"; export const size = { width: 1200, height: 630, }; export const contentType = "image/png"; type OpenGraphImageProps = { params: Promise<{ slug: string }>; }; type OpenGraphFacility = { name: string; city?: string | null; county?: string | null; image_url?: string | null; }; async function getFacility(slug: string) { const res = await fetch(`${API_URL}/facilities/${slug}`, { cache: "no-store" }); if (!res.ok) { return null; } const facility = (await res.json()) as Partial | null; if (!facility?.name) { return null; } return facility as OpenGraphFacility; } async function getFacilityForSlug(slug: string) { const facility = await getFacility(slug); if (facility) { return facility; } const canonicalSlug = await resolveFacilityAlias(slug); if (!canonicalSlug || canonicalSlug === slug) { return null; } return getFacility(canonicalSlug); } export default async function OpenGraphImage({ params }: OpenGraphImageProps) { const { slug } = await params; const facility = await getFacilityForSlug(slug); const title = facility?.name || "TeeOff"; const location = [facility?.city, facility?.county].filter(Boolean).join(" ยท ") || "Norske golfbaner"; const imageUrl = facility?.image_url ? buildAbsoluteUrl(facility.image_url) : null; return new ImageResponse( (
{imageUrl ? ( {title} ) : null}
TeeOff
Golfbane
{title}
{location}
), size, ); }