11import type { AgentEvent } from '@deep-sea-stories/common' ;
22import { useEffect , useState } from 'react' ;
33import { useTRPCClient } from '@/contexts/trpc' ;
4+ import { toast } from '@/components/ui/sonner' ;
5+ import { X } from 'lucide-react' ;
46
57export const useAgentEvents = ( roomId ?: string ) => {
68 const [ events , setEvents ] = useState < AgentEvent [ ] > ( [ ] ) ;
@@ -11,31 +13,39 @@ export const useAgentEvents = (roomId?: string) => {
1113
1214 setEvents ( [ ] ) ;
1315
14- const subscription = trpcClient . Notifications . subscribe (
15- { roomId, lastEventId : undefined } ,
16- {
17- onStarted : ( ) => {
18- console . log (
19- '[useAgentEvents] Subscription started successfully for' ,
20- roomId ,
21- ) ;
22- } ,
23- onData : ( data : unknown ) => {
24- const event =
25- data && typeof data === 'object' && 'data' in data
26- ? ( data as { data : AgentEvent } ) . data
27- : ( data as AgentEvent ) ;
28- setEvents ( ( prev ) => [ ...prev , event ] ) ;
29- } ,
30- onError : ( error : unknown ) => {
31- console . error ( '[useAgentEvents] Subscription error:' , error ) ;
32- } ,
33- } ,
34- ) ;
16+ let subscription :
17+ | ReturnType < typeof trpcClient . Notifications . subscribe >
18+ | undefined ;
19+ let active = true ;
20+
21+ trpcClient . getEvents
22+ . query ( { roomId } )
23+ . then ( ( { events : pastEvents , lastEventId } ) => {
24+ if ( ! active ) return ;
25+
26+ setEvents ( pastEvents ) ;
27+
28+ subscription = trpcClient . Notifications . subscribe (
29+ { roomId, lastEventId } ,
30+ {
31+ onData : ( data : unknown ) => {
32+ const event =
33+ data && typeof data === 'object' && 'data' in data
34+ ? ( data as { data : AgentEvent } ) . data
35+ : ( data as AgentEvent ) ;
36+ setEvents ( ( prev ) => [ ...prev , event ] ) ;
37+ } ,
38+ onError : ( error : unknown ) => {
39+ console . error ( '[useAgentEvents] Subscription error:' , error ) ;
40+ } ,
41+ } ,
42+ ) ;
43+ } )
44+ . catch ( ( ) => toast ( 'Failed to fetch events' , X ) ) ;
3545
3646 return ( ) => {
37- console . log ( '[useAgentEvents] Unsubscribing from' , roomId ) ;
38- subscription . unsubscribe ( ) ;
47+ active = false ;
48+ subscription ? .unsubscribe ( ) ;
3949 } ;
4050 } , [ trpcClient , roomId ] ) ;
4151
0 commit comments