spb/countryatlas
Public
TypeScript 57%
Python 38.6%
JavaScript 3.6%
CSS 0.6%
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