| 
									
										
										
										
											2025-03-05 17:41:15 +08:00
										 |  |  | import type { FC } from 'react' | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   memo, | 
					
						
							|  |  |  |   useEffect, | 
					
						
							|  |  |  | } from 'react' | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   Background, | 
					
						
							|  |  |  |   useNodesInitialized, | 
					
						
							|  |  |  |   useViewport, | 
					
						
							|  |  |  | } from 'reactflow' | 
					
						
							|  |  |  | import { LoopStartNodeDumb } from '../loop-start' | 
					
						
							|  |  |  | import { useNodeLoopInteractions } from './use-interactions' | 
					
						
							|  |  |  | import type { LoopNodeType } from './types' | 
					
						
							|  |  |  | import AddBlock from './add-block' | 
					
						
							|  |  |  | import cn from '@/utils/classnames' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import type { NodeProps } from '@/app/components/workflow/types' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Node: FC<NodeProps<LoopNodeType>> = ({ | 
					
						
							|  |  |  |   id, | 
					
						
							|  |  |  |   data, | 
					
						
							|  |  |  | }) => { | 
					
						
							|  |  |  |   const { zoom } = useViewport() | 
					
						
							|  |  |  |   const nodesInitialized = useNodesInitialized() | 
					
						
							|  |  |  |   const { handleNodeLoopRerender } = useNodeLoopInteractions() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     if (nodesInitialized) | 
					
						
							|  |  |  |       handleNodeLoopRerender(id) | 
					
						
							|  |  |  |   }, [nodesInitialized, id, handleNodeLoopRerender]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <div className={cn( | 
					
						
							| 
									
										
										
										
											2025-04-10 17:15:48 +08:00
										 |  |  |       'relative h-full min-h-[90px] w-full min-w-[240px] rounded-2xl bg-workflow-canvas-workflow-bg', | 
					
						
							| 
									
										
										
										
											2025-03-05 17:41:15 +08:00
										 |  |  |     )}> | 
					
						
							|  |  |  |       <Background | 
					
						
							|  |  |  |         id={`loop-background-${id}`} | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         className='!z-0 rounded-2xl' | 
					
						
							| 
									
										
										
										
											2025-03-05 17:41:15 +08:00
										 |  |  |         gap={[14 / zoom, 14 / zoom]} | 
					
						
							|  |  |  |         size={2 / zoom} | 
					
						
							| 
									
										
										
										
											2025-04-10 17:15:48 +08:00
										 |  |  |         color='var(--color-workflow-canvas-workflow-dot-color)' | 
					
						
							| 
									
										
										
										
											2025-03-05 17:41:15 +08:00
										 |  |  |       /> | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         data._isCandidate && ( | 
					
						
							|  |  |  |           <LoopStartNodeDumb /> | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         data._children!.length === 1 && ( | 
					
						
							|  |  |  |           <AddBlock | 
					
						
							|  |  |  |             loopNodeId={id} | 
					
						
							|  |  |  |             loopNodeData={data} | 
					
						
							|  |  |  |           /> | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default memo(Node) |