import { Trophy } from "lucide-react"; import { LeaderboardPagination } from "@/components/leaderboard/leaderboard-pagination"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { formatInteger, formatVoiceDuration, resolveLeaderboardName, shortenDiscordId, type LeaderboardPage, type VoiceLeaderboardRow, type XpLeaderboardRow, } from "@/lib/leaderboard/ranking"; type LeaderboardBoardProps = | { kind: "xp"; data: LeaderboardPage; searchQuery: string; channelId?: never; } | { kind: "vc"; data: LeaderboardPage; searchQuery: string; channelId?: string; }; function rankVariant(rank: number) { if (rank === 1) return "default"; if (rank === 2) return "secondary"; return "outline"; } function Identity({ displayName, username, userId, }: { displayName: string | null; username: string | null; userId: string; }) { const unresolved = !displayName?.trim() && !username?.trim(); return (
{resolveLeaderboardName({ displayName, username, userId })} {unresolved ? `Discord ID: ${shortenDiscordId(userId)}` : displayName?.trim() && username?.trim() ? `@${username}` : `Discord ID: ${shortenDiscordId(userId)}`}
); } function Podium({ data }: LeaderboardBoardProps) { if (data.podium.length === 0) return null; return (

สามอันดับนำ

{data.podium.map((row) => ( {resolveLeaderboardName(row)} {row.rank === 1 && } #{row.rank} {"level" in row ? `เลเวล ${row.level}` : "เวลารวมในห้องเสียง"} {"totalXp" in row ? `${formatInteger(row.totalXp)} XP` : formatVoiceDuration(row.totalSeconds)} ))}
); } export function LeaderboardBoard(props: LeaderboardBoardProps) { const { kind, data, channelId, searchQuery } = props; const firstRow = data.totalRows === 0 ? 0 : (data.page - 1) * data.pageSize + 1; const lastRow = Math.min(data.page * data.pageSize, data.totalRows); return ( <> {kind === "xp" ? "อันดับ XP ทั้งหมด" : "อันดับเวลาในห้องเสียง"} {data.totalRows > 0 ? `แสดง ${firstRow}–${lastRow} จาก ${formatInteger(String(data.totalRows))} คน` : searchQuery ? "ไม่พบสมาชิกที่ตรงกับคำค้นหานี้" : "ยังไม่มีข้อมูลในขอบเขตนี้"} {kind === "xp" ? "ตารางอันดับจาก XP รวมของสมาชิกเลเวล 1 ขึ้นไป" : "ตารางอันดับจากเวลารวมในห้องเสียงและห้องเวทีปัจจุบัน"} อันดับ สมาชิก {kind === "xp" && เลเวล} {kind === "xp" ? "XP รวม" : "เวลารวม"} {data.rows.map((row) => ( #{row.rank} {"level" in row && ( {row.level} )} {"totalXp" in row ? formatInteger(row.totalXp) : formatVoiceDuration(row.totalSeconds)} ))}
); }