Files
gridpilot.gg/apps/website/lib/presenters/TeamMembersPresenter.ts
2025-12-11 21:06:25 +01:00

41 lines
1.3 KiB
TypeScript

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