import type { FC } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { RiCloseLine, } from '@remixicon/react' import { useStore } from '../store' import useCurrentVars from '../hooks/use-inspect-vars-crud' import Empty from './empty' import Left from './left' import Right from './right' import ActionButton from '@/app/components/base/action-button' import type { VarInInspect } from '@/types/workflow' import { VarInInspectType } from '@/types/workflow' import cn from '@/utils/classnames' export type currentVarType = { nodeId: string nodeType: string title: string isValueFetched?: boolean var: VarInInspect } const Panel: FC = () => { const { t } = useTranslation() const bottomPanelWidth = useStore(s => s.bottomPanelWidth) const setShowVariableInspectPanel = useStore(s => s.setShowVariableInspectPanel) const [showLeftPanel, setShowLeftPanel] = useState(true) const environmentVariables = useStore(s => s.environmentVariables) const currentFocusNodeId = useStore(s => s.currentFocusNodeId) const setCurrentFocusNodeId = useStore(s => s.setCurrentFocusNodeId) const [currentVarId, setCurrentVarId] = useState('') const { conversationVars, systemVars, nodesWithInspectVars, fetchInspectVarValue, } = useCurrentVars() const isEmpty = useMemo(() => { const allVars = [...environmentVariables, ...conversationVars, ...systemVars, ...nodesWithInspectVars] return allVars.length === 0 }, [environmentVariables, conversationVars, systemVars, nodesWithInspectVars]) const currentNodeInfo = useMemo(() => { if (!currentFocusNodeId) return if (currentFocusNodeId === VarInInspectType.environment) { const currentVar = environmentVariables.find(v => v.id === currentVarId) const res = { nodeId: VarInInspectType.environment, title: VarInInspectType.environment, nodeType: VarInInspectType.environment, } if (currentVar) { return { ...res, var: { ...currentVar, type: VarInInspectType.environment, visible: true, ...(currentVar.value_type === 'secret' ? { value: '******************' } : {}), }, } } return res } if (currentFocusNodeId === VarInInspectType.conversation) { const currentVar = conversationVars.find(v => v.id === currentVarId) const res = { nodeId: VarInInspectType.conversation, title: VarInInspectType.conversation, nodeType: VarInInspectType.conversation, } if (currentVar) { return { ...res, var: { ...currentVar, type: VarInInspectType.conversation, }, } } return res } if (currentFocusNodeId === VarInInspectType.system) { const currentVar = systemVars.find(v => v.id === currentVarId) const res = { nodeId: VarInInspectType.system, title: VarInInspectType.system, nodeType: VarInInspectType.system, } if (currentVar) { return { ...res, var: { ...currentVar, type: VarInInspectType.system, }, } } return res } const targetNode = nodesWithInspectVars.find(node => node.nodeId === currentFocusNodeId) if (!targetNode) return const currentVar = targetNode.vars.find(v => v.id === currentVarId) return { nodeId: targetNode.nodeId, nodeType: targetNode.nodeType, title: targetNode.title, isSingRunRunning: targetNode.isSingRunRunning, isValueFetched: targetNode.isValueFetched, ...(currentVar ? { var: currentVar } : {}), } }, [currentFocusNodeId, currentVarId, environmentVariables, conversationVars, systemVars, nodesWithInspectVars]) const isCurrentNodeVarValueFetching = useMemo(() => { if (!currentNodeInfo) return false const targetNode = nodesWithInspectVars.find(node => node.nodeId === currentNodeInfo.nodeId) if (!targetNode) return false return !targetNode.isValueFetched }, [currentNodeInfo, nodesWithInspectVars]) const handleNodeVarSelect = useCallback((node: currentVarType) => { setCurrentFocusNodeId(node.nodeId) setCurrentVarId(node.var.id) }, [setCurrentFocusNodeId, setCurrentVarId]) useEffect(() => { if (currentFocusNodeId && currentVarId) { const targetNode = nodesWithInspectVars.find(node => node.nodeId === currentFocusNodeId) if (targetNode && !targetNode.isValueFetched) fetchInspectVarValue([currentFocusNodeId]) } }, [currentFocusNodeId, currentVarId, nodesWithInspectVars, fetchInspectVarValue]) if (isEmpty) { return (
{t('workflow.debug.variableInspect.title')}
setShowVariableInspectPanel(false)}>
) } return (
{/* left */} {bottomPanelWidth < 488 && showLeftPanel &&
setShowLeftPanel(false)}>
}
{/* right */}
setShowLeftPanel(true)} />
) } export default Panel