import React, { useState, useRef, useEffect } from "react"; import { MoreHorizontal } from "lucide-react"; import { clsx } from "clsx"; export interface MoreMenuItem { label: string; icon?: React.ReactNode; onClick: () => void; variant?: "default" | "danger"; disabled?: boolean; } interface MoreMenuProps { items: MoreMenuItem[]; className?: string; } export default function MoreMenu({ items, className }: MoreMenuProps) { const [isOpen, setIsOpen] = useState(false); const buttonRef = useRef(null); const menuRef = useRef(null); useEffect(() => { if (!isOpen) return; const handleClickOutside = (e: MouseEvent) => { if ( menuRef.current && !menuRef.current.contains(e.target as Node) && buttonRef.current && !buttonRef.current.contains(e.target as Node) ) { setIsOpen(false); } }; const handleScroll = () => setIsOpen(false); const handleEscape = (e: KeyboardEvent) => { if (e.key === "Escape") setIsOpen(false); }; document.addEventListener("mousedown", handleClickOutside); document.addEventListener("scroll", handleScroll, true); document.addEventListener("keydown", handleEscape); return () => { document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("scroll", handleScroll, true); document.removeEventListener("keydown", handleEscape); }; }, [isOpen]); if (items.length === 0) return null; return (
{isOpen && (
{items.map((item, i) => ( ))}
)}
); }