import { memo, useCallback, useEffect, useState, } from 'react' import { RiClipboardLine, RiCloseLine, } from '@remixicon/react' import { useTranslation } from 'react-i18next' import copy from 'copy-to-clipboard' import ResultText from '../run/result-text' import ResultPanel from '../run/result-panel' import TracingPanel from '../run/tracing-panel' import { useWorkflowInteractions, } from '../hooks' import { useStore } from '../store' import { WorkflowRunningStatus, } from '../types' import Toast from '../../base/toast' import InputsPanel from './inputs-panel' import cn from '@/utils/classnames' import Loading from '@/app/components/base/loading' import Button from '@/app/components/base/button' const WorkflowPreview = () => { const { t } = useTranslation() const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions() const workflowRunningData = useStore(s => s.workflowRunningData) const showInputsPanel = useStore(s => s.showInputsPanel) const showDebugAndPreviewPanel = useStore(s => s.showDebugAndPreviewPanel) const [currentTab, setCurrentTab] = useState(showInputsPanel ? 'INPUT' : 'TRACING') const switchTab = async (tab: string) => { setCurrentTab(tab) } useEffect(() => { if (showDebugAndPreviewPanel && showInputsPanel) setCurrentTab('INPUT') }, [showDebugAndPreviewPanel, showInputsPanel]) useEffect(() => { if ((workflowRunningData?.result.status === WorkflowRunningStatus.Succeeded || workflowRunningData?.result.status === WorkflowRunningStatus.Failed) && !workflowRunningData.resultText && !workflowRunningData.result.files?.length) switchTab('DETAIL') }, [workflowRunningData]) const [panelWidth, setPanelWidth] = useState(420) const [isResizing, setIsResizing] = useState(false) const startResizing = useCallback((e: React.MouseEvent) => { e.preventDefault() setIsResizing(true) }, []) const stopResizing = useCallback(() => { setIsResizing(false) }, []) const resize = useCallback((e: MouseEvent) => { if (isResizing) { const newWidth = window.innerWidth - e.clientX if (newWidth > 420 && newWidth < 1024) setPanelWidth(newWidth) } }, [isResizing]) useEffect(() => { window.addEventListener('mousemove', resize) window.addEventListener('mouseup', stopResizing) return () => { window.removeEventListener('mousemove', resize) window.removeEventListener('mouseup', stopResizing) } }, [resize, stopResizing]) return (
{`Test Run${!workflowRunningData?.result.sequence_number ? '' : `#${workflowRunningData?.result.sequence_number}`}`}
handleCancelDebugAndPreviewPanel()}>
{showInputsPanel && (
switchTab('INPUT')} >{t('runLog.input')}
)}
{ if (!workflowRunningData) return switchTab('RESULT') }} >{t('runLog.result')}
{ if (!workflowRunningData) return switchTab('DETAIL') }} >{t('runLog.detail')}
{ if (!workflowRunningData) return switchTab('TRACING') }} >{t('runLog.tracing')}
{currentTab === 'INPUT' && showInputsPanel && ( switchTab('RESULT')} /> )} {currentTab === 'RESULT' && ( <> switchTab('DETAIL')} /> {(workflowRunningData?.result.status === WorkflowRunningStatus.Succeeded && workflowRunningData?.resultText && typeof workflowRunningData?.resultText === 'string') && ( )} )} {currentTab === 'DETAIL' && ( )} {currentTab === 'DETAIL' && !workflowRunningData?.result && (
)} {currentTab === 'TRACING' && ( )} {currentTab === 'TRACING' && !workflowRunningData?.tracing?.length && (
)}
) } export default memo(WorkflowPreview)