From 6fb8801960a6f3e921ec87ab35e7750078b549b5 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Fri, 20 Mar 2026 18:24:44 +0100 Subject: [PATCH] feat: add useContextMenu consumer hook --- packages/web/src/hooks/useContextMenu.ts | 26 ++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 packages/web/src/hooks/useContextMenu.ts 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 }; +}