import { useEffect, useRef, useState } from "react"; import { createPortal } from "react-dom"; import { Icon } from "./Icon"; interface RowMenuProps { label: string; onDuplicate?: () => void; onDelete: () => void; onToggleTitle?: () => void; titleHidden?: boolean; onToggleMargin?: () => void; marginHidden?: boolean; onOpenChange?: (open: boolean) => void; className?: string; } export function RowMenu({ label, onDuplicate, onDelete, onToggleTitle, titleHidden, onToggleMargin, marginHidden, onOpenChange, className = "" }: RowMenuProps) { const [open, setOpen] = useState(false); useEffect(() => { onOpenChange?.(open); }, [open]); const [coords, setCoords] = useState({ top: 0, right: 0 }); const btnRef = useRef(null); const popRef = useRef(null); const toggle = (e: React.MouseEvent) => { e.stopPropagation(); if (!open && btnRef.current) { const r = btnRef.current.getBoundingClientRect(); setCoords({ top: r.bottom + 4, right: window.innerWidth - r.right }); } setOpen((v) => !v); }; useEffect(() => { if (!open) return; const onDown = (e: MouseEvent) => { if (btnRef.current?.contains(e.target as Node) || popRef.current?.contains(e.target as Node)) return; setOpen(false); }; const close = () => setOpen(false); document.addEventListener("mousedown", onDown, true); document.addEventListener("scroll", close, true); window.addEventListener("resize", close); return () => { document.removeEventListener("mousedown", onDown, true); document.removeEventListener("scroll", close, true); window.removeEventListener("resize", close); }; }, [open]); const toggleTitle = (e: React.MouseEvent) => { e.stopPropagation(); setOpen(false); onToggleTitle?.(); }; const toggleMargin = (e: React.MouseEvent) => { e.stopPropagation(); setOpen(false); onToggleMargin?.(); }; const duplicate = (e: React.MouseEvent) => { e.stopPropagation(); setOpen(false); onDuplicate?.(); }; const remove = (e: React.MouseEvent) => { e.stopPropagation(); setOpen(false); onDelete(); }; return ( <> {open && createPortal(
{onToggleTitle && ( )} {onToggleMargin && ( )} {onDuplicate && ( )}
, document.body )} ); }