"use client"; import React from "react"; import { useState, useRef } from "react"; import DiagnosticsView from "@/components/diagnostics-view"; import GraphUpdateView from "@/components/graph-update-view"; import SituationGraphView from "@/components/situation-graph-view"; const MAX_LENGTH = 10000; export async function submitScenarioForStartCase(fetchImpl, scenario) { return fetchImpl("/api/cases/start", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ scenario }), }); } export async function submitAnswerForUpdateCase( fetchImpl, { situationGraph, previousQuestion, answer }, ) { if (!answer?.trim()) { return { ok: false, skipped: true, data: { success: false, stage: "request_validation", error: "Please enter an answer before updating.", }, }; } const response = await fetchImpl("/api/cases/update", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ situationGraph, previousQuestion, answer }), }); return { ok: response.ok, skipped: false, data: await response.json(), }; } function normaliseStartResult(data) { return { ...data, selectedQuestion: typeof data?.selectedQuestion === "string" ? data.selectedQuestion : data?.selectedQuestion?.question ?? null, }; } export function ScenarioResultPanels({ status, result }) { if (!result) return null; const hasGraph = Boolean(result.situationGraph); const hasQuestion = Boolean(result.selectedQuestion?.question); const hasDiagnostics = Boolean(result.diagnostics); return ( <> {status === "error" && (
{result.error && (
Error: {result.error}
)} {!hasGraph && !hasQuestion && (
Validation failed — no structured graph output was produced.
)}
)} {(status === "success" || hasGraph || hasQuestion) && ( )} {hasDiagnostics && } ); } export function UpdateErrorPanel({ updateError }) { if (!updateError) return null; const errors = [ ...(updateError.errors || []), ...(updateError.validationErrors || []), ...(updateError.graphValidationErrors || []), ...(updateError.proposalErrors || []), ...(updateError.providerErrors || []), ]; return (
Update error: {updateError.error}
{errors.length > 0 && (
Update details ({errors.length})
    {errors.map((item, index) => (
  • {typeof item === "string" ? item : item?.message || JSON.stringify(item)}
  • ))}
)}
); } export default function ScenarioForm() { const [scenario, setScenario] = useState(""); const [status, setStatus] = useState("idle"); // idle | loading | error | success const [result, setResult] = useState(null); const [answer, setAnswer] = useState(""); const [updateStatus, setUpdateStatus] = useState("idle"); // idle | loading | error | success const [updateError, setUpdateError] = useState(null); const [updateResult, setUpdateResult] = useState(null); const textareaRef = useRef(null); const handleSubmit = async (e) => { e.preventDefault(); setStatus("loading"); setResult(null); setAnswer(""); setUpdateStatus("idle"); setUpdateError(null); setUpdateResult(null); try { const res = await submitScenarioForStartCase(fetch, scenario); const data = await res.json(); if (res.ok && data.success) { setStatus("success"); setResult(normaliseStartResult(data)); } else { setStatus("error"); setResult(normaliseStartResult(data)); } } catch (err) { setStatus("error"); setResult({ error: err.message || "Network request failed" }); } }; const handleUpdate = async (e) => { e.preventDefault(); const submission = await submitAnswerForUpdateCase(fetch, { situationGraph: result?.situationGraph, previousQuestion: result?.selectedQuestion, answer, }); if (submission.skipped) { setUpdateStatus("error"); setUpdateError(submission.data); return; } setUpdateStatus("loading"); setUpdateError(null); try { const outcome = submission.data; if (submission.ok && outcome.success) { setUpdateStatus("success"); setUpdateResult({ ...outcome, previousSituationGraph: result?.situationGraph ?? null, }); setResult((current) => ({ ...current, situationGraph: outcome.updatedSituationGraph, selectedQuestion: null, diagnostics: outcome.diagnostics, })); setAnswer(""); } else { setUpdateStatus("error"); setUpdateError(outcome); } } catch (err) { setUpdateStatus("error"); setUpdateError({ error: err.message || "Network request failed" }); } }; const canRenderAnswerForm = status === "success" && Boolean(result?.situationGraph) && Boolean(result?.selectedQuestion); return (