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'); } }