'use client'; import { useState, useEffect, useMemo } from 'react'; import { Game, User, fetchGames, fetchUsers, truncateAddress, getDisplayGameName } from '../utils/api'; import Pagination from '../components/Pagination'; import SearchInput from '../components/SearchInput'; import Modal from '../components/Modal'; const ITEMS_PER_PAGE = 20; export default function Games() { const [games, setGames] = useState([]); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [search, setSearch] = useState(''); const [selectedUser, setSelectedUser] = useState(null); const [showUserModal, setShowUserModal] = useState(false); const handlePlayerClick = (e: React.MouseEvent, playerId: string) => { e.preventDefault(); e.stopPropagation(); const user = users.find(u => u.active_wallet === playerId); if (user) { setSelectedUser(user); setShowUserModal(true); } }; const getUserDisplayName = (userId: string): string => { if (userId === 'na') return 'N/A'; const user = users.find(u => u.id === userId || u.active_wallet === userId); if (user?.username) { return user.username; } return truncateAddress(userId); }; const formatDate = (dateStr: string) => { const date = new Date(dateStr); return date.toLocaleString('en-US', { year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); }; // Filter and paginate games const filteredGames = useMemo(() => { if (!search) return games; const searchLower = search.toLowerCase(); return games.filter(game => game.ended_time.toLowerCase().includes(searchLower) || game.game.toLowerCase().includes(searchLower) || game.winner.toLowerCase().includes(searchLower) || game.master_id.toLowerCase().includes(searchLower) || game.client_id.toLowerCase().includes(searchLower) || game.master_score.includes(searchLower) || game.client_score.includes(searchLower) || game.wager.includes(searchLower) ); }, [games, search]); const currentGames = filteredGames.slice( (currentPage - 1) * ITEMS_PER_PAGE, currentPage * ITEMS_PER_PAGE ); useEffect(() => { const loadData = async () => { try { const [gamesData, usersData] = await Promise.all([ fetchGames(), fetchUsers() ]); setGames(gamesData); setUsers(usersData); } catch (err) { setError('Failed to load data. Please try again later.'); console.error('Error loading data:', err); } finally { setLoading(false); } }; loadData(); }, []); useEffect(() => { setCurrentPage(1); }, [search]); if (loading) { return (
Loading...
); } if (error) { return (
{error}
); } return (
{/* User Details Modal */} { setShowUserModal(false); setSelectedUser(null); }} title="User Details" > {selectedUser && (

Ref ID

{selectedUser.ref_id}

Username

{selectedUser.username || '-'}

Wallet Address

{selectedUser.active_wallet || '-'}

X Profile

{selectedUser.x_profile_url ? ( e.stopPropagation()} > View Profile ) : '-'}

Referred By

{selectedUser.referred_id === '-1' ? '-' : selectedUser.referred_id}

)}
{/* Games History Section */}

Game History

Total Games: {filteredGames.length}
{currentGames.map((game) => ( ))}
Date Game Winner Players Score Wager (SOL)
{formatDate(game.ended_time)} {getDisplayGameName(game.game)} {game.winner}
Master:
Client:
{game.master_score} - {game.client_score} {(parseInt(game.wager) / 100000000).toFixed(2)}
); }