react-query
Version:
Hooks for managing, caching and syncing asynchronous and remote data in React
216 lines (171 loc) • 6.54 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.QueriesObserver = void 0;
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _utils = require("./utils");
var _notifyManager = require("./notifyManager");
var _queryObserver = require("./queryObserver");
var _subscribable = require("./subscribable");
var QueriesObserver = /*#__PURE__*/function (_Subscribable) {
(0, _inheritsLoose2.default)(QueriesObserver, _Subscribable);
function QueriesObserver(client, queries) {
var _this;
_this = _Subscribable.call(this) || this;
_this.client = client;
_this.queries = [];
_this.result = [];
_this.observers = [];
_this.observersMap = {};
if (queries) {
_this.setQueries(queries);
}
return _this;
}
var _proto = QueriesObserver.prototype;
_proto.onSubscribe = function onSubscribe() {
var _this2 = this;
if (this.listeners.length === 1) {
this.observers.forEach(function (observer) {
observer.subscribe(function (result) {
_this2.onUpdate(observer, result);
});
});
}
};
_proto.onUnsubscribe = function onUnsubscribe() {
if (!this.listeners.length) {
this.destroy();
}
};
_proto.destroy = function destroy() {
this.listeners = [];
this.observers.forEach(function (observer) {
observer.destroy();
});
};
_proto.setQueries = function setQueries(queries, notifyOptions) {
this.queries = queries;
this.updateObservers(notifyOptions);
};
_proto.getCurrentResult = function getCurrentResult() {
return this.result;
};
_proto.getOptimisticResult = function getOptimisticResult(queries) {
return this.findMatchingObservers(queries).map(function (match) {
return match.observer.getOptimisticResult(match.defaultedQueryOptions);
});
};
_proto.findMatchingObservers = function findMatchingObservers(queries) {
var _this3 = this;
var prevObservers = this.observers;
var defaultedQueryOptions = queries.map(function (options) {
return _this3.client.defaultQueryObserverOptions(options);
});
var matchingObservers = defaultedQueryOptions.flatMap(function (defaultedOptions) {
var match = prevObservers.find(function (observer) {
return observer.options.queryHash === defaultedOptions.queryHash;
});
if (match != null) {
return [{
defaultedQueryOptions: defaultedOptions,
observer: match
}];
}
return [];
});
var matchedQueryHashes = matchingObservers.map(function (match) {
return match.defaultedQueryOptions.queryHash;
});
var unmatchedQueries = defaultedQueryOptions.filter(function (defaultedOptions) {
return !matchedQueryHashes.includes(defaultedOptions.queryHash);
});
var unmatchedObservers = prevObservers.filter(function (prevObserver) {
return !matchingObservers.some(function (match) {
return match.observer === prevObserver;
});
});
var newOrReusedObservers = unmatchedQueries.map(function (options, index) {
if (options.keepPreviousData) {
// return previous data from one of the observers that no longer match
var previouslyUsedObserver = unmatchedObservers[index];
if (previouslyUsedObserver !== undefined) {
return {
defaultedQueryOptions: options,
observer: previouslyUsedObserver
};
}
}
return {
defaultedQueryOptions: options,
observer: _this3.getObserver(options)
};
});
var sortMatchesByOrderOfQueries = function sortMatchesByOrderOfQueries(a, b) {
return defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);
};
return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);
};
_proto.getObserver = function getObserver(options) {
var defaultedOptions = this.client.defaultQueryObserverOptions(options);
var currentObserver = this.observersMap[defaultedOptions.queryHash];
return currentObserver != null ? currentObserver : new _queryObserver.QueryObserver(this.client, defaultedOptions);
};
_proto.updateObservers = function updateObservers(notifyOptions) {
var _this4 = this;
_notifyManager.notifyManager.batch(function () {
var prevObservers = _this4.observers;
var newObserverMatches = _this4.findMatchingObservers(_this4.queries); // set options for the new observers to notify of changes
newObserverMatches.forEach(function (match) {
return match.observer.setOptions(match.defaultedQueryOptions, notifyOptions);
});
var newObservers = newObserverMatches.map(function (match) {
return match.observer;
});
var newObserversMap = Object.fromEntries(newObservers.map(function (observer) {
return [observer.options.queryHash, observer];
}));
var newResult = newObservers.map(function (observer) {
return observer.getCurrentResult();
});
var hasIndexChange = newObservers.some(function (observer, index) {
return observer !== prevObservers[index];
});
if (prevObservers.length === newObservers.length && !hasIndexChange) {
return;
}
_this4.observers = newObservers;
_this4.observersMap = newObserversMap;
_this4.result = newResult;
if (!_this4.hasListeners()) {
return;
}
(0, _utils.difference)(prevObservers, newObservers).forEach(function (observer) {
observer.destroy();
});
(0, _utils.difference)(newObservers, prevObservers).forEach(function (observer) {
observer.subscribe(function (result) {
_this4.onUpdate(observer, result);
});
});
_this4.notify();
});
};
_proto.onUpdate = function onUpdate(observer, result) {
var index = this.observers.indexOf(observer);
if (index !== -1) {
this.result = (0, _utils.replaceAt)(this.result, index, result);
this.notify();
}
};
_proto.notify = function notify() {
var _this5 = this;
_notifyManager.notifyManager.batch(function () {
_this5.listeners.forEach(function (listener) {
listener(_this5.result);
});
});
};
return QueriesObserver;
}(_subscribable.Subscribable);
exports.QueriesObserver = QueriesObserver;