Add back promise resolution for transitioning on fitView

This commit is contained in:
peterkogo
2025-03-05 15:00:44 +01:00
parent ee1ef205eb
commit f208223400
6 changed files with 21 additions and 18 deletions
+4 -2
View File
@@ -279,9 +279,11 @@ export function useReactFlow<NodeType extends Node = Node, EdgeType extends Edge
.connectionLookup.get(`${nodeId}${type ? (handleId ? `-${type}-${handleId}` : `-${type}`) : ''}`)
?.values() ?? []
),
fitView: (options: FitViewOptions<NodeType> | undefined) => {
store.setState({ fitViewQueued: true, fitViewOptions: options });
fitView: async (options: FitViewOptions<NodeType> | undefined) => {
const fitViewResolver = store.getState().fitViewResolver ?? Promise.withResolvers<boolean>();
store.setState({ fitViewQueued: true, fitViewOptions: options, fitViewResolver });
batchContext.nodeQueue.push((nodes) => [...nodes]);
return fitViewResolver.promise;
},
};
}, []);
+6 -6
View File
@@ -62,10 +62,9 @@ const createStore = ({
checkEquality: true,
});
let viewportFitted = false;
if (fitViewQueued && nodesInitialized && panZoom) {
const { fitViewOptions, width, height, minZoom, maxZoom } = get();
viewportFitted = fitViewport(
const { fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();
const fitViewPromise = fitViewport(
{
nodes: nodeLookup,
width,
@@ -76,9 +75,10 @@ const createStore = ({
},
fitViewOptions
);
}
if (viewportFitted) {
fitViewPromise.then((value) => {
fitViewResolver?.resolve(value);
set({ fitViewResolver: null });
});
set({ nodes, fitViewQueued: false, fitViewOptions: undefined });
} else {
set({ nodes });
+1
View File
@@ -110,6 +110,7 @@ const getInitialState = ({
fitViewQueued: false,
fitViewOptions: undefined,
fitViewResolver: null,
connection: { ...initialConnection },
connectionClickStartHandle: null,
+1 -1
View File
@@ -109,7 +109,7 @@ export type FitViewParams<NodeType extends Node = Node> = FitViewParamsBase<Node
* @public
*/
export type FitViewOptions<NodeType extends Node = Node> = FitViewOptionsBase<NodeType>;
export type FitView<NodeType extends Node = Node> = (fitViewOptions?: FitViewOptions<NodeType>) => void;
export type FitView<NodeType extends Node = Node> = (fitViewOptions?: FitViewOptions<NodeType>) => Promise<boolean>;
export type OnInit<NodeType extends Node = Node, EdgeType extends Edge = Edge> = (
reactFlowInstance: ReactFlowInstance<NodeType, EdgeType>
) => void;
+1
View File
@@ -121,6 +121,7 @@ export type ReactFlowStore<NodeType extends Node = Node, EdgeType extends Edge =
fitViewQueued: boolean;
fitViewOptions: FitViewOptions | undefined;
fitViewResolver: PromiseWithResolvers<boolean> | null;
onNodesDelete?: OnNodesDelete<NodeType>;
onEdgesDelete?: OnEdgesDelete<EdgeType>;