import { memo, useCallback, } from 'react' import produce from 'immer' import { RiAddLine, } from '@remixicon/react' import { useStoreApi } from 'reactflow' import { useTranslation } from 'react-i18next' import { generateNewNode, } from '../../utils' import { WorkflowHistoryEvent, useAvailableBlocks, useNodesReadOnly, useWorkflowHistory, } from '../../hooks' import { NODES_INITIAL_DATA } from '../../constants' import InsertBlock from './insert-block' import type { IterationNodeType } from './types' import cn from '@/utils/classnames' import BlockSelector from '@/app/components/workflow/block-selector' import { IterationStart } from '@/app/components/base/icons/src/vender/workflow' import type { OnSelectBlock, } from '@/app/components/workflow/types' import { BlockEnum, } from '@/app/components/workflow/types' import TooltipPlus from '@/app/components/base/tooltip-plus' type AddBlockProps = { iterationNodeId: string iterationNodeData: IterationNodeType } const AddBlock = ({ iterationNodeId, iterationNodeData, }: AddBlockProps) => { const { t } = useTranslation() const store = useStoreApi() const { nodesReadOnly } = useNodesReadOnly() const { availableNextBlocks } = useAvailableBlocks(BlockEnum.Start, true) const { availablePrevBlocks } = useAvailableBlocks(iterationNodeData.startNodeType, true) const { saveStateToHistory } = useWorkflowHistory() const handleSelect = useCallback((type, toolDefaultValue) => { const { getNodes, setNodes, } = store.getState() const nodes = getNodes() const nodesWithSameType = nodes.filter(node => node.data.type === type) const newNode = generateNewNode({ data: { ...NODES_INITIAL_DATA[type], title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${type}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${type}`), ...(toolDefaultValue || {}), isIterationStart: true, isInIteration: true, iteration_id: iterationNodeId, }, position: { x: 117, y: 85, }, zIndex: 1001, parentId: iterationNodeId, extent: 'parent', }) const newNodes = produce(nodes, (draft) => { draft.forEach((node) => { if (node.id === iterationNodeId) { node.data._children = [newNode.id] node.data.start_node_id = newNode.id node.data.startNodeType = newNode.data.type } }) draft.push(newNode) }) setNodes(newNodes) saveStateToHistory(WorkflowHistoryEvent.NodeAdd) }, [store, t, iterationNodeId, saveStateToHistory]) const renderTriggerElement = useCallback((open: boolean) => { return (
{t('workflow.common.addBlock')}
) }, [nodesReadOnly, t]) return (
{ iterationNodeData.startNodeType && ( ) }
{ !iterationNodeData.startNodeType && ( ) }
) } export default memo(AddBlock)