UNPKG

redux-store-templates

Version:

Set of helpers to create useful and commonly used redux store patterns

145 lines (120 loc) 4.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createSelectorById = exports.createSelectorAll = exports.createReducer = void 0; var _internals = require("../.internals"); function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var createReducer = function createReducer() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$idName = _ref.idName, idName = _ref$idName === void 0 ? "uuid" : _ref$idName, _ref$initial = _ref.initial, initial = _ref$initial === void 0 ? [] : _ref$initial, setOn = _ref.setOn, addOn = _ref.addOn, updateOn = _ref.updateOn, removeOn = _ref.removeOn, emptyOn = _ref.emptyOn; var addToById = (0, _internals.createAddById)(idName); var addToIds = (0, _internals.createAddIds)(idName); var updateById = (0, _internals.createUpdateById)(idName); var defaultState = { byId: addToById({}, initial), ids: addToIds([], initial) }; var emptyState = { byId: {}, ids: [] }; var handleAction = Object.create(null); if (setOn) { (0, _internals.readAsArray)(setOn).forEach(function (opt) { var readActionPayload = (0, _internals.createPathReader)(opt.payloadPath); handleAction[opt.type] = function (state, action) { var items = readActionPayload(action); return _objectSpread({}, state, { byId: addToById({}, items), ids: addToIds([], items) }); }; }); } if (addOn) { (0, _internals.readAsArray)(addOn).forEach(function (opt) { var readActionPayload = (0, _internals.createPathReader)(opt.payloadPath); handleAction[opt.type] = function (state, action) { var items = readActionPayload(action); return _objectSpread({}, state, { byId: addToById(state.byId, items), ids: addToIds(state.ids, items) }); }; }); } if (updateOn) { (0, _internals.readAsArray)(updateOn).forEach(function (opt) { var readActionPayload = (0, _internals.createPathReader)(opt.payloadPath); handleAction[opt.type] = function (state, action) { var updates = readActionPayload(action); return _objectSpread({}, state, { byId: updateById(state.byId, updates) }); }; }); } if (removeOn) { var removeFromById = (0, _internals.createRemoveById)(idName); (0, _internals.readAsArray)(removeOn).forEach(function (opt) { var readActionPayload = (0, _internals.createPathReader)(opt.payloadPath); handleAction[opt.type] = function (state, action) { var ids = readActionPayload(action); return _objectSpread({}, state, { byId: removeFromById(state.byId, ids), ids: (0, _internals.applyRemoveIds)(state.ids, ids) }); }; }); } if (emptyOn) { (0, _internals.readAsArray)(emptyOn).forEach(function (opt) { handleAction[opt.type] = function (state) { return _objectSpread({}, state, { byId: emptyState.byId, ids: emptyState.ids }); }; }); } return function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState; var action = arguments.length > 1 ? arguments[1] : undefined; return handleAction[action.type] ? handleAction[action.type](state, action) : state; }; }; /* selectors */ exports.createReducer = createReducer; var createSelectorAll = function createSelectorAll(_ref2) { var selector = _ref2.selector; return function (state) { var list = selector(state); return list.ids.map(function (id) { return list.byId[id]; }); }; }; exports.createSelectorAll = createSelectorAll; var createSelectorById = function createSelectorById(_ref3) { var selector = _ref3.selector; return function (state, id) { var byId = selector(state).byId; if (Array.isArray(id)) { return id.map(function (itemId) { return byId[itemId]; }); } // else id: string return byId[id]; }; }; exports.createSelectorById = createSelectorById;