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;