import type { FC, ReactElement, } from 'react' import { cloneElement, memo, useCallback, } from 'react' import { useTranslation } from 'react-i18next' import NextStep from './components/next-step' import PanelOperator from './components/panel-operator' import { DescriptionInput, TitleInput, } from './components/title-description-input' import { XClose, } from '@/app/components/base/icons/src/vender/line/general' import BlockIcon from '@/app/components/workflow/block-icon' import { useNodeDataUpdate, useNodesInteractions, } from '@/app/components/workflow/hooks' import { canRunBySingle } from '@/app/components/workflow/utils' import { GitBranch01 } from '@/app/components/base/icons/src/vender/line/development' import { Play } from '@/app/components/base/icons/src/vender/line/mediaAndDevices' import TooltipPlus from '@/app/components/base/tooltip-plus' import type { Node } from '@/app/components/workflow/types' import { BlockEnum } from '@/app/components/workflow/types' type BasePanelProps = { children: ReactElement } & Node const BasePanel: FC = ({ id, data, children, }) => { const { t } = useTranslation() const { handleNodeSelect } = useNodesInteractions() const { handleNodeDataUpdate, handleNodeDataUpdateWithSyncDraft, } = useNodeDataUpdate() const handleTitleChange = useCallback((title: string) => { if (!title) return handleNodeDataUpdateWithSyncDraft({ id, data: { ...data, title } }) }, [handleNodeDataUpdateWithSyncDraft, id, data]) const handleDescriptionChange = useCallback((desc: string) => { handleNodeDataUpdateWithSyncDraft({ id, data: { ...data, desc } }) }, [handleNodeDataUpdateWithSyncDraft, id, data]) return (
{ canRunBySingle(data.type) && (
handleNodeDataUpdate({ id, data: { _isSingleRun: true } })} >
) }
handleNodeSelect(id, true)} >
{cloneElement(children, { id, data })}
{ data.type !== BlockEnum.End && (
{t('workflow.panel.nextStep').toLocaleUpperCase()}
{t('workflow.panel.addNextStep')}
) }
) } export default memo(BasePanel)