refactor page to use services

This commit is contained in:
2025-12-18 17:02:48 +01:00
parent fc386db06a
commit 9814d9682c
27 changed files with 434 additions and 282 deletions

View File

@@ -8,8 +8,7 @@ import Button from '@/components/ui/Button';
import Card from '@/components/ui/Card';
import Heading from '@/components/ui/Heading';
import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId';
import { ServiceFactory } from '@/lib/services/ServiceFactory';
import { LeagueMembershipService } from '@/lib/services/leagues/LeagueMembershipService';
import { useServices } from '@/lib/services/ServiceProvider';
import { LeagueMembershipUtility } from '@/lib/utilities/LeagueMembershipUtility';
import type { RaceDetailViewModel } from '@/lib/view-models/RaceDetailViewModel';
import {
@@ -38,6 +37,7 @@ export default function RaceDetailPage() {
const router = useRouter();
const params = useParams();
const raceId = params.id as string;
const { raceService, leagueMembershipService } = useServices();
const [viewModel, setViewModel] = useState<RaceDetailViewModel | null>(null);
const [loading, setLoading] = useState(true);
@@ -57,15 +57,13 @@ export default function RaceDetailPage() {
setLoading(true);
setError(null);
try {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
const raceService = serviceFactory.createRaceService();
const vm = await raceService.getRaceDetail(raceId, currentDriverId);
setViewModel(vm);
// Fetch league membership for admin controls
if (vm.league) {
await LeagueMembershipService.fetchLeagueMemberships(vm.league.id);
const leagueMembership = LeagueMembershipService.getMembership(vm.league.id, currentDriverId);
await leagueMembershipService.fetchLeagueMemberships(vm.league.id);
const leagueMembership = leagueMembershipService.getMembership(vm.league.id, currentDriverId);
setMembership(leagueMembership);
}
@@ -123,8 +121,6 @@ export default function RaceDetailPage() {
setCancelling(true);
try {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
const raceService = serviceFactory.createRaceService();
await raceService.cancelRace(race.id);
await loadRaceData();
} catch (err) {
@@ -147,8 +143,6 @@ export default function RaceDetailPage() {
setRegistering(true);
try {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
const raceService = serviceFactory.createRaceService();
await raceService.registerForRace(race.id, league.id, currentDriverId);
await loadRaceData();
} catch (err) {
@@ -171,8 +165,6 @@ export default function RaceDetailPage() {
setRegistering(true);
try {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
const raceService = serviceFactory.createRaceService();
await raceService.withdrawFromRace(race.id, currentDriverId);
await loadRaceData();
} catch (err) {
@@ -973,8 +965,6 @@ export default function RaceDetailPage() {
raceName={race.track}
onConfirm={async () => {
try {
const serviceFactory = new ServiceFactory(process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3001');
const raceService = serviceFactory.createRaceService();
await raceService.completeRace(race.id);
await loadRaceData();
setShowEndRaceModal(false);

View File

@@ -7,7 +7,7 @@ import ResultsTable from '@/components/races/ResultsTable';
import Button from '@/components/ui/Button';
import Card from '@/components/ui/Card';
import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId';
import { raceResultsService } from '@/lib/services/races/RaceResultsService';
import { useServices } from '@/lib/services/ServiceProvider';
import type { RaceResultsDetailViewModel } from '@/lib/view-models';
import { ArrowLeft, Calendar, Trophy, Users, Zap } from 'lucide-react';
import { useParams, useRouter } from 'next/navigation';
@@ -18,6 +18,7 @@ export default function RaceResultsPage() {
const params = useParams();
const raceId = params.id as string;
const currentDriverId = useEffectiveDriverId();
const { raceResultsService } = useServices();
const [raceData, setRaceData] = useState<RaceResultsDetailViewModel | null>(null);
const [raceSOF, setRaceSOF] = useState<number | null>(null);