'use client' import type { FC } from 'react' import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { RiArrowLeftLine, RiArrowRightSLine, RiErrorWarningLine, RiLoader2Line, } from '@remixicon/react' import { NodeRunningStatus } from '@/app/components/workflow/types' import TracingPanel from '@/app/components/workflow/run/tracing-panel' import { Iteration } from '@/app/components/base/icons/src/vender/workflow' import cn from '@/utils/classnames' import type { IterationDurationMap, NodeTracing } from '@/types/workflow' const i18nPrefix = 'workflow.singleRun' type Props = { list: NodeTracing[][] onBack: () => void iterDurationMap?: IterationDurationMap } const IterationResultPanel: FC = ({ list, onBack, iterDurationMap, }) => { const { t } = useTranslation() const [expandedIterations, setExpandedIterations] = useState>({}) const toggleIteration = useCallback((index: number) => { setExpandedIterations(prev => ({ ...prev, [index]: !prev[index], })) }, []) const countIterDuration = (iteration: NodeTracing[], iterDurationMap: IterationDurationMap): string => { const IterRunIndex = iteration[0]?.execution_metadata?.iteration_index as number const iterRunId = iteration[0]?.execution_metadata?.parallel_mode_run_id const iterItem = iterDurationMap[iterRunId || IterRunIndex] const duration = iterItem return `${(duration && duration > 0.01) ? duration.toFixed(2) : 0.01}s` } const iterationStatusShow = (index: number, iteration: NodeTracing[], iterDurationMap?: IterationDurationMap) => { const hasFailed = iteration.some(item => item.status === NodeRunningStatus.Failed) const isRunning = iteration.some(item => item.status === NodeRunningStatus.Running) const hasDurationMap = iterDurationMap && Object.keys(iterDurationMap).length !== 0 if (hasFailed) return if (isRunning) return return ( <> {hasDurationMap && (
{countIterDuration(iteration, iterDurationMap)}
)} ) } return (
{ e.stopPropagation() e.nativeEvent.stopImmediatePropagation() onBack() }} >
{t(`${i18nPrefix}.back`)}
{/* List */}
{list.map((iteration, index) => (
toggleIteration(index)} >
{t(`${i18nPrefix}.iteration`)} {index + 1} {iterationStatusShow(index, iteration, iterDurationMap)}
{expandedIterations[index] &&
}
))}
) } export default React.memo(IterationResultPanel)