redux-tiles
Version:
Library to create and easily compose redux pieces together in less verbose manner
73 lines • 3.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var lodash_1 = require("lodash");
var helpers_1 = require("../helpers");
exports.DEFAULT_REDUCER = '';
function changeDefaultReducer(newReducer) {
exports.DEFAULT_REDUCER = newReducer;
}
exports.changeDefaultReducer = changeDefaultReducer;
function checkValue(result, defaultValue) {
return result === undefined || result === null ? defaultValue : result;
}
/**
* @overview Deep lookup inside state
* @param {Object} state – current redux state object
* @param {Any} params – argument with which action was dispatched
* @param {Function} nesting – function to create nested data inside store
* @param {String} tileName – string to access module data
* @return {Object} – stored data
*/
function lookup(_a) {
var state = _a.state, params = _a.params, nesting = _a.nesting, tileName = _a.tileName, selectorFallback = _a.selectorFallback;
var path = [];
var topReducer = exports.DEFAULT_REDUCER;
if (nesting) {
path = nesting(params);
}
var nestedNames = helpers_1.ensureArray(tileName);
var topReducerArray = Boolean(topReducer) ? [topReducer] : [];
return checkValue(lodash_1.get(state, topReducerArray.concat(nestedNames, path)), selectorFallback);
}
/**
* @overview check passed arguments to the Selector function.
* The single purpose is for readability, to throw sane error
* @param {Object} state – redux state
* @param {Any} params – argument with which action was dispatched
* @param {String} tileName – string to access module data
* @param {Function} fn – function to invoke if check was passed
* @return {Any} – result of function invokation
*/
function checkArguments(_a) {
var state = _a.state, params = _a.params, tileName = _a.tileName, fn = _a.fn;
if (!state) {
throw new Error("\n Error in Redux-Tiles Selector \u2013 you have to provide\n state as a first argument!. Error in \"" + helpers_1.createType({ type: tileName }) + "\" tile.");
}
return fn(state, params);
}
/**
* @overview function to create selectors for modules
* @param {String} tileName – string to access module data
* @param {Function} nesting – function to create nested data inside store
* @return {Object} – object with selectors for all and specific data
*/
function createSelectors(_a) {
var tileName = _a.tileName, nesting = _a.nesting, selectorFallback = _a.selectorFallback;
var getAll = function (state) {
var topReducerArray = Boolean(exports.DEFAULT_REDUCER) ? [exports.DEFAULT_REDUCER] : [];
return checkValue(lodash_1.get(state, topReducerArray.concat(helpers_1.ensureArray(tileName))));
};
var getSpecific = function (state, params) {
return lookup({ state: state, params: params, nesting: nesting, tileName: tileName, selectorFallback: selectorFallback });
};
return {
getAll: function (state) {
return checkArguments({ state: state, tileName: tileName, fn: getAll });
},
get: function (state, params) {
return checkArguments({ state: state, params: params, tileName: tileName, fn: getSpecific });
}
};
}
exports.createSelectors = createSelectors;
//# sourceMappingURL=selectors.js.map