"use client"; import { useEffect, useState } from "react"; import { Avatar } from "@/components/ui"; import { getCharacterClassIcon, getCharacterClassName, type CharacterClass } from "@/lib/character-classes"; interface LeaderboardEntry { rank: number; username: string; email: string; score: number; level: number; avatar?: string | null; bio?: string | null; characterClass?: CharacterClass | null; } // Format number with consistent locale to avoid hydration mismatch const formatScore = (score: number): string => { return score.toLocaleString("en-US"); }; export default function Leaderboard() { const [leaderboard, setLeaderboard] = useState([]); const [loading, setLoading] = useState(true); const [selectedEntry, setSelectedEntry] = useState( null ); useEffect(() => { fetch("/api/leaderboard") .then((res) => res.json()) .then((data) => { setLeaderboard(data); setLoading(false); }) .catch((err) => { console.error("Error fetching leaderboard:", err); setLoading(false); }); }, []); if (loading) { return (
Chargement...
); } return (

LEADERBOARD

{/* Header */}
Rank
Player
Score
Level
{/* Entries */}
{leaderboard.map((entry) => (
{entry.rank}
setSelectedEntry(entry)} > {entry.username} {entry.characterClass && ( [{getCharacterClassIcon(entry.characterClass)} {getCharacterClassName(entry.characterClass)}] )}
{formatScore(entry.score)}
Lv.{entry.level}
))}
{/* Additional info */}

Compete with players worldwide and climb the ranks!

{/* Character Modal */} {selectedEntry && (
setSelectedEntry(null)} >
e.stopPropagation()} >
{/* Header */}

{selectedEntry.username}

{/* Avatar and Class */}
Rank #{selectedEntry.rank}
{selectedEntry.email}
{selectedEntry.characterClass && (
{getCharacterClassIcon(selectedEntry.characterClass)} {getCharacterClassName(selectedEntry.characterClass)}
)}
{/* Stats */}
Score
{formatScore(selectedEntry.score)}
Niveau
Lv.{selectedEntry.level}
{/* Bio */} {selectedEntry.bio && (
Bio

{selectedEntry.bio}

)}
)}
); }