"use client"; import { useState, useEffect } from "react"; import Image from "next/image"; import { fetchLeaderboard, formatPoints, type LeaderboardData } from "@/lib/api/points"; import { useApp } from "@/contexts/AppContext"; export default function TopPerformers() { const { t } = useApp(); const [leaderboard, setLeaderboard] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { async function loadLeaderboard() { setLoading(true); const data = await fetchLeaderboard(5); setLeaderboard(data); setLoading(false); } loadLeaderboard(); }, []); const getRowStyle = (rank: number) => { switch (rank) { case 1: return { bg: "#fff5ef", borderColor: "#ff6900", rankColor: "#ff6900", textColor: "#111827", pointsSize: "text-body-large", }; case 2: return { bg: "#fffbf5", borderColor: "#ffb933", rankColor: "#ffb933", textColor: "#111827", pointsSize: "text-body-large", }; case 3: return { bg: "#f3f4f6", borderColor: "#6b7280", rankColor: "#6b7280", textColor: "#111827", pointsSize: "text-body-large", }; default: return { bg: "transparent", borderColor: "transparent", rankColor: "#d1d5db", textColor: "#9ca1af", pointsSize: "text-body-small", }; } }; if (loading) { return (
{[1, 2, 3, 4, 5].map((i) => (
))}
); } if (!leaderboard) { return (

{t("points.failedToLoadLeaderboard")}

); } return (
{/* Header */}

{t("points.topPerformers")}

{/* Performers List */}
{leaderboard.topUsers.map((performer) => { const style = getRowStyle(performer.rank); const isTopThree = performer.rank <= 3; const height = performer.rank <= 3 ? "h-[72px]" : "h-[68px]"; return (
{/* Left - Rank and Address */}
{/* Rank Number */} {performer.rank} {/* Address */} {performer.address}
{/* Right - Points */} {formatPoints(performer.points)}
); })}
{/* Footer - My Rank */}
Chart {t("points.myRank")}
{leaderboard.myPoints.toLocaleString()}
); }