ayanami
Version:
A better way to react with state
40 lines (39 loc) • 1.62 kB
JavaScript
import { Subject } from 'rxjs';
import { getActionNames } from '../decorators';
import { effectSymbols, reducerSymbols, immerReducerSymbols, defineActionSymbols } from '../symbols';
const getOriginalFunctionNames = (ayanami) => ({
effects: getActionNames(effectSymbols, ayanami.constructor),
reducers: getActionNames(reducerSymbols, ayanami.constructor),
defineActions: getActionNames(defineActionSymbols, ayanami.constructor),
immerReducers: getActionNames(immerReducerSymbols, ayanami.constructor),
});
const transformDefineActions = (actionNames) => {
const result = {};
actionNames.forEach((actionName) => {
const actions$ = new Subject();
result[actionName] = {
observable: actions$.asObservable(),
next: (params) => actions$.next(params),
};
});
return result;
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const getOriginalFunctions = (ayanami) => {
const { effects, reducers, immerReducers, defineActions } = getOriginalFunctionNames(ayanami);
return {
effects: effects.reduce((acc, method) => {
acc[method] = ayanami[method].bind(ayanami);
return acc;
}, {}),
reducers: reducers.reduce((acc, method) => {
acc[method] = ayanami[method].bind(ayanami);
return acc;
}, {}),
immerReducers: immerReducers.reduce((acc, method) => {
acc[method] = ayanami[method].bind(ayanami);
return acc;
}, {}),
defineActions: transformDefineActions(defineActions),
};
};