UNPKG

@shopify/react-graphql

Version:

Tools for creating type-safe and asynchronous GraphQL components for React

45 lines (44 loc) 1.74 kB
import { useEffect, useRef, useCallback } from 'react'; import useApolloClient from './apollo-client'; export function useBackgroundQuery(load, options) { const client = useApolloClient(); const lastClient = useRef(client); const lastOptions = useRef(options); const serializedOptions = JSON.stringify(options); const lastSerializedOptions = useRef(serializedOptions); const subscription = useRef(null); const polling = useRef(Boolean(options && options.pollInterval)); if (subscription.current != null && (lastClient.current !== client || lastSerializedOptions.current !== serializedOptions)) { subscription.current.unsubscribe(); subscription.current = null; } lastClient.current = client; lastOptions.current = options; lastSerializedOptions.current = serializedOptions; useEffect(() => () => { if (subscription.current) { subscription.current.unsubscribe(); subscription.current = null; } }, []); return useCallback(async () => { if (subscription.current) { return; } const query = await load(); if (query == null || query instanceof Error) { return; } const observableQuery = lastClient.current.watchQuery(Object.assign({ query, fetchPolicy: 'network-only' }, lastOptions.current)); const unsubscribe = () => { if (polling.current || subscription.current == null) { return; } subscription.current.unsubscribe(); subscription.current = null; }; subscription.current = observableQuery.subscribe(unsubscribe, unsubscribe); }, [load]); }