From 62f674b15df23ce75f13521ec7c3563c0eae6112 Mon Sep 17 00:00:00 2001 From: Pouzor Date: Sat, 18 Apr 2026 21:09:49 +0200 Subject: [PATCH] fix: extract handleNodeDoubleClick into useCallback and add tests Replace inline arrow with named useCallback handler to avoid creating a new fn ref on every render. Add two CanvasContainer tests covering the double-click callback and the no-op path when prop is omitted. --- frontend/src/App.tsx | 6 +++++- .../canvas/__tests__/CanvasContainer.test.tsx | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index c3ff8df..fdd1b1c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -343,6 +343,10 @@ export default function App() { setEditEdgeId(edge.id) }, []) + const handleNodeDoubleClick = useCallback((node: Node) => { + handleEditNode(node.id) + }, [handleEditNode]) + const handleEdgeUpdate = useCallback((data: EdgeData) => { if (!editEdgeId) return snapshotHistory() @@ -400,7 +404,7 @@ export default function App() { handleEditNode(node.id)} + onNodeDoubleClick={handleNodeDoubleClick} onNodeDragStart={snapshotHistory} onOpenPending={(deviceId) => { setHighlightPendingId(undefined) diff --git a/frontend/src/components/canvas/__tests__/CanvasContainer.test.tsx b/frontend/src/components/canvas/__tests__/CanvasContainer.test.tsx index a80ced1..332e983 100644 --- a/frontend/src/components/canvas/__tests__/CanvasContainer.test.tsx +++ b/frontend/src/components/canvas/__tests__/CanvasContainer.test.tsx @@ -104,6 +104,24 @@ describe('CanvasContainer', () => { }).not.toThrow() }) + // ── Node double-click ───────────────────────────────────────────────────── + + it('calls onNodeDoubleClick prop when a node is double-clicked', () => { + const onNodeDoubleClick = vi.fn() + const node = makeNode('n1') + render() + ;(rfProps.onNodeDoubleClick as (...args: unknown[]) => unknown)({} as MouseEvent, node) + expect(onNodeDoubleClick).toHaveBeenCalledWith(node) + }) + + it('does not throw when onNodeDoubleClick is not provided', () => { + const node = makeNode('n1') + render() + expect(() => { + ;(rfProps.onNodeDoubleClick as (...args: unknown[]) => unknown)({} as MouseEvent, node) + }).not.toThrow() + }) + // ── Connection validation ───────────────────────────────────────────────── it('isValidConnection returns false for self-connections', () => {