import { useSpaces } from "./hooks/use-spaces"; import { useState, useEffect, useRef } from "react"; import { cn } from "@/lib/utils"; interface SpacesSelectorProps { onSelecting?: (isSelecting: boolean) => void; onSpacesChange?: (spaces: any[]) => void; passRef?: React.RefObject; } export default function SpacesSelector({ onSelecting, onSpacesChange, passRef, }: SpacesSelectorProps) { const { spaces } = useSpaces(); const [isOpen, setIsOpen] = useState(false); const [selectedSpaces, setSelectedSpaces] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const dropdownRef = useRef(null); const dropdownContentRef = useRef(null); const toggleSpace = (space: any) => { const isSelected = selectedSpaces.some((s) => s.id === space.id); const newSelectedSpaces = isSelected ? selectedSpaces.filter((s) => s.id !== space.id) : [...selectedSpaces, space]; setSelectedSpaces(newSelectedSpaces); onSpacesChange?.(newSelectedSpaces); }; const removeSpace = (spaceId: string) => { const newSelectedSpaces = selectedSpaces.filter((s) => s.id !== spaceId); setSelectedSpaces(newSelectedSpaces); onSpacesChange?.(newSelectedSpaces); }; useEffect(() => { const handleClickOutside = (event: MouseEvent) => { // Get the shadow root const shadowRoot = dropdownRef.current?.getRootNode() as ShadowRoot; const target = event.composedPath()[0] as Node; // Check if click is inside either the trigger or dropdown content const isInsideTrigger = dropdownRef.current?.contains(target); const isInsideDropdown = dropdownContentRef.current?.contains(target); if (!isInsideTrigger && !isInsideDropdown) { setIsOpen(false); onSelecting?.(false); } }; // Listen on the window to catch all clicks, including those in shadow DOM window.addEventListener("click", handleClickOutside, true); return () => { window.removeEventListener("click", handleClickOutside, true); // cleanup all states setIsOpen(false); setSelectedSpaces([]); setSearchQuery(""); }; }, [onSelecting]); const filteredSpaces = spaces?.filter((space) => space.name.toLowerCase().includes(searchQuery.toLowerCase()) ); const toggleDropdown = () => { setIsOpen(!isOpen); onSelecting?.(!isOpen); }; return (
{isOpen && (
setSearchQuery(e.target.value)} className="w-full px-2 py-1.5 text-sm bg-gray-800 rounded border border-white/20 text-white placeholder-white/50 focus:outline-none focus:border-blue-500" autoFocus />
{filteredSpaces?.length === 0 && (
No spaces found
)} {filteredSpaces?.map((space) => { const isSelected = selectedSpaces.some( (s) => s.id === space.id ); return ( ); })}
)}
{selectedSpaces.length > 0 && (
{selectedSpaces.map((space) => (
{space.name}
))}
)}
); }