'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 [isOpen, setIsOpen] = useState(controlledIsOpen ?? false); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (!dropdownRef.current || !(event.target instanceof Node)) return; if (dropdownRef.current && !dropdownRef.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]); 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 streams available
) : ( options.map((option) => (
handleSelect(option)} className={`dropdown-item ${activeOption?.id === option.id ? 'active' : ''}`} > {option.name}
)) )}
)}
); }