File size: 1,091 Bytes
dfb3d07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"use client"
import { useEffect, useState } from "react"
import { useStore } from "@/lib/store"
import { getStreamUrl } from "@/lib/api"
import type { SSEEvent } from "@/lib/types"

export function useAssessmentStream(assessmentId: string | null) {
  const handleSSEEvent = useStore((s) => s.handleSSEEvent)
  const [isConnected, setIsConnected] = useState(false)
  const [error, setError] = useState<string | null>(null)
  const [isComplete, setIsComplete] = useState(false)

  useEffect(() => {
    if (!assessmentId) return
    const es = new EventSource(getStreamUrl(assessmentId))
    es.onopen = () => setIsConnected(true)
    es.onmessage = (e) => {
      try {
        const event: SSEEvent = JSON.parse(e.data)
        handleSSEEvent(event)
        if (event.event === "assessment_complete") {
          setIsComplete(true)
          es.close()
        }
      } catch (err) {}
    }
    es.onerror = () => {
      setError("Stream disconnected")
      es.close()
    }
    return () => es.close()
  }, [assessmentId, handleSSEEvent])

  return { isConnected, error, isComplete }
}