UNPKG

relay-hooks

Version:
231 lines (188 loc) 5.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchResolver = void 0; var relay_runtime_1 = require("relay-runtime"); var Utils_1 = require("./Utils"); var fetchQuery = relay_runtime_1.__internal.fetchQuery; var DATA_RETENTION_TIMEOUT = 30 * 1000; function fetchResolver(_a) { var _b = _a.doRetain, doRetain = _b === void 0 ? true : _b, disposeTemporary = _a.disposeTemporary; var _refetchSubscription = null; var disposable = null; var releaseQueryTimeout; var isLoading = false; var query; var promise; var error = null; var env; var update = function (loading, e) { if (e === void 0) { e = null; } isLoading = loading; error = e; }; var lookupInStore = function (environment, operation, fetchPolicy, renderPolicy) { if ((0, Utils_1.isStorePolicy)(fetchPolicy)) { var check = environment.check(operation); var queryStatus = check.status; var hasFullQuery = queryStatus === 'available'; var canPartialRender = hasFullQuery || renderPolicy === 'partial' && queryStatus !== 'stale'; if (canPartialRender) { return { snapshot: environment.lookup(operation.fragment), full: hasFullQuery }; } } return { snapshot: null, full: false }; }; var dispose = function () { clearTemporaryRetain(); disposable && disposable.dispose(); disposeRequest(); disposable = null; env = null; query = null; }; var clearTemporaryRetain = function () { clearTimeout(releaseQueryTimeout); releaseQueryTimeout = null; }; var temporaryRetain = function () { var localReleaseTemporaryRetain = function () { clearTemporaryRetain(); dispose(); disposeTemporary && disposeTemporary(); }; releaseQueryTimeout = setTimeout(localReleaseTemporaryRetain, DATA_RETENTION_TIMEOUT); }; var disposeRequest = function () { _refetchSubscription && _refetchSubscription.unsubscribe(); error = null; isLoading = false; }; var fetch = function (environment, operation, fetchPolicy, onComplete, onNext, onResponse, renderPolicy) { if (fetchPolicy === void 0) { fetchPolicy = 'network-only'; } if (onComplete === void 0) { onComplete = function (_e, _u) { return undefined; }; } var fetchHasReturned = false; if (env != environment || query.request.identifier !== operation.request.identifier) { dispose(); if (doRetain) { disposable = environment.retain(operation); } } env = environment; query = operation; disposeRequest(); var _a = lookupInStore(environment, operation, fetchPolicy, renderPolicy), snapshot = _a.snapshot, full = _a.full; var isNetwork = (0, Utils_1.isNetworkPolicy)(fetchPolicy, full); if (snapshot != null) { var onlyStore = !isNetwork; onNext(operation, snapshot, fetchHasReturned && !onlyStore); if (onlyStore) { onComplete(null, fetchHasReturned); } } // Cancel any previously running refetch. _refetchSubscription && _refetchSubscription.unsubscribe(); var refetchSubscription; if (isNetwork) { var resolveNetworkPromise_1 = function () {}; // Declare refetchSubscription before assigning it in .start(), since // synchronous completion may call callbacks .subscribe() returns. var cleanup_1 = function () { if (_refetchSubscription === refetchSubscription) { _refetchSubscription = null; } isLoading = false; promise = null; }; var complete_1 = function (error) { if (error === void 0) { error = null; } resolveNetworkPromise_1(); update(false, error); cleanup_1(); onComplete(error, fetchHasReturned); }; fetchQuery(environment, operation).subscribe({ unsubscribe: function () { cleanup_1(); }, complete: complete_1, error: function (e) { return complete_1(e); }, next: function (response) { var store = environment.lookup(operation.fragment); promise = null; var responses = Array.isArray(response) ? response : [response]; var cacheConfig = operation.request.cacheConfig; var isQueryPolling = !!cacheConfig && !!cacheConfig.poll; var isIncremental = responses.some(function (x) { return x != null && x.hasNext === true; }); isQueryPolling && update(false); resolveNetworkPromise_1(); onResponse && onResponse(response); onNext(operation, store, fetchHasReturned && (isIncremental || isQueryPolling)); }, start: function (subscription) { refetchSubscription = subscription; _refetchSubscription = refetchSubscription; update(true); } }); if (!snapshot) { promise = new Promise(function (resolve) { resolveNetworkPromise_1 = resolve; }); } } fetchHasReturned = true; return { dispose: function () { refetchSubscription && refetchSubscription.unsubscribe(); } }; }; var checkAndSuspense = function (suspense, useLazy) { clearTemporaryRetain(); var toThrow = promise || error; if (suspense && toThrow) { if (promise && useLazy) { temporaryRetain(); } throw toThrow; } return toThrow; }; var getData = function () { return { isLoading: isLoading, error: error }; }; return { fetch: fetch, getData: getData, dispose: dispose, checkAndSuspense: checkAndSuspense }; } exports.fetchResolver = fetchResolver;