'use client'; import { useState, useEffect } from 'react'; import Card from '@/components/ui/Card'; import DriverIdentity from '@/components/drivers/DriverIdentity'; import { useServices } from '@/lib/services/ServiceProvider'; import type { TeamMemberViewModel } from '@/lib/view-models/TeamMemberViewModel'; type TeamRole = 'owner' | 'admin' | 'member'; type TeamMembershipSummary = Pick; interface TeamRosterProps { teamId: string; memberships: TeamMembershipSummary[]; isAdmin: boolean; onRemoveMember?: (driverId: string) => void; onChangeRole?: (driverId: string, newRole: TeamRole) => void; } export default function TeamRoster({ teamId, memberships, isAdmin, onRemoveMember, onChangeRole, }: TeamRosterProps) { const { teamService, driverService } = useServices(); const [teamMembers, setTeamMembers] = useState([]); const [loading, setLoading] = useState(true); const [sortBy, setSortBy] = useState<'role' | 'rating' | 'name'>('rating'); useEffect(() => { const load = async () => { setLoading(true); try { // Get driver details for each membership const membersWithDetails = await Promise.all( memberships.map(async (m) => { const driver = await driverService.findById(m.driverId); return { driver: driver || { id: m.driverId, name: 'Unknown Driver', country: 'Unknown', position: 'N/A', races: '0', impressions: '0', team: 'None' }, role: m.role, joinedAt: m.joinedAt, rating: null, // DriverDTO doesn't include rating overallRank: null, // DriverDTO doesn't include overallRank }; }) ); setTeamMembers(membersWithDetails); } catch (error) { console.error('Failed to load team roster:', error); } finally { setLoading(false); } }; void load(); }, [memberships, teamService, driverService]); const getRoleBadgeColor = (role: TeamRole) => { switch (role) { case 'owner': return 'bg-warning-amber/20 text-warning-amber'; case 'admin': return 'bg-primary-blue/20 text-primary-blue'; default: return 'bg-charcoal-outline text-gray-300'; } }; const getRoleLabel = (role: TeamRole) => { return role.charAt(0).toUpperCase() + role.slice(1); }; function getRoleOrder(role: TeamRole): number { switch (role) { case 'owner': return 0; case 'admin': return 1; case 'member': return 2; default: return 3; } } const sortedMembers = [...teamMembers].sort((a, b) => { switch (sortBy) { case 'rating': { const ratingA = a.rating ?? 0; const ratingB = b.rating ?? 0; return ratingB - ratingA; } case 'role': { return getRoleOrder(a.role) - getRoleOrder(b.role); } case 'name': { return a.driver.name.localeCompare(b.driver.name); } default: return 0; } }); const teamAverageRating = teamMembers.length > 0 ? teamMembers.reduce((sum, m) => sum + (m.rating || 0), 0) / teamMembers.length : 0; if (loading) { return (
Loading roster...
); } return (

Team Roster

{memberships.length} {memberships.length === 1 ? 'member' : 'members'} • Avg Rating:{' '} {teamAverageRating}

{sortedMembers.map((member) => { const { driver, role, joinedAt, rating, overallRank } = member; const canManageMembership = isAdmin && role !== 'owner'; return (
{driver.country} • Joined {new Date(joinedAt).toLocaleDateString()} } size="md" /> {rating !== null && (
{rating}
Rating
{overallRank !== null && (
#{overallRank}
Rank
)}
)} {canManageMembership && (
)}
); })}
{memberships.length === 0 && (
No team members yet.
)}
); }