UNPKG

@descope/sdk-mixins

Version:
48 lines (44 loc) 2.03 kB
'use strict'; 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