From 6acb709bef20c9663e453956567f6e08a553b289 Mon Sep 17 00:00:00 2001 From: peterkogo Date: Tue, 18 Mar 2025 09:30:29 +0100 Subject: [PATCH] extract fitView into action --- packages/react/src/store/index.ts | 89 +++++++++++++------------------ 1 file changed, 36 insertions(+), 53 deletions(-) diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index 68d1dd24..8b219d27 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -41,11 +41,36 @@ const createStore = ({ nodeOrigin?: NodeOrigin; nodeExtent?: CoordinateExtent; }) => - createWithEqualityFn( - (set, get) => ({ + createWithEqualityFn((set, get) => { + function resolveFitView() { + const { nodeLookup, panZoom, fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get(); + + if (!panZoom) { + return; + } + + const fitViewPromise = fitViewport( + { + nodes: nodeLookup, + width, + height, + panZoom, + minZoom, + maxZoom, + }, + fitViewOptions + ); + fitViewPromise.then((value) => { + fitViewResolver?.resolve(value); + set({ fitViewResolver: null }); + }); + set({ nodes, fitViewQueued: false, fitViewOptions: undefined }); + } + + return { ...getInitialState({ nodes, edges, width, height, fitView, nodeOrigin, nodeExtent, defaultNodes, defaultEdges }), setNodes: (nodes: Node[]) => { - const { nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, fitViewQueued, panZoom } = get(); + const { nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, fitViewQueued } = get(); /* * setNodes() is called exclusively in response to user actions: * - either when the `` prop is updated in the controlled ReactFlow setup, @@ -62,24 +87,8 @@ const createStore = ({ checkEquality: true, }); - if (fitViewQueued && nodesInitialized && panZoom) { - const { fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get(); - const fitViewPromise = fitViewport( - { - nodes: nodeLookup, - width, - height, - panZoom, - minZoom, - maxZoom, - }, - fitViewOptions - ); - fitViewPromise.then((value) => { - fitViewResolver?.resolve(value); - set({ fitViewResolver: null }); - }); - set({ nodes, fitViewQueued: false, fitViewOptions: undefined }); + if (fitViewQueued && nodesInitialized) { + resolveFitView(); } else { set({ nodes }); } @@ -109,17 +118,8 @@ const createStore = ({ * new dimensions and update the nodes. */ updateNodeInternals: (updates) => { - const { - triggerNodeChanges, - nodeLookup, - parentLookup, - domNode, - nodeOrigin, - nodeExtent, - debug, - panZoom, - fitViewQueued, - } = get(); + const { triggerNodeChanges, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, debug, fitViewQueued } = + get(); const { changes, updatedInternals } = updateNodeInternalsSystem( updates, @@ -136,24 +136,8 @@ const createStore = ({ updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent }); - if (fitViewQueued && panZoom) { - const { fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get(); - const fitViewPromise = fitViewport( - { - nodes: nodeLookup, - width, - height, - panZoom, - minZoom, - maxZoom, - }, - fitViewOptions - ); - fitViewPromise.then((value) => { - fitViewResolver?.resolve(value); - set({ fitViewResolver: null }); - }); - set({ nodes, fitViewQueued: false, fitViewOptions: undefined }); + if (fitViewQueued) { + resolveFitView(); } else { // we always want to trigger useStore calls whenever updateNodeInternals is called set({}); @@ -359,8 +343,7 @@ const createStore = ({ }, reset: () => set({ ...getInitialState() }), - }), - Object.is - ); + }; + }, Object.is); export { createStore };