import type { Metadata } from 'next'; import { t } from '@/i18n'; import { isNotBuilt } from '@/lib/api'; import { apiAnalytics } from '@/lib/api-analytics'; import { grouped } from '@/lib/format'; import { routes } from '@/lib/site'; import { isTopicId } from '@/lib/topics'; import type { ExtremesResponse } from '@/lib/types-analytics'; import { NotBuiltState } from '@/components/data/empty-state'; import { ExtremeFacetBlock } from '@/components/explorer/extreme-facet'; import { ExtremesControls } from '@/components/explorer/extremes-controls'; import { firstParam, type SP } from '@/components/explorer/options'; export const revalidate = 900; const WINDOWS = new Set(['1', '5', '10', '25', 'since1990']); function parseState(sp: SP) { const w = firstParam(sp, 'window') ?? '10'; const topic = (firstParam(sp, 'topic') ?? '').toLowerCase(); return { window: WINDOWS.has(w) ? w : '10', topic: isTopicId(topic) ? topic : null, all: firstParam(sp, 'all') === '1' }; } export async function generateMetadata({ searchParams }: { searchParams: Promise }): Promise { const sp = await searchParams; return { title: t('extremes.metaTitle'), description: t('extremes.description'), alternates: { canonical: routes.extremes() }, robots: Object.keys(sp).length ? { index: false, follow: true } : undefined, openGraph: { title: `${t('extremes.metaTitle')} — ${t('site.name')}`, description: t('extremes.description'), url: routes.extremes(), type: 'website' }, }; } export default async function ExtremesPage({ searchParams }: { searchParams: Promise }) { const state = parseState(await searchParams); let data: ExtremesResponse; try { data = await apiAnalytics.extremes({ window: state.window, topic: state.topic, min_population: state.all ? 0 : null }); } catch (e) { if (isNotBuilt(e)) return ; throw e; } return ( <>

{t('extremes.title')}

{t('extremes.lede')}

{t('extremes.facets', { n: grouped(data.facets.length), y0: data.from_year ?? '', y1: data.to_year ?? '' })} {data.filter_note ? ` · ${data.filter_note}` : ` · ${t('extremes.allCountries')}`}

{t('extremes.semantics')}

{data.facets.length ? ( <> {data.facets.map((f) => ( ))} ) : (

{t('extremes.none')}

)} ); }