'use client'; import Card from '@/components/ui/Card'; import type { LeagueAdminRosterJoinRequestViewModel } from '@/lib/view-models/LeagueAdminRosterJoinRequestViewModel'; import type { LeagueAdminRosterMemberViewModel } from '@/lib/view-models/LeagueAdminRosterMemberViewModel'; import type { MembershipRole } from '@/lib/types/MembershipRole'; import { useServices } from '@/lib/services/ServiceProvider'; import { useParams } from 'next/navigation'; import { useEffect, useMemo, useState } from 'react'; const ROLE_OPTIONS: MembershipRole[] = ['owner', 'admin', 'steward', 'member']; export function RosterAdminPage() { const params = useParams(); const leagueId = params.id as string; const { leagueService } = useServices(); const [loading, setLoading] = useState(true); const [joinRequests, setJoinRequests] = useState([]); const [members, setMembers] = useState([]); const loadRoster = async () => { setLoading(true); try { const [requestsVm, membersVm] = await Promise.all([ leagueService.getAdminRosterJoinRequests(leagueId), leagueService.getAdminRosterMembers(leagueId), ]); setJoinRequests(requestsVm); setMembers(membersVm); } finally { setLoading(false); } }; useEffect(() => { void loadRoster(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [leagueId]); const pendingCountLabel = useMemo(() => { return joinRequests.length === 1 ? '1 request' : `${joinRequests.length} requests`; }, [joinRequests.length]); const handleApprove = async (joinRequestId: string) => { await leagueService.approveJoinRequest(leagueId, joinRequestId); setJoinRequests((prev) => prev.filter((r) => r.id !== joinRequestId)); }; const handleReject = async (joinRequestId: string) => { await leagueService.rejectJoinRequest(leagueId, joinRequestId); setJoinRequests((prev) => prev.filter((r) => r.id !== joinRequestId)); }; const handleRoleChange = async (driverId: string, newRole: MembershipRole) => { setMembers((prev) => prev.map((m) => (m.driverId === driverId ? { ...m, role: newRole } : m))); const result = await leagueService.updateMemberRole(leagueId, driverId, newRole); if (!result.success) { await loadRoster(); } }; const handleRemove = async (driverId: string) => { await leagueService.removeMember(leagueId, driverId); setMembers((prev) => prev.filter((m) => m.driverId !== driverId)); }; return (

Roster Admin

Manage join requests and member roles.

Pending join requests

{pendingCountLabel}

{loading ? (
Loading…
) : joinRequests.length ? (
{joinRequests.map((req) => (

{req.driverName}

{req.requestedAtIso}

{req.message ?

{req.message}

: null}
))}
) : (
No pending join requests.
)}

Members

{loading ? (
Loading…
) : members.length ? (
{members.map((member) => (

{member.driverName}

{member.joinedAtIso}

))}
) : (
No members found.
)}
); }