import type { ITeamMembersPresenter, TeamMemberViewModel, TeamMembersViewModel, TeamMembersResultDTO, } from '@gridpilot/racing/application/presenters/ITeamMembersPresenter'; export class TeamMembersPresenter implements ITeamMembersPresenter { private viewModel: TeamMembersViewModel | null = null; reset(): void { this.viewModel = null; } present(input: TeamMembersResultDTO): void { const members: TeamMemberViewModel[] = input.memberships.map((membership) => ({ driverId: membership.driverId, driverName: input.driverNames[membership.driverId] ?? 'Unknown Driver', role: membership.role === 'driver' ? 'member' : membership.role, joinedAt: membership.joinedAt.toISOString(), isActive: membership.status === 'active', avatarUrl: input.avatarUrls[membership.driverId] ?? '', })); const ownerCount = members.filter((m) => m.role === 'owner').length; const managerCount = members.filter((m) => m.role === 'manager').length; const memberCount = members.filter((m) => m.role === 'member').length; this.viewModel = { members, totalCount: members.length, ownerCount, managerCount, memberCount, }; } getViewModel(): TeamMembersViewModel | null { return this.viewModel; } }