fix(react): uncontrolled flows with Provider
This commit is contained in:
@@ -26,7 +26,6 @@ export function ReactFlowProvider({
|
|||||||
fitView?: boolean;
|
fitView?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const storeRef = useRef<UseBoundStoreWithEqualityFn<StoreApi<ReactFlowState>> | null>(null);
|
const storeRef = useRef<UseBoundStoreWithEqualityFn<StoreApi<ReactFlowState>> | null>(null);
|
||||||
|
|
||||||
if (!storeRef.current) {
|
if (!storeRef.current) {
|
||||||
storeRef.current = createRFStore({
|
storeRef.current = createRFStore({
|
||||||
nodes: initialNodes,
|
nodes: initialNodes,
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ import { initNodeOrigin } from '../../container/ReactFlow';
|
|||||||
const reactFlowFieldsToTrack = [
|
const reactFlowFieldsToTrack = [
|
||||||
'nodes',
|
'nodes',
|
||||||
'edges',
|
'edges',
|
||||||
|
'defaultNodes',
|
||||||
|
'defaultEdges',
|
||||||
'onConnect',
|
'onConnect',
|
||||||
'onConnectStart',
|
'onConnectStart',
|
||||||
'onConnectEnd',
|
'onConnectEnd',
|
||||||
@@ -79,16 +81,24 @@ const selector = (s: ReactFlowState) => ({
|
|||||||
setTranslateExtent: s.setTranslateExtent,
|
setTranslateExtent: s.setTranslateExtent,
|
||||||
setNodeExtent: s.setNodeExtent,
|
setNodeExtent: s.setNodeExtent,
|
||||||
reset: s.reset,
|
reset: s.reset,
|
||||||
|
setDefaultNodesAndEdges: s.setDefaultNodesAndEdges,
|
||||||
});
|
});
|
||||||
|
|
||||||
export function StoreUpdater(props: StoreUpdaterProps) {
|
export function StoreUpdater(props: StoreUpdaterProps) {
|
||||||
const { setNodes, setEdges, setMinZoom, setMaxZoom, setTranslateExtent, setNodeExtent, reset } = useStore(
|
const {
|
||||||
selector,
|
setNodes,
|
||||||
shallow
|
setEdges,
|
||||||
);
|
setMinZoom,
|
||||||
|
setMaxZoom,
|
||||||
|
setTranslateExtent,
|
||||||
|
setNodeExtent,
|
||||||
|
reset,
|
||||||
|
setDefaultNodesAndEdges,
|
||||||
|
} = useStore(selector, shallow);
|
||||||
const store = useStoreApi();
|
const store = useStoreApi();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
setDefaultNodesAndEdges(props.defaultNodes, props.defaultEdges);
|
||||||
return () => {
|
return () => {
|
||||||
reset();
|
reset();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -242,6 +242,8 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
|
|||||||
<StoreUpdater
|
<StoreUpdater
|
||||||
nodes={nodes}
|
nodes={nodes}
|
||||||
edges={edges}
|
edges={edges}
|
||||||
|
defaultNodes={defaultNodes}
|
||||||
|
defaultEdges={defaultEdges}
|
||||||
onConnect={onConnect}
|
onConnect={onConnect}
|
||||||
onConnectStart={onConnectStart}
|
onConnectStart={onConnectStart}
|
||||||
onConnectEnd={onConnectEnd}
|
onConnectEnd={onConnectEnd}
|
||||||
|
|||||||
@@ -63,6 +63,18 @@ const createRFStore = ({
|
|||||||
|
|
||||||
set({ edges });
|
set({ edges });
|
||||||
},
|
},
|
||||||
|
setDefaultNodesAndEdges: (nodes?: Node[], edges?: Edge[]) => {
|
||||||
|
if (nodes) {
|
||||||
|
const { setNodes } = get();
|
||||||
|
setNodes(nodes);
|
||||||
|
set({ hasDefaultNodes: true });
|
||||||
|
}
|
||||||
|
if (edges) {
|
||||||
|
const { setEdges } = get();
|
||||||
|
setEdges(edges);
|
||||||
|
set({ hasDefaultEdges: true });
|
||||||
|
}
|
||||||
|
},
|
||||||
// Every node gets registerd at a ResizeObserver. Whenever a node
|
// Every node gets registerd at a ResizeObserver. Whenever a node
|
||||||
// changes its dimensions, this function is called to measure the
|
// changes its dimensions, this function is called to measure the
|
||||||
// new dimensions and update the nodes.
|
// new dimensions and update the nodes.
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ export type ReactFlowActions = {
|
|||||||
triggerEdgeChanges: (changes: EdgeChange[] | null) => void;
|
triggerEdgeChanges: (changes: EdgeChange[] | null) => void;
|
||||||
panBy: PanBy;
|
panBy: PanBy;
|
||||||
fitView: (nodes: Node[], options?: FitViewOptions) => boolean;
|
fitView: (nodes: Node[], options?: FitViewOptions) => boolean;
|
||||||
|
setDefaultNodesAndEdges: (nodes?: Node[], edges?: Edge[]) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ReactFlowState = ReactFlowStore & ReactFlowActions;
|
export type ReactFlowState = ReactFlowStore & ReactFlowActions;
|
||||||
|
|||||||
Reference in New Issue
Block a user