UNPKG

redux-dispatcher

Version:

All-in-one simple solution to manage actions with less code

96 lines (78 loc) 2.9 kB
"use strict"; 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; }