'use client'; import { useState, useEffect, useMemo } from 'react'; import dynamic from 'next/dynamic'; import { AppData } from '@/lib/types'; import { defaultAppData } from '@/lib/defaultData'; import { calculateStandingsData } from '@/lib/leaderboard'; import RaceResultsTable from './components/RaceResultsTable'; import DriverStandings from './components/DriverStandings'; import PointsKey from './components/PointsKey'; const CumulativeChart = dynamic(() => import('./components/CumulativeChart'), { ssr: false }); const API_BASE = process.env.NEXT_PUBLIC_API_BASE || ''; const SERVER_ID = process.env.NEXT_PUBLIC_SERVER_ID || ''; const ACCESS_TOKEN = process.env.NEXT_PUBLIC_ACCESS_TOKEN || ''; async function fetchLeaderboard(): Promise { try { const res = await fetch(`${API_BASE}/server/${SERVER_ID}/leaderboard`, { headers: { "Access-Key": ACCESS_TOKEN } }); if (!res.ok) return null; const data = await res.json(); // Treat empty leaderboard (no drivers) as null to fall back to defaults if (!data || !data.drivers || data.drivers.length === 0) return null; return data; } catch (e) { console.error("Failed to load leaderboard from API:", e); return null; } } export default function ClientPage() { const [appData, setAppData] = useState(defaultAppData); useEffect(() => { const loadData = async () => { const savedData = await fetchLeaderboard(); if (savedData) { setAppData(savedData); } }; loadData(); }, []); const standingsData = useMemo(() => calculateStandingsData(appData), [appData]); return (

Grid Gladiators League Leaderboard

Race Results

Driver Standings

Points Table:

Cumulative Points per Race

); }