import type { FC, ReactElement, } from 'react' import { cloneElement, memo, useCallback, useMemo, } from 'react' import type { NodeProps } from 'reactflow' import { getOutgoers } from 'reactflow' import { useWorkflowContext } from '../../context' import type { BlockEnum } from '../../types' import { useBlockSelectorContext } from '../../block-selector/context' import NodeControl from '../../node-control' import BlockIcon from '../../block-icon' import { Plus02 } from '@/app/components/base/icons/src/vender/line/general' type BaseNodeProps = { children: ReactElement } & Pick const BaseNode: FC = ({ id: nodeId, data, children, }) => { const { nodes, edges, selectedNodeId, handleSelectedNodeIdChange, handleAddNextNode, } = useWorkflowContext() const { from, open, referenceRef, handleToggle, } = useBlockSelectorContext() const currentNode = useMemo(() => { return nodes.find(node => node.id === nodeId) }, [nodeId, nodes]) const outgoers = useMemo(() => { return getOutgoers(currentNode!, nodes, edges) }, [currentNode, nodes, edges]) const handleSelectBlock = useCallback((type: BlockEnum) => { handleAddNextNode(currentNode!, type) }, [currentNode, handleAddNextNode]) return (
handleSelectedNodeIdChange(nodeId || '')} >
{data.title}
{cloneElement(children, { id: nodeId, data })}
Define the initial parameters for launching a workflow
{ !outgoers.length && (
{ e.stopPropagation() handleToggle({ placement: 'right', offset: 6, callback: handleSelectBlock, }) }} className={` hidden absolute -bottom-2 left-1/2 -translate-x-1/2 items-center justify-center w-4 h-4 rounded-full bg-primary-600 cursor-pointer z-10 group-hover:flex ${open && from === 'node' && '!flex'} `} >
) }
) } export default memo(BaseNode)