import { t } from 'i18next'; import { ChevronLeft, Info } from 'lucide-react'; import React, { useMemo } from 'react'; import { LeftSideBarType, useBuilderStateContext, } from '@/app/builder/builder-hooks'; import { CardList } from '@/components/custom/card-list'; import { Button } from '@/components/ui/button'; import { ResizableHandle, ResizablePanel, ResizablePanelGroup, } from '@/components/ui/resizable-panel'; import { LoadingSpinner } from '@/components/ui/spinner'; import { flagsHooks } from '@/hooks/flags-hooks'; import { ApFlagId, FlowRun, FlowRunStatus, isNil, RunEnvironment, } from '@activepieces/shared'; import { flowRunUtils } from '../../../features/flow-runs/lib/flow-run-utils'; import { SidebarHeader } from '../sidebar-header'; import { FlowStepIO } from './flow-step-io'; import { FlowStepDetailsCardItem } from './run-step-card-item'; function getMessage(run: FlowRun | null, retentionDays: number | null) { if ( !run || [ FlowRunStatus.RUNNING, FlowRunStatus.QUEUED, FlowRunStatus.SUCCEEDED, ].includes(run.status) ) return null; if ([FlowRunStatus.INTERNAL_ERROR].includes(run.status)) { return t('There are no logs captured for this run.'); } if (isNil(run.logsFileId)) { return t( 'Logs are kept for {days} days after execution and then deleted.', { days: retentionDays }, ); } return null; } const FlowRunDetails = React.memo(() => { const { data: rententionDays } = flagsHooks.useFlag( ApFlagId.EXECUTION_DATA_RETENTION_DAYS, ); const [setLeftSidebar, run, steps, loopsIndexes, flowVersion, selectedStep] = useBuilderStateContext((state) => { const steps = state.run && state.run.steps ? Object.keys(state.run.steps) : []; return [ state.setLeftSidebar, state.run, steps, state.loopsIndexes, state.flowVersion, state.selectedStep, ]; }); const selectedStepOutput = useMemo(() => { return run && selectedStep && run.steps ? flowRunUtils.extractStepOutput( selectedStep, loopsIndexes, run.steps, flowVersion.trigger, ) : null; }, [run, selectedStep, loopsIndexes, flowVersion.trigger]); const message = getMessage(run, rententionDays); if (!isNil(message)) return (

{message}

); return ( setLeftSidebar(LeftSideBarType.NONE)}>
{run && run.environment !== RunEnvironment.TESTING && ( )} {t('Run Details')}
{steps.length > 0 && steps .filter((path) => !isNil(path)) .map((path) => ( ))} {steps.length === 0 && (
)}
{selectedStepOutput && ( <> )}
); }); FlowRunDetails.displayName = 'FlowRunDetails'; export { FlowRunDetails };