From 4a3a6a3a629b249e94d8a1db1335e319d323a6bf Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 30 Mar 2021 12:20:44 +0200 Subject: [PATCH] refactor(lib): forward ref closes #1050 --- src/container/ReactFlow/index.tsx | 309 +++++++++++++++--------------- 1 file changed, 158 insertions(+), 151 deletions(-) diff --git a/src/container/ReactFlow/index.tsx b/src/container/ReactFlow/index.tsx index 809fef98..e91ae27f 100644 --- a/src/container/ReactFlow/index.tsx +++ b/src/container/ReactFlow/index.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, CSSProperties, HTMLAttributes, MouseEvent, WheelEvent } from 'react'; +import React, { useMemo, CSSProperties, HTMLAttributes, MouseEvent, WheelEvent, forwardRef } from 'react'; import cc from 'classcat'; import GraphView from '../GraphView'; @@ -119,157 +119,164 @@ export interface ReactFlowProps extends Omit, 'on edgeTypesId?: string; } -const ReactFlow = ({ - elements = [], - className, - nodeTypes = defaultNodeTypes, - edgeTypes = defaultEdgeTypes, - onElementClick, - onLoad, - onMove, - onMoveStart, - onMoveEnd, - onElementsRemove, - onConnect, - onConnectStart, - onConnectStop, - onConnectEnd, - onNodeMouseEnter, - onNodeMouseMove, - onNodeMouseLeave, - onNodeContextMenu, - onNodeDoubleClick, - onNodeDragStart, - onNodeDrag, - onNodeDragStop, - onSelectionChange, - onSelectionDragStart, - onSelectionDrag, - onSelectionDragStop, - onSelectionContextMenu, - connectionMode = ConnectionMode.Strict, - connectionLineType = ConnectionLineType.Bezier, - connectionLineStyle, - connectionLineComponent, - deleteKeyCode = 'Backspace', - selectionKeyCode = 'Shift', - multiSelectionKeyCode = 'Meta', - zoomActivationKeyCode = 'Meta', - snapToGrid = false, - snapGrid = [15, 15], - onlyRenderVisibleElements = true, - selectNodesOnDrag = true, - nodesDraggable, - nodesConnectable, - elementsSelectable, - minZoom, - maxZoom, - defaultZoom = 1, - defaultPosition = [0, 0], - translateExtent, - nodeExtent, - arrowHeadColor = '#b1b1b7', - markerEndId, - zoomOnScroll = true, - zoomOnPinch = true, - panOnScroll = false, - panOnScrollSpeed = 0.5, - panOnScrollMode = PanOnScrollMode.Free, - zoomOnDoubleClick = true, - paneMoveable = true, - onPaneClick, - onPaneScroll, - onPaneContextMenu, - children, - onEdgeUpdate, - onEdgeContextMenu, - onEdgeMouseEnter, - onEdgeMouseMove, - onEdgeMouseLeave, - edgeUpdaterRadius = 10, - nodeTypesId = '1', - edgeTypesId = '1', - ...rest -}: ReactFlowProps) => { - const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), [nodeTypesId]); - const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), [edgeTypesId]); - const reactFlowClasses = cc(['react-flow', className]); +export type ReactFlowRefType = HTMLDivElement; - return ( -
- - - - {onSelectionChange && } - {children} - -
- ); -}; +const ReactFlow = forwardRef( + ( + { + elements = [], + className, + nodeTypes = defaultNodeTypes, + edgeTypes = defaultEdgeTypes, + onElementClick, + onLoad, + onMove, + onMoveStart, + onMoveEnd, + onElementsRemove, + onConnect, + onConnectStart, + onConnectStop, + onConnectEnd, + onNodeMouseEnter, + onNodeMouseMove, + onNodeMouseLeave, + onNodeContextMenu, + onNodeDoubleClick, + onNodeDragStart, + onNodeDrag, + onNodeDragStop, + onSelectionChange, + onSelectionDragStart, + onSelectionDrag, + onSelectionDragStop, + onSelectionContextMenu, + connectionMode = ConnectionMode.Strict, + connectionLineType = ConnectionLineType.Bezier, + connectionLineStyle, + connectionLineComponent, + deleteKeyCode = 'Backspace', + selectionKeyCode = 'Shift', + multiSelectionKeyCode = 'Meta', + zoomActivationKeyCode = 'Meta', + snapToGrid = false, + snapGrid = [15, 15], + onlyRenderVisibleElements = true, + selectNodesOnDrag = true, + nodesDraggable, + nodesConnectable, + elementsSelectable, + minZoom, + maxZoom, + defaultZoom = 1, + defaultPosition = [0, 0], + translateExtent, + nodeExtent, + arrowHeadColor = '#b1b1b7', + markerEndId, + zoomOnScroll = true, + zoomOnPinch = true, + panOnScroll = false, + panOnScrollSpeed = 0.5, + panOnScrollMode = PanOnScrollMode.Free, + zoomOnDoubleClick = true, + paneMoveable = true, + onPaneClick, + onPaneScroll, + onPaneContextMenu, + children, + onEdgeUpdate, + onEdgeContextMenu, + onEdgeMouseEnter, + onEdgeMouseMove, + onEdgeMouseLeave, + edgeUpdaterRadius = 10, + nodeTypesId = '1', + edgeTypesId = '1', + ...rest + }, + ref + ) => { + const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), [nodeTypesId]); + const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), [edgeTypesId]); + const reactFlowClasses = cc(['react-flow', className]); + + return ( +
+ + + + {onSelectionChange && } + {children} + +
+ ); + } +); ReactFlow.displayName = 'ReactFlow';