SPB Git forge

spb/countryatlas

Public
20commits 1branches 0releases
268.3 MBsize
maindefault branch
12 days agolast push
TypeScript 57% Python 38.6% JavaScript 3.6% CSS 0.6%
2.1 KB · 47 lines tsx
Raw Blame History
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