| import { |
| memo, |
| useCallback, |
| } from 'react' |
| import { |
| RiAddLine, |
| } from '@remixicon/react' |
| import { useTranslation } from 'react-i18next' |
| import { |
| useAvailableBlocks, |
| useNodesInteractions, |
| useNodesReadOnly, |
| } from '../../hooks' |
| import type { IterationNodeType } from './types' |
| import cn from '@/utils/classnames' |
| import BlockSelector from '@/app/components/workflow/block-selector' |
| import type { |
| OnSelectBlock, |
| } from '@/app/components/workflow/types' |
| import { |
| BlockEnum, |
| } from '@/app/components/workflow/types' |
|
|
| type AddBlockProps = { |
| iterationNodeId: string |
| iterationNodeData: IterationNodeType |
| } |
| const AddBlock = ({ |
| iterationNodeData, |
| }: AddBlockProps) => { |
| const { t } = useTranslation() |
| const { nodesReadOnly } = useNodesReadOnly() |
| const { handleNodeAdd } = useNodesInteractions() |
| const { availableNextBlocks } = useAvailableBlocks(BlockEnum.Start, true) |
|
|
| const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => { |
| handleNodeAdd( |
| { |
| nodeType: type, |
| toolDefaultValue, |
| }, |
| { |
| prevNodeId: iterationNodeData.start_node_id, |
| prevNodeSourceHandle: 'source', |
| }, |
| ) |
| }, [handleNodeAdd, iterationNodeData.start_node_id]) |
|
|
| const renderTriggerElement = useCallback((open: boolean) => { |
| return ( |
| <div className={cn( |
| 'relative inline-flex items-center px-3 h-8 rounded-lg border-[0.5px] border-gray-50 bg-white shadow-xs cursor-pointer hover:bg-gray-200 text-[13px] font-medium text-gray-700', |
| `${nodesReadOnly && '!cursor-not-allowed opacity-50'}`, |
| open && '!bg-gray-50', |
| )}> |
| <RiAddLine className='mr-1 w-4 h-4' /> |
| {t('workflow.common.addBlock')} |
| </div> |
| ) |
| }, [nodesReadOnly, t]) |
|
|
| return ( |
| <div className='absolute top-7 left-14 flex items-center h-8 z-10'> |
| <div className='group/insert relative w-16 h-0.5 bg-gray-300'> |
| <div className='absolute right-0 top-1/2 -translate-y-1/2 w-0.5 h-2 bg-primary-500'></div> |
| </div> |
| <BlockSelector |
| disabled={nodesReadOnly} |
| onSelect={handleSelect} |
| trigger={renderTriggerElement} |
| triggerInnerClassName='inline-flex' |
| popupClassName='!min-w-[256px]' |
| availableBlocksTypes={availableNextBlocks} |
| /> |
| </div> |
| ) |
| } |
|
|
| export default memo(AddBlock) |
|
|