'use client'; import { useState, useEffect } from 'react'; import Card from '../ui/Card'; import Button from '../ui/Button'; import RaceResultCard from '../races/RaceResultCard'; import { getRaceRepository, getLeagueRepository, getResultRepository } from '@/lib/di-container'; import { Race } from '@gridpilot/racing/domain/entities/Race'; import { Result } from '@gridpilot/racing/domain/entities/Result'; import { League } from '@gridpilot/racing/domain/entities/League'; interface RaceHistoryProps { driverId: string; } export default function ProfileRaceHistory({ driverId }: RaceHistoryProps) { const [filter, setFilter] = useState<'all' | 'wins' | 'podiums'>('all'); const [page, setPage] = useState(1); const [races, setRaces] = useState([]); const [results, setResults] = useState([]); const [leagues, setLeagues] = useState>(new Map()); const [loading, setLoading] = useState(true); const resultsPerPage = 10; useEffect(() => { async function loadRaceHistory() { try { const resultRepo = getResultRepository(); const raceRepo = getRaceRepository(); const leagueRepo = getLeagueRepository(); const driverResults = await resultRepo.findByDriverId(driverId); const allRaces = await raceRepo.findAll(); const allLeagues = await leagueRepo.findAll(); // Filter races to only those where driver has results const raceIds = new Set(driverResults.map(r => r.raceId)); const driverRaces = allRaces .filter(race => raceIds.has(race.id) && race.status === 'completed') .sort((a, b) => b.scheduledAt.getTime() - a.scheduledAt.getTime()); const leagueMap = new Map(); allLeagues.forEach(league => leagueMap.set(league.id, league)); setRaces(driverRaces); setResults(driverResults); setLeagues(leagueMap); } catch (err) { console.error('Failed to load race history:', err); } finally { setLoading(false); } } loadRaceHistory(); }, [driverId]); const raceHistory = races.map(race => { const result = results.find(r => r.raceId === race.id); const league = leagues.get(race.leagueId); return { race, result, league, }; }).filter(item => item.result); const filteredResults = raceHistory.filter(item => { if (!item.result) return false; if (filter === 'wins') return item.result.position === 1; if (filter === 'podiums') return item.result.position <= 3; return true; }); const totalPages = Math.ceil(filteredResults.length / resultsPerPage); const paginatedResults = filteredResults.slice( (page - 1) * resultsPerPage, page * resultsPerPage ); if (loading) { return (
{[1, 2, 3].map(i => (
))}
{[1, 2, 3].map(i => (
))}
); } if (raceHistory.length === 0) { return (

No race history yet

Complete races to build your racing record

); } return (
{paginatedResults.map(({ race, result, league }) => { if (!result || !league) return null; return ( ); })}
{totalPages > 1 && (
Page {page} of {totalPages}
)}
); }