import { RiCheckboxCircleLine, RiCloseLine, RiErrorWarningLine, } from '@remixicon/react' import { memo, useState, } from 'react' import { useTranslation } from 'react-i18next' import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback' import { ClockPlay, ClockPlaySlim, } from '@/app/components/base/icons/src/vender/line/time' import Loading from '@/app/components/base/loading' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import Tooltip from '@/app/components/base/tooltip' import { useInputFieldPanel } from '@/app/components/rag-pipeline/hooks' import { useStore, useWorkflowStore, } from '@/app/components/workflow/store' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import { useWorkflowRunHistory } from '@/service/use-workflow' import { cn } from '@/utils/classnames' import { useIsChatMode, useNodesInteractions, useWorkflowInteractions, useWorkflowRun, } from '../hooks' import { ControlMode, WorkflowRunningStatus } from '../types' import { formatWorkflowRunIdentifier } from '../utils' export type ViewHistoryProps = { withText?: boolean onClearLogAndMessageModal?: () => void historyUrl?: string } const ViewHistory = ({ withText, onClearLogAndMessageModal, historyUrl, }: ViewHistoryProps) => { const { t } = useTranslation() const isChatMode = useIsChatMode() const [open, setOpen] = useState(false) const { formatTimeFromNow } = useFormatTimeFromNow() const { handleNodesCancelSelected, } = useNodesInteractions() const { handleCancelDebugAndPreviewPanel, } = useWorkflowInteractions() const workflowStore = useWorkflowStore() const setControlMode = useStore(s => s.setControlMode) const historyWorkflowData = useStore(s => s.historyWorkflowData) const { handleBackupDraft } = useWorkflowRun() const { closeAllInputFieldPanels } = useInputFieldPanel() const shouldFetchHistory = open && !!historyUrl const { data, isLoading, } = useWorkflowRunHistory(historyUrl, shouldFetchHistory) return ( ( setOpen(v => !v)}> { withText && (
{t('common.showRunHistory', { ns: 'workflow' })}
) } { !withText && (
{ onClearLogAndMessageModal?.() }} >
) }
{t('common.runHistory', { ns: 'workflow' })}
{ onClearLogAndMessageModal?.() setOpen(false) }} >
{ isLoading && (
) } { !isLoading && (
{ !data?.data.length && (
{t('common.notRunning', { ns: 'workflow' })}
) } { data?.data.map(item => (
{ workflowStore.setState({ historyWorkflowData: item, showInputsPanel: false, showEnvPanel: false, }) closeAllInputFieldPanels() handleBackupDraft() setOpen(false) handleNodesCancelSelected() handleCancelDebugAndPreviewPanel() setControlMode(ControlMode.Hand) }} > { !isChatMode && item.status === WorkflowRunningStatus.Stopped && ( ) } { !isChatMode && item.status === WorkflowRunningStatus.Failed && ( ) } { !isChatMode && item.status === WorkflowRunningStatus.Succeeded && ( ) }
{`Test ${isChatMode ? 'Chat' : 'Run'}${formatWorkflowRunIdentifier(item.finished_at)}`}
{item.created_by_account?.name} {' '} ยท {formatTimeFromNow((item.finished_at || item.created_at) * 1000)}
)) }
) }
) ) } export default memo(ViewHistory)