core-native
Version:
A lightweight framework based on React Native + Redux + Redux Saga, in strict TypeScript.
44 lines • 1.89 kB
JavaScript
import { app } from "./app";
import { ModuleProxy } from "./platform/ModuleProxy";
import { setStateAction } from "./reducer";
import { stringifyWithMask } from "./util/json-util";
import { captureError } from "./util/error-util";
export function register(module) {
const moduleName = module.name;
if (!app.store.getState().app[moduleName]) {
// To get private property
app.store.dispatch(setStateAction(moduleName, module.initialState, `@@${moduleName}/@@init`));
}
// Transform every method into ActionCreator
const actions = {};
getKeys(module).forEach((actionType) => {
// Attach action name, for @Log / error handler reflection
const method = module[actionType];
const qualifiedActionType = `${moduleName}/${actionType}`;
method.actionName = qualifiedActionType;
actions[actionType] = (...payload) => ({ type: qualifiedActionType, payload });
app.actionHandlers[qualifiedActionType] = method.bind(module);
});
return new ModuleProxy(module, actions);
}
export function* executeAction(actionName, handler, ...payload) {
var _a;
try {
yield* handler(...payload);
}
catch (error) {
const actionPayload = stringifyWithMask(((_a = app.loggerConfig) === null || _a === void 0 ? void 0 : _a.maskedKeywords) || [], "***", ...payload) || "[No Parameter]";
captureError(error, actionName, { actionPayload });
}
}
function getKeys(module) {
// Do not use Object.keys(Object.getPrototypeOf(module)), because class methods are not enumerable
const keys = [];
for (const propertyName of Object.getOwnPropertyNames(Object.getPrototypeOf(module))) {
if (module[propertyName] instanceof Function && propertyName !== "constructor") {
keys.push(propertyName);
}
}
return keys;
}
//# sourceMappingURL=module.js.map