/** * [F11-S3] ExportMenu — Dropdown button with JSON/CSV export options */ import React, { useCallback, useState } from 'react'; import type { AgentLensEvent, Session } from '@agentkitai/agentlens-core'; import { exportSessionJSON, exportSessionCSV, exportSessionNDJSON, triggerDownload, getExportFilename, } from '../../utils/export-utils'; export interface ExportMenuProps { sessionId: string; session: Session; events: AgentLensEvent[]; chainValid: boolean; } export function ExportMenu({ sessionId, session, events, chainValid, }: ExportMenuProps): React.ReactElement { const [open, setOpen] = useState(false); const [exporting, setExporting] = useState(false); const handleExport = useCallback( async (format: 'json' | 'csv' | 'ndjson') => { setExporting(true); setOpen(false); try { // For large datasets (>5000), use setTimeout to yield to UI // Full Web Worker implementation deferred for simplicity await new Promise((r) => setTimeout(r, 0)); const blob = format === 'json' ? exportSessionJSON(session, events, chainValid) : format === 'ndjson' ? exportSessionNDJSON(session, events, chainValid) : exportSessionCSV(session, events); triggerDownload(blob, getExportFilename(sessionId, format)); } finally { setExporting(false); } }, [session, events, chainValid, sessionId], ); return (
{open && ( <> {/* Backdrop */}
setOpen(false)} /> {/* Dropdown */}
)}
); }