Skip to content

Commit

Permalink
refactor(wrapnode): put update node logic in action
Browse files Browse the repository at this point in the history
  • Loading branch information
moklick committed Oct 25, 2019
1 parent d44bbf7 commit caebec6
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 69 deletions.
41 changes: 41 additions & 0 deletions src/components/Nodes/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { HandleElement, Position } from '../../types';
import { getDimensions } from '../../utils';

export const getHandleBounds = (
selector: string,
nodeElement: HTMLDivElement,
parentBounds: ClientRect | DOMRect,
k: number
): HandleElement[] | null => {
const handles = nodeElement.querySelectorAll(selector);

if (!handles || !handles.length) {
return null;
}

const handlesArray = Array.from(handles) as HTMLDivElement[];

return handlesArray.map(
(handle): HandleElement => {
const bounds = handle.getBoundingClientRect();
const dimensions = getDimensions(handle);
const nodeIdAttr = handle.getAttribute('data-nodeid');
const handlePosition = (handle.getAttribute('data-handlepos') as unknown) as Position;
const nodeIdSplitted = nodeIdAttr ? nodeIdAttr.split('__') : null;

let handleId = null;

if (nodeIdSplitted) {
handleId = (nodeIdSplitted.length ? nodeIdSplitted[1] : nodeIdSplitted) as string;
}

return {
id: handleId,
position: handlePosition,
x: (bounds.left - parentBounds.left) * (1 / k),
y: (bounds.top - parentBounds.top) * (1 / k),
...dimensions,
};
}
);
};
60 changes: 2 additions & 58 deletions src/components/Nodes/wrapNode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,58 +3,9 @@ import { DraggableCore } from 'react-draggable';
import cx from 'classnames';
import { ResizeObserver } from 'resize-observer';

import { getDimensions } from '../../utils';
import { Provider } from '../../contexts/NodeIdContext';
import store from '../../store';
import {
Node,
XYPosition,
HandleElement,
Position,
Transform,
ElementId,
NodeComponentProps,
WrapNodeProps,
} from '../../types';

const getHandleBounds = (
selector: string,
nodeElement: HTMLDivElement,
parentBounds: ClientRect | DOMRect,
k: number
): HandleElement[] | null => {
const handles = nodeElement.querySelectorAll(selector);

if (!handles || !handles.length) {
return null;
}

const handlesArray = Array.from(handles) as HTMLDivElement[];

return handlesArray.map(
(handle): HandleElement => {
const bounds = handle.getBoundingClientRect();
const dimensions = getDimensions(handle);
const nodeIdAttr = handle.getAttribute('data-nodeid');
const handlePosition = (handle.getAttribute('data-handlepos') as unknown) as Position;
const nodeIdSplitted = nodeIdAttr ? nodeIdAttr.split('__') : null;

let handleId = null;

if (nodeIdSplitted) {
handleId = (nodeIdSplitted.length ? nodeIdSplitted[1] : nodeIdSplitted) as string;
}

return {
id: handleId,
position: handlePosition,
x: (bounds.left - parentBounds.left) * (1 / k),
y: (bounds.top - parentBounds.top) * (1 / k),
...dimensions,
};
}
);
};
import { Node, XYPosition, Transform, ElementId, NodeComponentProps, WrapNodeProps } from '../../types';

const onStart = (
evt: MouseEvent,
Expand Down Expand Up @@ -153,14 +104,7 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
return;
}

const storeState = store.getState();
const bounds = nodeElement.current.getBoundingClientRect();
const dimensions = getDimensions(nodeElement.current);
const handleBounds = {
source: getHandleBounds('.source', nodeElement.current, bounds, storeState.transform[2]),
target: getHandleBounds('.target', nodeElement.current, bounds, storeState.transform[2]),
};
store.dispatch.updateNodeData({ id, ...dimensions, handleBounds });
store.dispatch.updateNodeDimensions({ id, nodeElement: nodeElement.current });
};

useEffect(() => {
Expand Down
27 changes: 16 additions & 11 deletions src/store/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import { createStore, Action, action } from 'easy-peasy';
import isEqual from 'fast-deep-equal';
import { Selection as D3Selection, ZoomBehavior } from 'd3';

import { getDimensions } from '../utils';
import { getHandleBounds } from '../components/Nodes/utils';

import { getNodesInside, getConnectedEdges, getRectOfNodes } from '../utils/graph';
import {
ElementId,
Expand All @@ -14,7 +17,6 @@ import {
XYPosition,
OnConnectFunc,
SelectionRect,
HandleElement,
} from '../types';

type TransformXYK = {
Expand All @@ -28,14 +30,9 @@ type NodePosUpdate = {
pos: XYPosition;
};

type NodeUpdate = {
type NodeDimensionUpdate = {
id: ElementId;
width: number;
height: number;
handleBounds: {
source: HandleElement[] | null;
target: HandleElement[] | null;
};
nodeElement: HTMLDivElement;
};

type SelectionUpdate = {
Expand Down Expand Up @@ -86,7 +83,7 @@ export interface StoreModel {

setEdges: Action<StoreModel, Edge[]>;

updateNodeData: Action<StoreModel, NodeUpdate>;
updateNodeDimensions: Action<StoreModel, NodeDimensionUpdate>;

updateNodePos: Action<StoreModel, NodePosUpdate>;

Expand Down Expand Up @@ -152,12 +149,20 @@ const storeModel: StoreModel = {
state.edges = edges;
}),

updateNodeData: action((state, { id, ...data }) => {
updateNodeDimensions: action((state, { id, nodeElement }) => {
const bounds = nodeElement.getBoundingClientRect();
const dimensions = getDimensions(nodeElement);
const handleBounds = {
source: getHandleBounds('.source', nodeElement, bounds, state.transform[2]),
target: getHandleBounds('.target', nodeElement, bounds, state.transform[2]),
};

state.nodes.forEach(n => {
if (n.id === id) {
n.__rg = {
...n.__rg,
...data,
...dimensions,
handleBounds,
};
}
});
Expand Down

0 comments on commit caebec6

Please sign in to comment.