"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.
)}
);
}