import type { FC } from 'react' import { useMemo } from 'react' import { useNodes } from 'reactflow' import { useTranslation } from 'react-i18next' import { RiLoader2Line, RiStopCircleFill } from '@remixicon/react' import Tooltip from '@/app/components/base/tooltip' import { useStore } from '../store' import useCurrentVars from '../hooks/use-inspect-vars-crud' import { WorkflowRunningStatus } from '@/app/components/workflow/types' import { NodeRunningStatus } from '@/app/components/workflow/types' import type { CommonNodeType } from '@/app/components/workflow/types' import { useEventEmitterContextContext } from '@/context/event-emitter' import { EVENT_WORKFLOW_STOP } from '@/app/components/workflow/variable-inspect/types' import cn from '@/utils/classnames' import { useNodesReadOnly } from '../hooks/use-workflow' const VariableInspectTrigger: FC = () => { const { t } = useTranslation() const { eventEmitter } = useEventEmitterContextContext() const showVariableInspectPanel = useStore(s => s.showVariableInspectPanel) const setShowVariableInspectPanel = useStore(s => s.setShowVariableInspectPanel) const environmentVariables = useStore(s => s.environmentVariables) const setCurrentFocusNodeId = useStore(s => s.setCurrentFocusNodeId) const { conversationVars, systemVars, nodesWithInspectVars, deleteAllInspectorVars, } = useCurrentVars() const currentVars = useMemo(() => { const allVars = [...environmentVariables, ...conversationVars, ...systemVars, ...nodesWithInspectVars] return allVars }, [environmentVariables, conversationVars, systemVars, nodesWithInspectVars]) const { nodesReadOnly, getNodesReadOnly, } = useNodesReadOnly() const workflowRunningData = useStore(s => s.workflowRunningData) const nodes = useNodes() const isStepRunning = useMemo(() => nodes.some(node => node.data._singleRunningStatus === NodeRunningStatus.Running), [nodes]) const isPreviewRunning = useMemo(() => { if (!workflowRunningData) return false return workflowRunningData.result.status === WorkflowRunningStatus.Running }, [workflowRunningData]) const isRunning = useMemo(() => isPreviewRunning || isStepRunning, [isPreviewRunning, isStepRunning]) const handleStop = () => { eventEmitter?.emit({ type: EVENT_WORKFLOW_STOP, } as any) } const handleClearAll = () => { deleteAllInspectorVars() setCurrentFocusNodeId('') } if (showVariableInspectPanel) return null return (
{!isRunning && !currentVars.length && (
{ if (getNodesReadOnly()) return setShowVariableInspectPanel(true) }} > {t('workflow.debug.variableInspect.trigger.normal')}
)} {!isRunning && currentVars.length > 0 && ( <>
{ if (getNodesReadOnly()) return setShowVariableInspectPanel(true) }} > {t('workflow.debug.variableInspect.trigger.cached')}
{t('workflow.debug.variableInspect.trigger.clear')}
)} {isRunning && ( <>
setShowVariableInspectPanel(true)} > {t('workflow.debug.variableInspect.trigger.running')}
{isPreviewRunning && (
)} )}
) } export default VariableInspectTrigger