/** * Postcode district pages. * * No phase variants: nobody searches "primary schools in SW11", so the * variants would be pages without demand. These exist to catch * "schools near " and to give London districts a geographic page * where the GIAS town field cannot. */ import { notFound } from 'next/navigation'; import type { Metadata } from 'next'; import { fetchPlace, fetchPlaces } from '@/lib/places'; import { fetchNationalAverages } from '@/lib/api'; import { PlaceView } from '@/components/places/PlaceView'; import { absoluteUrl } from '@/lib/site'; interface Props { params: Promise<{ outcode: string }> } export const revalidate = 604800; export const dynamicParams = true; export async function generateStaticParams(): Promise> { // 1,760 of these; same CI budget argument as the town routes. if (process.env.PRERENDER_PLACES !== '1') return []; try { return (await fetchPlaces()) .filter((p) => p.kind === 'outcode') .map((p) => ({ outcode: p.slug })); } catch (error) { console.warn('generateStaticParams: API unreachable, falling back to on-demand ISR.', error); return []; } } export async function generateMetadata({ params }: Props): Promise { const { outcode } = await params; const detail = await fetchPlace('outcode', outcode); if (!detail) return { title: 'Place Not Found' }; const { name, count } = detail.place; return { title: { absolute: `Schools near ${name} | schoolcompare` }, description: `${count} schools in the ${name} postcode district, with results, Ofsted grades ` + `and how close you had to live to get a place.`, alternates: { canonical: absoluteUrl(`/schools/near/${outcode}`) }, }; } export default async function OutcodePage({ params }: Props) { const { outcode } = await params; const detail = await fetchPlace('outcode', outcode); if (!detail) notFound(); const national = await fetchNationalAverages().catch(() => null); return ( ); }