UNPKG

@shopify/react-graphql

Version:

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

54 lines (49 loc) 1.74 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); var apolloClient = require('./apollo-client.js'); function useBackgroundQuery(load, options) { const client = apolloClient["default"](); const lastClient = React.useRef(client); const lastOptions = React.useRef(options); const serializedOptions = JSON.stringify(options); const lastSerializedOptions = React.useRef(serializedOptions); const subscription = React.useRef(null); const polling = React.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; React.useEffect(() => () => { if (subscription.current) { subscription.current.unsubscribe(); subscription.current = null; } }, []); return React.useCallback(async () => { if (subscription.current) { return; } const query = await load(); if (query == null || query instanceof Error) { return; } const observableQuery = lastClient.current.watchQuery({ 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]); } exports.useBackgroundQuery = useBackgroundQuery;