// src/components/TowerDefenseLeaderboard.tsx import React, { useState, useEffect } from 'react'; import { Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Typography, Pagination, Chip, CircularProgress } from '@mui/material'; import EmojiEventsIcon from '@mui/icons-material/EmojiEvents'; import { API_BASE_URL } from '../config'; interface LeaderboardRecord { userId: string; username: string; fullname: string; bestWave: number; bestScore: number; totalGames: number; lastPlayed: string; } interface LeaderboardResponse { records: LeaderboardRecord[]; total: number; currentPage: number; totalPages: number; } const TowerDefenseLeaderboard: React.FC = () => { const [records, setRecords] = useState([]); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { fetchLeaderboard(); }, [page]); const fetchLeaderboard = async () => { setLoading(true); setError(null); try { const response = await fetch( `${API_BASE_URL}/api/tower-defense/leaderboard?page=${page}&limit=10` ); if (!response.ok) { throw new Error('获取排行榜失败'); } const data: LeaderboardResponse = await response.json(); setRecords(data.records); setTotalPages(data.totalPages); } catch (error) { console.error('获取排行榜失败:', error); setError(error instanceof Error ? error.message : '获取排行榜失败'); } finally { setLoading(false); } }; const handlePageChange = (_event: React.ChangeEvent, value: number) => { setPage(value); }; const getRankBadge = (rank: number) => { if (rank === 1) return { emoji: '🥇', color: 'success' as const }; if (rank === 2) return { emoji: '🥈', color: 'primary' as const }; if (rank === 3) return { emoji: '🥉', color: 'default' as const }; return null; }; if (loading && records.length === 0) { return ( ); } if (error) { return ( {error} ); } return ( 塔防排行榜 排名 姓名 最高积分 最高波次 总游戏次数 最后游玩 {records.length === 0 ? ( 暂无排行榜数据 ) : ( records.map((record, index) => { const rank = (page - 1) * 10 + index + 1; const badge = page === 1 ? getRankBadge(rank) : null; return ( {rank} {badge && ( )} {record.fullname || record.username} {record.bestWave} {record.totalGames} {new Date(record.lastPlayed).toLocaleString('zh-CN')} ); }) )}
{totalPages > 1 && ( )}
); }; export default TowerDefenseLeaderboard;