import type { LeaderboardDto, Period } from '@atm/shared/api'; import type { Metadata } from 'next'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { PeriodTabs } from '@/components/PeriodTabs'; import { PlayerHead } from '@/components/PlayerHead'; import { ApiDown, EmptyState, PageTitle } from '@/components/States'; import { apiFind } from '@/lib/api'; import { formatUnit } from '@/lib/format'; export const dynamic = 'force-dynamic'; type Props = { params: Promise<{ board: string }>; searchParams: Promise<{ period?: string }> }; const PERIOD_TEXT: Record = { all: 'über die gesamte Spielzeit', '30d': 'Zuwachs der letzten 30 Tage', '7d': 'Zuwachs der letzten 7 Tage', }; export async function generateMetadata({ params }: Props): Promise { const { board } = await params; const data = await apiFind(`/api/leaderboards/${encodeURIComponent(board)}`).catch(() => null); return { title: data?.board.title ?? 'Rangliste' }; } export default async function BoardPage({ params, searchParams }: Props) { const { board } = await params; const raw = (await searchParams).period; const period: Period = raw === '7d' || raw === '30d' ? raw : 'all'; let data: LeaderboardDto | null; try { data = await apiFind(`/api/leaderboards/${encodeURIComponent(board)}?period=${period}`); } catch { return ; } if (!data) notFound(); const max = Math.max(...data.entries.map((e) => e.value), 1); return ( <>

Alle Ranglisten

{data.board.description}, {PERIOD_TEXT[period]}.
{data.entries.length === 0 ? ( {period === 'all' ? 'Sobald Spieler Werte in dieser Kategorie haben, erscheinen sie hier.' : 'In diesem Zeitraum hat sich niemand verbessert.'} ) : (
    {data.entries.map((e) => (
  1. {e.rank} {e.name ?? 'Unbekannt'} {formatUnit(e.value, data.board.unit)}
  2. ))}
)} ); }