From 66998fa8e2b605401ed6bdddf53227209c01eaf1 Mon Sep 17 00:00:00 2001 From: moklick Date: Wed, 9 Oct 2024 17:08:40 +0200 Subject: [PATCH 1/2] fix(react): use internal nodes for deselecting node #4716 --- packages/react/src/store/index.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index ea06fb8b..c4dc42b6 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -20,7 +20,6 @@ import { import { applyEdgeChanges, applyNodeChanges, createSelectionChange, getSelectionChanges } from '../utils/changes'; import getInitialState from './initialState'; import type { ReactFlowState, Node, Edge, UnselectNodesAndEdgesParams, FitViewOptions } from '../types'; - const createStore = ({ nodes, edges, @@ -238,12 +237,17 @@ const createStore = ({ triggerNodeChanges(getSelectionChanges(nodeLookup, new Set(), true)); }, unselectNodesAndEdges: ({ nodes, edges }: UnselectNodesAndEdgesParams = {}) => { - const { edges: storeEdges, nodes: storeNodes, triggerNodeChanges, triggerEdgeChanges } = get(); + const { edges: storeEdges, nodes: storeNodes, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get(); const nodesToUnselect = nodes ? nodes : storeNodes; const edgesToUnselect = edges ? edges : storeEdges; - const nodeChanges = nodesToUnselect.map((n) => { - n.selected = false; + const internalNode = nodeLookup.get(n.id); + if (internalNode) { + // we need to unselect the internal node that was selected previously before we + // send the change to the user to prevent it to be selected while dragging the new node + internalNode.selected = false; + } + return createSelectionChange(n.id, false); }); const edgeChanges = edgesToUnselect.map((edge) => createSelectionChange(edge.id, false)); From e816bb6953486e37dd39d93252aa9b94fe5d4ec1 Mon Sep 17 00:00:00 2001 From: moklick Date: Wed, 9 Oct 2024 17:11:27 +0200 Subject: [PATCH 2/2] chore(changesets): add --- .changeset/stale-owls-turn.md | 5 +++++ packages/react/src/store/index.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/stale-owls-turn.md diff --git a/.changeset/stale-owls-turn.md b/.changeset/stale-owls-turn.md new file mode 100644 index 00000000..60687a4d --- /dev/null +++ b/.changeset/stale-owls-turn.md @@ -0,0 +1,5 @@ +--- +'@xyflow/react': patch +--- + +Fix internal behaviour that mutated user nodes which led to an issue with Redux and immer diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index c4dc42b6..067f4093 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -20,6 +20,7 @@ import { import { applyEdgeChanges, applyNodeChanges, createSelectionChange, getSelectionChanges } from '../utils/changes'; import getInitialState from './initialState'; import type { ReactFlowState, Node, Edge, UnselectNodesAndEdgesParams, FitViewOptions } from '../types'; + const createStore = ({ nodes, edges,