"use client"; import { useState } from "react"; import { Avatar, Modal, CloseButton, Card, BackgroundSection, SectionTitle, } 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; } interface HouseMember { id: string; username: string; avatar: string | null; score: number; level: number; role: string; } interface HouseLeaderboardEntry { rank: number; houseId: string; houseName: string; totalScore: number; memberCount: number; averageScore: number; description: string | null; members: HouseMember[]; } interface LeaderboardSectionProps { leaderboard: LeaderboardEntry[]; houseLeaderboard: HouseLeaderboardEntry[]; backgroundImage: string; } // Format number with consistent locale to avoid hydration mismatch const formatScore = (score: number): string => { return score.toLocaleString("en-US"); }; export default function LeaderboardSection({ leaderboard, houseLeaderboard, backgroundImage, }: LeaderboardSectionProps) { const [selectedEntry, setSelectedEntry] = useState( null ); const [selectedHouse, setSelectedHouse] = useState( null ); return ( {/* Title Section */} LEADERBOARD {/* Players Leaderboard Table */}
{/* Header */}
Rank
Player
Score
Level
{/* Entries */}
{leaderboard.map((entry) => (
{/* Rank */}
{entry.rank}
{/* Player */}
setSelectedEntry(entry)} > {entry.username} {entry.characterClass && ( [{getCharacterClassIcon(entry.characterClass)}] )} {entry.rank <= 3 && ( )}
{/* Score */}
{formatScore(entry.score)}
{/* Level */}
Lv.{entry.level}
))}
{/* House Leaderboard Table */}
MAISONS
{/* Header */}
Rank
Maison
Score Total
Membres
{/* Entries */}
{houseLeaderboard.map((house) => (
setSelectedHouse(house)} > {/* Rank */}
{house.rank}
{/* House Name */}
{house.houseName} {house.rank <= 3 && ( )}
{/* Total Score */}
{formatScore(house.totalScore)}
{/* Member Count */}
{house.memberCount}
))}
{/* Footer Info */}

Compete with players worldwide and climb the ranks!

Rankings update every hour

{/* House Modal */} {selectedHouse && ( setSelectedHouse(null)} size="md" >
{/* Header */}

{selectedHouse.houseName}

setSelectedHouse(null)} size="md" />
{/* Stats */}
Rank
#{selectedHouse.rank}
Score Total
{formatScore(selectedHouse.totalScore)}
Membres
{selectedHouse.memberCount}
{/* Members List */}
Membres ({selectedHouse.memberCount})
{selectedHouse.members.map((member) => (
{member.username} {member.role}
Niveau {member.level}
{formatScore(member.score)}
points
))}
{/* Description */} {selectedHouse.description && (
Description

{selectedHouse.description}

)}
)} {/* Character Modal */} {selectedEntry && ( setSelectedEntry(null)} size="md" >
{/* Header */}

{selectedEntry.username}

setSelectedEntry(null)} size="md" />
{/* 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}

)}
)}
); }