'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Button from '@/components/ui/Button'; import Input from '@/components/ui/Input'; import Card from '@/components/ui/Card'; import CreateTeamForm from '@/components/teams/CreateTeamForm'; import TeamLadderRow from '@/components/teams/TeamLadderRow'; import { getGetAllTeamsQuery, getGetTeamMembersQuery, getDriverStats } from '@/lib/di-container'; import type { Team } from '@gridpilot/racing'; type TeamLadderItem = { team: Team; memberCount: number; rating: number | null; totalWins: number; totalRaces: number; }; export default function TeamsPage() { const router = useRouter(); const [teams, setTeams] = useState([]); const [showCreateForm, setShowCreateForm] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [memberFilter, setMemberFilter] = useState('all'); const [memberCounts, setMemberCounts] = useState>({}); const [teamStats, setTeamStats] = useState>>({}); const loadTeams = async () => { const allTeamsQuery = getGetAllTeamsQuery(); const teamMembersQuery = getGetTeamMembersQuery(); const allTeams = await allTeamsQuery.execute(); setTeams(allTeams); const counts: Record = {}; const stats: Record> = {}; await Promise.all( allTeams.map(async (team) => { const memberships = await teamMembersQuery.execute({ teamId: team.id }); counts[team.id] = memberships.length; const memberDriverIds = memberships.map((m) => m.driverId); let ratingSum = 0; let ratingCount = 0; let totalWins = 0; let totalRaces = 0; for (const driverId of memberDriverIds) { const statsForDriver = getDriverStats(driverId); if (!statsForDriver) continue; if (typeof statsForDriver.rating === 'number') { ratingSum += statsForDriver.rating; ratingCount += 1; } totalWins += statsForDriver.wins ?? 0; totalRaces += statsForDriver.totalRaces ?? 0; } const averageRating = ratingCount > 0 ? ratingSum / ratingCount : null; stats[team.id] = { rating: averageRating, totalWins, totalRaces, }; }), ); setMemberCounts(counts); setTeamStats(stats); }; useEffect(() => { void loadTeams(); }, []); const handleCreateSuccess = (teamId: string) => { setShowCreateForm(false); void loadTeams(); router.push(`/teams/${teamId}`); }; const filteredTeams = teams.filter((team) => { const memberCount = memberCounts[team.id] ?? 0; const matchesSearch = team.name.toLowerCase().includes(searchQuery.toLowerCase()); const matchesMemberCount = memberFilter === 'all' || (memberFilter === 'small' && memberCount < 5) || (memberFilter === 'medium' && memberCount >= 5 && memberCount < 10) || (memberFilter === 'large' && memberCount >= 10); return matchesSearch && matchesMemberCount; }); const sortedTeams = [...filteredTeams].sort((a, b) => { const statsA = teamStats[a.id]; const statsB = teamStats[b.id]; const ratingA = statsA?.rating ?? null; const ratingB = statsB?.rating ?? null; const ratingValA = ratingA === null ? Number.NEGATIVE_INFINITY : ratingA; const ratingValB = ratingB === null ? Number.NEGATIVE_INFINITY : ratingB; if (ratingValA !== ratingValB) { return ratingValB - ratingValA; } const winsA = statsA?.totalWins ?? 0; const winsB = statsB?.totalWins ?? 0; if (winsA !== winsB) { return winsB - winsA; } return a.name.localeCompare(b.name); }); const handleTeamClick = (teamId: string) => { router.push(`/teams/${teamId}`); }; if (showCreateForm) { return (

Create New Team

setShowCreateForm(false)} onSuccess={handleCreateSuccess} />
); } return (

Teams

Browse and join racing teams

setSearchQuery(e.target.value)} />

{sortedTeams.length} {sortedTeams.length === 1 ? 'team' : 'teams'} found

{sortedTeams.length > 0 && (
{sortedTeams.map((team, index) => { const memberCount = memberCounts[team.id] ?? 0; const statsForTeam = teamStats[team.id]; const rating = statsForTeam?.rating ?? null; const totalWins = statsForTeam?.totalWins ?? 0; const totalRaces = statsForTeam?.totalRaces ?? 0; const rank = index + 1; return ( ); })}
# Team Rating Wins Races Members
)} {filteredTeams.length === 0 && (

{teams.length === 0 ? 'No teams yet' : 'No teams found'}

{teams.length === 0 ? 'Create your first team to start racing together.' : 'Try adjusting your search or filters.'}

{teams.length === 0 && ( )}
)}
); }