redux-store-templates
Version:
Set of helpers to create useful and commonly used redux store patterns
52 lines (44 loc) • 1.34 kB
JavaScript
import { applyAddIds, applyRemoveIds, readAsArray, createPathReader } from "../.internals";
export const createReducer = ({
initial = [],
setOn,
addOn,
removeOn,
emptyOn
} = {}) => {
const defaultState = initial;
const emptyState = [];
const handleAction = Object.create(null);
if (setOn) {
readAsArray(setOn).forEach(opt => {
const readActionPayload = createPathReader(opt.payloadPath);
handleAction[opt.type] = (state, action) => {
return applyAddIds([], readActionPayload(action));
};
});
}
if (addOn) {
readAsArray(addOn).forEach(opt => {
const readActionPayload = createPathReader(opt.payloadPath);
handleAction[opt.type] = (state, action) => {
return applyAddIds(state, readActionPayload(action));
};
});
}
if (removeOn) {
readAsArray(removeOn).forEach(opt => {
const readActionPayload = createPathReader(opt.payloadPath);
handleAction[opt.type] = (state, action) => {
return applyRemoveIds(state, readActionPayload(action));
};
});
}
if (emptyOn) {
readAsArray(emptyOn).forEach(opt => {
handleAction[opt.type] = () => emptyState;
});
}
return (state = defaultState, action) => {
return handleAction[action.type] ? handleAction[action.type](state, action) : state;
};
};