1- import React , { memo , Fragment , useCallback } from 'react' ;
1+ import React , { memo , Fragment , useCallback , useEffect , useState } from 'react' ;
22
33import {
44 ReactFlow as ReactFlowOrig ,
@@ -86,47 +86,34 @@ export default function ReactFlow({
8686 ...props
8787} ) {
8888
89- // if dagre is enabled, we need to layout the nodes
89+ var nodes_used = nodes ;
90+
9091 if ( use_dagre ) {
91- // Overwrite nodes with layouted nodes
92- nodes = getLayoutedNodes ( nodes , edges , dagre_direction , dagre_config ) ;
92+ nodes_used = getLayoutedNodes ( nodes_used , edges , dagre_direction , dagre_config ) ;
9393 }
94-
95- const [ final_nodes , setNodes , onNodesChange ] = useNodesState ( nodes ) ;
94+
95+ const [ final_nodes , setNodes , onNodesChange ] = useNodesState ( nodes_used ) ;
9696 const [ final_edges , setEdges , onEdgesChange ] = useEdgesState ( edges ) ;
9797
98- // TODO make onNodeChange, onEdgeChange, onConnect a JS function that can be passed ??
98+ useEffect ( ( ) => {
99+ setNodes ( nodes_used ) ;
100+ setEdges ( edges ) ;
101+ } , [ nodes , edges ] ) ;
99102
100103 const onConnect = useCallback ( ( params ) => setEdges ( ( eds ) => addEdge ( params , eds ) ) , [ setEdges ] ) ;
101104
102- // for the minimap
103- function nodeColor ( node ) {
104- switch ( node . type ) {
105- case 'input' :
106- return 'lightgreen' ;
107- case 'output' :
108- return 'coral' ;
109- default :
110- return 'lightblue' ;
111- }
112- }
113-
114- // when the layout changes, recalculate the positions
115105 const onLayout = useCallback (
116106 ( dagre_direction ) => {
117- nodes2 = getLayoutedNodes ( nodes , edges , dagre_direction , dagre_config ) ;
118-
119- setNodes ( [ ...nodes2 ] ) ;
120- setEdges ( [ ...edges ] ) ;
121-
107+ const layoutedNodes = getLayoutedNodes ( nodes , edges , dagre_direction , dagre_config ) ;
108+ setNodes ( layoutedNodes ) ;
109+ setEdges ( edges ) ;
122110 window . requestAnimationFrame ( ( ) => {
123111 fitView ( ) ;
124112 } ) ;
125-
126113 } ,
127114 [ nodes , edges , dagre_direction , dagre_config ] ,
128115 ) ;
129-
116+
130117 return (
131118 < ReactFlowOrig
132119 nodes = { final_nodes }
@@ -136,18 +123,17 @@ export default function ReactFlow({
136123 onLayout = { onLayout }
137124 onConnect = { allow_edge_connection ? onConnect : undefined }
138125 nodeTypes = { nodeTypes }
139-
140- onNodeDrag = { ( event , node , nodes ) => {
126+ onNodeClick = { ( event , node ) => {
141127 Shiny . setInputValue ( elementId + "_click" , { node : node . id , edge : null } ) ;
142128 } }
143- onNodeClick = { ( event , node ) => {
129+ // the node is selected when dragging in CSS! this makes it consistent
130+ onNodeDrag = { ( event , node ) => {
144131 Shiny . setInputValue ( elementId + "_click" , { node : node . id , edge : null } ) ;
145132 } }
146133 onEdgeClick = { ( event , edge ) => {
147134 Shiny . setInputValue ( elementId + "_click" , { node : null , edge : edge . id } ) ;
148135 } }
149136 { ...props }
150- >
151- </ ReactFlowOrig >
152- )
137+ />
138+ ) ;
153139}
0 commit comments