import React, { useState, useRef, useEffect } from "react"; import { Check, ChevronsUpDown, 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 { cn } from "@/lib/utils"; import { Team } from "@/types"; interface TeamSelectorProps { teams: Team[]; selectedTeam: string; onSelect: (teamId: string) => void; placeholder?: string; disabled?: boolean; className?: string; } const TeamSelector = ({ teams, selectedTeam, onSelect, placeholder = "Select a team", disabled = false, className }: TeamSelectorProps) => { const [isOpen, setIsOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const dropdownRef = useRef(null); // Find the currently selected team const selected = teams.find(team => team.id.toString() === selectedTeam); // Filter teams based on search query const filteredTeams = teams.filter(team => team.name.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 = (teamId: string) => { onSelect(teamId); setIsOpen(false); setSearchQuery(""); }; // Handle clearing selection const handleClearSelection = (e: React.MouseEvent) => { e.stopPropagation(); onSelect(""); }; return (
)}
{isOpen && (
setSearchQuery(e.target.value)} onClick={(e) => e.stopPropagation()} />
{filteredTeams.length === 0 ? (
No teams found
) : ( filteredTeams.map(team => (
handleSelectTeam(team.id.toString())} >
{team.name.slice(0, 2).toUpperCase()}

{team.name}

{team.description && (

{team.description}

)}
{team.id.toString() === selectedTeam && ( )}
)) )}
)} ); }; export default TeamSelector;