import { useEffect, useRef } from "react"; import type { Order, OrderStatus } from "../../lib/api"; interface OrderContextMenuProps { x: number; y: number; order: Order; onClose: () => void; onChangeStatus: (status: OrderStatus) => void; onDelete: () => void; onGoToDirective: () => void; } export function OrderContextMenu({ x, y, order, onClose, onChangeStatus, onDelete, onGoToDirective, }: OrderContextMenuProps) { 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 showOpen = order.status !== "open"; const showInProgress = order.status !== "in_progress"; const showUnderReview = order.status !== "under_review"; const showDone = order.status !== "done"; const showArchive = order.status !== "archived"; const showGoToDirective = !!order.directiveId; return (
{/* Header showing order title */}
{order.title}
{/* Status actions */} {showOpen && ( )} {showInProgress && ( )} {showUnderReview && ( )} {showDone && ( )} {showArchive && ( )} {/* Directive link */} {showGoToDirective && ( <>
)}
{/* Delete action */}
); }