redux-dispatcher
Version:
All-in-one simple solution to manage actions with less code
96 lines (78 loc) • 2.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createReducer = void 0;
exports.default = _default;
exports.reducers = void 0;
var _dotPropImmutable = _interopRequireDefault(require("dot-prop-immutable"));
var _dispatcherMiddleware = require("./dispatcherMiddleware");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const reducers = {};
exports.reducers = reducers;
const createReducer = (key, enhancer) => (initialState, mapDispatchToReducer) => {
if (typeof mapDispatchToReducer === 'function') mapDispatchToReducer = mapDispatchToReducer(_dispatcherMiddleware.context);
if (enhancer) ({
initialState,
mapDispatchToReducer
} = enhancer.injectReducer(key, initialState, mapDispatchToReducer));
const mapTypeToHandler = parseHandler(mapDispatchToReducer);
const reducer = (state = initialState, {
type,
...payload
}) => {
if (mapTypeToHandler.hasOwnProperty(type)) {
const handler = mapTypeToHandler[type];
if (typeof handler === 'function') return { ...state,
...handler(state, payload, withDotProp(state))
};
if (typeof handler === 'object') return { ...state,
...handler
};
}
return state;
};
reducers[key] = reducer;
return {
[key]: reducer
};
};
exports.createReducer = createReducer;
const parseHandler = mapDispatchToReducer => {
const reducerHandler = {};
for (const key in mapDispatchToReducer) if (mapDispatchToReducer.hasOwnProperty(key) && typeof key === 'string') {
const actionTypes = key.split(',');
actionTypes.forEach(type => {
reducerHandler[type] = mapDispatchToReducer[key];
});
}
return reducerHandler;
};
const withDotProp = state => ({
get: (prop, defaultValue) => _dotPropImmutable.default.get(state, prop, defaultValue),
set: (prop, value) => _dotPropImmutable.default.set(state, prop, value),
merge: (prop, value) => _dotPropImmutable.default.merge(state, prop, value),
toggle: prop => _dotPropImmutable.default.toggle(state, prop),
remove: prop => _dotPropImmutable.default.delete(state, prop)
});
function _default(initialState, mapDispatchToReducer) {
if (typeof mapDispatchToReducer === 'function') mapDispatchToReducer = mapDispatchToReducer(_dispatcherMiddleware.context);
const mapTypeToHandler = parseHandler(mapDispatchToReducer);
const reducer = (state = initialState, {
type,
...payload
}) => {
if (mapTypeToHandler.hasOwnProperty(type)) {
const handler = mapTypeToHandler[type];
if (typeof handler === 'function') return { ...state,
...handler(state, payload, withDotProp(state))
};
if (typeof handler === 'object') return { ...state,
...handler
};
}
return state;
};
reducer.initialState = Object.freeze(initialState);
return reducer;
}