@shopify/react-graphql
Version:
Tools for creating type-safe and asynchronous GraphQL components for React
62 lines (49 loc) • 1.92 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
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( /*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(function* () {
if (subscription.current) {
return;
}
const query = yield load();
if (query == null || query instanceof Error) {
return;
}
const observableQuery = lastClient.current.watchQuery(_rollupPluginBabelHelpers.objectSpread2({
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;