"use client"; import { useEffect, useState } from "react"; import { apiFetch } from "@/lib/api"; import { useI18nText } from "@/lib/i18n"; import { useUiPreferences } from "@/components/ui-preference-provider"; type Row = { user_id: number; username: string; rating: number; created_at: number; }; export default function LeaderboardPage() { const { tx } = useI18nText(); const { theme } = useUiPreferences(); const isMc = theme === "minecraft"; const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); useEffect(() => { const load = async () => { setLoading(true); setError(""); try { const data = await apiFetch("/api/v1/leaderboard/global?limit=200"); setItems(data); } catch (e: unknown) { setError(String(e)); } finally { setLoading(false); } }; void load(); }, []); const getRankColor = (index: number) => { if (!isMc) return ""; switch (index) { case 0: return "text-[color:var(--mc-gold)] drop-shadow-sm"; // Gold case 1: return "text-zinc-300"; // Iron case 2: return "text-orange-700"; // Copper default: return "text-zinc-400"; } }; const getRankIcon = (index: number) => { if (!isMc) return `#${index + 1}`; switch (index) { case 0: return "🏆"; case 1: return "🥈"; case 2: return "🥉"; default: return `#${index + 1}`; } }; return (

{isMc ? ( 🏰 {tx("名人堂", "Hall of Fame")} ) : ( tx("全站排行榜", "Global Leaderboard") )}

{loading &&

{tx("正在读取卷轴...", "Reading scrolls...")}

} {error &&

{error}

}
{items.map((row, i) => (

{getRankIcon(i)} {row.username}

{row.rating}

{tx("注册时间:", "Registered: ")} {new Date(row.created_at * 1000).toLocaleString()}

))} {!loading && items.length === 0 && (

{tx("暂无数据", "No legends yet")}

)}
{items.map((row, i) => ( ))} {!loading && items.length === 0 && ( )}
{tx("排名", "Rank")} {tx("用户", "User")} Rating {tx("注册时间", "Registered At")}
{getRankIcon(i)} {row.username} {row.rating} {new Date(row.created_at * 1000).toLocaleString()}
{tx("暂无数据", "No legends yet")}
); }