import { useEffect, useState } from "react"; import { htmlUrl } from "../api"; import "./HtmlPanel.css"; interface HtmlPanelProps { runId: string; fileName: string; available: boolean; } type ViewMode = "render" | "source"; export default function HtmlPanel({ runId, fileName, available }: HtmlPanelProps): JSX.Element { const [mode, setMode] = useState("render"); const [source, setSource] = useState(null); const [error, setError] = useState(null); const url = htmlUrl(runId, fileName); useEffect(() => { if (!available || mode !== "source") return; let cancelled = false; setSource(null); setError(null); fetch(url) .then((response) => { if (!response.ok) throw new Error(`${response.status} ${response.statusText}`); return response.text(); }) .then((text) => { if (!cancelled) setSource(text); }) .catch((failure: unknown) => { if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure)); }); return () => { cancelled = true; }; }, [available, mode, url]); if (!available) { return
no html captured for this step
; } return (
{mode === "render" ? (