2026-05-20 11:52:18 -04:00
|
|
|
import { useQuery, useQueryClient } from '@tanstack/react-query'
|
|
|
|
|
import { useEffect } from 'react'
|
2026-05-28 12:34:01 -04:00
|
|
|
import { getScanStatus, getStats } from '../lib/api'
|
2026-05-20 11:52:18 -04:00
|
|
|
|
|
|
|
|
export function useStats() {
|
|
|
|
|
const queryClient = useQueryClient()
|
|
|
|
|
|
|
|
|
|
// Subscribe to SSE updates once; invalidate both stats and tests on any update
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const es = new EventSource('/api/events')
|
|
|
|
|
es.onmessage = (e) => {
|
|
|
|
|
try {
|
|
|
|
|
const data = JSON.parse(e.data)
|
|
|
|
|
if (data.type === 'update') {
|
|
|
|
|
queryClient.invalidateQueries({ queryKey: ['stats'] })
|
|
|
|
|
queryClient.invalidateQueries({ queryKey: ['tests'] })
|
|
|
|
|
}
|
|
|
|
|
} catch { /* ignore malformed */ }
|
|
|
|
|
}
|
|
|
|
|
return () => es.close()
|
|
|
|
|
}, [queryClient])
|
|
|
|
|
|
2026-05-28 12:34:01 -04:00
|
|
|
const scanStatusQuery = useQuery({
|
|
|
|
|
queryKey: ['scanStatus'],
|
|
|
|
|
queryFn: getScanStatus,
|
|
|
|
|
refetchInterval: (query) => (query.state.data?.scanning ? 1000 : 5000),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const isScanning = scanStatusQuery.data?.scanning ?? true
|
|
|
|
|
|
|
|
|
|
const statsQuery = useQuery({
|
|
|
|
|
queryKey: ['stats'],
|
|
|
|
|
queryFn: getStats,
|
|
|
|
|
enabled: !isScanning,
|
|
|
|
|
refetchInterval: isScanning ? false : 30_000,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
...statsQuery,
|
|
|
|
|
isScanning,
|
|
|
|
|
}
|
2026-05-20 11:52:18 -04:00
|
|
|
}
|