fix(react): uncontrolled flows with Provider

This commit is contained in:
moklick
2024-02-13 16:12:31 +01:00
parent c1ccf119d6
commit 2860feec11
5 changed files with 29 additions and 5 deletions
@@ -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}
+12
View File
@@ -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.
+1
View File
@@ -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;