'use client'; import { MinimalEmptyState } from '@/ui/EmptyState'; import { TeamRosterItem } from '@/components/teams/TeamRosterItem'; import { TeamRosterList } from '@/components/teams/TeamRosterList'; import { useTeamRoster } from "@/hooks/team/useTeamRoster"; import { routes } from '@/lib/routing/RouteConfig'; import { sortMembers } from '@/lib/utilities/roster-utils'; import type { DriverViewModel } from '@/lib/view-models/DriverViewModel'; import { Button } from '@/ui/Button'; import { Card } from '@/ui/Card'; import { Heading } from '@/ui/Heading'; import { Stack } from '@/ui/Stack'; import { Select } from '@/ui/Select'; import { Text } from '@/ui/Text'; import { useMemo, useState } from 'react'; import { MemberDisplay } from '@/lib/display-objects/MemberDisplay'; import { RatingDisplay } from '@/lib/display-objects/RatingDisplay'; import { DateDisplay } from '@/lib/display-objects/DateDisplay'; export type TeamRole = 'owner' | 'admin' | 'member'; export 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; } interface TeamMember { driver: { id: string; name: string; country: string; }; role: TeamMemberRole; joinedAt: string; rating: number | null; overallRank: number | null; } 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 = useMemo(() => (role: TeamRole | TeamMemberRole) => { // Convert manager to admin for display const displayRole = role === 'manager' ? 'admin' : role; return displayRole.charAt(0).toUpperCase() + displayRole.slice(1); }, []); const sortedMembers = useMemo(() => { return sortMembers(teamMembers as unknown as TeamMember[], sortBy); }, [teamMembers, sortBy]); const teamAverageRatingLabel = useMemo(() => { if (teamMembers.length === 0) return '—'; const avg = teamMembers.reduce((sum: number, m: { rating?: number | null }) => sum + (m.rating || 0), 0) / teamMembers.length; return RatingDisplay.format(avg); }, [teamMembers]); if (loading) { return ( Loading roster... ); } return ( Team Roster {MemberDisplay.formatCount(memberships.length)} • Avg Rating:{' '} {teamAverageRatingLabel} Sort by: onChangeRole?.(driver.id, e.target.value as TeamRole) } options={[ { value: 'member', label: 'Member' }, { value: 'admin', label: 'Admin' }, ]} /> ) : undefined} /> ); })} ) : ( )} ); }