extract fitView into action
This commit is contained in:
@@ -41,11 +41,36 @@ const createStore = ({
|
|||||||
nodeOrigin?: NodeOrigin;
|
nodeOrigin?: NodeOrigin;
|
||||||
nodeExtent?: CoordinateExtent;
|
nodeExtent?: CoordinateExtent;
|
||||||
}) =>
|
}) =>
|
||||||
createWithEqualityFn<ReactFlowState>(
|
createWithEqualityFn<ReactFlowState>((set, get) => {
|
||||||
(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 }),
|
...getInitialState({ nodes, edges, width, height, fitView, nodeOrigin, nodeExtent, defaultNodes, defaultEdges }),
|
||||||
setNodes: (nodes: Node[]) => {
|
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:
|
* setNodes() is called exclusively in response to user actions:
|
||||||
* - either when the `<ReactFlow nodes>` prop is updated in the controlled ReactFlow setup,
|
* - either when the `<ReactFlow nodes>` prop is updated in the controlled ReactFlow setup,
|
||||||
@@ -62,24 +87,8 @@ const createStore = ({
|
|||||||
checkEquality: true,
|
checkEquality: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (fitViewQueued && nodesInitialized && panZoom) {
|
if (fitViewQueued && nodesInitialized) {
|
||||||
const { fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();
|
resolveFitView();
|
||||||
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 });
|
|
||||||
} else {
|
} else {
|
||||||
set({ nodes });
|
set({ nodes });
|
||||||
}
|
}
|
||||||
@@ -109,17 +118,8 @@ const createStore = ({
|
|||||||
* new dimensions and update the nodes.
|
* new dimensions and update the nodes.
|
||||||
*/
|
*/
|
||||||
updateNodeInternals: (updates) => {
|
updateNodeInternals: (updates) => {
|
||||||
const {
|
const { triggerNodeChanges, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, debug, fitViewQueued } =
|
||||||
triggerNodeChanges,
|
get();
|
||||||
nodeLookup,
|
|
||||||
parentLookup,
|
|
||||||
domNode,
|
|
||||||
nodeOrigin,
|
|
||||||
nodeExtent,
|
|
||||||
debug,
|
|
||||||
panZoom,
|
|
||||||
fitViewQueued,
|
|
||||||
} = get();
|
|
||||||
|
|
||||||
const { changes, updatedInternals } = updateNodeInternalsSystem(
|
const { changes, updatedInternals } = updateNodeInternalsSystem(
|
||||||
updates,
|
updates,
|
||||||
@@ -136,24 +136,8 @@ const createStore = ({
|
|||||||
|
|
||||||
updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent });
|
updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent });
|
||||||
|
|
||||||
if (fitViewQueued && panZoom) {
|
if (fitViewQueued) {
|
||||||
const { fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();
|
resolveFitView();
|
||||||
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 });
|
|
||||||
} else {
|
} else {
|
||||||
// we always want to trigger useStore calls whenever updateNodeInternals is called
|
// we always want to trigger useStore calls whenever updateNodeInternals is called
|
||||||
set({});
|
set({});
|
||||||
@@ -359,8 +343,7 @@ const createStore = ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
reset: () => set({ ...getInitialState() }),
|
reset: () => set({ ...getInitialState() }),
|
||||||
}),
|
};
|
||||||
Object.is
|
}, Object.is);
|
||||||
);
|
|
||||||
|
|
||||||
export { createStore };
|
export { createStore };
|
||||||
|
|||||||
Reference in New Issue
Block a user