refactor(helper): use type predicates for isEdge and isNode

This commit is contained in:
moklick
2020-05-16 12:41:33 +02:00
parent 3451836e57
commit edefe860cf
3 changed files with 18 additions and 21 deletions
+2 -2
View File
@@ -249,11 +249,11 @@ import ReactFlow, { isNode, isEdge, removeElements, addEdge } from 'react-flow-r
#### isEdge #### isEdge
`isEdge = (element: Node | Edge): boolean` `isEdge = (element: Node | Edge): element is Edge`
#### isNode #### isNode
`isNode = (element: Node | Edge): boolean` `isNode = (element: Node | Edge): element is Node`
#### removeElements #### removeElements
+5 -5
View File
@@ -18,10 +18,10 @@ const useElementUpdater = (elements: Elements): void => {
const setEdges = useStoreActions((a) => a.setEdges); const setEdges = useStoreActions((a) => a.setEdges);
useEffect(() => { useEffect(() => {
const nodes = elements.filter(isNode) as Node[]; const nodes: Node[] = elements.filter(isNode);
const edges = elements.filter(isEdge).map((e) => parseElement(e)) as Edge[]; const edges: Edge[] = elements.filter(isEdge).map((e) => parseElement(e) as Edge);
const nextNodes = nodes.map((propNode) => { const nextNodes: Node[] = nodes.map((propNode) => {
const existingNode = state.nodes.find((n) => n.id === propNode.id); const existingNode = state.nodes.find((n) => n.id === propNode.id);
if (existingNode) { if (existingNode) {
@@ -56,8 +56,8 @@ const useElementUpdater = (elements: Elements): void => {
}; };
} }
return parseElement(propNode); return parseElement(propNode) as Node;
}) as Node[]; });
const nodesChanged: boolean = !isEqual(state.nodes, nextNodes); const nodesChanged: boolean = !isEqual(state.nodes, nextNodes);
const edgesChanged: boolean = !isEqual(state.edges, edges); const edgesChanged: boolean = !isEqual(state.edges, edges);
+11 -14
View File
@@ -3,11 +3,11 @@ import { zoomIdentity } from 'd3-zoom';
import store from '../store'; import store from '../store';
import { ElementId, Node, Edge, Elements, Transform, XYPosition, Rect, FitViewParams, Box, Connection } from '../types'; import { ElementId, Node, Edge, Elements, Transform, XYPosition, Rect, FitViewParams, Box, Connection } from '../types';
export const isEdge = (element: Node | Edge): boolean => export const isEdge = (element: Node | Connection | Edge): element is Edge =>
element.hasOwnProperty('source') && element.hasOwnProperty('target'); 'id' in element && 'source' in element && 'target' in element;
export const isNode = (element: Node | Edge): boolean => export const isNode = (element: Node | Connection | Edge): element is Node =>
!element.hasOwnProperty('source') && !element.hasOwnProperty('target'); 'id' in element && !('source' in element) && !('target' in element);
export const getOutgoers = (node: Node, elements: Elements): Elements => { export const getOutgoers = (node: Node, elements: Elements): Elements => {
if (!isNode(node)) { if (!isNode(node)) {
@@ -38,9 +38,8 @@ export const addEdge = (edgeParams: Edge | Connection, elements: Elements): Elem
throw new Error('Can not create edge. An edge needs a source and a target'); throw new Error('Can not create edge. An edge needs a source and a target');
} }
if (edgeParams.hasOwnProperty('id')) { if (isEdge(edgeParams)) {
const edge = { ...edgeParams } as Edge; return elements.concat({ ...edgeParams });
return elements.concat(edge);
} }
const edge = { const edge = {
@@ -88,19 +87,17 @@ export const parseElement = (element: Node | Edge): Node | Edge => {
}; };
} }
const nodeElement = element as Node;
return { return {
...nodeElement, ...element,
id: nodeElement.id.toString(), id: element.id.toString(),
type: nodeElement.type || 'default', type: element.type || 'default',
__rg: { __rg: {
position: nodeElement.position, position: element.position,
width: null, width: null,
height: null, height: null,
handleBounds: {}, handleBounds: {},
}, },
}; } as Node;
}; };
const getBoundsOfBoxes = (box1: Box, box2: Box): Box => ({ const getBoundsOfBoxes = (box1: Box, box2: Box): Box => ({