import type { TeamMembership } from '@gridpilot/racing/domain/entities/Team'; import type { ITeamMembersPresenter, TeamMemberViewModel, TeamMembersViewModel, } from '@gridpilot/racing/application/presenters/ITeamMembersPresenter'; export class TeamMembersPresenter implements ITeamMembersPresenter { private viewModel: TeamMembersViewModel | null = null; present( memberships: TeamMembership[], driverNames: Record, avatarUrls: Record ): TeamMembersViewModel { const members: TeamMemberViewModel[] = memberships.map((membership) => ({ driverId: membership.driverId, driverName: driverNames[membership.driverId] ?? 'Unknown Driver', role: membership.role, joinedAt: membership.joinedAt.toISOString(), isActive: membership.isActive, avatarUrl: 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, }; return this.viewModel; } getViewModel(): TeamMembersViewModel { if (!this.viewModel) { throw new Error('Presenter has not been called yet'); } return this.viewModel; } }