refactor(app): folder structure, components cleanup
This commit is contained in:
Generated
+743
-902
File diff suppressed because it is too large
Load Diff
+18
-18
@@ -6,37 +6,37 @@
|
|||||||
"main": "dist/ReactGraph.js",
|
"main": "dist/ReactGraph.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@welldone-software/why-did-you-render": "^3.2.3",
|
"@welldone-software/why-did-you-render": "^3.3.6",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"d3-selection": "^1.4.0",
|
"d3-selection": "^1.4.0",
|
||||||
"d3-zoom": "^1.7.3",
|
"d3-zoom": "^1.8.3",
|
||||||
"easy-peasy": "^3.0.2",
|
"easy-peasy": "^3.1.0",
|
||||||
"fast-deep-equal": "^3.0.0-beta.1",
|
"fast-deep-equal": "^3.0.0-beta.2",
|
||||||
"react": "^16.9.0",
|
"react": "^16.10.2",
|
||||||
"react-dom": "^16.9.0",
|
"react-dom": "^16.10.2",
|
||||||
"react-draggable": "^3.3.0",
|
"react-draggable": "^3.3.2",
|
||||||
"scheduler": "^0.15.0"
|
"scheduler": "^0.15.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.5.4",
|
"@babel/core": "^7.6.2",
|
||||||
"@babel/preset-env": "^7.5.4",
|
"@babel/preset-env": "^7.6.2",
|
||||||
"@babel/preset-react": "^7.0.0",
|
"@babel/preset-react": "^7.0.0",
|
||||||
"autoprefixer": "^9.6.1",
|
"autoprefixer": "^9.6.4",
|
||||||
"babel-loader": "^8.0.6",
|
"babel-loader": "^8.0.6",
|
||||||
"babel-preset-react-app": "^9.0.0",
|
"babel-preset-react-app": "^9.0.2",
|
||||||
"cypress": "^3.4.1",
|
"cypress": "^3.4.1",
|
||||||
"husky": "^3.0.0",
|
"husky": "^3.0.8",
|
||||||
"parcel-bundler": "^1.12.3",
|
"parcel-bundler": "^1.12.4",
|
||||||
"postcss-nested": "^4.1.2",
|
"postcss-nested": "^4.1.2",
|
||||||
"rollup": "^1.16.2",
|
"rollup": "^1.23.1",
|
||||||
"rollup-plugin-babel": "^4.3.3",
|
"rollup-plugin-babel": "^4.3.3",
|
||||||
"rollup-plugin-bundle-size": "^1.0.3",
|
"rollup-plugin-bundle-size": "^1.0.3",
|
||||||
"rollup-plugin-commonjs": "^10.0.0",
|
"rollup-plugin-commonjs": "^10.1.0",
|
||||||
"rollup-plugin-livereload": "^1.0.1",
|
"rollup-plugin-livereload": "^1.0.4",
|
||||||
"rollup-plugin-node-resolve": "^5.1.0",
|
"rollup-plugin-node-resolve": "^5.2.0",
|
||||||
"rollup-plugin-postcss": "^2.0.3",
|
"rollup-plugin-postcss": "^2.0.3",
|
||||||
"rollup-plugin-serve": "^1.0.1",
|
"rollup-plugin-serve": "^1.0.1",
|
||||||
"start-server-and-test": "^1.10.2",
|
"start-server-and-test": "^1.10.4",
|
||||||
"wait-on": "^3.3.0"
|
"wait-on": "^3.3.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
|||||||
+14
-17
@@ -6,28 +6,26 @@ if (process.env.NODE_ENV !== 'production') {
|
|||||||
whyDidYouRender(React);
|
whyDidYouRender(React);
|
||||||
}
|
}
|
||||||
|
|
||||||
import GraphView from '../GraphView';
|
import GraphView from '../container/GraphView';
|
||||||
import GlobalKeyHandler from '../GlobalKeyHandler';
|
|
||||||
|
|
||||||
import DefaultNode from '../NodeRenderer/NodeTypes/DefaultNode';
|
import DefaultNode from '../components/Nodes/DefaultNode';
|
||||||
import InputNode from '../NodeRenderer/NodeTypes/InputNode';
|
import InputNode from '../components/Nodes/InputNode';
|
||||||
import OutputNode from '../NodeRenderer/NodeTypes/OutputNode';
|
import OutputNode from '../components/Nodes/OutputNode';
|
||||||
import { createNodeTypes } from '../NodeRenderer/utils';
|
import { createNodeTypes } from '../container/NodeRenderer/utils';
|
||||||
|
|
||||||
import BezierEdge from '../EdgeRenderer/EdgeTypes/BezierEdge';
|
import BezierEdge from '../components/Edges/BezierEdge';
|
||||||
import StraightEdge from '../EdgeRenderer/EdgeTypes/StraightEdge';
|
import StraightEdge from '../components/Edges/StraightEdge';
|
||||||
import StepEdge from '../EdgeRenderer/EdgeTypes/StepEdge';
|
import StepEdge from '../components/Edges/StepEdge';
|
||||||
import { createEdgeTypes } from '../EdgeRenderer/utils';
|
import { createEdgeTypes } from '../container/EdgeRenderer/utils';
|
||||||
import store from '../store';
|
import store from '../store';
|
||||||
import ElementUpdater from './ElementUpdater';
|
|
||||||
|
|
||||||
import '../style.css';
|
import '../style.css';
|
||||||
|
|
||||||
const ReactGraph = ({
|
const ReactGraph = ({
|
||||||
style, onElementClick, elements, children,
|
style, onElementClick, elements, children,
|
||||||
nodeTypes, edgeTypes, onLoad, onMove, onElementsRemove,
|
nodeTypes, edgeTypes, onLoad, onMove,
|
||||||
onConnect, onNodeDragStop, connectionLineType, connectionLineStyle,
|
onElementsRemove, onConnect, onNodeDragStop, connectionLineType,
|
||||||
deleteKeyCode, selectionKeyCode
|
connectionLineStyle, deleteKeyCode, selectionKeyCode
|
||||||
}) => {
|
}) => {
|
||||||
const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []);
|
const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []);
|
||||||
const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []);
|
const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []);
|
||||||
@@ -35,7 +33,6 @@ const ReactGraph = ({
|
|||||||
return (
|
return (
|
||||||
<div style={style} className="react-graph">
|
<div style={style} className="react-graph">
|
||||||
<StoreProvider store={store}>
|
<StoreProvider store={store}>
|
||||||
<ElementUpdater elements={elements} onConnect={onConnect} />
|
|
||||||
<GraphView
|
<GraphView
|
||||||
onLoad={onLoad}
|
onLoad={onLoad}
|
||||||
onMove={onMove}
|
onMove={onMove}
|
||||||
@@ -46,10 +43,10 @@ const ReactGraph = ({
|
|||||||
connectionLineType={connectionLineType}
|
connectionLineType={connectionLineType}
|
||||||
connectionLineStyle={connectionLineStyle}
|
connectionLineStyle={connectionLineStyle}
|
||||||
selectionKeyCode={selectionKeyCode}
|
selectionKeyCode={selectionKeyCode}
|
||||||
/>
|
|
||||||
<GlobalKeyHandler
|
|
||||||
onElementsRemove={onElementsRemove}
|
onElementsRemove={onElementsRemove}
|
||||||
deleteKeyCode={deleteKeyCode}
|
deleteKeyCode={deleteKeyCode}
|
||||||
|
elements={elements}
|
||||||
|
onConnect={onConnect}
|
||||||
/>
|
/>
|
||||||
{children}
|
{children}
|
||||||
</StoreProvider>
|
</StoreProvider>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState, memo } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import cx from 'classnames';
|
import cx from 'classnames';
|
||||||
|
|
||||||
export default (props) => {
|
export default (props) => {
|
||||||
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
|||||||
import { useStoreActions, useStoreState } from 'easy-peasy';
|
import { useStoreActions, useStoreState } from 'easy-peasy';
|
||||||
|
|
||||||
import BaseHandle from './BaseHandle';
|
import BaseHandle from './BaseHandle';
|
||||||
import NodeIdContext from '../NodeIdContext'
|
import NodeIdContext from '../../contexts/NodeIdContext'
|
||||||
|
|
||||||
const Handle = memo(({ onConnect, ...rest }) => {
|
const Handle = memo(({ onConnect, ...rest }) => {
|
||||||
const nodeId = useContext(NodeIdContext);
|
const nodeId = useContext(NodeIdContext);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import Handle from '../HandleTypes/Handle';
|
import Handle from '../../components/Handle';
|
||||||
|
|
||||||
const nodeStyles = {
|
const nodeStyles = {
|
||||||
background: '#ff6060',
|
background: '#ff6060',
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import Handle from '../HandleTypes/Handle';
|
import Handle from '../../components/Handle';
|
||||||
|
|
||||||
const nodeStyles = {
|
const nodeStyles = {
|
||||||
background: '#9999ff',
|
background: '#9999ff',
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import Handle from '../HandleTypes/Handle';
|
import Handle from '../../components/Handle';
|
||||||
|
|
||||||
const nodeStyles = {
|
const nodeStyles = {
|
||||||
background: '#55dd99',
|
background: '#55dd99',
|
||||||
@@ -3,7 +3,7 @@ import ReactDraggable from 'react-draggable';
|
|||||||
import cx from 'classnames';
|
import cx from 'classnames';
|
||||||
|
|
||||||
import { getDimensions, isInputNode } from '../../utils';
|
import { getDimensions, isInputNode } from '../../utils';
|
||||||
import { Provider } from '../NodeIdContext';
|
import { Provider } from '../../contexts/NodeIdContext';
|
||||||
import store from '../../store';
|
import store from '../../store';
|
||||||
|
|
||||||
const isHandle = e => (
|
const isHandle = e => (
|
||||||
@@ -2,7 +2,7 @@ import React, { useState, memo } from 'react';
|
|||||||
import ReactDraggable from 'react-draggable';
|
import ReactDraggable from 'react-draggable';
|
||||||
import { useStoreState, useStoreActions } from 'easy-peasy';
|
import { useStoreState, useStoreActions } from 'easy-peasy';
|
||||||
|
|
||||||
import { isNode } from '../graph-utils';
|
import { isNode } from '../../graph-utils';
|
||||||
|
|
||||||
function getStartPositions(elements) {
|
function getStartPositions(elements) {
|
||||||
return elements
|
return elements
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import React, { memo } from 'react';
|
import React, { memo } from 'react';
|
||||||
import { useStoreState } from 'easy-peasy';
|
import { useStoreState } from 'easy-peasy';
|
||||||
|
|
||||||
import ConnectionLine from '../ConnectionLine';
|
import ConnectionLine from '../../components/ConnectionLine';
|
||||||
import { isEdge } from '../graph-utils';
|
import { isEdge } from '../../graph-utils';
|
||||||
|
|
||||||
function getHandlePosition(position, node, handle = null) {
|
function getHandlePosition(position, node, handle = null) {
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import StraightEdge from './EdgeTypes/StraightEdge';
|
import StraightEdge from '../../components/Edges/StraightEdge';
|
||||||
import BezierEdge from './EdgeTypes/BezierEdge';
|
import BezierEdge from '../../components/Edges/BezierEdge';
|
||||||
import wrapEdge from './EdgeTypes/wrapEdge';
|
import wrapEdge from '../../components/Edges/wrapEdge';
|
||||||
|
|
||||||
export function createEdgeTypes(edgeTypes) {
|
export function createEdgeTypes(edgeTypes) {
|
||||||
const standardTypes = {
|
const standardTypes = {
|
||||||
@@ -3,17 +3,20 @@ import { useStoreState, useStoreActions } from 'easy-peasy';
|
|||||||
|
|
||||||
import NodeRenderer from '../NodeRenderer';
|
import NodeRenderer from '../NodeRenderer';
|
||||||
import EdgeRenderer from '../EdgeRenderer';
|
import EdgeRenderer from '../EdgeRenderer';
|
||||||
import UserSelection from '../UserSelection';
|
import UserSelection from '../../components/UserSelection';
|
||||||
import NodesSelection from '../NodesSelection';
|
import NodesSelection from '../../components/NodesSelection';
|
||||||
import useKeyPress from '../hooks/useKeyPress';
|
import useKeyPress from '../../hooks/useKeyPress';
|
||||||
import useD3Zoom from '../hooks/useD3Zoom';
|
import useD3Zoom from '../../hooks/useD3Zoom';
|
||||||
import { getDimensions } from '../utils';
|
import useGlobalKeyHandler from '../../hooks/useGlobalKeyHandler';
|
||||||
import { fitView, zoomIn, zoomOut } from '../graph-utils';
|
import useElementUpdater from '../../hooks/useElementUpdater'
|
||||||
|
import { getDimensions } from '../../utils';
|
||||||
|
import { fitView, zoomIn, zoomOut } from '../../graph-utils';
|
||||||
|
|
||||||
const GraphView = memo(({
|
const GraphView = memo(({
|
||||||
nodeTypes, edgeTypes, onMove, onLoad,
|
nodeTypes, edgeTypes, onMove, onLoad,
|
||||||
onElementClick, onNodeDragStop, connectionLineType, connectionLineStyle,
|
onElementClick, onNodeDragStop, connectionLineType, connectionLineStyle,
|
||||||
selectionKeyCode
|
selectionKeyCode, onElementsRemove, deleteKeyCode, elements,
|
||||||
|
onConnect
|
||||||
}) => {
|
}) => {
|
||||||
const zoomPane = useRef();
|
const zoomPane = useRef();
|
||||||
const rendererNode = useRef();
|
const rendererNode = useRef();
|
||||||
@@ -27,8 +30,11 @@ const GraphView = memo(({
|
|||||||
}));
|
}));
|
||||||
const updateSize = useStoreActions(actions => actions.updateSize);
|
const updateSize = useStoreActions(actions => actions.updateSize);
|
||||||
const setNodesSelection = useStoreActions(actions => actions.setNodesSelection);
|
const setNodesSelection = useStoreActions(actions => actions.setNodesSelection);
|
||||||
|
const setOnConnect = useStoreActions(a => a.setOnConnect);
|
||||||
const selectionKeyPressed = useKeyPress(selectionKeyCode);
|
const selectionKeyPressed = useKeyPress(selectionKeyCode);
|
||||||
|
|
||||||
|
const onZoomPaneClick = () => setNodesSelection({ isActive: false });
|
||||||
|
|
||||||
const updateDimensions = () => {
|
const updateDimensions = () => {
|
||||||
const size = getDimensions(rendererNode.current);
|
const size = getDimensions(rendererNode.current);
|
||||||
updateSize(size);
|
updateSize(size);
|
||||||
@@ -36,6 +42,7 @@ const GraphView = memo(({
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
updateDimensions();
|
updateDimensions();
|
||||||
|
setOnConnect(onConnect);
|
||||||
window.onresize = updateDimensions;
|
window.onresize = updateDimensions;
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
@@ -55,6 +62,9 @@ const GraphView = memo(({
|
|||||||
}
|
}
|
||||||
}, [state.d3Initialised]);
|
}, [state.d3Initialised]);
|
||||||
|
|
||||||
|
useGlobalKeyHandler({ onElementsRemove, deleteKeyCode });
|
||||||
|
useElementUpdater({ elements });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="react-graph__renderer" ref={rendererNode}>
|
<div className="react-graph__renderer" ref={rendererNode}>
|
||||||
<NodeRenderer
|
<NodeRenderer
|
||||||
@@ -74,7 +84,7 @@ const GraphView = memo(({
|
|||||||
{state.nodesSelectionActive && <NodesSelection />}
|
{state.nodesSelectionActive && <NodesSelection />}
|
||||||
<div
|
<div
|
||||||
className="react-graph__zoompane"
|
className="react-graph__zoompane"
|
||||||
onClick={() => setNodesSelection({ isActive: false })}
|
onClick={onZoomPaneClick}
|
||||||
ref={zoomPane}
|
ref={zoomPane}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, { memo } from 'react';
|
import React, { memo } from 'react';
|
||||||
import { useStoreState } from 'easy-peasy';
|
import { useStoreState } from 'easy-peasy';
|
||||||
|
|
||||||
import { isNode } from '../graph-utils';
|
import { isNode } from '../../graph-utils';
|
||||||
|
|
||||||
function renderNode(d, props, state) {
|
function renderNode(d, props, state) {
|
||||||
const nodeType = d.type || 'default';
|
const nodeType = d.type || 'default';
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import DefaultNode from './NodeTypes/DefaultNode';
|
import DefaultNode from '../../components/Nodes/DefaultNode';
|
||||||
import InputNode from './NodeTypes/InputNode';
|
import InputNode from '../../components/Nodes/InputNode';
|
||||||
import OutputNode from './NodeTypes/OutputNode';
|
import OutputNode from '../../components/Nodes/OutputNode';
|
||||||
import wrapNode from './NodeTypes/wrapNode';
|
import wrapNode from '../../components/Nodes/wrapNode';
|
||||||
|
|
||||||
export function createNodeTypes(nodeTypes) {
|
export function createNodeTypes(nodeTypes) {
|
||||||
const standardTypes = {
|
const standardTypes = {
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useEffect, memo } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useStoreState, useStoreActions } from 'easy-peasy';
|
import { useStoreState, useStoreActions } from 'easy-peasy';
|
||||||
import isEqual from 'fast-deep-equal';
|
import isEqual from 'fast-deep-equal';
|
||||||
|
|
||||||
import { parseElement, isNode, isEdge } from '../graph-utils';
|
import { parseElement, isNode, isEdge } from '../graph-utils';
|
||||||
|
|
||||||
const ElementUpdater = (props) => {
|
const useElementUpdater = ({ elements }) => {
|
||||||
const state = useStoreState(s => ({
|
const state = useStoreState(s => ({
|
||||||
nodes: s.nodes,
|
nodes: s.nodes,
|
||||||
edges: s.edges,
|
edges: s.edges,
|
||||||
@@ -13,11 +13,10 @@ const ElementUpdater = (props) => {
|
|||||||
|
|
||||||
const setNodes = useStoreActions(a => a.setNodes);
|
const setNodes = useStoreActions(a => a.setNodes);
|
||||||
const setEdges = useStoreActions(a => a.setEdges);
|
const setEdges = useStoreActions(a => a.setEdges);
|
||||||
const setOnConnect = useStoreActions(a => a.setOnConnect);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const nodes = props.elements.filter(isNode);
|
const nodes = elements.filter(isNode);
|
||||||
const edges = props.elements.filter(isEdge).map(parseElement);
|
const edges = elements.filter(isEdge).map(parseElement);
|
||||||
|
|
||||||
const nextNodes = nodes.map(propNode => {
|
const nextNodes = nodes.map(propNode => {
|
||||||
const existingNode = state.nodes.find(n => n.id === propNode.id);
|
const existingNode = state.nodes.find(n => n.id === propNode.id);
|
||||||
@@ -47,13 +46,7 @@ const ElementUpdater = (props) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setOnConnect(props.onConnect);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
ElementUpdater.displayName = 'ElementUpdater';
|
export default useElementUpdater;
|
||||||
|
|
||||||
export default memo(ElementUpdater);
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useEffect, memo } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useStoreState, useStoreActions } from 'easy-peasy';
|
import { useStoreState, useStoreActions } from 'easy-peasy';
|
||||||
|
|
||||||
import useKeyPress from '../hooks/useKeyPress';
|
import useKeyPress from './useKeyPress';
|
||||||
import { isEdge, getConnectedEdges } from '../graph-utils';
|
import { isEdge, getConnectedEdges } from '../graph-utils';
|
||||||
|
|
||||||
export default memo(({ deleteKeyCode, onElementsRemove }) => {
|
export default ({ deleteKeyCode, onElementsRemove }) => {
|
||||||
const state = useStoreState(s => ({ selectedElements: s.selectedElements, edges: s.edges }))
|
const state = useStoreState(s => ({ selectedElements: s.selectedElements, edges: s.edges }))
|
||||||
const setNodesSelection = useStoreActions(a => a.setNodesSelection);
|
const setNodesSelection = useStoreActions(a => a.setNodesSelection);
|
||||||
const deleteKeyPressed = useKeyPress(deleteKeyCode);
|
const deleteKeyPressed = useKeyPress(deleteKeyCode);
|
||||||
@@ -25,4 +25,4 @@ export default memo(({ deleteKeyCode, onElementsRemove }) => {
|
|||||||
}, [deleteKeyPressed])
|
}, [deleteKeyPressed])
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
});
|
};
|
||||||
+2
-2
@@ -2,8 +2,8 @@ import ReactGraph from './ReactGraph';
|
|||||||
|
|
||||||
export default ReactGraph;
|
export default ReactGraph;
|
||||||
|
|
||||||
export { default as Handle } from './NodeRenderer/HandleTypes/Handle';
|
export { default as Handle } from './components/Handle';
|
||||||
export { default as MiniMap } from './Plugins/MiniMap';
|
export { default as MiniMap } from './plugins/MiniMap';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
isNode,
|
isNode,
|
||||||
|
|||||||
Reference in New Issue
Block a user