import type { FC, ReactElement, } from 'react' import { cloneElement, memo, useMemo, useRef, } from 'react' import type { NodeProps } from '../../types' import { BlockEnum, NodeRunningStatus, } from '../../types' import { useNodesReadOnly, useToolIcon, } from '../../hooks' import { NodeSourceHandle, NodeTargetHandle, } from './components/node-handle' import NodeControl from './components/node-control' import BlockIcon from '@/app/components/workflow/block-icon' import { CheckCircle, Loading02, } from '@/app/components/base/icons/src/vender/line/general' import { AlertCircle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback' type BaseNodeProps = { children: ReactElement } & NodeProps const BaseNode: FC = ({ id, data, children, }) => { const nodeRef = useRef(null) const { nodesReadOnly } = useNodesReadOnly() const toolIcon = useToolIcon(data) const showSelectedBorder = data.selected || data._isBundled const { showRunningBorder, showSuccessBorder, showFailedBorder, } = useMemo(() => { return { showRunningBorder: data._runningStatus === NodeRunningStatus.Running && !showSelectedBorder, showSuccessBorder: data._runningStatus === NodeRunningStatus.Succeeded && !showSelectedBorder, showFailedBorder: data._runningStatus === NodeRunningStatus.Failed && !showSelectedBorder, } }, [data._runningStatus, showSelectedBorder]) return (
{ data.type !== BlockEnum.VariableAssigner && !data._isCandidate && ( ) } { data.type !== BlockEnum.IfElse && data.type !== BlockEnum.QuestionClassifier && !data._isCandidate && ( ) } { !data._runningStatus && !nodesReadOnly && !data._isCandidate && ( ) }
{data.title}
{ (data._runningStatus === NodeRunningStatus.Running || data._singleRunningStatus === NodeRunningStatus.Running) && ( ) } { data._runningStatus === NodeRunningStatus.Succeeded && ( ) } { data._runningStatus === NodeRunningStatus.Failed && ( ) }
{cloneElement(children, { id, data })} { data.desc && (
{data.desc}
) }
) } export default memo(BaseNode)