@descope/sdk-mixins
Version:
Descope JavaScript SDK mixins
48 lines (44 loc) • 2.03 kB
JavaScript
;
var sdkHelpers = require('@descope/sdk-helpers');
var toolkit = require('@reduxjs/toolkit');
var loggerMixin = require('./loggerMixin/loggerMixin.js');
/* eslint-disable no-param-reassign */
const createStateManagementMixin = (options) => sdkHelpers.createSingletonMixin((superclass) => {
const slice = toolkit.createSlice(options);
const allActions = Object.assign(Object.assign({}, slice.actions), options.asyncActions);
return class StateManagementMixinClass extends sdkHelpers.compose(loggerMixin.loggerMixin)(superclass) {
constructor(...args) {
super(...args);
const store = toolkit.configureStore({
reducer: slice.reducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware({
thunk: {
extraArgument: this,
},
serializableCheck: false,
}),
// change to true if we want to debug redux
devTools: false,
});
const wrapAction = (action) => (async (...arg) => {
const result = await store.dispatch(action(...arg));
// we want to unwrap the result, so in case of an error we can log it
try {
toolkit.unwrapResult(result);
}
catch (e) {
this.logger.error(e.message, result.type, e.stack);
}
return result;
});
const actions = Object.keys(allActions).reduce((acc, actionName) => {
acc[actionName] = wrapAction(allActions[actionName]);
return acc;
}, {});
this.actions = actions;
this.subscribe = (cb, selector = (state) => state) => store.subscribe(() => cb(selector(store.getState())));
}
};
});
exports.createStateManagementMixin = createStateManagementMixin;
//# sourceMappingURL=createStateManagementMixin.js.map