'use client'; import { Card } from '@/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'; import { Box } from '@/ui/Box'; import { Stack } from '@/ui/Stack'; import { Text } from '@/ui/Text'; import { Heading } from '@/ui/Heading'; import { Select } from '@/ui/Select'; import { Surface } from '@/ui/Surface'; import { Badge } from '@/ui/Badge'; import { Button } from '@/ui/Button'; 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 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 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: number, m: any) => 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.toFixed(0)} Sort by: onChangeRole?.(driver.id, e.target.value as TeamRole) } options={[ { value: 'member', label: 'Member' }, { value: 'admin', label: 'Admin' }, ]} className="text-sm" /> )} ); })} {memberships.length === 0 && ( No team members yet. )} ); }