diff --git a/packages/web/src/hooks/useContextMenu.ts b/packages/web/src/hooks/useContextMenu.ts new file mode 100644 index 00000000..f687e4a6 --- /dev/null +++ b/packages/web/src/hooks/useContextMenu.ts @@ -0,0 +1,26 @@ +// packages/web/src/hooks/useContextMenu.ts +import { useCallback, useRef } from 'react'; +import { useContextMenuStore, type ContextMenuItem } from '../stores/contextMenuStore'; + +/** + * Returns an onContextMenu handler that opens the centralized context menu. + * + * Items are captured via a ref so the callback identity is stable regardless + * of whether the caller memoises the array. The ref is updated every render, + * so items are always fresh at event-fire time. + */ +export function useContextMenu(items: ContextMenuItem[]) { + const itemsRef = useRef(items); + itemsRef.current = items; + + const onContextMenu = useCallback((e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + useContextMenuStore.getState().open( + { x: e.clientX, y: e.clientY }, + itemsRef.current, + ); + }, []); + + return { onContextMenu }; +}