| 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) | |