diff --git a/hooks/use-jobs-realtime.ts b/hooks/use-jobs-realtime.ts index f85b5c5..b15cd0a 100644 --- a/hooks/use-jobs-realtime.ts +++ b/hooks/use-jobs-realtime.ts @@ -18,7 +18,6 @@ interface JobStatusPayload { } export default function useJobsRealtime() { - const initJobs = useJobsStore(s => s.initJobs) const upsertJob = useJobsStore(s => s.upsertJob) useEffect(() => { @@ -32,10 +31,23 @@ export default function useJobsRealtime() { es = new EventSource('/api/realtime/jobs') es.addEventListener('jobs_initial', (event) => { + // De server stuurt JobPayload[] (met `job_id`), niet JobWithRelations[]. + // Daarom geen initJobs-overwrite — de SSR-fetch heeft de volledige + // shape al in de store geplaatst. We reconcileren alleen status/branch + // van bekende jobs en pushen onbekende jobs (nieuw aangemaakt tussen + // SSR en SSE-connect) als partials. try { - const jobs = JSON.parse(event.data) - if (Array.isArray(jobs)) { - initJobs(jobs, useJobsStore.getState().doneJobs) + const payload = JSON.parse(event.data) + if (!Array.isArray(payload)) return + for (const p of payload as JobStatusPayload[]) { + if (!p.job_id) continue + upsertJob({ + id: p.job_id, + status: p.status as ClaudeJobStatus, + branch: p.branch ?? null, + error: p.error ?? null, + summary: p.summary ?? null, + }) } } catch { // malformed JSON @@ -75,5 +87,5 @@ export default function useJobsRealtime() { if (reconnectTimer) clearTimeout(reconnectTimer) es?.close() } - }, [initJobs, upsertJob]) + }, [upsertJob]) }