This commit is contained in:
2025-12-11 00:57:32 +01:00
parent 1303a14493
commit 6a427eab57
112 changed files with 6148 additions and 2272 deletions

View File

@@ -4,33 +4,35 @@ import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import Button from '../ui/Button';
import Input from '../ui/Input';
import { Race } from '@gridpilot/racing/domain/entities/Race';
import { League } from '@gridpilot/racing/domain/entities/League';
import { SessionType } from '@gridpilot/racing/domain/entities/Race';
import { getRaceRepository, getLeagueRepository } from '../../lib/di-container';
import { InMemoryRaceRepository } from '@gridpilot/racing/infrastructure/repositories/InMemoryRaceRepository';
import {
loadScheduleRaceFormLeagues,
scheduleRaceFromForm,
type ScheduleRaceFormData,
type ScheduledRaceViewModel,
type LeagueOptionViewModel,
} from '@/lib/presenters/ScheduleRaceFormPresenter';
interface ScheduleRaceFormProps {
preSelectedLeagueId?: string;
onSuccess?: (race: Race) => void;
onSuccess?: (race: ScheduledRaceViewModel) => void;
onCancel?: () => void;
}
export default function ScheduleRaceForm({
preSelectedLeagueId,
export default function ScheduleRaceForm({
preSelectedLeagueId,
onSuccess,
onCancel
onCancel
}: ScheduleRaceFormProps) {
const router = useRouter();
const [leagues, setLeagues] = useState<League[]>([]);
const [leagues, setLeagues] = useState<LeagueOptionViewModel[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [formData, setFormData] = useState({
const [formData, setFormData] = useState<ScheduleRaceFormData>({
leagueId: preSelectedLeagueId || '',
track: '',
car: '',
sessionType: 'race' as SessionType,
sessionType: 'race',
scheduledDate: '',
scheduledTime: '',
});
@@ -39,11 +41,10 @@ export default function ScheduleRaceForm({
useEffect(() => {
const loadLeagues = async () => {
const leagueRepo = getLeagueRepository();
const allLeagues = await leagueRepo.findAll();
const allLeagues = await loadScheduleRaceFormLeagues();
setLeagues(allLeagues);
};
loadLeagues();
void loadLeagues();
}, []);
const validateForm = (): boolean => {
@@ -94,20 +95,7 @@ export default function ScheduleRaceForm({
setError(null);
try {
const raceRepo = getRaceRepository();
const scheduledAt = new Date(`${formData.scheduledDate}T${formData.scheduledTime}`);
const race = Race.create({
id: InMemoryRaceRepository.generateId(),
leagueId: formData.leagueId,
track: formData.track.trim(),
car: formData.car.trim(),
sessionType: formData.sessionType,
scheduledAt,
status: 'scheduled',
});
const createdRace = await raceRepo.create(race);
const createdRace = await scheduleRaceFromForm(formData);
if (onSuccess) {
onSuccess(createdRace);
@@ -187,7 +175,7 @@ export default function ScheduleRaceForm({
`}
>
<option value="">Select a league</option>
{leagues.map(league => (
{leagues.map((league: any) => (
<option key={league.id} value={league.id}>
{league.name}
</option>
@@ -241,7 +229,7 @@ export default function ScheduleRaceForm({
</label>
<select
value={formData.sessionType}
onChange={(e) => handleChange('sessionType', e.target.value)}
onChange={(e) => handleChange('sessionType', e.target.value as SessionType)}
className="w-full px-4 py-2 bg-deep-graphite border border-charcoal-outline rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-primary-blue"
>
<option value="practice">Practice</option>