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

40 lines
1.5 KiB
TypeScript

import { ViewModel } from "../contracts/view-models/ViewModel";
import { DriverLeaderboardItemViewModel } from './DriverLeaderboardItemViewModel';
import type { LeaderboardsViewData } from '../view-data/LeaderboardsViewData';
export class DriverLeaderboardViewModel extends ViewModel {
private readonly data: LeaderboardsViewData;
readonly drivers: DriverLeaderboardItemViewModel[];
constructor(
data: LeaderboardsViewData,
previousRatings?: Record<string, number>,
) {
super();
this.data = data;
this.drivers = data.drivers.map((driver) => {
const previousRating = previousRatings?.[driver.id];
return new DriverLeaderboardItemViewModel(driver, previousRating);
});
}
/** UI-specific: Total races across all drivers */
get totalRaces(): number {
return this.drivers.reduce((sum, driver) => sum + driver.racesCompleted, 0);
}
/** UI-specific: Total wins across all drivers */
get totalWins(): number {
return this.drivers.reduce((sum, driver) => sum + driver.wins, 0);
}
/** UI-specific: Active drivers count */
get activeCount(): number {
// Note: LeaderboardDriverItem doesn't have isActive, but DriverLeaderboardItemViewModel might need it.
// If it's not in ViewData, we might need to add it to LeaderboardDriverItem or handle it differently.
// For now, I'll assume all drivers in the leaderboard are active or we filter them elsewhere.
// Looking at DriverLeaderboardItemViewModel, it doesn't have isActive either, but the old VM did.
return this.drivers.length;
}
}