69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import { LeagueStandingDTO } from '../types/generated/LeagueStandingDTO';
|
|
|
|
export class StandingEntryViewModel {
|
|
driverId: string;
|
|
position: number;
|
|
points: number;
|
|
wins: number;
|
|
podiums: number;
|
|
races: number;
|
|
|
|
private leaderPoints: number;
|
|
private nextPoints: number;
|
|
private currentUserId: string;
|
|
private previousPosition?: number;
|
|
|
|
constructor(dto: LeagueStandingDTO, leaderPoints: number, nextPoints: number, currentUserId: string, previousPosition?: number) {
|
|
this.driverId = dto.driverId;
|
|
this.position = dto.position;
|
|
this.points = dto.points;
|
|
this.wins = dto.wins ?? 0;
|
|
this.podiums = dto.podiums ?? 0;
|
|
this.races = dto.races ?? 0;
|
|
this.leaderPoints = leaderPoints;
|
|
this.nextPoints = nextPoints;
|
|
this.currentUserId = currentUserId;
|
|
this.previousPosition = previousPosition;
|
|
}
|
|
|
|
/** UI-specific: Badge for position display */
|
|
get positionBadge(): string {
|
|
return this.position.toString();
|
|
}
|
|
|
|
// Note: The generated DTO is incomplete
|
|
// These fields will need to be added when the OpenAPI spec is updated
|
|
driver?: any;
|
|
|
|
/** UI-specific: Points difference to leader */
|
|
get pointsGapToLeader(): number {
|
|
return this.points - this.leaderPoints;
|
|
}
|
|
|
|
/** UI-specific: Points difference to next position */
|
|
get pointsGapToNext(): number {
|
|
return this.points - this.nextPoints;
|
|
}
|
|
|
|
/** UI-specific: Whether this entry is the current user */
|
|
get isCurrentUser(): boolean {
|
|
return this.driverId === this.currentUserId;
|
|
}
|
|
|
|
/** UI-specific: Trend compared to previous */
|
|
get trend(): 'up' | 'down' | 'same' {
|
|
if (!this.previousPosition) return 'same';
|
|
if (this.position < this.previousPosition) return 'up';
|
|
if (this.position > this.previousPosition) return 'down';
|
|
return 'same';
|
|
}
|
|
|
|
/** UI-specific: Arrow for trend */
|
|
get trendArrow(): string {
|
|
switch (this.trend) {
|
|
case 'up': return '↑';
|
|
case 'down': return '↓';
|
|
default: return '-';
|
|
}
|
|
}
|
|
} |