40 lines
1.5 KiB
TypeScript
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;
|
|
}
|
|
}
|