"use client"; import { useEffect, useState } from "react"; type LeaderboardRow = { id: string; name: string; totalGames: number; wins: number; soloGames: number; soloWins: number; multiGames: number; multiWins: number; avgClicks: number | null; bestTime: number | null; }; type Mode = "all" | "solo" | "multi"; function fmt(s: number): string { const m = Math.floor(s / 60); const sec = Math.floor(s % 60); return `${m}:${String(sec).padStart(2, "0")}`; } const MEDALS = ["🥇", "🥈", "🥉"]; export function LeaderboardScreen({ onBack }: { onBack: () => void }) { const [rows, setRows] = useState([]); const [loading, setLoading] = useState(true); const [mode, setMode] = useState("all"); useEffect(() => { fetch("/api/leaderboard") .then((r) => r.json()) .then((data) => { setRows(data); setLoading(false); }); }, []); const sorted = [...rows] .filter((r) => mode === "solo" ? r.soloGames > 0 : mode === "multi" ? r.multiGames > 0 : true) .sort((a, b) => { if (mode === "solo") return b.soloWins - a.soloWins || b.soloGames - a.soloGames; if (mode === "multi") return b.multiWins - a.multiWins || b.multiGames - a.multiGames; return b.wins - a.wins || b.totalGames - a.totalGames; }); return (
{/* Header */}

Classement

{/* Tabs */}
{(["all", "solo", "multi"] as Mode[]).map((m) => ( ))}
{loading ? (
) : sorted.length === 0 ? (

Aucune partie jouée pour le moment.

) : (
{sorted.map((row, i) => { const games = mode === "solo" ? row.soloGames : mode === "multi" ? row.multiGames : row.totalGames; const wins = mode === "solo" ? row.soloWins : mode === "multi" ? row.multiWins : row.wins; return (
{MEDALS[i] ?? `#${i + 1}`} {row.name}
{wins} victoires
{games} parties
{row.avgClicks != null && (
{row.avgClicks} moy. clics
)} {row.bestTime != null && (
{fmt(row.bestTime)} meilleur
)}
); })}
)}
); }