Spaces:
Build error
Build error
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) | |