41 lines
1.3 KiB
TypeScript
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;
|
|
}
|
|
} |