feat(ST-1111.10d): show worker presence indicator and gate 'Voer uit' on connected workers

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-04-29 19:14:00 +02:00
parent 5c226fb042
commit 95b5dd8430
4 changed files with 62 additions and 6 deletions

View file

@ -37,6 +37,9 @@ export function useSoloRealtime(productId: string | null) {
const handleEvent = useSoloStore.getState().handleRealtimeEvent
const handleJobEvent = useSoloStore.getState().handleJobEvent
const initJobs = useSoloStore.getState().initJobs
const setWorkers = useSoloStore.getState().setWorkers
const incrementWorkers = useSoloStore.getState().incrementWorkers
const decrementWorkers = useSoloStore.getState().decrementWorkers
if (!productId) {
// Geen actief product (gebruiker zit niet op /solo) — stream uit
@ -95,12 +98,27 @@ export function useSoloRealtime(productId: string | null) {
}
})
source.addEventListener('workers_initial', (e) => {
if (!e.data) return
try {
const { count } = JSON.parse(e.data) as { count: number }
setWorkers(count)
} catch {
// ignore malformed payload
}
})
source.onmessage = (e) => {
if (!e.data) return
try {
const raw = JSON.parse(e.data) as RealtimeEvent | ClaudeJobEvent
if ('type' in raw && (raw.type === 'claude_job_enqueued' || raw.type === 'claude_job_status')) {
handleJobEvent(raw)
const raw = JSON.parse(e.data) as RealtimeEvent | ClaudeJobEvent | { type: string }
if ('type' in raw) {
if (raw.type === 'claude_job_enqueued' || raw.type === 'claude_job_status') {
handleJobEvent(raw as ClaudeJobEvent)
return
}
if (raw.type === 'worker_connected') { incrementWorkers(); return }
if (raw.type === 'worker_disconnected') { decrementWorkers(); return }
return
}
const payload = raw as RealtimeEvent