import { memo, useState, } from 'react' import type { Fetcher } from 'swr' import useSWR from 'swr' import { useTranslation } from 'react-i18next' import { noop } from 'lodash-es' import { RiCheckboxCircleLine, RiCloseLine, RiErrorWarningLine, } from '@remixicon/react' import { useFormatTimeFromNow, useIsChatMode, useNodesInteractions, useWorkflowInteractions, useWorkflowRun, } from '../hooks' import { ControlMode, WorkflowRunningStatus } from '../types' import { formatWorkflowRunIdentifier } from '../utils' import cn from '@/utils/classnames' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import Tooltip from '@/app/components/base/tooltip' import { ClockPlay, ClockPlaySlim, } from '@/app/components/base/icons/src/vender/line/time' import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback' import Loading from '@/app/components/base/loading' import { useStore, useWorkflowStore, } from '@/app/components/workflow/store' import type { WorkflowRunHistoryResponse } from '@/types/workflow' export type ViewHistoryProps = { withText?: boolean onClearLogAndMessageModal?: () => void historyUrl?: string historyFetcher?: Fetcher } const ViewHistory = ({ withText, onClearLogAndMessageModal, historyUrl, historyFetcher, }: 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 fetcher = historyFetcher ?? (noop as Fetcher) const { data, isLoading, } = useSWR((open && historyUrl && historyFetcher) ? historyUrl : null, fetcher) return ( ( setOpen(v => !v)}> { withText && (
{t('workflow.common.showRunHistory')}
) } { !withText && (
{ onClearLogAndMessageModal?.() }} >
) }
{t('workflow.common.runHistory')}
{ onClearLogAndMessageModal?.() setOpen(false) }} >
{ isLoading && (
) } { !isLoading && (
{ !data?.data.length && (
{t('workflow.common.notRunning')}
) } { data?.data.map(item => (
{ workflowStore.setState({ historyWorkflowData: item, showInputsPanel: false, showEnvPanel: false, }) 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)