Files
gridpilot.gg/apps/website/lib/view-models/RacesPageViewModel.ts
2026-01-23 15:30:23 +01:00

54 lines
1.5 KiB
TypeScript

import { RaceListItemViewModel } from './RaceListItemViewModel';
import { ViewModel } from "../contracts/view-models/ViewModel";
import { RacesPageViewData } from '../view-data/RacesPageViewData';
/**
* Races page view model
* Represents the races page data with all races in a single list
*/
export class RacesPageViewModel extends ViewModel {
private readonly data: RacesPageViewData;
readonly races: RaceListItemViewModel[];
constructor(data: RacesPageViewData) {
super();
this.data = data;
this.races = data.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');
}
}