UNPKG

react-query

Version:

Hooks for managing, caching and syncing asynchronous and remote data in React

123 lines (97 loc) 3.97 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose"; import { getDefaultState } from './mutation'; import { notifyManager } from './notifyManager'; import { Subscribable } from './subscribable'; // CLASS export var MutationObserver = /*#__PURE__*/function (_Subscribable) { _inheritsLoose(MutationObserver, _Subscribable); function MutationObserver(client, options) { var _this; _this = _Subscribable.call(this) || this; _this.client = client; _this.setOptions(options); _this.bindMethods(); _this.updateResult(); return _this; } var _proto = MutationObserver.prototype; _proto.bindMethods = function bindMethods() { this.mutate = this.mutate.bind(this); this.reset = this.reset.bind(this); }; _proto.setOptions = function setOptions(options) { this.options = this.client.defaultMutationOptions(options); }; _proto.onUnsubscribe = function onUnsubscribe() { if (!this.listeners.length) { var _this$currentMutation; (_this$currentMutation = this.currentMutation) == null ? void 0 : _this$currentMutation.removeObserver(this); } }; _proto.onMutationUpdate = function onMutationUpdate(action) { this.updateResult(); // Determine which callbacks to trigger var notifyOptions = { listeners: true }; if (action.type === 'success') { notifyOptions.onSuccess = true; } else if (action.type === 'error') { notifyOptions.onError = true; } this.notify(notifyOptions); }; _proto.getCurrentResult = function getCurrentResult() { return this.currentResult; }; _proto.reset = function reset() { this.currentMutation = undefined; this.updateResult(); this.notify({ listeners: true }); }; _proto.mutate = function mutate(variables, options) { this.mutateOptions = options; if (this.currentMutation) { this.currentMutation.removeObserver(this); } this.currentMutation = this.client.getMutationCache().build(this.client, _extends({}, this.options, { variables: typeof variables !== 'undefined' ? variables : this.options.variables })); this.currentMutation.addObserver(this); return this.currentMutation.execute(); }; _proto.updateResult = function updateResult() { var state = this.currentMutation ? this.currentMutation.state : getDefaultState(); this.currentResult = _extends({}, state, { isLoading: state.status === 'loading', isSuccess: state.status === 'success', isError: state.status === 'error', isIdle: state.status === 'idle', mutate: this.mutate, reset: this.reset }); }; _proto.notify = function notify(options) { var _this2 = this; notifyManager.batch(function () { // First trigger the mutate callbacks if (_this2.mutateOptions) { if (options.onSuccess) { _this2.mutateOptions.onSuccess == null ? void 0 : _this2.mutateOptions.onSuccess(_this2.currentResult.data, _this2.currentResult.variables, _this2.currentResult.context); _this2.mutateOptions.onSettled == null ? void 0 : _this2.mutateOptions.onSettled(_this2.currentResult.data, null, _this2.currentResult.variables, _this2.currentResult.context); } else if (options.onError) { _this2.mutateOptions.onError == null ? void 0 : _this2.mutateOptions.onError(_this2.currentResult.error, _this2.currentResult.variables, _this2.currentResult.context); _this2.mutateOptions.onSettled == null ? void 0 : _this2.mutateOptions.onSettled(undefined, _this2.currentResult.error, _this2.currentResult.variables, _this2.currentResult.context); } } // Then trigger the listeners if (options.listeners) { _this2.listeners.forEach(function (listener) { listener(_this2.currentResult); }); } }); }; return MutationObserver; }(Subscribable);