"use client"; import { useEffect, useState } from "react"; import { useParams, useRouter } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; import { getScenario, scenarioEventsUrl, type ProgressEvent } from "@/lib/api"; import { Button } from "@/components/ui/button"; function ProgressBar({ pct }: { pct: number }) { return (
); } export default function ScenarioPage() { const params = useParams<{ id: string }>(); const router = useRouter(); const id = params.id; const [progress, setProgress] = useState(null); const [done, setDone] = useState(false); const { data: scenario, refetch } = useQuery({ queryKey: ["scenario", id], queryFn: () => getScenario(id), refetchInterval: done ? false : 3000, }); useEffect(() => { if (!id) return; const es = new EventSource(scenarioEventsUrl(id)); es.onmessage = (event: MessageEvent) => { const data = JSON.parse(event.data) as ProgressEvent; setProgress(data); if (data.stage === "done") { setDone(true); es.close(); void refetch(); } }; es.onerror = () => es.close(); return () => es.close(); }, [id, refetch]); const statusColor = scenario?.status === "success" ? "text-green-600" : scenario?.status === "failed" ? "text-red-600" : scenario?.status === "running" ? "text-blue-600" : "text-yellow-600"; const kpis = scenario?.kpis_json ? (JSON.parse(scenario.kpis_json) as Record) : null; return (

{scenario?.name ?? "Loading…"}

{scenario?.status ?? "—"}

{(scenario?.status === "queued" || scenario?.status === "running") && (
{progress?.stage ?? "waiting…"} {progress?.pct ?? 0}%
)} {scenario?.status === "success" && kpis && (

Result

            {JSON.stringify(kpis, null, 2)}
          
)} {scenario?.status === "failed" && (
Scenario failed. Check worker logs.
)}
); }