Files
OpenFrame/app/(marketing)/[slug]/page.tsx
T
eehkayandClaude Fable 5 9595698b5b fix: emit one json-ld script per schema object
A single ld+json script holding a top-level array crashes naive
structured-data consumers (Safari extension content scripts) that read
parsed['@context'] without checking for arrays. Emit one script per
object so every payload has a top-level @context, and escape < in the
root layout like the marketing pages already did.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-18 09:15:57 -07:00

64 lines
1.8 KiB
TypeScript

import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
import { ComparisonPage } from '@/components/marketing/comparison-page';
import { auth } from '@/lib/auth';
import { comparisonPages, getComparisonPage } from '@/lib/marketing/comparison-pages';
import { buildComparisonJsonLd, buildComparisonMetadata } from '@/lib/marketing/metadata';
interface MarketingSlugPageProps {
params: Promise<{ slug: string }>;
}
export function generateStaticParams() {
return comparisonPages.map((page) => ({ slug: page.slug }));
}
export async function generateMetadata({ params }: MarketingSlugPageProps): Promise<Metadata> {
const { slug } = await params;
const page = getComparisonPage(slug);
if (!page) {
return {};
}
return buildComparisonMetadata({
title: page.title,
description: page.metaDescription,
path: `/${page.slug}`,
keywords: page.keywords,
});
}
export default async function MarketingSlugPage({ params }: MarketingSlugPageProps) {
const { slug } = await params;
const page = getComparisonPage(slug);
if (!page) {
notFound();
}
const session = await auth();
const structuredData = buildComparisonJsonLd({
title: page.title,
description: page.metaDescription,
path: `/${page.slug}`,
faq: page.faq,
});
return (
<>
{/* One script per object: single-object payloads with a top-level
@context survive naive JSON-LD consumers that choke on arrays. */}
{structuredData.map((data, index) => (
<script
key={`${String(data['@type'])}-${index}`}
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(data).replace(/</g, '\\u003c'),
}}
/>
))}
<ComparisonPage page={page} isLoggedIn={Boolean(session?.user)} />
</>
);
}