refactor(store): reset on unmount

This commit is contained in:
moklick
2021-11-23 18:37:12 +01:00
parent f775cf29ca
commit 296289710f
4 changed files with 63 additions and 44 deletions
+1 -1
View File
@@ -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) => (
+10 -2
View File
@@ -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
View File
@@ -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 };
+9 -3
View File
@@ -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;