|
import type { FC } from 'react' |
|
import { |
|
memo, |
|
useEffect, |
|
} from 'react' |
|
import { |
|
Background, |
|
useNodesInitialized, |
|
useViewport, |
|
} from 'reactflow' |
|
import { useTranslation } from 'react-i18next' |
|
import { IterationStartNodeDumb } from '../iteration-start' |
|
import { useNodeIterationInteractions } from './use-interactions' |
|
import type { IterationNodeType } from './types' |
|
import AddBlock from './add-block' |
|
import cn from '@/utils/classnames' |
|
import type { NodeProps } from '@/app/components/workflow/types' |
|
import Toast from '@/app/components/base/toast' |
|
|
|
const i18nPrefix = 'workflow.nodes.iteration' |
|
|
|
const Node: FC<NodeProps<IterationNodeType>> = ({ |
|
id, |
|
data, |
|
}) => { |
|
const { zoom } = useViewport() |
|
const nodesInitialized = useNodesInitialized() |
|
const { handleNodeIterationRerender } = useNodeIterationInteractions() |
|
const { t } = useTranslation() |
|
|
|
useEffect(() => { |
|
if (nodesInitialized) |
|
handleNodeIterationRerender(id) |
|
if (data.is_parallel && data._isShowTips) { |
|
Toast.notify({ |
|
type: 'warning', |
|
message: t(`${i18nPrefix}.answerNodeWarningDesc`), |
|
duration: 5000, |
|
}) |
|
data._isShowTips = false |
|
} |
|
}, [nodesInitialized, id, handleNodeIterationRerender, data, t]) |
|
|
|
return ( |
|
<div className={cn( |
|
'relative min-w-[240px] min-h-[90px] w-full h-full rounded-2xl bg-[#F0F2F7]/90', |
|
)}> |
|
<Background |
|
id={`iteration-background-${id}`} |
|
className='rounded-2xl !z-0' |
|
gap={[14 / zoom, 14 / zoom]} |
|
size={2 / zoom} |
|
color='#E4E5E7' |
|
/> |
|
{ |
|
data._isCandidate && ( |
|
<IterationStartNodeDumb /> |
|
) |
|
} |
|
{ |
|
data._children!.length === 1 && ( |
|
<AddBlock |
|
iterationNodeId={id} |
|
iterationNodeData={data} |
|
/> |
|
) |
|
} |
|
</div> |
|
) |
|
} |
|
|
|
export default memo(Node) |
|
|