Files
gridpilot.gg/apps/website/lib/view-models/TeamDetailsViewModel.ts
2025-12-18 13:48:35 +01:00

70 lines
1.7 KiB
TypeScript

import { TeamMemberViewModel } from './TeamMemberViewModel';
// Note: No generated DTO available for TeamDetails yet
interface DriverDTO {
id: string;
name: string;
avatarUrl?: string;
iracingId?: string;
rating?: number;
}
interface TeamMemberDTO {
driverId: string;
driver?: DriverDTO;
role: string;
joinedAt: string;
}
interface TeamDetailsDTO {
id: string;
name: string;
description?: string;
logoUrl?: string;
memberCount: number;
ownerId: string;
members: TeamMemberDTO[];
}
export class TeamDetailsViewModel {
id: string;
name: string;
description?: string;
logoUrl?: string;
memberCount: number;
ownerId: string;
members: TeamMemberViewModel[];
private currentUserId: string;
constructor(dto: TeamDetailsDTO, currentUserId: string) {
this.id = dto.id;
this.name = dto.name;
this.description = dto.description;
this.logoUrl = dto.logoUrl;
this.memberCount = dto.memberCount;
this.ownerId = dto.ownerId;
this.members = dto.members.map(m => new TeamMemberViewModel(m, currentUserId, dto.ownerId));
this.currentUserId = currentUserId;
}
/** UI-specific: Whether current user is owner */
get isOwner(): boolean {
return this.currentUserId === this.ownerId;
}
/** UI-specific: Whether can add members */
get canAddMembers(): boolean {
return this.isOwner && this.memberCount < 10; // Assuming max 10
}
/** UI-specific: Member management actions available */
get memberActionsAvailable(): boolean {
return this.isOwner;
}
/** UI-specific: Team status */
get teamStatus(): string {
if (this.memberCount < 5) return 'Recruiting';
if (this.memberCount < 10) return 'Active';
return 'Full';
}
}