redux-store-templates
Version:
Set of helpers to create useful and commonly used redux store patterns
145 lines (120 loc) • 4.78 kB
JavaScript
;
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;