"use client"; import { useEffect, useRef } from "react"; import { useRouter } from "next/navigation"; interface JobDetailLiveProps { jobId: string; isTerminal: boolean; } export function JobDetailLive({ jobId, isTerminal }: JobDetailLiveProps) { const router = useRouter(); const isTerminalRef = useRef(isTerminal); isTerminalRef.current = isTerminal; useEffect(() => { if (isTerminalRef.current) return; const eventSource = new EventSource(`/api/jobs/${jobId}/stream`); eventSource.onmessage = (event) => { try { const data = JSON.parse(event.data); router.refresh(); if (data.status === "success" || data.status === "failed" || data.status === "cancelled") { eventSource.close(); } } catch { // ignore parse errors } }; eventSource.onerror = () => { eventSource.close(); }; return () => { eventSource.close(); }; }, [jobId, router]); return null; }