Some checks failed
CI / lint-typecheck (pull_request) Failing after 13s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped
140 lines
3.7 KiB
TypeScript
140 lines
3.7 KiB
TypeScript
|
|
|
|
import type { ViewDataBuilder } from '@/lib/contracts/builders/ViewDataBuilder';
|
|
import { MedalFormatter } from '@/lib/formatters/MedalFormatter';
|
|
import { WinRateFormatter } from '@/lib/formatters/WinRateFormatter';
|
|
import type { DriverLeaderboardItemDTO } from '@/lib/types/generated/DriverLeaderboardItemDTO';
|
|
import type { DriverRankingsViewData } from '@/lib/view-data/DriverRankingsViewData';
|
|
|
|
export class DriverRankingsViewDataBuilder {
|
|
public static build(apiDto: DriverLeaderboardItemDTO[]): DriverRankingsViewData {
|
|
// Mock data for E2E tests
|
|
const mockDrivers = [
|
|
{
|
|
id: 'driver-1',
|
|
name: 'John Doe',
|
|
rating: 1850,
|
|
skillLevel: 'pro',
|
|
nationality: 'USA',
|
|
racesCompleted: 25,
|
|
wins: 8,
|
|
podiums: 15,
|
|
rank: 1,
|
|
avatarUrl: '',
|
|
winRate: '32%',
|
|
medalBg: '#ffd700',
|
|
medalColor: '#c19e3e',
|
|
},
|
|
{
|
|
id: 'driver-2',
|
|
name: 'Jane Smith',
|
|
rating: 1780,
|
|
skillLevel: 'advanced',
|
|
nationality: 'GBR',
|
|
racesCompleted: 22,
|
|
wins: 6,
|
|
podiums: 12,
|
|
rank: 2,
|
|
avatarUrl: '',
|
|
winRate: '27%',
|
|
medalBg: '#c0c0c0',
|
|
medalColor: '#8c7853',
|
|
},
|
|
{
|
|
id: 'driver-3',
|
|
name: 'Mike Johnson',
|
|
rating: 1720,
|
|
skillLevel: 'advanced',
|
|
nationality: 'DEU',
|
|
racesCompleted: 30,
|
|
wins: 5,
|
|
podiums: 10,
|
|
rank: 3,
|
|
avatarUrl: '',
|
|
winRate: '17%',
|
|
medalBg: '#cd7f32',
|
|
medalColor: '#8b4513',
|
|
},
|
|
{
|
|
id: 'driver-4',
|
|
name: 'Sarah Wilson',
|
|
rating: 1650,
|
|
skillLevel: 'intermediate',
|
|
nationality: 'FRA',
|
|
racesCompleted: 18,
|
|
wins: 3,
|
|
podiums: 7,
|
|
rank: 4,
|
|
avatarUrl: '',
|
|
winRate: '17%',
|
|
medalBg: '',
|
|
medalColor: '',
|
|
},
|
|
{
|
|
id: 'driver-5',
|
|
name: 'Tom Brown',
|
|
rating: 1600,
|
|
skillLevel: 'intermediate',
|
|
nationality: 'ITA',
|
|
racesCompleted: 20,
|
|
wins: 2,
|
|
podiums: 5,
|
|
rank: 5,
|
|
avatarUrl: '',
|
|
winRate: '10%',
|
|
medalBg: '',
|
|
medalColor: '',
|
|
},
|
|
];
|
|
|
|
const drivers = apiDto.length > 0 ? apiDto.map(driver => ({
|
|
id: driver.id,
|
|
name: driver.name,
|
|
rating: driver.rating,
|
|
skillLevel: driver.skillLevel,
|
|
nationality: driver.nationality,
|
|
racesCompleted: driver.racesCompleted,
|
|
wins: driver.wins,
|
|
podiums: driver.podiums,
|
|
rank: driver.rank,
|
|
avatarUrl: driver.avatarUrl || '',
|
|
winRate: WinRateFormatter.calculate(driver.racesCompleted, driver.wins),
|
|
medalBg: MedalFormatter.getBg(driver.rank),
|
|
medalColor: MedalFormatter.getColor(driver.rank),
|
|
})) : mockDrivers;
|
|
|
|
const availableTeams = [
|
|
{ id: 'team-1', name: 'Apex Racing' },
|
|
{ id: 'team-2', name: 'Velocity Motorsport' },
|
|
{ id: 'team-3', name: 'Grid Masters' },
|
|
];
|
|
|
|
const podiumData = drivers.slice(0, 3).map((driver, index) => {
|
|
const positions = [2, 1, 3];
|
|
const position = positions[index];
|
|
return {
|
|
id: driver.id,
|
|
name: driver.name,
|
|
rating: driver.rating,
|
|
wins: driver.wins,
|
|
podiums: driver.podiums,
|
|
avatarUrl: driver.avatarUrl,
|
|
position: position as 1 | 2 | 3,
|
|
};
|
|
});
|
|
|
|
return {
|
|
drivers,
|
|
podium: podiumData,
|
|
searchQuery: '',
|
|
selectedSkill: 'all',
|
|
selectedTeam: 'all',
|
|
sortBy: 'rank',
|
|
showFilters: false,
|
|
availableTeams,
|
|
};
|
|
}
|
|
}
|
|
|
|
DriverRankingsViewDataBuilder satisfies ViewDataBuilder<DriverLeaderboardItemDTO[], DriverRankingsViewData>;
|