From 8f23321bd02418db80200d42ec4e464d172633ec Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 21 Oct 2021 09:05:56 +0200 Subject: [PATCH] refactor(hooks): add useVisibleNodes and useVisibleEdges --- src/container/EdgeRenderer/index.tsx | 36 ++--------------------- src/container/NodeRenderer/index.tsx | 17 +++-------- src/hooks/useVisibleEdges.ts | 44 ++++++++++++++++++++++++++++ src/hooks/useVisibleNodes.ts | 22 ++++++++++++++ 4 files changed, 73 insertions(+), 46 deletions(-) create mode 100644 src/hooks/useVisibleEdges.ts create mode 100644 src/hooks/useVisibleNodes.ts diff --git a/src/container/EdgeRenderer/index.tsx b/src/container/EdgeRenderer/index.tsx index 4b707b98..0b83ce99 100644 --- a/src/container/EdgeRenderer/index.tsx +++ b/src/container/EdgeRenderer/index.tsx @@ -4,7 +4,7 @@ import shallow from 'zustand/shallow'; import { useStore } from '../../store'; import ConnectionLine from '../../components/ConnectionLine/index'; import MarkerDefinitions from './MarkerDefinitions'; -import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from './utils'; +import { getEdgePositions, getHandle, getSourceTargetNodes } from './utils'; import { Position, Edge, @@ -16,6 +16,7 @@ import { ReactFlowState, NodeHandleBounds, } from '../../types'; +import useVisibleEdges from '../../hooks/useVisibleEdges'; interface EdgeRendererProps { edgeTypes: any; @@ -234,38 +235,7 @@ const EdgeRenderer = (props: EdgeRendererProps) => { nodes, } = useStore(selector, shallow); - const edges = useStore( - useCallback( - (s: ReactFlowState) => { - if (!props.onlyRenderVisibleElements) { - return s.edges; - } - - return s.edges.filter((e) => { - const { sourceNode, targetNode } = getSourceTargetNodes(e, s.nodes); - - return ( - sourceNode?.width && - sourceNode?.height && - targetNode?.width && - targetNode?.height && - isEdgeVisible({ - sourcePos: sourceNode.position, - targetPos: targetNode.position, - sourceWidth: sourceNode.width, - sourceHeight: sourceNode.height, - targetWidth: targetNode.width, - targetHeight: targetNode.height, - width: s.width, - height: s.height, - transform: s.transform, - }) - ); - }); - }, - [props.onlyRenderVisibleElements] - ) - ); + const edges = useVisibleEdges(props.onlyRenderVisibleElements); if (!width) { return null; diff --git a/src/container/NodeRenderer/index.tsx b/src/container/NodeRenderer/index.tsx index 16e3e037..2f8be03f 100644 --- a/src/container/NodeRenderer/index.tsx +++ b/src/container/NodeRenderer/index.tsx @@ -1,9 +1,10 @@ -import React, { memo, useMemo, ComponentType, MouseEvent, useCallback, Fragment } from 'react'; +import React, { memo, useMemo, ComponentType, MouseEvent, Fragment } from 'react'; import shallow from 'zustand/shallow'; import { useStore } from '../../store'; import { Node, NodeTypesType, ReactFlowState, WrapNodeProps, SnapGrid } from '../../types'; -import { getNodesInside, getRectOfNodes } from '../../utils/graph'; +import { getRectOfNodes } from '../../utils/graph'; +import useVisibleNodes from '../../hooks/useVisibleNodes'; interface NodeRendererProps { nodeTypes: NodeTypesType; selectNodesOnDrag: boolean; @@ -156,17 +157,7 @@ const NodeRenderer = (props: NodeRendererProps) => { snapGrid, snapToGrid, } = useStore(selector, shallow); - - const nodes = useStore( - useCallback( - (s: ReactFlowState) => { - return props.onlyRenderVisibleElements - ? getNodesInside(s.nodes, { x: 0, y: 0, width: s.width, height: s.height }, s.transform, true) - : s.nodes; - }, - [props.onlyRenderVisibleElements] - ) - ); + const nodes = useVisibleNodes(props.onlyRenderVisibleElements); const transformStyle = useMemo( () => ({ diff --git a/src/hooks/useVisibleEdges.ts b/src/hooks/useVisibleEdges.ts new file mode 100644 index 00000000..74406400 --- /dev/null +++ b/src/hooks/useVisibleEdges.ts @@ -0,0 +1,44 @@ +import { useCallback } from 'react'; + +import { useStore } from '../store'; +import { isEdgeVisible, getSourceTargetNodes } from '../container/EdgeRenderer/utils'; +import { ReactFlowState } from '../types'; + +function useVisibleEdges(onlyRenderVisible: boolean) { + const edges = useStore( + useCallback( + (s: ReactFlowState) => { + if (!onlyRenderVisible) { + return s.edges; + } + + return s.edges.filter((e) => { + const { sourceNode, targetNode } = getSourceTargetNodes(e, s.nodes); + + return ( + sourceNode?.width && + sourceNode?.height && + targetNode?.width && + targetNode?.height && + isEdgeVisible({ + sourcePos: sourceNode.position, + targetPos: targetNode.position, + sourceWidth: sourceNode.width, + sourceHeight: sourceNode.height, + targetWidth: targetNode.width, + targetHeight: targetNode.height, + width: s.width, + height: s.height, + transform: s.transform, + }) + ); + }); + }, + [onlyRenderVisible] + ) + ); + + return edges; +} + +export default useVisibleEdges; diff --git a/src/hooks/useVisibleNodes.ts b/src/hooks/useVisibleNodes.ts new file mode 100644 index 00000000..d6c9bd96 --- /dev/null +++ b/src/hooks/useVisibleNodes.ts @@ -0,0 +1,22 @@ +import { useCallback } from 'react'; + +import { useStore } from '../store'; +import { getNodesInside } from '../utils/graph'; +import { ReactFlowState } from '../types'; + +function useVisibleNodes(onlyRenderVisible: boolean) { + const nodes = useStore( + useCallback( + (s: ReactFlowState) => { + return onlyRenderVisible + ? getNodesInside(s.nodes, { x: 0, y: 0, width: s.width, height: s.height }, s.transform, true) + : s.nodes; + }, + [onlyRenderVisible] + ) + ); + + return nodes; +} + +export default useVisibleNodes;