rtk-slice-manager
Version:
Wrap over slice from @reduxjs/toolkit for automatic generation of actions and isolation of effect logic after changing the state of the fields
64 lines (63 loc) • 2.52 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMetaByAction = exports.generateReducers = exports.getHandlerNames = exports.getCapitalizeFields = exports.getDeepKeys = exports.decapitalize = exports.capitalize = void 0;
const set_1 = __importDefault(require("lodash/set"));
const capitalize = (str) => str.charAt(0).toUpperCase() + str.substring(1);
exports.capitalize = capitalize;
const decapitalize = (str) => (str.charAt(0).toLowerCase() + str.substring(1));
exports.decapitalize = decapitalize;
function getDeepKeys(obj) {
let keys = [];
for (const key in obj) {
keys.push(key);
if (typeof obj[key] === "object") {
const subkeys = getDeepKeys(obj[key]);
keys = keys.concat(subkeys.map(function (subkey) {
return `${key}.${subkey}`;
}));
}
}
return keys;
}
exports.getDeepKeys = getDeepKeys;
function getKeysByArr(keys, callback) {
return keys.map(e => callback(e.split('.')));
}
function capitalizeAllKeys(keys, includeFirst = true) {
return keys
.map((key, i) => {
const firstKeyCheck = includeFirst ? (0, exports.capitalize)(key) : key;
return i > 0 ? (0, exports.capitalize)(key) : firstKeyCheck;
})
.join('');
}
const getCapitalizeFields = (fields) => getKeysByArr(fields, (keyByArr) => capitalizeAllKeys(keyByArr, false));
exports.getCapitalizeFields = getCapitalizeFields;
function getHandlerNames(keys) {
return getKeysByArr(keys, (keyByArr) => ({
handlerName: `change${capitalizeAllKeys(keyByArr)}`,
key: keyByArr,
}));
}
exports.getHandlerNames = getHandlerNames;
function generateReducers(initialState) {
const keys = getDeepKeys(initialState);
const handlerNames = getHandlerNames(keys);
return handlerNames.reduce((acc, { handlerName, key }) => {
acc[handlerName] = (state, action) => {
(0, set_1.default)(state, key, action.payload);
};
return acc;
}, {});
}
exports.generateReducers = generateReducers;
function getMetaByAction(action) {
const actionByArr = action.type.split(`/`);
const field = (actionByArr[1] || '').split("change")[1] || '';
const fieldName = (0, exports.decapitalize)(field);
return { fieldName, managerName: actionByArr[0] };
}
exports.getMetaByAction = getMetaByAction;