Dont call onNodesChange when there are no changes & call setNodes instead

This commit is contained in:
peterkogo
2025-03-31 11:52:43 +02:00
parent f92e0e51dc
commit b1502dc2dc
@@ -28,7 +28,7 @@ export function BatchProvider<NodeType extends Node = Node, EdgeType extends Edg
const store = useStoreApi<NodeType, EdgeType>(); const store = useStoreApi<NodeType, EdgeType>();
const nodeQueueHandler = useCallback((queueItems: QueueItem<NodeType>[]) => { const nodeQueueHandler = useCallback((queueItems: QueueItem<NodeType>[]) => {
const { nodes = [], setNodes, hasDefaultNodes, onNodesChange, nodeLookup } = store.getState(); const { nodes = [], setNodes, hasDefaultNodes, onNodesChange, nodeLookup, fitViewQueued } = store.getState();
/* /*
* This is essentially an `Array.reduce` in imperative clothing. Processing * This is essentially an `Array.reduce` in imperative clothing. Processing
@@ -43,12 +43,17 @@ export function BatchProvider<NodeType extends Node = Node, EdgeType extends Edg
if (hasDefaultNodes) { if (hasDefaultNodes) {
setNodes(next); setNodes(next);
} else if (onNodesChange) { } else if (onNodesChange) {
onNodesChange( const changes = getElementsDiffChanges({
getElementsDiffChanges({ items: next,
items: next, lookup: nodeLookup,
lookup: nodeLookup, }) as NodeChange<NodeType>[];
}) as NodeChange<NodeType>[] if (changes.length > 0) {
); onNodesChange(changes);
} else if (fitViewQueued) {
// If there are no changes to the nodes, we still need to call setNodes
// to trigger a re-render and fitView.
setNodes(next);
}
} }
}, []); }, []);
const nodeQueue = useQueue<NodeType>(nodeQueueHandler); const nodeQueue = useQueue<NodeType>(nodeQueueHandler);