43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import type { TeamJoinRequest } from '@gridpilot/racing/domain/entities/Team';
|
|
import type {
|
|
ITeamJoinRequestsPresenter,
|
|
TeamJoinRequestViewModel,
|
|
TeamJoinRequestsViewModel,
|
|
} from '@gridpilot/racing/application/presenters/ITeamJoinRequestsPresenter';
|
|
|
|
export class TeamJoinRequestsPresenter implements ITeamJoinRequestsPresenter {
|
|
private viewModel: TeamJoinRequestsViewModel | null = null;
|
|
|
|
present(
|
|
requests: TeamJoinRequest[],
|
|
driverNames: Record<string, string>,
|
|
avatarUrls: Record<string, string>
|
|
): TeamJoinRequestsViewModel {
|
|
const requestItems: TeamJoinRequestViewModel[] = requests.map((request) => ({
|
|
requestId: request.id,
|
|
driverId: request.driverId,
|
|
driverName: driverNames[request.driverId] ?? 'Unknown Driver',
|
|
teamId: request.teamId,
|
|
status: request.status,
|
|
requestedAt: request.requestedAt.toISOString(),
|
|
avatarUrl: avatarUrls[request.driverId] ?? '',
|
|
}));
|
|
|
|
const pendingCount = requestItems.filter((r) => r.status === 'pending').length;
|
|
|
|
this.viewModel = {
|
|
requests: requestItems,
|
|
pendingCount,
|
|
totalCount: requestItems.length,
|
|
};
|
|
|
|
return this.viewModel;
|
|
}
|
|
|
|
getViewModel(): TeamJoinRequestsViewModel {
|
|
if (!this.viewModel) {
|
|
throw new Error('Presenter has not been called yet');
|
|
}
|
|
return this.viewModel;
|
|
}
|
|
} |