65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import { RaceListItemViewModel } from './RaceListItemViewModel';
|
|
|
|
// DTO matching the backend RacesPageDataDTO
|
|
interface RacesPageDTO {
|
|
races: Array<{
|
|
id: string;
|
|
track: string;
|
|
car: string;
|
|
scheduledAt: string;
|
|
status: string;
|
|
leagueId: string;
|
|
leagueName: string;
|
|
strengthOfField: number | null;
|
|
isUpcoming: boolean;
|
|
isLive: boolean;
|
|
isPast: boolean;
|
|
}>;
|
|
}
|
|
|
|
/**
|
|
* Races page view model
|
|
* Represents the races page data with all races in a single list
|
|
*/
|
|
export class RacesPageViewModel {
|
|
races: RaceListItemViewModel[];
|
|
|
|
constructor(dto: RacesPageDTO) {
|
|
this.races = dto.races.map(r => new RaceListItemViewModel(r));
|
|
}
|
|
|
|
/** UI-specific: Total races */
|
|
get totalCount(): number {
|
|
return this.races.length;
|
|
}
|
|
|
|
/** UI-specific: Upcoming races */
|
|
get upcomingRaces(): RaceListItemViewModel[] {
|
|
return this.races.filter(r => r.isUpcoming);
|
|
}
|
|
|
|
/** UI-specific: Live races */
|
|
get liveRaces(): RaceListItemViewModel[] {
|
|
return this.races.filter(r => r.isLive);
|
|
}
|
|
|
|
/** UI-specific: Past races */
|
|
get pastRaces(): RaceListItemViewModel[] {
|
|
return this.races.filter(r => r.isPast);
|
|
}
|
|
|
|
/** UI-specific: Scheduled races */
|
|
get scheduledRaces(): RaceListItemViewModel[] {
|
|
return this.races.filter(r => r.status === 'scheduled');
|
|
}
|
|
|
|
/** UI-specific: Running races */
|
|
get runningRaces(): RaceListItemViewModel[] {
|
|
return this.races.filter(r => r.status === 'running');
|
|
}
|
|
|
|
/** UI-specific: Completed races */
|
|
get completedRaces(): RaceListItemViewModel[] {
|
|
return this.races.filter(r => r.status === 'completed');
|
|
}
|
|
} |