@@ -4,38 +4,50 @@ import * as React from 'react'
44import { subscription } from '@inverter-network/graphql'
55import type {
66 GraphQLSubscriptionArgs ,
7- GraphQLSubscriptionResult ,
7+ SubscriptionResult ,
88} from '@inverter-network/graphql'
99
1010export type UseGraphQLSubscriptionParams < T extends GraphQLSubscriptionArgs > = {
1111 fields : T
1212 enabled ?: boolean
1313}
1414
15+ export type UseGraphQLSubscriptionResult < T extends GraphQLSubscriptionArgs > = {
16+ data : SubscriptionResult < T > | null
17+ error : string | null
18+ isLoading : boolean
19+ }
20+
1521export const useGraphQLSubscription = < T extends GraphQLSubscriptionArgs > ( {
1622 fields,
1723 enabled = true ,
18- } : UseGraphQLSubscriptionParams < T > ) : GraphQLSubscriptionResult < T > | null => {
19- const memo = React . useMemo ( ( ) => {
20- return subscription ( fields )
21- } , [ fields ] )
22-
23- const [ data , setData ] = React . useState < Awaited < typeof memo > | null > ( null )
24+ } : UseGraphQLSubscriptionParams < T > ) : UseGraphQLSubscriptionResult < T > => {
25+ const [ data , setData ] = React . useState < SubscriptionResult < T > | null > ( null )
26+ const [ error , setError ] = React . useState < string | null > ( null )
2427
2528 React . useEffect ( ( ) => {
26- if ( ! memo || ! enabled ) return
27-
28- const fetchData = async ( ) => {
29- try {
30- const result = memo
31- setData ( result )
32- } catch ( error ) {
33- console . error ( 'Error in GraphQL subscription:' , error )
29+ if ( ! enabled ) return ( ) => { } // Return empty cleanup function
30+
31+ try {
32+ const sub = subscription ( fields )
33+ let callbackId : string | null = null
34+
35+ callbackId = sub . addCallback ( setData )
36+
37+ // Return cleanup function
38+ return ( ) => {
39+ sub . removeCallback ( callbackId )
3440 }
41+ } catch ( error : any ) {
42+ console . error (
43+ 'Error subscribing to fields' ,
44+ error ?. message ?? error ?. cause ?? error
45+ )
46+ // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect
47+ setError ( error ?. message ?? error ?. cause ?? 'Unknown error' )
48+ return ( ) => { } // Add return for catch block
3549 }
50+ } , [ JSON . stringify ( fields ) , enabled ] )
3651
37- fetchData ( )
38- } , [ memo , enabled ] )
39-
40- return data
52+ return { data, error, isLoading : ! data }
4153}
0 commit comments