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 { useResizePanel } from './hooks/use-resize-panel' import { XClose, } from '@/app/components/base/icons/src/vender/line/general' import BlockIcon from '@/app/components/workflow/block-icon' import { useNodeDataUpdate, useNodesExtraData, useNodesInteractions, useNodesReadOnly, useNodesSyncDraft, useToolIcon, } from '@/app/components/workflow/hooks' import { canRunBySingle } from '@/app/components/workflow/utils' 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' type BasePanelProps = { children: ReactElement } & Node const BasePanel: FC = ({ id, data, children, }) => { const { t } = useTranslation() const initPanelWidth = localStorage.getItem('workflow-node-panel-width') || 420 const { handleNodeSelect } = useNodesInteractions() const { handleSyncWorkflowDraft } = useNodesSyncDraft() const { nodesReadOnly } = useNodesReadOnly() const nodesExtraData = useNodesExtraData() const availableNextNodes = nodesExtraData[data.type].availableNextNodes const toolIcon = useToolIcon(data) const handleResized = useCallback((width: number) => { localStorage.setItem('workflow-node-panel-width', `${width}`) }, []) const { triggerRef, containerRef, } = useResizePanel({ direction: 'horizontal', triggerDirection: 'left', minWidth: 420, maxWidth: 720, onResized: handleResized, }) const { handleNodeDataUpdate, handleNodeDataUpdateWithSyncDraft, } = useNodeDataUpdate() const handleTitleBlur = useCallback((title: string) => { handleNodeDataUpdateWithSyncDraft({ id, data: { title } }) }, [handleNodeDataUpdateWithSyncDraft, id]) const handleDescriptionChange = useCallback((desc: string) => { handleNodeDataUpdateWithSyncDraft({ id, data: { desc } }) }, [handleNodeDataUpdateWithSyncDraft, id]) return (
{ canRunBySingle(data.type) && !nodesReadOnly && (
{ handleNodeDataUpdate({ id, data: { _isSingleRun: true } }) handleSyncWorkflowDraft(true) }} >
) }
handleNodeSelect(id, true)} >
{cloneElement(children, { id, data })}
{ !!availableNextNodes.length && (
{t('workflow.panel.nextStep').toLocaleUpperCase()}
{t('workflow.panel.addNextStep')}
) }
) } export default memo(BasePanel)