218 lines
5.1 KiB
TypeScript
218 lines
5.1 KiB
TypeScript
import type { DashboardOverviewDTO } from '@/lib/types/generated/DashboardOverviewDTO';
|
|
import type { DashboardDriverSummaryDTO } from '@/lib/types/generated/DashboardDriverSummaryDTO';
|
|
import type { DashboardRaceSummaryDTO } from '@/lib/types/generated/DashboardRaceSummaryDTO';
|
|
import type { DashboardLeagueStandingSummaryDTO } from '@/lib/types/generated/DashboardLeagueStandingSummaryDTO';
|
|
import type { DashboardFeedItemSummaryDTO } from '@/lib/types/generated/DashboardFeedItemSummaryDTO';
|
|
import type { DashboardFriendSummaryDTO } from '@/lib/types/generated/DashboardFriendSummaryDTO';
|
|
|
|
export class DashboardDriverSummaryViewModel {
|
|
constructor(private readonly dto: DashboardDriverSummaryDTO) {}
|
|
|
|
get id(): string {
|
|
return this.dto.id;
|
|
}
|
|
|
|
get name(): string {
|
|
return this.dto.name;
|
|
}
|
|
|
|
get avatarUrl(): string {
|
|
return this.dto.avatarUrl;
|
|
}
|
|
|
|
get country(): string {
|
|
return this.dto.country;
|
|
}
|
|
|
|
get totalRaces(): number {
|
|
return this.dto.totalRaces;
|
|
}
|
|
|
|
get wins(): number {
|
|
return this.dto.wins;
|
|
}
|
|
|
|
get podiums(): number {
|
|
return this.dto.podiums;
|
|
}
|
|
|
|
get rating(): number {
|
|
return this.dto.rating ?? 0;
|
|
}
|
|
|
|
get globalRank(): number {
|
|
return this.dto.globalRank ?? 0;
|
|
}
|
|
|
|
get consistency(): number {
|
|
return this.dto.consistency ?? 0;
|
|
}
|
|
}
|
|
|
|
export class DashboardRaceSummaryViewModel {
|
|
constructor(private readonly dto: DashboardRaceSummaryDTO) {}
|
|
|
|
get id(): string {
|
|
return this.dto.id;
|
|
}
|
|
|
|
get leagueId(): string {
|
|
return (this.dto as any).leagueId ?? '';
|
|
}
|
|
|
|
get leagueName(): string {
|
|
return (this.dto as any).leagueName ?? '';
|
|
}
|
|
|
|
get track(): string {
|
|
return this.dto.track;
|
|
}
|
|
|
|
get car(): string {
|
|
return this.dto.car;
|
|
}
|
|
|
|
get scheduledAt(): Date {
|
|
return new Date(this.dto.scheduledAt);
|
|
}
|
|
|
|
get status(): string {
|
|
return this.dto.status;
|
|
}
|
|
|
|
get isMyLeague(): boolean {
|
|
return this.dto.isMyLeague;
|
|
}
|
|
}
|
|
|
|
export class DashboardLeagueStandingSummaryViewModel {
|
|
constructor(private readonly dto: DashboardLeagueStandingSummaryDTO) {}
|
|
|
|
get leagueId(): string {
|
|
return this.dto.leagueId;
|
|
}
|
|
|
|
get leagueName(): string {
|
|
return this.dto.leagueName;
|
|
}
|
|
|
|
get position(): number {
|
|
return this.dto.position;
|
|
}
|
|
|
|
get points(): number {
|
|
return this.dto.points;
|
|
}
|
|
|
|
get totalDrivers(): number {
|
|
return this.dto.totalDrivers;
|
|
}
|
|
}
|
|
|
|
export class DashboardFeedItemSummaryViewModel {
|
|
constructor(private readonly dto: DashboardFeedItemSummaryDTO) {}
|
|
|
|
get id(): string {
|
|
return this.dto.id;
|
|
}
|
|
|
|
get type(): string {
|
|
return this.dto.type;
|
|
}
|
|
|
|
get headline(): string {
|
|
return this.dto.headline;
|
|
}
|
|
|
|
get body(): string | undefined {
|
|
return this.dto.body;
|
|
}
|
|
|
|
get timestamp(): Date {
|
|
return new Date(this.dto.timestamp);
|
|
}
|
|
|
|
get ctaHref(): string | undefined {
|
|
return this.dto.ctaHref;
|
|
}
|
|
|
|
get ctaLabel(): string | undefined {
|
|
return this.dto.ctaLabel;
|
|
}
|
|
}
|
|
|
|
export class DashboardFriendSummaryViewModel {
|
|
constructor(private readonly dto: DashboardFriendSummaryDTO) {}
|
|
|
|
get id(): string {
|
|
return this.dto.id;
|
|
}
|
|
|
|
get name(): string {
|
|
return this.dto.name;
|
|
}
|
|
|
|
get avatarUrl(): string {
|
|
return this.dto.avatarUrl;
|
|
}
|
|
|
|
get country(): string {
|
|
return this.dto.country;
|
|
}
|
|
}
|
|
|
|
export class DashboardOverviewViewModel {
|
|
constructor(private readonly dto: DashboardOverviewDTO) {}
|
|
|
|
get currentDriver(): DashboardDriverSummaryViewModel {
|
|
// DTO uses optional property; enforce a consistent object for the UI
|
|
return new DashboardDriverSummaryViewModel(
|
|
(this.dto as any).currentDriver ?? {
|
|
id: '',
|
|
name: '',
|
|
country: '',
|
|
avatarUrl: '',
|
|
totalRaces: 0,
|
|
wins: 0,
|
|
podiums: 0,
|
|
},
|
|
);
|
|
}
|
|
|
|
get nextRace(): DashboardRaceSummaryViewModel | null {
|
|
const nextRace = (this.dto as any).nextRace;
|
|
return nextRace ? new DashboardRaceSummaryViewModel(nextRace) : null;
|
|
}
|
|
|
|
get upcomingRaces(): DashboardRaceSummaryViewModel[] {
|
|
const upcomingRaces = (this.dto as any).upcomingRaces ?? [];
|
|
return upcomingRaces.map((r: any) => new DashboardRaceSummaryViewModel(r));
|
|
}
|
|
|
|
get leagueStandings(): DashboardLeagueStandingSummaryViewModel[] {
|
|
const leagueStandings = (this.dto as any).leagueStandingsSummaries ?? (this.dto as any).leagueStandings ?? [];
|
|
return leagueStandings.map((s: any) => new DashboardLeagueStandingSummaryViewModel(s));
|
|
}
|
|
|
|
get feedItems(): DashboardFeedItemSummaryViewModel[] {
|
|
const feedItems = (this.dto as any).feedSummary?.items ?? (this.dto as any).feedItems ?? [];
|
|
return feedItems.map((i: any) => new DashboardFeedItemSummaryViewModel(i));
|
|
}
|
|
|
|
get friends(): DashboardFriendSummaryViewModel[] {
|
|
const friends = (this.dto as any).friends ?? [];
|
|
return friends.map((f: any) => new DashboardFriendSummaryViewModel(f));
|
|
}
|
|
|
|
get activeLeaguesCount(): number {
|
|
return (this.dto as any).activeLeaguesCount ?? 0;
|
|
}
|
|
}
|
|
|
|
export {
|
|
DashboardDriverSummaryViewModel as DriverViewModel,
|
|
DashboardRaceSummaryViewModel as RaceViewModel,
|
|
DashboardLeagueStandingSummaryViewModel as LeagueStandingViewModel,
|
|
DashboardFriendSummaryViewModel as FriendViewModel,
|
|
};
|