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.2 KB · 41 lines tsx
Raw Blame History
1import type { Metadata } from 'next';2import { t } from '@/i18n';3import { api, isNotBuilt, safe } from '@/lib/api';4import { apiAnalytics } from '@/lib/api-analytics';5import { apiExplore } from '@/lib/api-explore';6import { parseFinderState } from '@/lib/finder-query';7import { routes } from '@/lib/site';8import type { FormatSpec } from '@/lib/types';9import { NotBuiltState } from '@/components/data/empty-state';10import { FinderView } from '@/components/explorer/finder-view';11import { explorerIndicators, type SP } from '@/components/explorer/options';12import { baseFeatures } from '@/components/indicators/map-geometry';1314export const revalidate = 900;1516export async function generateMetadata({ searchParams }: { searchParams: Promise<SP> }): Promise<Metadata> {17  const sp = await searchParams;18  return {19    title: t('finder.metaTitle'),20    description: t('finder.description'),21    alternates: { canonical: routes.finder() },22    robots: Object.keys(sp).length ? { index: false, follow: true } : undefined,23    openGraph: { title: `${t('finder.metaTitle')} — ${t('site.name')}`, description: t('finder.description'), url: routes.finder(), type: 'website' },24  };25}2627export default async function FinderPage({ searchParams }: { searchParams: Promise<SP> }) {28  const state = parseFinderState(await searchParams);29  let indicatorsRes;30  try {31    indicatorsRes = await apiExplore.indicators({ with_data: true });32  } catch (e) {33    if (isNotBuilt(e)) return <NotBuiltState />;34    throw e;35  }36  const [countriesRes, result] = await Promise.all([safe(api.countries()), state.filters.length ? safe(apiAnalytics.finder(state.filters, { mode: state.mode, region: state.region, income: state.income, sort: state.sort, limit: 218 })) : Promise.resolve(null)]);37  const { features, sphere } = baseFeatures(countriesRes?.items ?? []);38  const specs: Record<string, FormatSpec> = Object.fromEntries(indicatorsRes.items.map((i) => [i.slug, { format: i.format, unit: i.unit, unit_short: i.unit_short, precision: i.precision, frequency: i.frequency, name: i.short_name ?? i.name, higher_is_better: i.higher_is_better }]));39  return <FinderView indicators={explorerIndicators(indicatorsRes.items, 10)} features={features} sphere={sphere} initial={result} initialState={state} specs={specs} />;40}41