Files
gridpilot.gg/apps/website/lib/presenters/TeamDetailPresenter.ts
2026-01-12 01:01:49 +01:00

48 lines
1.7 KiB
TypeScript

import type { TeamDetailPageDto } from '@/lib/page-queries/TeamDetailPageQuery';
import type { TeamDetailViewData, TeamDetailData, TeamMemberData } from '@/templates/TeamDetailViewData';
/**
* TeamDetailPresenter - Client-side presenter for team detail page
* Transforms PageQuery DTO into ViewData for the template
* Deterministic; no hooks; no side effects
*/
export class TeamDetailPresenter {
static createViewData(pageDto: TeamDetailPageDto): TeamDetailViewData {
const team: TeamDetailData = {
id: pageDto.team.id,
name: pageDto.team.name,
tag: pageDto.team.tag,
description: pageDto.team.description,
ownerId: pageDto.team.ownerId,
leagues: pageDto.team.leagues,
createdAt: pageDto.team.createdAt,
specialization: pageDto.team.specialization,
region: pageDto.team.region,
languages: pageDto.team.languages,
category: pageDto.team.category,
membership: pageDto.team.membership,
canManage: pageDto.team.canManage,
};
const memberships: TeamMemberData[] = pageDto.memberships.map(membership => ({
driverId: membership.driverId,
driverName: membership.driverName,
role: membership.role,
joinedAt: membership.joinedAt,
isActive: membership.isActive,
avatarUrl: membership.avatarUrl,
}));
// Calculate isAdmin based on current driver's role
const currentDriverMembership = memberships.find(m => m.driverId === pageDto.currentDriverId);
const isAdmin = currentDriverMembership?.role === 'owner' || currentDriverMembership?.role === 'manager';
return {
team,
memberships,
currentDriverId: pageDto.currentDriverId,
isAdmin,
};
}
}