import type { Metadata } from 'next'; import { t } from '@/i18n'; import { api, isNotBuilt, safe } from '@/lib/api'; import { apiAnalytics } from '@/lib/api-analytics'; import { apiExplore } from '@/lib/api-explore'; import { parseFinderState } from '@/lib/finder-query'; import { routes } from '@/lib/site'; import type { FormatSpec } from '@/lib/types'; import { NotBuiltState } from '@/components/data/empty-state'; import { FinderView } from '@/components/explorer/finder-view'; import { explorerIndicators, type SP } from '@/components/explorer/options'; import { baseFeatures } from '@/components/indicators/map-geometry'; export const revalidate = 900; export async function generateMetadata({ searchParams }: { searchParams: Promise }): Promise { const sp = await searchParams; return { title: t('finder.metaTitle'), description: t('finder.description'), alternates: { canonical: routes.finder() }, robots: Object.keys(sp).length ? { index: false, follow: true } : undefined, openGraph: { title: `${t('finder.metaTitle')} — ${t('site.name')}`, description: t('finder.description'), url: routes.finder(), type: 'website' }, }; } export default async function FinderPage({ searchParams }: { searchParams: Promise }) { const state = parseFinderState(await searchParams); let indicatorsRes; try { indicatorsRes = await apiExplore.indicators({ with_data: true }); } catch (e) { if (isNotBuilt(e)) return ; throw e; } 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)]); const { features, sphere } = baseFeatures(countriesRes?.items ?? []); const specs: Record = 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 }])); return ; }