import { useEffect, useRef } from "react"; import type { DirectiveSummary } from "../../lib/api"; interface DirectiveContextMenuProps { x: number; y: number; directive: DirectiveSummary; onClose: () => void; onStart: () => void; onPause: () => void; onArchive: () => void; onDelete: () => void; onGoToPR: () => void; } export function DirectiveContextMenu({ x, y, directive, onClose, onStart, onPause, onArchive, onDelete, onGoToPR, }: DirectiveContextMenuProps) { const menuRef = useRef(null); // Close on click outside useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { onClose(); } }; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { onClose(); } }; document.addEventListener("mousedown", handleClickOutside); document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("keydown", handleKeyDown); }; }, [onClose]); // Adjust position if menu would overflow viewport useEffect(() => { if (menuRef.current) { const rect = menuRef.current.getBoundingClientRect(); const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; if (rect.right > viewportWidth) { menuRef.current.style.left = `${x - rect.width}px`; } if (rect.bottom > viewportHeight) { menuRef.current.style.top = `${y - rect.height}px`; } } }, [x, y]); const menuItemClass = "w-full px-3 py-1.5 text-left text-xs font-mono text-[#9bc3ff] hover:bg-[rgba(117,170,252,0.1)] flex items-center gap-2"; const dividerClass = "border-t border-[rgba(117,170,252,0.2)] my-1"; const showStart = directive.status === "draft" || directive.status === "paused" || directive.status === "idle"; const showPause = directive.status === "active"; const showArchive = directive.status !== "archived"; const showGoToPR = !!directive.prUrl; return (
{/* Header showing directive title */}
{directive.title}
{/* Status actions */} {showStart && ( )} {showPause && ( )} {showArchive && ( )} {/* Go to PR link */} {showGoToPR && ( <>
)}
{/* Delete action */}
); }