Merge pull request #4550 from xyflow/fix/fitview-trigger

Fix/fitview trigger
This commit is contained in:
Moritz Klack
2024-08-14 16:34:25 +02:00
committed by GitHub
4 changed files with 27 additions and 17 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@xyflow/react': patch
---
fix(fitView): only trigger for resize observer
@@ -25,6 +25,6 @@ export function useUpdateNodeInternals(): UpdateNodeInternals {
} }
}); });
requestAnimationFrame(() => updateNodeInternals(updates)); requestAnimationFrame(() => updateNodeInternals(updates, { triggerFitView: false }));
}, []); }, []);
} }
+20 -15
View File
@@ -77,7 +77,7 @@ const createStore = ({
// Every node gets registerd at a ResizeObserver. Whenever a node // Every node gets registerd at a ResizeObserver. Whenever a node
// changes its dimensions, this function is called to measure the // changes its dimensions, this function is called to measure the
// new dimensions and update the nodes. // new dimensions and update the nodes.
updateNodeInternals: (updates) => { updateNodeInternals: (updates, params = { triggerFitView: true }) => {
const { const {
triggerNodeChanges, triggerNodeChanges,
nodeLookup, nodeLookup,
@@ -105,23 +105,28 @@ const createStore = ({
updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin }); updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin });
// we call fitView once initially after all dimensions are set if (params.triggerFitView) {
let nextFitViewDone = fitViewDone; // we call fitView once initially after all dimensions are set
let nextFitViewDone = fitViewDone;
if (!fitViewDone && fitViewOnInit) { if (!fitViewDone && fitViewOnInit) {
nextFitViewDone = fitViewSync({ nextFitViewDone = fitViewSync({
...fitViewOnInitOptions, ...fitViewOnInitOptions,
nodes: fitViewOnInitOptions?.nodes, nodes: fitViewOnInitOptions?.nodes,
}); });
}
// here we are cirmumventing the onNodesChange handler
// in order to be able to display nodes even if the user
// has not provided an onNodesChange handler.
// Nodes are only rendered if they have a width and height
// attribute which they get from this handler.
set({ fitViewDone: nextFitViewDone });
} else {
// we always want to trigger useStore calls whenever updateNodeInternals is called
set({});
} }
// here we are cirmumventing the onNodesChange handler
// in order to be able to display nodes even if the user
// has not provided an onNodesChange handler.
// Nodes are only rendered if they have a width and height
// attribute which they get from this handler.
set({ fitViewDone: nextFitViewDone });
if (changes?.length > 0) { if (changes?.length > 0) {
if (debug) { if (debug) {
console.log('React Flow: trigger node changes', changes); console.log('React Flow: trigger node changes', changes);
+1 -1
View File
@@ -152,7 +152,7 @@ export type ReactFlowActions<NodeType extends Node, EdgeType extends Edge> = {
setNodes: (nodes: NodeType[]) => void; setNodes: (nodes: NodeType[]) => void;
setEdges: (edges: EdgeType[]) => void; setEdges: (edges: EdgeType[]) => void;
setDefaultNodesAndEdges: (nodes?: NodeType[], edges?: EdgeType[]) => void; setDefaultNodesAndEdges: (nodes?: NodeType[], edges?: EdgeType[]) => void;
updateNodeInternals: (updates: Map<string, InternalNodeUpdate>) => void; updateNodeInternals: (updates: Map<string, InternalNodeUpdate>, params?: { triggerFitView: boolean }) => void;
updateNodePositions: UpdateNodePositions; updateNodePositions: UpdateNodePositions;
resetSelectedElements: () => void; resetSelectedElements: () => void;
unselectNodesAndEdges: (params?: UnselectNodesAndEdgesParams) => void; unselectNodesAndEdges: (params?: UnselectNodesAndEdgesParams) => void;