'use client' import { useCallback, useState, } from 'react' import ReactFlow, { Background, MiniMap, ReactFlowProvider, SelectionMode, applyEdgeChanges, applyNodeChanges, } from 'reactflow' import type { EdgeChange, NodeChange, Viewport, } from 'reactflow' import 'reactflow/dist/style.css' import '../style.css' import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants' import { CUSTOM_LOOP_START_NODE } from '@/app/components/workflow/nodes/loop-start/constants' import { CUSTOM_SIMPLE_NODE } from '@/app/components/workflow/simple-node/constants' import CustomConnectionLine from '@/app/components/workflow/custom-connection-line' import { CUSTOM_EDGE, CUSTOM_NODE, ITERATION_CHILDREN_Z_INDEX, } from '@/app/components/workflow/constants' import cn from '@/utils/classnames' import { initialEdges, initialNodes, } from '@/app/components/workflow/utils/workflow-init' import type { Edge, Node, } from '@/app/components/workflow/types' import { CUSTOM_NOTE_NODE } from '@/app/components/workflow/note-node/constants' import CustomNode from './components/nodes' import CustomEdge from './components/custom-edge' import ZoomInOut from './components/zoom-in-out' import IterationStartNode from './components/nodes/iteration-start' import LoopStartNode from './components/nodes/loop-start' import CustomNoteNode from './components/note-node' const nodeTypes = { [CUSTOM_NODE]: CustomNode, [CUSTOM_NOTE_NODE]: CustomNoteNode, [CUSTOM_SIMPLE_NODE]: CustomNode, [CUSTOM_ITERATION_START_NODE]: IterationStartNode, [CUSTOM_LOOP_START_NODE]: LoopStartNode, } const edgeTypes = { [CUSTOM_EDGE]: CustomEdge, } type WorkflowPreviewProps = { nodes: Node[] edges: Edge[] viewport: Viewport className?: string } const WorkflowPreview = ({ nodes, edges, viewport, className, }: WorkflowPreviewProps) => { const [nodesData, setNodesData] = useState(initialNodes(nodes, edges)) const [edgesData, setEdgesData] = useState(initialEdges(edges, nodes)) const onNodesChange = useCallback( (changes: NodeChange[]) => setNodesData(nds => applyNodeChanges(changes, nds)), [], ) const onEdgesChange = useCallback( (changes: EdgeChange[]) => setEdgesData(eds => applyEdgeChanges(changes, eds)), [], ) return (