redux-code
Version:
Redux helpers for actions and reducers
46 lines (45 loc) • 1.75 kB
JavaScript
;
/* eslint-disable @typescript-eslint/ban-ts-comment */
// @ts-nocheck
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildStructuredReducer = exports.createBaseReducer = exports.createReducer = void 0;
const immer_1 = require("immer");
const redux_1 = require("redux");
/**
*
* A helper to create reducer (uses immer)
* @param initial The initial state
*/
const createReducer = function (initial, ...mixins) {
const reducer = (0, exports.createBaseReducer)(initial, ...mixins);
return function (state = initial, action) {
if ((0, immer_1.isDraft)(state) || !(0, immer_1.isDraftable)(state))
return reducer(state, action);
return (0, immer_1.default)(state, (draft) => reducer(draft, action));
};
};
exports.createReducer = createReducer;
/**
*
* A helper to create reducer (without immer)
* @param initial The initial state
*/
const createBaseReducer = function (initial, ...mixins) {
const reducers = Object.assign({}, ...mixins);
return function (state = initial, action) {
const producer = reducers[action.type];
if (producer)
state = producer(state, action);
return state;
};
};
exports.createBaseReducer = createBaseReducer;
const isPlainObject = (v) => !!v && typeof v === 'object' && (v.__proto__ === null || v.__proto__ === Object.prototype);
const buildStructuredReducer = function (reducer) {
if (isPlainObject(reducer)) {
const combined = Object.fromEntries(Object.entries(reducer).map(([key, value]) => [key, (0, exports.buildStructuredReducer)(value)]));
return (0, redux_1.combineReducers)(combined);
}
return reducer;
};
exports.buildStructuredReducer = buildStructuredReducer;