@shopify/react-graphql
Version:
Tools for creating type-safe and asynchronous GraphQL components for React
54 lines (49 loc) • 1.74 kB
JavaScript
;
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;