api client refactor

This commit is contained in:
2025-12-17 18:01:47 +01:00
parent bab55955e1
commit 4177644b18
190 changed files with 6403 additions and 1624 deletions

View File

@@ -9,51 +9,10 @@ import Breadcrumbs from '@/components/layout/Breadcrumbs';
import ResultsTable from '@/components/races/ResultsTable';
import ImportResultsForm from '@/components/races/ImportResultsForm';
import QuickPenaltyModal from '@/components/leagues/QuickPenaltyModal';
import { apiClient } from '@/lib/apiClient';
import { getRaceResults, getRaceSOF, importRaceResults } from '@/lib/services/races/RaceResultsService';
import { useEffectiveDriverId } from '@/lib/currentDriver';
import { isLeagueAdminOrHigherRole } from '@/lib/leagueRoles';
import type { RaceResultsDetailViewModel, RaceWithSOFViewModel } from '@/lib/apiClient';
type PenaltyTypeDTO =
| 'time_penalty'
| 'grid_penalty'
| 'points_deduction'
| 'disqualification'
| 'warning'
| 'license_points'
| string;
interface PenaltyData {
driverId: string;
type: PenaltyTypeDTO;
value?: number;
}
interface RaceResultRowDTO {
id: string;
raceId: string;
driverId: string;
position: number;
fastestLap: number;
incidents: number;
startPosition: number;
getPositionChange(): number;
}
interface DriverRowDTO {
id: string;
name: string;
}
interface ImportResultRowDTO {
id: string;
raceId: string;
driverId: string;
position: number;
fastestLap: number;
incidents: number;
startPosition: number;
}
import type { RaceResultsDetailViewModel } from '@/lib/view-models';
export default function RaceResultsPage() {
const router = useRouter();
@@ -69,16 +28,16 @@ export default function RaceResultsPage() {
const [importSuccess, setImportSuccess] = useState(false);
const [isAdmin, setIsAdmin] = useState(false);
const [showQuickPenaltyModal, setShowQuickPenaltyModal] = useState(false);
const [preSelectedDriver, setPreSelectedDriver] = useState<DriverRowDTO | undefined>(undefined);
const [preSelectedDriver, setPreSelectedDriver] = useState<{ id: string; name: string } | undefined>(undefined);
const loadData = async () => {
try {
const raceData = await apiClient.races.getResultsDetail(raceId);
const raceData = await getRaceResults(raceId, currentDriverId);
setRaceData(raceData);
setError(null);
try {
const sofData = await apiClient.races.getWithSOF(raceId);
const sofData = await getRaceSOF(raceId);
setRaceSOF(sofData.strengthOfField);
} catch (sofErr) {
console.error('Failed to load SOF:', sofErr);
@@ -106,12 +65,12 @@ export default function RaceResultsPage() {
}
}, [raceData?.league?.id, currentDriverId]);
const handleImportSuccess = async (importedResults: ImportResultRowDTO[]) => {
const handleImportSuccess = async (importedResults: any[]) => {
setImporting(true);
setError(null);
try {
await apiClient.races.importResults(raceId, {
await importRaceResults(raceId, {
resultsFileContent: JSON.stringify(importedResults), // Assuming the API expects JSON string
});
@@ -128,7 +87,7 @@ export default function RaceResultsPage() {
setError(errorMessage);
};
const handlePenaltyClick = (driver: DriverRowDTO) => {
const handlePenaltyClick = (driver: { id: string; name: string }) => {
setPreSelectedDriver(driver);
setShowQuickPenaltyModal(true);
};
@@ -241,7 +200,7 @@ export default function RaceResultsPage() {
</span>
<span className="flex items-center gap-2">
<Users className="w-4 h-4" />
{raceData.results.length} drivers classified
{raceData.stats.totalDrivers} drivers classified
</span>
</>
)}
@@ -265,11 +224,11 @@ export default function RaceResultsPage() {
<Card>
{hasResults && raceData ? (
<ResultsTable
results={raceData.results as any}
drivers={raceData.drivers as any}
results={raceData.resultsByPosition}
drivers={raceData.drivers}
pointsSystem={raceData.pointsSystem ?? {}}
fastestLapTime={raceData.fastestLapTime ?? 0}
penalties={raceData.penalties as any}
penalties={raceData.penalties}
currentDriverId={raceData.currentDriverId ?? ''}
isAdmin={isAdmin}
onPenaltyClick={handlePenaltyClick}