import React, { useState, useEffect, useRef } from "react"; import type { SessionDetailResponse } from "../lib/types"; interface Props { session: SessionDetailResponse; visibleMessageUuids: string[]; redactedMessageUuids: string[]; autoRedactEnabled: boolean; } export function ExportButton({ session, visibleMessageUuids, redactedMessageUuids, autoRedactEnabled, }: Props) { const [state, setState] = useState<"idle" | "exporting" | "success" | "error">("idle"); const timerRef = useRef>(); useEffect(() => { return () => { if (timerRef.current) clearTimeout(timerRef.current); }; }, []); async function handleExport() { setState("exporting"); try { const res = await fetch("/api/export", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ session, visibleMessageUuids, redactedMessageUuids, autoRedactEnabled, }), }); if (!res.ok) throw new Error(`Export failed: HTTP ${res.status}`); const blob = await res.blob(); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `session-${session.id}.html`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); setState("success"); timerRef.current = setTimeout(() => setState("idle"), 2000); } catch (err) { console.error("Export failed:", err); setState("error"); timerRef.current = setTimeout(() => setState("idle"), 3000); } } return ( ); }