A React utility for managing GraphQL subscriptions over WebSockets, with Valtio-powered state and effect hooks.
Feel free to check out full end-to-end example in examples/next/src/pages/subscription.tsx
import { GraphQLReactWS } from './GraphQLReactWS';
import { createClient } from 'graphql-ws';
const wsClientOptions = {
url: 'wss://your-graphql-endpoint/graphql',
// ...other options
};
const graphql = GraphQLReactWS({ graphqlWsOptions: wsClientOptions });
const graphql = GraphQLReactWS({ graphqlWsOptions });
- Parameters:
graphqlWsOptions
: Options for thegraphql-ws
client.
- Returns: An object with the following properties:
client
graphql-ws
clientsubscribe
subscribe to a GraphQL subscriptionuseSubscription
React hook to subscribe to a GraphQL subscriptionsubscriptionStores
Map of subscription storessetSubscriptionData
Manually set the data for a subscription storegetSubscriptionStore
Get a subscription storeEffects
Register global effects for when data arrives or a subscription completes
A React hook to subscribe to a GraphQL subscription and reactively receive data and errors.
const { data, error, store } = graphql.useSubscription({
query: MySubscriptionDocument,
variables: { id: '123' }, // optional if your subscription has no variables
onData: result => {
/* handle new data */
},
onError: error => {
/* handle errors */
},
enabled: true, // optional, default true
});
-
Parameters:
query
: The GraphQL subscription document.variables
: (optional) Variables for the subscription.onData
: (optional) Callback for new data.onError
: (optional) Callback for errors.initialData
: (optional) Initial data for the store.enabled
: (optional) Whether the subscription is active.
-
Returns:
data
: Latest subscription data.error
: Latest error, if any.store
: The underlying Valtio store.
Manually set the data for a subscription store.
graphql.setSubscriptionData(
{ query: MySubscriptionDocument, variables: { id: '123' } },
{ data: { ... } }
);
- Parameters:
query
: The GraphQL subscription document.variables
: (optional) Variables for the subscription.data
: The new data to set.
Register global effects for when data arrives or a subscription completes.
Register a callback to be called every time the specified operation receives data.
const remove = Effects.onData(MySubscriptionDocument, ({ operation, result, variables }) => {
// Do something with result.data
});
- Returns: A function to remove the effect.
Register a callback to be called when the specified operation completes or is stopped.
const remove = Effects.onComplete(MySubscriptionDocument, ({ operation, variables }) => {
// Do something on completion
});
- Returns: A function to remove the effect.
const { data, error } = useSubscription({
query: MySubscriptionDocument,
variables: { id: 'abc' },
onData: result => {
console.log('New data:', result.data);
},
onError: err => {
console.error('Subscription error:', err.errors);
},
});
const removeEffect = Effects.onData(MySubscriptionDocument, ({ result }) => {
console.log('Received data:', result.data);
});
// Later, to remove the effect:
removeEffect();
graphql.setSubscriptionData(
{ query: MySubscriptionDocument, variables: { id: 'abc' } },
{ data: { myField: 'newValue' } },
);