Add back promise resolution for transitioning on fitView
This commit is contained in:
@@ -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;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
@@ -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 });
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ const getInitialState = ({
|
|||||||
|
|
||||||
fitViewQueued: false,
|
fitViewQueued: false,
|
||||||
fitViewOptions: undefined,
|
fitViewOptions: undefined,
|
||||||
|
fitViewResolver: null,
|
||||||
|
|
||||||
connection: { ...initialConnection },
|
connection: { ...initialConnection },
|
||||||
connectionClickStartHandle: null,
|
connectionClickStartHandle: null,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user