refactor(store): reset on unmount
This commit is contained in:
@@ -68,7 +68,7 @@ const Header = withRouter(({ history, location }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<Router forceRefresh={true}>
|
<Router>
|
||||||
<Header />
|
<Header />
|
||||||
<Switch>
|
<Switch>
|
||||||
{routes.map((route) => (
|
{routes.map((route) => (
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ const selector = (s: ReactFlowState) => ({
|
|||||||
setConnectionMode: s.setConnectionMode,
|
setConnectionMode: s.setConnectionMode,
|
||||||
setOnNodesChange: s.setOnNodesChange,
|
setOnNodesChange: s.setOnNodesChange,
|
||||||
setOnEdgesChange: s.setOnEdgesChange,
|
setOnEdgesChange: s.setOnEdgesChange,
|
||||||
|
reset: s.reset,
|
||||||
});
|
});
|
||||||
|
|
||||||
const StoreUpdater = ({
|
const StoreUpdater = ({
|
||||||
@@ -98,15 +99,22 @@ const StoreUpdater = ({
|
|||||||
setOnNodesChange,
|
setOnNodesChange,
|
||||||
setOnEdgesChange,
|
setOnEdgesChange,
|
||||||
setConnectionMode,
|
setConnectionMode,
|
||||||
|
reset,
|
||||||
} = useStore(selector, shallow);
|
} = useStore(selector, shallow);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
reset();
|
||||||
|
};
|
||||||
|
}, [reset]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setNodes(nodes);
|
setNodes(nodes);
|
||||||
}, [nodes]);
|
}, [nodes]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setEdges(edges, nodes);
|
setEdges(edges);
|
||||||
}, [edges, nodes]);
|
}, [edges]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (onConnect) {
|
if (onConnect) {
|
||||||
|
|||||||
+43
-38
@@ -25,6 +25,7 @@ import {
|
|||||||
Transform,
|
Transform,
|
||||||
Dimensions,
|
Dimensions,
|
||||||
XYPosition,
|
XYPosition,
|
||||||
|
ReactFlowStore,
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { isNode, isEdge, getRectOfNodes, getNodesInside, getConnectedEdges } from '../utils/graph';
|
import { isNode, isEdge, getRectOfNodes, getNodesInside, getConnectedEdges } from '../utils/graph';
|
||||||
import { getHandleBounds } from '../components/Nodes/utils';
|
import { getHandleBounds } from '../components/Nodes/utils';
|
||||||
@@ -37,51 +38,54 @@ const infiniteExtent: CoordinateExtent = [
|
|||||||
[Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],
|
[Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],
|
||||||
];
|
];
|
||||||
|
|
||||||
const createStore = () =>
|
const initialState: ReactFlowStore = {
|
||||||
create<ReactFlowState>((set, get) => ({
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
transform: [0, 0, 1],
|
||||||
|
nodeInternals: new Map(),
|
||||||
|
edges: [],
|
||||||
|
onNodesChange: null,
|
||||||
|
onEdgesChange: null,
|
||||||
|
selectedNodesBbox: { x: 0, y: 0, width: 0, height: 0 },
|
||||||
|
d3Zoom: null,
|
||||||
|
d3Selection: null,
|
||||||
|
d3ZoomHandler: undefined,
|
||||||
|
minZoom: 0.5,
|
||||||
|
maxZoom: 2,
|
||||||
|
translateExtent: infiniteExtent,
|
||||||
|
nodeExtent: infiniteExtent,
|
||||||
|
nodesSelectionActive: false,
|
||||||
|
selectionActive: false,
|
||||||
|
userSelectionRect: {
|
||||||
|
startX: 0,
|
||||||
|
startY: 0,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
width: 0,
|
width: 0,
|
||||||
height: 0,
|
height: 0,
|
||||||
transform: [0, 0, 1],
|
draw: false,
|
||||||
edges: [],
|
},
|
||||||
onNodesChange: null,
|
connectionNodeId: null,
|
||||||
onEdgesChange: null,
|
connectionHandleId: null,
|
||||||
selectedNodesBbox: { x: 0, y: 0, width: 0, height: 0 },
|
connectionHandleType: 'source',
|
||||||
d3Zoom: null,
|
connectionPosition: { x: 0, y: 0 },
|
||||||
d3Selection: null,
|
connectionMode: ConnectionMode.Strict,
|
||||||
d3ZoomHandler: undefined,
|
|
||||||
minZoom: 0.5,
|
|
||||||
maxZoom: 2,
|
|
||||||
translateExtent: infiniteExtent,
|
|
||||||
nodeExtent: infiniteExtent,
|
|
||||||
nodesSelectionActive: false,
|
|
||||||
selectionActive: false,
|
|
||||||
userSelectionRect: {
|
|
||||||
startX: 0,
|
|
||||||
startY: 0,
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
width: 0,
|
|
||||||
height: 0,
|
|
||||||
draw: false,
|
|
||||||
},
|
|
||||||
connectionNodeId: null,
|
|
||||||
connectionHandleId: null,
|
|
||||||
connectionHandleType: 'source',
|
|
||||||
connectionPosition: { x: 0, y: 0 },
|
|
||||||
connectionMode: ConnectionMode.Strict,
|
|
||||||
|
|
||||||
snapGrid: [15, 15],
|
snapGrid: [15, 15],
|
||||||
snapToGrid: false,
|
snapToGrid: false,
|
||||||
|
|
||||||
nodesDraggable: true,
|
nodesDraggable: true,
|
||||||
nodesConnectable: true,
|
nodesConnectable: true,
|
||||||
elementsSelectable: true,
|
elementsSelectable: true,
|
||||||
|
|
||||||
multiSelectionActive: false,
|
multiSelectionActive: false,
|
||||||
|
|
||||||
reactFlowVersion: typeof __REACT_FLOW_VERSION__ !== 'undefined' ? __REACT_FLOW_VERSION__ : '-',
|
reactFlowVersion: typeof __REACT_FLOW_VERSION__ !== 'undefined' ? __REACT_FLOW_VERSION__ : '-',
|
||||||
|
};
|
||||||
|
|
||||||
nodeInternals: new Map(),
|
const createStore = () =>
|
||||||
|
create<ReactFlowState>((set, get) => ({
|
||||||
|
...initialState,
|
||||||
|
|
||||||
setNodes: (nodes: Node[]) => {
|
setNodes: (nodes: Node[]) => {
|
||||||
const nodeInternals = createNodeInternals(nodes, get().nodeInternals);
|
const nodeInternals = createNodeInternals(nodes, get().nodeInternals);
|
||||||
@@ -366,6 +370,7 @@ const createStore = () =>
|
|||||||
setConnectionMode: (connectionMode: ConnectionMode) => set({ connectionMode }),
|
setConnectionMode: (connectionMode: ConnectionMode) => set({ connectionMode }),
|
||||||
setOnNodesChange: (onNodesChange: OnNodesChange) => set({ onNodesChange }),
|
setOnNodesChange: (onNodesChange: OnNodesChange) => set({ onNodesChange }),
|
||||||
setOnEdgesChange: (onEdgesChange: OnEdgesChange) => set({ onEdgesChange }),
|
setOnEdgesChange: (onEdgesChange: OnEdgesChange) => set({ onEdgesChange }),
|
||||||
|
reset: () => set({ ...initialState }),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export { Provider, useStore, createStore, useStoreApi };
|
export { Provider, useStore, createStore, useStoreApi };
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ export type InitD3ZoomPayload = {
|
|||||||
transform: Transform;
|
transform: Transform;
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface ReactFlowState {
|
export type ReactFlowStore = {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
transform: Transform;
|
transform: Transform;
|
||||||
@@ -169,9 +169,11 @@ export interface ReactFlowState {
|
|||||||
multiSelectionActive: boolean;
|
multiSelectionActive: boolean;
|
||||||
|
|
||||||
reactFlowVersion: string;
|
reactFlowVersion: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ReactFlowActions = {
|
||||||
setNodes: (nodes: Node[]) => void;
|
setNodes: (nodes: Node[]) => void;
|
||||||
setEdges: (edges: Edge[], nodes: Node[]) => void;
|
setEdges: (edges: Edge[]) => void;
|
||||||
updateNodeDimensions: (updates: NodeDimensionUpdate[]) => void;
|
updateNodeDimensions: (updates: NodeDimensionUpdate[]) => void;
|
||||||
updateNodePosition: (update: NodeDiffUpdate) => void;
|
updateNodePosition: (update: NodeDiffUpdate) => void;
|
||||||
setUserSelection: (mousePos: XYPosition) => void;
|
setUserSelection: (mousePos: XYPosition) => void;
|
||||||
@@ -209,7 +211,11 @@ export interface ReactFlowState {
|
|||||||
onConnectStart?: OnConnectStart;
|
onConnectStart?: OnConnectStart;
|
||||||
onConnectStop?: OnConnectStop;
|
onConnectStop?: OnConnectStop;
|
||||||
onConnectEnd?: OnConnectEnd;
|
onConnectEnd?: OnConnectEnd;
|
||||||
}
|
|
||||||
|
reset: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ReactFlowState = ReactFlowStore & ReactFlowActions;
|
||||||
|
|
||||||
export type UpdateNodeInternals = (nodeId: string) => void;
|
export type UpdateNodeInternals = (nodeId: string) => void;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user