'use client'; import Card from '@/components/ui/Card'; import DriverIdentity from '@/components/drivers/DriverIdentity'; import { useTeamRoster } from "@/lib/hooks/team"; import { useState } from 'react'; import type { DriverViewModel } from '@/lib/view-models/DriverViewModel'; type TeamRole = 'owner' | 'admin' | 'member'; type TeamMemberRole = 'owner' | 'manager' | 'member'; interface TeamRosterProps { teamId: string; memberships: Array<{ driverId: string; driverName: string; role: 'owner' | 'manager' | 'member'; joinedAt: string; isActive: boolean; avatarUrl: string; }>; isAdmin: boolean; onRemoveMember?: (driverId: string) => void; onChangeRole?: (driverId: string, newRole: TeamRole) => void; } export default function TeamRoster({ teamId, memberships, isAdmin, onRemoveMember, onChangeRole, }: TeamRosterProps) { const [sortBy, setSortBy] = useState<'role' | 'rating' | 'name'>('rating'); // Use hook for data fetching const { data: teamMembers = [], isLoading: loading } = useTeamRoster(memberships); 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 | TeamMemberRole) => { // Convert manager to admin for display const displayRole = role === 'manager' ? 'admin' : role; return displayRole.charAt(0).toUpperCase() + displayRole.slice(1); }; function getRoleOrder(role: TeamMemberRole): number { switch (role) { case 'owner': return 0; case 'manager': 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; // Convert manager to admin for display purposes const displayRole: TeamRole = role === 'manager' ? 'admin' : (role as TeamRole); 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.
)}
); }