import { ExternalLink } from 'lucide-react'; import type { Metadata } from 'next'; import Link from 'next/link'; import { t } from '@/i18n'; import { isNotBuilt } from '@/lib/api'; import { apiExplore } from '@/lib/api-explore'; import { compact, formatDate, grouped } from '@/lib/format'; import { routes } from '@/lib/site'; import type { SourcesResponse } from '@/lib/types-explore'; import { NotBuiltState } from '@/components/data/empty-state'; import { FreshnessBadge } from '@/components/data/freshness-badge'; import { PageHeader } from '@/components/explore/page-header'; import { FooterCredits } from '@/components/layout/site-footer'; export const revalidate = 900; export const metadata: Metadata = { title: t('sources.title'), description: t('sources.sub', { n: 9 }), alternates: { canonical: routes.sources() }, }; export default async function SourcesPage() { let data: SourcesResponse | null = null; try { data = await apiExplore.sources(); } catch (e) { if (!isNotBuilt(e)) throw e; } const items = data?.items ?? []; return ( <> {!data ? ( ) : ( <>

{t('sources.rule')}

    {items.map((s) => (
  1. {s.name ?? s.id} {s.organization} {s.licence ? {s.licence} : null}
    {s.attribution ?

    {s.attribution}

    : null}
    {s.id} {s.url ? ( {t('sources.website')} ) : null} {t('common.more')} →
    {t('sources.observations', { n: '' }).trim()}
    {s.n_observations != null ? compact(s.n_observations) : t('common.na')}
    {t('sources.indicators', { n: '' }).trim()}
    {s.n_indicators != null ? grouped(s.n_indicators) : t('common.na')}
    {t('sources.lastImport', { date: '' })}
    {t('sources.lastImport', { date: formatDate(s.last_success_at ?? s.last_retrieved_at) })}
  2. ))}
{t('sources.contact')}
)} ); }