UNPKG

redux-toolkit-optimistic

Version:

Helper library for Redux Toolkit to perform optimistic updates.

134 lines (124 loc) 12.6 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["ReduxToolkitOptimistic"] = factory(); else root["ReduxToolkitOptimistic"] = factory(); })(window, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/@babel/runtime/helpers/typeof.js": /*!*******************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { eval("function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\n\n//# sourceURL=webpack://ReduxToolkitOptimistic/./node_modules/@babel/runtime/helpers/typeof.js?"); /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /*! exports provided: performOptimisticUpdate, performManyOptimisticUpdates, revertOptimisticUpdate, revertManyOptimisticUpdates */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"performOptimisticUpdate\", function() { return performOptimisticUpdate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"performManyOptimisticUpdates\", function() { return performManyOptimisticUpdates; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"revertOptimisticUpdate\", function() { return revertOptimisticUpdate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"revertManyOptimisticUpdates\", function() { return revertManyOptimisticUpdates; });\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\");\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);\n\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {{ id: string, changes: object}} update The update object\n */\nfunction performOptimisticUpdate(state, adapter, update) {\n var incorrectUpdateArgError = new Error('Incorrect `update` arg sent to `performOptimisticUpdate`. Expected: { id: <string>, changes: <object> }');\n\n if (!update || _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(update) !== 'object') {\n throw incorrectUpdateArgError;\n }\n\n var id = update.id,\n changes = update.changes;\n\n if (typeof id !== 'string' || _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(changes) !== 'object') {\n throw incorrectUpdateArgError;\n } // Store the previous data to handle rejection of optimistic update\n\n\n state.entities[id].previousChanges = Object.keys(changes).reduce(function (acc, key) {\n acc[key] = state.entities[id][key];\n return acc;\n }, {});\n adapter.updateOne(state, update);\n}\n/**\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {{ id: string, changes: object}[]} update The update object\n */\n\nfunction performManyOptimisticUpdates(state, adapter, update) {\n var incorrectUpdateArgError = new Error('Incorrect `update` arg sent to `performManyOptimisticUpdates`. Expected: [{ id: <string>, changes: <object> }, ...]');\n\n if (!update || !Array.isArray(update)) {\n throw incorrectUpdateArgError;\n } // Store the previous data to handle rejection of optimistic updates\n\n\n var _iterator = _createForOfIteratorHelper(update),\n _step;\n\n try {\n var _loop = function _loop() {\n var entity = _step.value;\n\n if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(entity) !== 'object' || typeof entity.id !== 'string' || _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(entity.changes) !== 'object') {\n throw incorrectUpdateArgError;\n }\n\n var id = entity.id,\n changes = entity.changes;\n state.entities[id].previousChanges = Object.keys(changes).reduce(function (acc, key) {\n acc[key] = state.entities[id][key];\n return acc;\n }, {});\n };\n\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n _loop();\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n adapter.updateMany(state, update);\n}\n/**\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {string} id The ID of the entity to revert to its prior state\n */\n\nfunction revertOptimisticUpdate(state, adapter, id) {\n var _state$entities$id;\n\n if (typeof id !== 'string') {\n throw new Error('Incorrect `id` arg sent to `revertOptimisticUpdate`. Expected: <string>');\n }\n\n var previousChanges = state === null || state === void 0 ? void 0 : (_state$entities$id = state.entities[id]) === null || _state$entities$id === void 0 ? void 0 : _state$entities$id.previousChanges;\n if (!previousChanges) return;\n adapter.updateOne(state, {\n id: id,\n changes: previousChanges\n });\n}\n/**\n * Redux toolkit helper function that reverts multiple optimistic updates\n * @param {*} state The current state of the given slice\n * @param {*} adapter The entity adapter for the slice\n * @param {string[]} ids The list of IDs to revert to prior state\n */\n\nfunction revertManyOptimisticUpdates(state, adapter, ids) {\n if (!Array.isArray(ids)) {\n throw new Error('Incorrect `ids` arg sent to `revertManyOptimisticUpdates`. Expected: [<string>]');\n }\n\n var update = ids.map(function (id) {\n var _state$entities$id2;\n\n var changes = state === null || state === void 0 ? void 0 : (_state$entities$id2 = state.entities[id]) === null || _state$entities$id2 === void 0 ? void 0 : _state$entities$id2.previousChanges;\n if (!changes) return null;\n return {\n id: id,\n changes: changes\n };\n }).filter(Boolean);\n if (!update.length) return;\n adapter.updateMany(state, update);\n}\n\n//# sourceURL=webpack://ReduxToolkitOptimistic/./src/index.js?"); /***/ }), /***/ 0: /*!*************************!*\ !*** multi ./src/index ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("module.exports = __webpack_require__(/*! ./src/index */\"./src/index.js\");\n\n\n//# sourceURL=webpack://ReduxToolkitOptimistic/multi_./src/index?"); /***/ }) /******/ }); });