import { EllipsisVertical } from "lucide-react"; import { type ReactNode, useEffect, useRef, useState } from "react"; import { Button } from "./button"; export interface OverflowMenuItem { readonly icon: ReactNode; readonly label: string; readonly onClick: () => void; readonly disabled?: boolean; } interface OverflowMenuProps { readonly items: readonly OverflowMenuItem[]; } export function OverflowMenu({ items }: OverflowMenuProps) { const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { if (!open) return; function handleMouseDown(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) { setOpen(false); } } function handleKeyDown(e: KeyboardEvent) { if (e.key === "Escape") setOpen(false); } document.addEventListener("mousedown", handleMouseDown); document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("mousedown", handleMouseDown); document.removeEventListener("keydown", handleKeyDown); }; }, [open]); return (
{!!open && (
{items.map((item) => ( ))}
)}
); }