Files
gridpilot.gg/apps/website/lib/presenters/TeamDetailsPresenter.ts
2025-12-10 18:28:32 +01:00

48 lines
1.3 KiB
TypeScript

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;
}
}