"use client"; import { useEffect, useState } from "react"; interface LeaderboardEntry { rank: number; username: string; email: string; score: number; level: number; avatar?: string | null; bio?: string | null; characterClass?: string | 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 && ( [{entry.characterClass === "WARRIOR" && "⚔️ Guerrier"} {entry.characterClass === "MAGE" && "🔮 Mage"} {entry.characterClass === "ROGUE" && "🗡️ Voleur"} {entry.characterClass === "RANGER" && "🏹 Rôdeur"} {entry.characterClass === "PALADIN" && "🛡️ Paladin"} {entry.characterClass === "ENGINEER" && "⚙️ Ingénieur"} {entry.characterClass === "MERCHANT" && "💰 Marchand"} {entry.characterClass === "SCHOLAR" && "📚 Érudit"} {entry.characterClass === "BERSERKER" && "🔥 Berserker"} {entry.characterClass === "NECROMANCER" && "💀 Nécromancien"} ] )}
{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 */}
{selectedEntry.avatar ? (
{selectedEntry.username}
) : (
{selectedEntry.username.charAt(0).toUpperCase()}
)}
Rank #{selectedEntry.rank}
{selectedEntry.email}
{selectedEntry.characterClass && (
{selectedEntry.characterClass === "WARRIOR" && "⚔️"} {selectedEntry.characterClass === "MAGE" && "🔮"} {selectedEntry.characterClass === "ROGUE" && "🗡️"} {selectedEntry.characterClass === "RANGER" && "🏹"} {selectedEntry.characterClass === "PALADIN" && "🛡️"} {selectedEntry.characterClass === "ENGINEER" && "⚙️"} {selectedEntry.characterClass === "MERCHANT" && "💰"} {selectedEntry.characterClass === "SCHOLAR" && "📚"} {selectedEntry.characterClass === "BERSERKER" && "🔥"} {selectedEntry.characterClass === "NECROMANCER" && "💀"} {selectedEntry.characterClass === "WARRIOR" && "Guerrier"} {selectedEntry.characterClass === "MAGE" && "Mage"} {selectedEntry.characterClass === "ROGUE" && "Voleur"} {selectedEntry.characterClass === "RANGER" && "Rôdeur"} {selectedEntry.characterClass === "PALADIN" && "Paladin"} {selectedEntry.characterClass === "ENGINEER" && "Ingénieur"} {selectedEntry.characterClass === "MERCHANT" && "Marchand"} {selectedEntry.characterClass === "SCHOLAR" && "Érudit"} {selectedEntry.characterClass === "BERSERKER" && "Berserker"} {selectedEntry.characterClass === "NECROMANCER" && "Nécromancien"}
)}
{/* Stats */}
Score
{formatScore(selectedEntry.score)}
Niveau
Lv.{selectedEntry.level}
{/* Bio */} {selectedEntry.bio && (
Bio

{selectedEntry.bio}

)}
)}
); }