refactor(app): folder structure, components cleanup

This commit is contained in:
moklick
2019-10-06 19:01:02 +02:00
parent 845bae284f
commit cc2775dd78
25 changed files with 822 additions and 981 deletions
+743 -902
View File
File diff suppressed because it is too large Load Diff
+18 -18
View File
@@ -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
View File
@@ -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
View File
@@ -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,