view data fixes
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m54s
Contract Testing / contract-snapshot (pull_request) Has been skipped

This commit is contained in:
2026-01-23 13:04:05 +01:00
parent d97f50ed72
commit e22033be38
24 changed files with 605 additions and 455 deletions

View File

@@ -1,23 +1,55 @@
import type { GetDriverOutputDTO } from '@/lib/types/generated/GetDriverOutputDTO';
import { ViewModel } from "../contracts/view-models/ViewModel";
import type { DriverSummaryData } from "../view-data/LeagueDetailViewData";
import { NumberDisplay } from "../display-objects/NumberDisplay";
import { RatingDisplay } from "../display-objects/RatingDisplay";
/**
* View Model for driver summary with rating and rank
* Transform from DTO to ViewModel with UI fields
*
* Client-only UI helper built from ViewData.
*/
import { ViewModel } from "../contracts/view-models/ViewModel";
export class DriverSummaryViewModel extends ViewModel {
driver: GetDriverOutputDTO;
rating: number | null;
rank: number | null;
constructor(private readonly viewData: DriverSummaryData) {
super();
}
constructor(dto: {
driver: GetDriverOutputDTO;
rating?: number | null;
rank?: number | null;
}) {
this.driver = dto.driver;
this.rating = dto.rating ?? null;
this.rank = dto.rank ?? null;
get id(): string {
return this.viewData.driverId;
}
get name(): string {
return this.viewData.driverName;
}
get avatarUrl(): string | null {
return this.viewData.avatarUrl;
}
get rating(): number | null {
return this.viewData.rating;
}
get ratingLabel(): string {
return RatingDisplay.format(this.rating);
}
get rank(): number | null {
return this.viewData.rank;
}
get rankLabel(): string {
return this.rank === null ? '—' : NumberDisplay.format(this.rank);
}
get roleBadgeText(): string {
return this.viewData.roleBadgeText;
}
get roleBadgeClasses(): string {
return this.viewData.roleBadgeClasses;
}
get profileUrl(): string {
return this.viewData.profileUrl;
}
}