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
43 lines (42 loc) • 1.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createSliceManager = void 0;
const toolkit_1 = require("@reduxjs/toolkit");
const utils_1 = require("./utils");
function createSliceManager({ initialState, name, watchers = [], reducers, extraReducers }) {
const baseReducers = (0, utils_1.generateReducers)(initialState);
const reducersResult = Object.assign(Object.assign({}, baseReducers), reducers);
const slice = (0, toolkit_1.createSlice)({
name,
initialState: initialState,
reducers: reducersResult,
extraReducers,
});
const actions = slice.actions;
const updateSubscriptions = () => (dispatch, getState) => {
const state = getState()[name];
watchers.forEach(e => e.isSubscriber ? dispatch(e.handler(state)) : void 0);
};
const middleware = ({ dispatch, getState }) => (next) => (action) => {
next(action);
const { fieldName, managerName } = (0, utils_1.getMetaByAction)(action);
if (managerName !== name) {
return;
}
const params = getState()[name];
for (const watcher of watchers) {
const fields = (0, utils_1.getCapitalizeFields)(watcher.fields);
if (fields.includes(fieldName)) {
return watcher.handler(params)(dispatch, getState, undefined);
}
}
};
return {
actions,
name,
middleware,
updateSubscriptions,
slice,
};
}
exports.createSliceManager = createSliceManager;