fix data flow issues
This commit is contained in:
@@ -1,62 +1,65 @@
|
||||
// Note: No generated DTO available for RaceListItem yet
|
||||
// DTO matching the backend RacesPageDataRaceDTO
|
||||
interface RaceListItemDTO {
|
||||
id: string;
|
||||
name: string;
|
||||
track: string;
|
||||
car: string;
|
||||
scheduledAt: string;
|
||||
status: string;
|
||||
leagueId: string;
|
||||
leagueName: string;
|
||||
scheduledTime: string;
|
||||
status: string;
|
||||
trackName?: string;
|
||||
strengthOfField: number | null;
|
||||
isUpcoming: boolean;
|
||||
isLive: boolean;
|
||||
isPast: boolean;
|
||||
}
|
||||
|
||||
export class RaceListItemViewModel {
|
||||
id: string;
|
||||
name: string;
|
||||
track: string;
|
||||
car: string;
|
||||
scheduledAt: string;
|
||||
status: string;
|
||||
leagueId: string;
|
||||
leagueName: string;
|
||||
scheduledTime: string;
|
||||
status: string;
|
||||
trackName?: string;
|
||||
strengthOfField: number | null;
|
||||
isUpcoming: boolean;
|
||||
isLive: boolean;
|
||||
isPast: boolean;
|
||||
|
||||
constructor(dto: RaceListItemDTO) {
|
||||
this.id = dto.id;
|
||||
this.name = dto.name;
|
||||
this.track = dto.track;
|
||||
this.car = dto.car;
|
||||
this.scheduledAt = dto.scheduledAt;
|
||||
this.status = dto.status;
|
||||
this.leagueId = dto.leagueId;
|
||||
this.leagueName = dto.leagueName;
|
||||
this.scheduledTime = dto.scheduledTime;
|
||||
this.status = dto.status;
|
||||
if (dto.trackName !== undefined) this.trackName = dto.trackName;
|
||||
this.strengthOfField = dto.strengthOfField;
|
||||
this.isUpcoming = dto.isUpcoming;
|
||||
this.isLive = dto.isLive;
|
||||
this.isPast = dto.isPast;
|
||||
}
|
||||
|
||||
/** UI-specific: Formatted scheduled time */
|
||||
get formattedScheduledTime(): string {
|
||||
return new Date(this.scheduledTime).toLocaleString();
|
||||
return new Date(this.scheduledAt).toLocaleString();
|
||||
}
|
||||
|
||||
/** UI-specific: Badge variant for status */
|
||||
get statusBadgeVariant(): string {
|
||||
switch (this.status) {
|
||||
case 'upcoming': return 'info';
|
||||
case 'live': return 'success';
|
||||
case 'finished': return 'secondary';
|
||||
case 'scheduled': return 'info';
|
||||
case 'running': return 'success';
|
||||
case 'completed': return 'secondary';
|
||||
case 'cancelled': return 'danger';
|
||||
default: return 'default';
|
||||
}
|
||||
}
|
||||
|
||||
/** UI-specific: Whether race is upcoming */
|
||||
get isUpcoming(): boolean {
|
||||
return this.status === 'upcoming';
|
||||
}
|
||||
|
||||
/** UI-specific: Whether race is live */
|
||||
get isLive(): boolean {
|
||||
return this.status === 'live';
|
||||
}
|
||||
|
||||
/** UI-specific: Time until start in minutes */
|
||||
get timeUntilStart(): number {
|
||||
const now = new Date();
|
||||
const scheduled = new Date(this.scheduledTime);
|
||||
const scheduled = new Date(this.scheduledAt);
|
||||
return Math.max(0, Math.floor((scheduled.getTime() - now.getTime()) / (1000 * 60)));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user