spb/countryatlas
Public
TypeScript 57%
Python 38.6%
JavaScript 3.6%
CSS 0.6%
1import type { Metadata } from 'next';2import { t } from '@/i18n';3import { isNotBuilt, safe } from '@/lib/api';4import { apiAnalytics } from '@/lib/api-analytics';5import { apiExplore } from '@/lib/api-explore';6import { routes } from '@/lib/site';7import { NotBuiltState } from '@/components/data/empty-state';8import { DEFAULT_TRAJ, explorerIndicators, firstParam, listParam, parseYearParam, slugParam, type SP } from '@/components/explorer/options';9import { TrajectoriesView } from '@/components/explorer/trajectories-view';1011export const revalidate = 900;1213function parseState(sp: SP) {14 return {15 x: slugParam(firstParam(sp, 'x'), DEFAULT_TRAJ.x)!,16 y: slugParam(firstParam(sp, 'y'), DEFAULT_TRAJ.y)!,17 size: slugParam(firstParam(sp, 'size'), DEFAULT_TRAJ.size)!,18 year: parseYearParam(firstParam(sp, 'year')),19 group: slugParam(firstParam(sp, 'group'), 'world')!,20 select: listParam(firstParam(sp, 'select'), 4).map((s) => s.toUpperCase()),21 };22}2324export async function generateMetadata({ searchParams }: { searchParams: Promise<SP> }): Promise<Metadata> {25 const sp = await searchParams;26 return {27 title: t('traj.metaTitle'),28 description: t('traj.description'),29 alternates: { canonical: routes.trajectories() },30 robots: Object.keys(sp).length ? { index: false, follow: true } : undefined,31 openGraph: { title: `${t('traj.metaTitle')} — ${t('site.name')}`, description: t('traj.description'), url: routes.trajectories(), type: 'website' },32 };33}3435export default async function TrajectoriesPage({ searchParams }: { searchParams: Promise<SP> }) {36 const state = parseState(await searchParams);37 let indicatorsRes;38 try {39 indicatorsRes = await apiExplore.indicators({ with_data: true });40 } catch (e) {41 if (isNotBuilt(e)) return <NotBuiltState />;42 throw e;43 }44 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 }))]);45 return <TrajectoriesView indicators={explorerIndicators(indicatorsRes.items)} groups={groupsRes?.items ?? []} initial={traj} initialState={state} />;46}47