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}`) : ''}`) .connectionLookup.get(`${nodeId}${type ? (handleId ? `-${type}-${handleId}` : `-${type}`) : ''}`)
?.values() ?? [] ?.values() ?? []
), ),
fitView: (options: FitViewOptions<NodeType> | undefined) => { fitView: async (options: FitViewOptions<NodeType> | undefined) => {
store.setState({ fitViewQueued: true, fitViewOptions: options }); const fitViewResolver = store.getState().fitViewResolver ?? Promise.withResolvers<boolean>();
store.setState({ fitViewQueued: true, fitViewOptions: options, fitViewResolver });
batchContext.nodeQueue.push((nodes) => [...nodes]); batchContext.nodeQueue.push((nodes) => [...nodes]);
return fitViewResolver.promise;
}, },
}; };
}, []); }, []);
+6 -6
View File
@@ -62,10 +62,9 @@ const createStore = ({
checkEquality: true, checkEquality: true,
}); });
let viewportFitted = false;
if (fitViewQueued && nodesInitialized && panZoom) { if (fitViewQueued && nodesInitialized && panZoom) {
const { fitViewOptions, width, height, minZoom, maxZoom } = get(); const { fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();
viewportFitted = fitViewport( const fitViewPromise = fitViewport(
{ {
nodes: nodeLookup, nodes: nodeLookup,
width, width,
@@ -76,9 +75,10 @@ const createStore = ({
}, },
fitViewOptions fitViewOptions
); );
} fitViewPromise.then((value) => {
fitViewResolver?.resolve(value);
if (viewportFitted) { set({ fitViewResolver: null });
});
set({ nodes, fitViewQueued: false, fitViewOptions: undefined }); set({ nodes, fitViewQueued: false, fitViewOptions: undefined });
} else { } else {
set({ nodes }); set({ nodes });
+1
View File
@@ -110,6 +110,7 @@ const getInitialState = ({
fitViewQueued: false, fitViewQueued: false,
fitViewOptions: undefined, fitViewOptions: undefined,
fitViewResolver: null,
connection: { ...initialConnection }, connection: { ...initialConnection },
connectionClickStartHandle: null, connectionClickStartHandle: null,
+1 -1
View File
@@ -109,7 +109,7 @@ export type FitViewParams<NodeType extends Node = Node> = FitViewParamsBase<Node
* @public * @public
*/ */
export type FitViewOptions<NodeType extends Node = Node> = FitViewOptionsBase<NodeType>; 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> = ( export type OnInit<NodeType extends Node = Node, EdgeType extends Edge = Edge> = (
reactFlowInstance: ReactFlowInstance<NodeType, EdgeType> reactFlowInstance: ReactFlowInstance<NodeType, EdgeType>
) => void; ) => void;
+1
View File
@@ -121,6 +121,7 @@ export type ReactFlowStore<NodeType extends Node = Node, EdgeType extends Edge =
fitViewQueued: boolean; fitViewQueued: boolean;
fitViewOptions: FitViewOptions | undefined; fitViewOptions: FitViewOptions | undefined;
fitViewResolver: PromiseWithResolvers<boolean> | null;
onNodesDelete?: OnNodesDelete<NodeType>; onNodesDelete?: OnNodesDelete<NodeType>;
onEdgesDelete?: OnEdgesDelete<EdgeType>; onEdgesDelete?: OnEdgesDelete<EdgeType>;
+8 -9
View File
@@ -351,16 +351,15 @@ function getFitViewNodes<
return fitViewNodes; return fitViewNodes;
} }
export function fitViewport<Params extends FitViewParamsBase<NodeBase>, Options extends FitViewOptionsBase<NodeBase>>( export async function fitViewport<
Params extends FitViewParamsBase<NodeBase>,
Options extends FitViewOptionsBase<NodeBase>
>(
{ nodes, width, height, panZoom, minZoom, maxZoom }: Params, { nodes, width, height, panZoom, minZoom, maxZoom }: Params,
options?: Omit<Options, 'nodes' | 'includeHiddenNodes'> options?: Omit<Options, 'nodes' | 'includeHiddenNodes'>
): boolean { ): Promise<boolean> {
if (nodes.size === 0) { if (nodes.size === 0) {
return true; return Promise.resolve(true);
}
if (!panZoom) {
return false;
} }
const nodesToFit = getFitViewNodes(nodes, options); const nodesToFit = getFitViewNodes(nodes, options);
@@ -376,9 +375,9 @@ export function fitViewport<Params extends FitViewParamsBase<NodeBase>, Options
options?.padding ?? 0.1 options?.padding ?? 0.1
); );
panZoom.setViewport(viewport, { duration: options?.duration }); await panZoom.setViewport(viewport, { duration: options?.duration });
return true; return Promise.resolve(true);
} }
/** /**