website refactor

This commit is contained in:
2026-01-18 00:17:01 +01:00
parent 69d4cce7f1
commit 4b66c682a0
18 changed files with 847 additions and 87 deletions

View File

@@ -1,16 +1,5 @@
export interface DriverProfileDriverSummaryViewModel {
id: string;
name: string;
country: string;
avatarUrl: string;
iracingId: string | null;
joinedAt: string;
rating: number | null;
globalRank: number | null;
consistency: number | null;
bio: string | null;
totalDrivers: number | null;
}
import { DriverProfileDriverSummaryViewModel } from "./DriverProfileDriverSummaryViewModel";
export type { DriverProfileDriverSummaryViewModel };
export interface DriverProfileStatsViewModel {
totalRaces: number;

View File

@@ -1,3 +1,6 @@
import { DriverViewModel as SharedDriverViewModel } from "./DriverViewModel";
import { RaceViewModel as SharedRaceViewModel } from "./RaceViewModel";
/**
* League Detail View Model
*
@@ -5,13 +8,13 @@
*/
export class LeagueDetailViewModel {
league: LeagueViewModel;
drivers: DriverViewModel[];
races: RaceViewModel[];
drivers: SharedDriverViewModel[];
races: SharedRaceViewModel[];
constructor(data: { league: unknown; drivers: unknown[]; races: unknown[] }) {
this.league = new LeagueViewModel(data.league);
this.drivers = data.drivers.map(driver => new DriverViewModel(driver));
this.races = data.races.map(race => new RaceViewModel(race));
this.drivers = data.drivers.map(driver => new SharedDriverViewModel(driver as any));
this.races = data.races.map(race => new SharedRaceViewModel(race as any));
}
}
@@ -96,55 +99,3 @@ export class LeagueViewModel {
return configs[this.tier];
}
}
export class DriverViewModel {
id: string;
name: string;
country: string;
position: number;
races: number;
impressions: number;
team: string;
constructor(data: unknown) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const d = data as any;
this.id = d.id;
this.name = d.name;
this.country = d.country;
this.position = d.position;
this.races = d.races;
this.impressions = d.impressions;
this.team = d.team;
}
get formattedImpressions(): string {
return this.impressions.toLocaleString();
}
}
export class RaceViewModel {
id: string;
name: string;
date: Date;
views: number;
status: 'upcoming' | 'completed';
constructor(data: unknown) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const d = data as any;
this.id = d.id;
this.name = d.name;
this.date = new Date(d.date);
this.views = d.views;
this.status = d.status;
}
get formattedDate(): string {
return this.date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
}
get formattedViews(): string {
return this.views.toLocaleString();
}
}