'use client'; import Card from '@/components/ui/Card'; import type { MembershipRole } from '@/lib/types/MembershipRole'; import { useParams } from 'next/navigation'; import { useMemo } from 'react'; import { useLeagueRosterJoinRequests, useLeagueRosterMembers, useApproveJoinRequest, useRejectJoinRequest, useUpdateMemberRole, useRemoveMember, } from "@/lib/hooks/league/useLeagueRosterAdmin"; const ROLE_OPTIONS: MembershipRole[] = ['owner', 'admin', 'steward', 'member']; export function RosterAdminPage() { const params = useParams(); const leagueId = params.id as string; // Fetch data using React-Query + DI const { data: joinRequests = [], isLoading: loadingJoinRequests, refetch: refetchJoinRequests, } = useLeagueRosterJoinRequests(leagueId); const { data: members = [], isLoading: loadingMembers, refetch: refetchMembers, } = useLeagueRosterMembers(leagueId); const loading = loadingJoinRequests || loadingMembers; // Mutations const approveMutation = useApproveJoinRequest({ onSuccess: () => refetchJoinRequests(), }); const rejectMutation = useRejectJoinRequest({ onSuccess: () => refetchJoinRequests(), }); const updateRoleMutation = useUpdateMemberRole({ onError: () => refetchMembers(), // Refetch on error to restore state }); const removeMemberMutation = useRemoveMember({ onSuccess: () => refetchMembers(), }); const pendingCountLabel = useMemo(() => { return joinRequests.length === 1 ? '1 request' : `${joinRequests.length} requests`; }, [joinRequests.length]); const handleApprove = async (joinRequestId: string) => { await approveMutation.mutateAsync({ leagueId, joinRequestId }); }; const handleReject = async (joinRequestId: string) => { await rejectMutation.mutateAsync({ leagueId, joinRequestId }); }; const handleRoleChange = async (driverId: string, newRole: MembershipRole) => { await updateRoleMutation.mutateAsync({ leagueId, driverId, role: newRole }); }; const handleRemove = async (driverId: string) => { await removeMemberMutation.mutateAsync({ leagueId, 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.
)}
); }