'use client'; import { useRef, useEffect, useState } from 'react'; type DropdownProps = { options: Array<{ id: number; name: string }>; activeId: number | null; onSelect: (id: number) => void; label: string; isOpen?: boolean; onToggle?: (isOpen: boolean) => void; }; export default function Dropdown({ options, activeId, onSelect, label, isOpen: controlledIsOpen, onToggle, }: DropdownProps) { const dropdownRef = useRef(null); const buttonRef = useRef(null); const [isOpen, setIsOpen] = useState(controlledIsOpen ?? false); const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0, width: 0 }); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (!dropdownRef.current || !(event.target instanceof Node)) return; if (dropdownRef.current && !dropdownRef.current.contains(event.target) && buttonRef.current && !buttonRef.current.contains(event.target)) { if (onToggle) onToggle(false); else setIsOpen(false); } }; if (controlledIsOpen || isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [controlledIsOpen, isOpen, onToggle]); useEffect(() => { if ((controlledIsOpen ?? isOpen) && buttonRef.current) { const rect = buttonRef.current.getBoundingClientRect(); setDropdownPosition({ top: rect.bottom + window.scrollY, left: rect.left + window.scrollX, width: rect.width }); } }, [controlledIsOpen, isOpen]); const activeOption = options.find((option) => option.id === activeId) || null; const handleSelect = (option: { id: number }) => { onSelect(option.id); if (onToggle) onToggle(false); else setIsOpen(false); }; const toggleDropdown = () => { if (onToggle) onToggle(!isOpen); else setIsOpen((prev) => !prev); }; return ( <>
{(controlledIsOpen ?? isOpen) && (
{options.length === 0 ? (
No teams available
) : ( options.map((option) => (
handleSelect(option)} className={`dropdown-item ${activeOption?.id === option.id ? 'active' : ''}`} > {option.name}
)) )}
)} ); }