11import { useMonaco } from "@monaco-editor/react"
2- import { useKeycloak } from "@react-keycloak/web"
32import { useMutation , useQuery , UseQueryOptions } from "@tanstack/react-query"
43import axios , { AxiosError } from "axios"
5- import { EventSource } from "extended-eventsource"
64import { compact , concat , flatten } from "lodash"
75import { Uri } from "monaco-editor"
86import { Dispatch , SetStateAction , useEffect , useRef , useState } from "react"
@@ -306,66 +304,39 @@ export const useCountdown = (start: number | null, end: number | null) => {
306304}
307305
308306export const useTimeframeFromSSE = ( ) => {
309- const { keycloak } = useKeycloak ( )
310- const { courseSlug } = useParams ( )
311- const token = keycloak . token
312-
313307 const [ timeFrameFromEvent , setTimeFrameFromEvent ] = useState <
314308 [ number , number ] | null
315309 > ( null )
316- const [ error , setError ] = useState < Error | null > ( null )
317-
318- useEffect ( ( ) => {
319- if ( ! token || ! courseSlug ) return
320- const eventSource = new EventSource (
321- `/api/courses/${ courseSlug } /subscribe` ,
322- {
323- headers : { Authorization : `Bearer ${ token } ` } ,
324- retry : 3000 ,
325- } ,
326- )
327-
328- const onTimeEvent = ( e : MessageEvent ) => {
329- const [ startTimeString , endTimeString ] = ( e . data as string ) . split ( "/" )
330- setTimeFrameFromEvent ( [
331- Date . parse ( startTimeString ) ,
332- Date . parse ( endTimeString ) ,
333- ] )
334- }
335-
336- eventSource . addEventListener ( "timer-update" , onTimeEvent )
337- eventSource . onerror = ( error ) => {
338- console . error ( "SSE error" , error )
339- setError ( new Error ( "SSE connection error" ) )
340- }
341310
342- const cleanup = ( ) => {
343- eventSource . removeEventListener ( "timer-update" , onTimeEvent )
344- eventSource . close ( )
345- }
346- window . addEventListener ( "beforeunload" , cleanup )
347- return ( ) => {
348- window . removeEventListener ( "beforeunload" , cleanup )
349- cleanup ( )
350- }
351- } , [ courseSlug , token ] )
311+ useSSE < string > ( "timer-update" , ( data ) => {
312+ const [ startTimeString , endTimeString ] = data . split ( "/" )
313+ setTimeFrameFromEvent ( [
314+ Date . parse ( startTimeString ) ,
315+ Date . parse ( endTimeString ) ,
316+ ] )
317+ } )
352318
353- return { timeFrameFromEvent, error }
319+ return { timeFrameFromEvent }
354320}
355321
356- // properly define eventType
357322export const useSSE = < T , > ( eventType : string , handler : ( data : T ) => void ) => {
358323 const { eventSource } = useEventSource ( )
359324
325+ const handlerRef = useRef ( handler )
326+
327+ useEffect ( ( ) => {
328+ handlerRef . current = handler
329+ } , [ handler ] )
330+
360331 useEffect ( ( ) => {
361332 if ( ! eventSource ) return
362333
363334 const listener = ( event : MessageEvent ) => {
364335 try {
365336 const parsed = JSON . parse ( event . data )
366- handler ( parsed as T )
337+ handlerRef . current ( parsed as T )
367338 } catch {
368- handler ( event . data as unknown as T )
339+ handlerRef . current ( event . data as unknown as T )
369340 }
370341 }
371342
@@ -374,7 +345,7 @@ export const useSSE = <T,>(eventType: string, handler: (data: T) => void) => {
374345 return ( ) => {
375346 eventSource . removeEventListener ( eventType , listener )
376347 }
377- } , [ eventSource , eventType , handler ] )
348+ } , [ eventSource , eventType ] )
378349}
379350
380351export const useInspect = ( ) => {
0 commit comments