This commit is contained in:
2025-12-12 01:11:36 +01:00
parent ec3ddc3a5c
commit 6a88fe93ab
125 changed files with 1513 additions and 803 deletions

View File

@@ -34,6 +34,7 @@ import {
ArrowLeft,
Scale,
} from 'lucide-react';
import { RaceDetailPresenter } from '@/lib/presenters/RaceDetailPresenter';
export default function RaceDetailPage() {
const router = useRouter();
@@ -57,8 +58,9 @@ export default function RaceDetailPage() {
setError(null);
try {
const useCase = getGetRaceDetailUseCase();
await useCase.execute({ raceId, driverId: currentDriverId });
const vm = useCase.presenter.getViewModel();
const presenter = new RaceDetailPresenter();
await useCase.execute({ raceId, driverId: currentDriverId }, presenter);
const vm = presenter.getViewModel();
if (!vm) {
throw new Error('Race detail not available');
}

View File

@@ -13,6 +13,8 @@ import {
getGetRaceResultsDetailUseCase,
getImportRaceResultsUseCase,
} from '@/lib/di-container';
import { RaceWithSOFPresenter } from '@/lib/presenters/RaceWithSOFPresenter';
import { RaceResultsDetailPresenter } from '@/lib/presenters/RaceResultsDetailPresenter';
import type {
RaceResultsHeaderViewModel,
RaceResultsLeagueViewModel,
@@ -71,7 +73,7 @@ export default function RaceResultsPage() {
const [currentDriverId, setCurrentDriverId] = useState<string | undefined>(undefined);
const [raceSOF, setRaceSOF] = useState<number | null>(null);
const [penalties, setPenalties] = useState<PenaltyData[]>([]);
const [pointsSystem, setPointsSystem] = useState<Record<number, number>>({});
const [pointsSystem, setPointsSystem] = useState<Record<number, number> | undefined>(undefined);
const [fastestLapTime, setFastestLapTime] = useState<number | undefined>(undefined);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
@@ -81,9 +83,10 @@ export default function RaceResultsPage() {
const loadData = async () => {
try {
const raceResultsUseCase = getGetRaceResultsDetailUseCase();
await raceResultsUseCase.execute({ raceId });
const raceResultsPresenter = new RaceResultsDetailPresenter();
await raceResultsUseCase.execute({ raceId }, raceResultsPresenter);
const viewModel = raceResultsUseCase.presenter.getViewModel();
const viewModel = raceResultsPresenter.getViewModel();
if (!viewModel) {
setError('Failed to load race data');
@@ -130,8 +133,9 @@ export default function RaceResultsPage() {
try {
const raceWithSOFUseCase = getGetRaceWithSOFUseCase();
await raceWithSOFUseCase.execute({ raceId });
const raceViewModel = raceWithSOFUseCase.presenter.getViewModel();
const sofPresenter = new RaceWithSOFPresenter();
await raceWithSOFUseCase.execute({ raceId }, sofPresenter);
const raceViewModel = sofPresenter.getViewModel();
if (raceViewModel) {
setRaceSOF(raceViewModel.strengthOfField);
}
@@ -290,7 +294,7 @@ export default function RaceResultsPage() {
<ResultsTable
results={results}
drivers={drivers}
pointsSystem={pointsSystem}
pointsSystem={pointsSystem ?? {}}
fastestLapTime={fastestLapTime ?? 0}
penalties={penalties}
currentDriverId={currentDriverId ?? ''}

View File

@@ -8,6 +8,7 @@ import Button from '@/components/ui/Button';
import Heading from '@/components/ui/Heading';
import Breadcrumbs from '@/components/layout/Breadcrumbs';
import { getGetAllRacesPageDataUseCase } from '@/lib/di-container';
import { AllRacesPagePresenter } from '@/lib/presenters/AllRacesPagePresenter';
import type {
AllRacesPageViewModel,
AllRacesListItemViewModel,
@@ -53,8 +54,9 @@ export default function AllRacesPage() {
const loadRaces = async () => {
try {
const useCase = getGetAllRacesPageDataUseCase();
await useCase.execute();
const viewModel = useCase.presenter.getViewModel();
const presenter = new AllRacesPagePresenter();
await useCase.execute(undefined, presenter);
const viewModel = presenter.getViewModel();
setPageData(viewModel);
} catch (err) {
console.error('Failed to load races:', err);

View File

@@ -7,6 +7,7 @@ import Card from '@/components/ui/Card';
import Button from '@/components/ui/Button';
import Heading from '@/components/ui/Heading';
import { getGetRacesPageDataUseCase } from '@/lib/di-container';
import { RacesPagePresenter } from '@/lib/presenters/RacesPagePresenter';
import type {
RacesPageViewModel,
RaceListItemViewModel,
@@ -46,8 +47,9 @@ export default function RacesPage() {
const loadRaces = async () => {
try {
const useCase = getGetRacesPageDataUseCase();
await useCase.execute();
const data = useCase.presenter.getViewModel();
const presenter = new RacesPagePresenter();
await useCase.execute(undefined, presenter);
const data = presenter.getViewModel();
setPageData(data);
} catch (err) {
console.error('Failed to load races:', err);