'use client' import { useEffect, useRef, useState } from 'react' interface Row { receivedAt: string type: 'ready' | 'message' | 'error' raw: string } const MAX_ROWS = 200 export function DebugRealtimeClient() { const [rows, setRows] = useState([]) const [status, setStatus] = useState<'connecting' | 'open' | 'closed' | 'error'>('connecting') const sourceRef = useRef(null) useEffect(() => { const source = new EventSource('/api/debug/realtime-stream') sourceRef.current = source const append = (row: Row) => { setRows((prev) => [row, ...prev].slice(0, MAX_ROWS)) } source.addEventListener('ready', (e) => { setStatus('open') const data = (e as MessageEvent).data ?? '' append({ receivedAt: new Date().toISOString(), type: 'ready', raw: data }) }) source.addEventListener('error', (e) => { setStatus('error') const data = (e as MessageEvent).data ?? '(no data)' append({ receivedAt: new Date().toISOString(), type: 'error', raw: data }) }) source.onmessage = (e) => { append({ receivedAt: new Date().toISOString(), type: 'message', raw: e.data ?? '' }) } source.onerror = () => { setStatus('error') } return () => { source.close() sourceRef.current = null } }, []) function statusColor() { switch (status) { case 'open': return 'green' case 'error': return 'red' case 'closed': return 'gray' default: return 'orange' } } return (
Status:{' '} {status} · totaal{' '} {rows.length} entries
{rows.length === 0 ? ( ) : ( rows.map((row, idx) => ( )) )}
received_at type payload
Wachten op events… trigger een mutatie via UI of script.
{row.receivedAt} {row.type} {row.raw}
) }