Skip to content

Instantly share code, notes, and snippets.

@Lippur
Created May 10, 2024 10:22
Show Gist options
  • Save Lippur/6c9acfbe77285039e4e797b16c33c3df to your computer and use it in GitHub Desktop.
Save Lippur/6c9acfbe77285039e4e797b16c33c3df to your computer and use it in GitHub Desktop.
GraphQL subscriptions with SWR
import useSWRSubscription, { SWRSubscriptionOptions } from 'swr/subscription'
import { createClient } from 'graphql-ws'
export function useSubscription<TResult, TVariables extends Variables | undefined>(subscription: TypedDocumentNode<TResult, TVariables>, variables?: TVariables) {
return useSWRSubscription<TResult, any, GraphQLRequestInput<TResult, TVariables>>({
query: subscription,
variables,
} as GraphQLRequestInput<TResult, TVariables>, subscribe)
}
export function subscribe<TResult, TVariables extends Variables | undefined>(input: GraphQLRequestInput<TResult, TVariables>, options: SWRSubscriptionOptions) {
return wsClient.subscribe({
query: print(input.query),
variables: input.variables,
}, {
next: value => options.next(null, value.data),
error: error => options.next(error, null),
complete: () => {},
})
}
type GraphQLRequestInput<TResult, TVariables extends Variables | undefined> = {
query: TypedDocumentNode<TResult, TVariables>
variables: TVariables
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment