react-query
Version:
Hooks for managing, caching and syncing asynchronous and remote data in React
101 lines (81 loc) • 2.25 kB
JavaScript
import { scheduleMicrotask } from './utils'; // TYPES
// CLASS
var NotifyManager = /*#__PURE__*/function () {
function NotifyManager() {
this.queue = [];
this.transactions = 0;
this.notifyFn = function (callback) {
callback();
};
this.batchNotifyFn = function (callback) {
callback();
};
}
var _proto = NotifyManager.prototype;
_proto.batch = function batch(callback) {
this.transactions++;
var result = callback();
this.transactions--;
if (!this.transactions) {
this.flush();
}
return result;
};
_proto.schedule = function schedule(callback) {
var _this = this;
if (this.transactions) {
this.queue.push(callback);
} else {
scheduleMicrotask(function () {
_this.notifyFn(callback);
});
}
}
/**
* All calls to the wrapped function will be batched.
*/
;
_proto.batchCalls = function batchCalls(callback) {
var _this2 = this;
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2.schedule(function () {
callback.apply(void 0, args);
});
};
};
_proto.flush = function flush() {
var _this3 = this;
var queue = this.queue;
this.queue = [];
if (queue.length) {
scheduleMicrotask(function () {
_this3.batchNotifyFn(function () {
queue.forEach(function (callback) {
_this3.notifyFn(callback);
});
});
});
}
}
/**
* Use this method to set a custom notify function.
* This can be used to for example wrap notifications with `React.act` while running tests.
*/
;
_proto.setNotifyFunction = function setNotifyFunction(fn) {
this.notifyFn = fn;
}
/**
* Use this method to set a custom function to batch notifications together into a single tick.
* By default React Query will use the batch function provided by ReactDOM or React Native.
*/
;
_proto.setBatchNotifyFunction = function setBatchNotifyFunction(fn) {
this.batchNotifyFn = fn;
};
return NotifyManager;
}(); // SINGLETON
export var notifyManager = new NotifyManager();