import { useState, useMemo } from 'react'; import { useParams, useNavigate } from 'react-router'; import { Card, Badge, StatusDot, MonoText, CodeBlock, InfoCallout, ProcessorTimeline, Breadcrumb, Spinner, } from '@cameleer/design-system'; import { useExecutionDetail, useProcessorSnapshot } from '../../api/queries/executions'; export default function ExchangeDetail() { const { id } = useParams(); const navigate = useNavigate(); const { data: detail, isLoading } = useExecutionDetail(id ?? null); const [selectedProcessor, setSelectedProcessor] = useState(null); const { data: snapshot } = useProcessorSnapshot(id ?? null, selectedProcessor); const processors = useMemo(() => { if (!detail?.children) return []; const result: any[] = []; let offset = 0; function walk(node: any) { result.push({ name: node.processorId || node.processorType, type: node.processorType, durationMs: node.durationMs ?? 0, status: node.status === 'COMPLETED' ? 'ok' : node.status === 'FAILED' ? 'fail' : 'ok', startMs: offset, }); offset += node.durationMs ?? 0; if (node.children) node.children.forEach(walk); } detail.children.forEach(walk); return result; }, [detail]); if (isLoading) return
; if (!detail) return Exchange not found; return (
Status
Duration
{detail.durationMs}ms
Route
{detail.routeId}
Application
{detail.errorMessage && (
{detail.errorMessage}
)}

Processor Timeline

{processors.length > 0 ? ( setSelectedProcessor(i)} selectedIndex={selectedProcessor ?? undefined} /> ) : ( No processor data available )} {snapshot && (

Exchange Snapshot

Input Body

Output Body

Input Headers

Output Headers

)}
); }