import { Stack, ActionIcon, Text, Group, Loader, } from "@mantine/core"; import { TrashIcon } from "@phosphor-icons/react"; import { useCallback, memo } from "react"; import { useFreeAgents } from "../queries"; import PlayerAvatar from "@/components/player-avatar"; import { PlayerInfo, Player } from "@/features/players/types"; import Typeahead, { TypeaheadOption } from "@/components/typeahead"; import { usePlayers } from "@/features/players/queries"; import useAdminEnrollPlayer from "../hooks/use-admin-enroll-player"; import useAdminUnenrollPlayer from "../hooks/use-admin-unenroll-player"; interface EditEnrolledPlayersProps { tournamentId: string; } interface PlayerItemProps { player: PlayerInfo; onRemove: (playerId: string) => void; disabled: boolean; } const PlayerItem = memo(({ player, onRemove, disabled }: PlayerItemProps) => { return ( {player.first_name} {player.last_name} onRemove(player.id)} disabled={disabled} size="sm" > ); }); const EditEnrolledPlayers = ({ tournamentId }: EditEnrolledPlayersProps) => { const { data: freeAgents = [], isLoading } = useFreeAgents(tournamentId); const { data: allPlayers = [] } = usePlayers(); const { mutate: removeFreeAgent, isPending: isRemoving } = useAdminUnenrollPlayer(); const { mutate: enrollPlayer, isPending: isEnrolling } = useAdminEnrollPlayer(); const handleRemovePlayer = useCallback( (playerId: string) => { removeFreeAgent({ tournamentId, playerId }); }, [removeFreeAgent, tournamentId] ); const handleEnrollPlayer = useCallback( (option: TypeaheadOption) => { enrollPlayer({ tournamentId, playerId: option.data.id }); }, [enrollPlayer, tournamentId] ); const enrolledPlayers = freeAgents.map(agent => agent.player).filter((p): p is PlayerInfo => p !== undefined); const enrolledPlayerIds = new Set(enrolledPlayers.map(p => p.id)); const hasEnrolledPlayers = enrolledPlayers.length > 0; const searchPlayers = async (query: string): Promise[]> => { if (!query.trim()) return []; const filtered = allPlayers.filter((player: Player) => { const fullName = `${player.first_name} ${player.last_name}`.toLowerCase(); return fullName.includes(query.toLowerCase()) && !enrolledPlayerIds.has(player.id); }); return filtered.map((player: Player) => ({ id: player.id, data: player })); }; const renderPlayerOption = (option: TypeaheadOption) => { const player = option.data; return ( {player.first_name} {player.last_name} ); }; const formatPlayer = (option: TypeaheadOption) => { return `${option.data.first_name} ${option.data.last_name}`; }; return ( Add Player Enrolled Players {enrolledPlayers.length} players {isLoading ? ( ) : !hasEnrolledPlayers ? ( No players enrolled yet ) : ( {enrolledPlayers.map((player) => ( ))} )} ); }; export default EditEnrolledPlayers;