import type { Metadata } from 'next'; import { t } from '@/i18n'; import { isNotBuilt, safe } from '@/lib/api'; import { apiAnalytics } from '@/lib/api-analytics'; import { apiExplore } from '@/lib/api-explore'; import { routes } from '@/lib/site'; import { NotBuiltState } from '@/components/data/empty-state'; import { DEFAULT_TRAJ, explorerIndicators, firstParam, listParam, parseYearParam, slugParam, type SP } from '@/components/explorer/options'; import { TrajectoriesView } from '@/components/explorer/trajectories-view'; export const revalidate = 900; function parseState(sp: SP) { return { x: slugParam(firstParam(sp, 'x'), DEFAULT_TRAJ.x)!, y: slugParam(firstParam(sp, 'y'), DEFAULT_TRAJ.y)!, size: slugParam(firstParam(sp, 'size'), DEFAULT_TRAJ.size)!, year: parseYearParam(firstParam(sp, 'year')), group: slugParam(firstParam(sp, 'group'), 'world')!, select: listParam(firstParam(sp, 'select'), 4).map((s) => s.toUpperCase()), }; } export async function generateMetadata({ searchParams }: { searchParams: Promise }): Promise { const sp = await searchParams; return { title: t('traj.metaTitle'), description: t('traj.description'), alternates: { canonical: routes.trajectories() }, robots: Object.keys(sp).length ? { index: false, follow: true } : undefined, openGraph: { title: `${t('traj.metaTitle')} — ${t('site.name')}`, description: t('traj.description'), url: routes.trajectories(), type: 'website' }, }; } export default async function TrajectoriesPage({ searchParams }: { searchParams: Promise }) { const state = parseState(await searchParams); let indicatorsRes; try { indicatorsRes = await apiExplore.indicators({ with_data: true }); } catch (e) { if (isNotBuilt(e)) return ; throw e; } const [groupsRes, traj] = await Promise.all([safe(apiExplore.regions()), safe(apiAnalytics.trajectory({ x: state.x, y: state.y, size: state.size, group: state.group !== 'world' ? state.group : null }))]); return ; }