import React, {ReactNode, useEffect, useRef, useState} from "react"; import {LucideIcon} from "lucide-react"; interface DropdownItem { label: string; icon?: LucideIcon; onClick: () => void; variant?: 'default' | 'danger'; } interface DropdownProps { trigger: ReactNode; items: DropdownItem[]; align?: 'left' | 'right'; } export default function Dropdown( { trigger, items, align = 'left', }: DropdownProps): React.JSX.Element { const [isOpen, setIsOpen] = useState(false); const dropdownRef: React.RefObject = useRef(null); useEffect(function handleClickOutside() { function onClickOutside(event: MouseEvent): void { if (dropdownRef.current && event.target instanceof Node && !dropdownRef.current.contains(event.target)) { setIsOpen(false); } } document.addEventListener('mousedown', onClickOutside); return (): void => document.removeEventListener('mousedown', onClickOutside); }, []); function handleItemClick(item: DropdownItem): void { item.onClick(); setIsOpen(false); } return (
setIsOpen(!isOpen)}> {trigger}
{isOpen && (
{items.map(function renderDropdownItem(item: DropdownItem, index: number) { const isDanger: boolean = item.variant === 'danger'; const ItemIcon: LucideIcon | undefined = item.icon; return ( ); })}
)}
); }