39246-vm/frontend/hooks/useSSE.ts
abbashkyt-creator 7d8ce0e322 V0.1
2026-03-14 04:02:22 +03:00

38 lines
1.1 KiB
TypeScript

'use client'
import { useEffect } from 'react'
import { useEngineStore } from '@/store/engineStore'
// SSE is disabled in the static build — replaced with plain HTTP polling.
// EventSource('/api/stream') would always fail (404) since there is no
// streaming route in the FastAPI-served static build, causing permanent
// ENGINE OFFLINE display. Polling /api/stats every 5s works in all modes.
const BASE = 'http://localhost:8000'
export function useSSE() {
const setStats = useEngineStore((s) => s.setStats)
const setOffline = useEngineStore((s) => s.setOffline)
useEffect(() => {
let alive = true
const poll = async () => {
try {
const res = await fetch(`${BASE}/api/stats`)
if (!res.ok) throw new Error('not ok')
const data = await res.json()
if (alive) setStats(data) // also clears isOffline via store
} catch {
if (alive) setOffline(true)
}
}
poll() // immediate on mount
const id = setInterval(poll, 5000) // then every 5 s
return () => {
alive = false
clearInterval(id)
}
}, [setStats, setOffline])
}