@@ -3,6 +3,7 @@ import { PropTypes } from 'prop-types';
33import ReactFlow , { useNodesState , useEdgesState , addEdge , Controls , Background , ControlButton } from 'reactflow' ;
44import 'reactflow/dist/style.css' ;
55import { cloneDeep , isEqual } from 'lodash' ;
6+ import { toast } from 'react-toastify' ;
67
78// css
89import './index.css' ;
@@ -27,12 +28,15 @@ import FlowNode from 'components/atoms/flow/FlowNode';
2728import { Popover } from '@headlessui/react' ;
2829import { generateFlowData } from './flowtestai' ;
2930import { GENAI_MODELS } from 'constants/Common' ;
31+ import useCanvasStore from 'stores/CanvasStore' ;
32+
33+ import { shallow } from 'zustand/shallow' ;
3034
3135const StartNode = ( ) => (
3236 < FlowNode title = 'Start' handleLeft = { false } handleRight = { true } handleRightData = { { type : 'source' } } > </ FlowNode >
3337) ;
3438
35- const init = ( flowData ) => {
39+ export const init = ( flowData ) => {
3640 // Initialization
3741 if ( flowData && flowData . nodes && flowData . edges ) {
3842 return {
@@ -95,36 +99,19 @@ const init = (flowData) => {
9599 }
96100} ;
97101
98- const Flow = ( { tabId, collectionId, flowData } ) => {
99- useEffect ( ( ) => {
100- // Action to perform on tab change
101- console . log ( `Tab changed to: ${ tabId } ` ) ;
102- console . log ( flowData ) ;
103- // perform actions based on the new tabId
104- const result = init ( cloneDeep ( flowData ) ) ;
105- setNodes ( result . nodes ) ;
106- setEdges ( result . edges ) ;
107- } , [ tabId ] ) ;
102+ const selector = ( state ) => ( {
103+ nodes : state . nodes ,
104+ edges : state . edges ,
105+ onNodesChange : state . onNodesChange ,
106+ onEdgesChange : state . onEdgesChange ,
107+ onConnect : state . onConnect ,
108+ setNodes : state . setNodes ,
109+ setEdges : state . setEdges ,
110+ } ) ;
108111
109- const setCanvasDirty = ( ) => {
110- console . debug ( 'set canvas dirty' ) ;
111- const tab = useTabStore . getState ( ) . tabs . find ( ( t ) => t . id === tabId ) ;
112- if ( tab ) {
113- tab . isDirty = true ;
114- tab . flowData = {
115- nodes : nodes . map ( ( node ) => {
116- const _node = JSON . parse ( JSON . stringify ( node ) ) ;
117- return { ..._node } ;
118- } ) ,
119- edges : edges . map ( ( edge ) => {
120- return {
121- ...edge ,
122- animated : false ,
123- } ;
124- } ) ,
125- } ;
126- }
127- } ;
112+ const Flow = ( { collectionId } ) => {
113+ const { nodes, edges, onNodesChange, onEdgesChange, onConnect, setNodes, setEdges } = useCanvasStore ( selector ) ;
114+ //console.log(nodes);
128115
129116 // notification
130117 // eslint-disable-next-line no-unused-vars
@@ -151,29 +138,6 @@ const Flow = ({ tabId, collectionId, flowData }) => {
151138 [ ] ,
152139 ) ;
153140
154- const [ nodes , setNodes , onNodesChange ] = useNodesState ( [ ] ) ;
155- const [ edges , setEdges , onEdgesChange ] = useEdgesState ( [ ] ) ;
156-
157- useEffect ( ( ) => {
158- // skip inital render
159- if ( flowData === undefined || ( isEqual ( nodes , [ ] ) && isEqual ( edges , [ ] ) ) ) {
160- return ;
161- }
162- if ( flowData && isEqual ( JSON . parse ( JSON . stringify ( nodes ) ) , flowData . nodes ) && isEqual ( edges , flowData . edges ) ) {
163- console . debug ( 'canvas is unchanged' ) ;
164- return ;
165- }
166- setCanvasDirty ( ) ;
167- } , [ nodes , edges ] ) ;
168-
169- const onConnect = ( params ) => {
170- const newEdge = {
171- ...params ,
172- type : 'buttonedge' ,
173- } ;
174- setEdges ( ( eds ) => addEdge ( newEdge , eds ) ) ;
175- } ;
176-
177141 const runnableEdges = ( runnable ) => {
178142 const updatedEdges = reactFlowInstance . getEdges ( ) . map ( ( edge ) => {
179143 return {
@@ -220,7 +184,7 @@ const Flow = ({ tabId, collectionId, flowData }) => {
220184 } ;
221185 console . debug ( 'Dropped node: ' , newNode ) ;
222186
223- setNodes ( ( nds ) => nds . concat ( newNode ) ) ;
187+ setNodes ( [ ... useCanvasStore . getState ( ) . nodes , newNode ] ) ;
224188 } ,
225189 [ reactFlowInstance ] ,
226190 ) ;
@@ -279,7 +243,7 @@ const Flow = ({ tabId, collectionId, flowData }) => {
279243 onInit = { setReactFlowInstance }
280244 onDrop = { onDrop }
281245 onDragOver = { onDragOver }
282- onNodeDragStop = { ( ) => setCanvasDirty ( ) }
246+ // onNodeDragStop={() => setCanvasDirty()}
283247 isValidConnection = { isValidConnection }
284248 //fitView
285249 >
@@ -313,8 +277,8 @@ const Flow = ({ tabId, collectionId, flowData }) => {
313277 setEdges ( result . edges ) ;
314278 } )
315279 . catch ( ( error ) => {
316- // TODO: show error in UI
317280 console . log ( error ) ;
281+ toast . error ( `Error while generating flow data` ) ;
318282 } ) ;
319283 } }
320284 >
@@ -328,9 +292,7 @@ const Flow = ({ tabId, collectionId, flowData }) => {
328292} ;
329293
330294Flow . propTypes = {
331- tabId : PropTypes . string . isRequired ,
332295 collectionId : PropTypes . string . isRequired ,
333- flowData : PropTypes . object . isRequired ,
334296} ;
335297
336298export default Flow ;
0 commit comments