import React, { useState, useRef, useEffect } from "react"; import { ChevronsUpDown, Plus, Search, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { Team } from "@/types"; interface MultiTeamSelectorProps { teams: Team[]; selectedTeams: Team[]; onSelect: (team: Team) => void; onRemove: (teamId: number) => void; placeholder?: string; disabled?: boolean; className?: string; } const MultiTeamSelector = ({ teams, selectedTeams, onSelect, onRemove, placeholder = "Select teams to add", disabled = false, className }: MultiTeamSelectorProps) => { const [isOpen, setIsOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const dropdownRef = useRef(null); // Filter out already selected teams const availableTeams = teams.filter(team => !selectedTeams.some(selected => selected.id === team.id) ); // Filter teams based on search query const filteredTeams = availableTeams.filter(team => team.name.toLowerCase().includes(searchQuery.toLowerCase()) || (team.description && team.description.toLowerCase().includes(searchQuery.toLowerCase())) ); // Handle click outside to close dropdown useEffect(() => { function handleClickOutside(event: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); // Handle selecting a team const handleSelectTeam = (team: Team) => { onSelect(team); setSearchQuery(""); if (availableTeams.length <= 1) { setIsOpen(false); } }; return (
{selectedTeams.length > 0 && (
{selectedTeams.map(team => ( {team.name.slice(0, 2).toUpperCase()} {team.name} ))}
)} {isOpen && (
setSearchQuery(e.target.value)} onClick={(e) => e.stopPropagation()} />
{filteredTeams.length === 0 ? (
{searchQuery ? "No matching teams found" : "No more teams available to add"}
) : ( filteredTeams.map(team => (
handleSelectTeam(team)} >
{team.name.slice(0, 2).toUpperCase()}

{team.name}

{team.description && (

{team.description}

)}
)) )}
)}
); }; export default MultiTeamSelector;