import type { Team, TeamMembership } from '@gridpilot/racing/domain/entities/Team'; import type { ITeamDetailsPresenter, TeamDetailsViewModel, } from '@gridpilot/racing/application/presenters/ITeamDetailsPresenter'; export class TeamDetailsPresenter implements ITeamDetailsPresenter { private viewModel: TeamDetailsViewModel | null = null; present( team: Team, membership: TeamMembership | null, driverId: string ): TeamDetailsViewModel { const canManage = membership?.role === 'owner' || membership?.role === 'manager'; this.viewModel = { team: { id: team.id, name: team.name, tag: team.tag, description: team.description, ownerId: team.ownerId, leagues: team.leagues, specialization: team.specialization as 'endurance' | 'sprint' | 'mixed' | undefined, region: team.region, languages: team.languages, }, membership: membership ? { role: membership.role, joinedAt: membership.joinedAt.toISOString(), isActive: membership.isActive, } : null, canManage, }; return this.viewModel; } getViewModel(): TeamDetailsViewModel { if (!this.viewModel) { throw new Error('Presenter has not been called yet'); } return this.viewModel; } }