core-native
Version:
A lightweight framework based on React Native + Redux + Redux Saga, in strict TypeScript.
34 lines • 1.47 kB
JavaScript
import { app } from "./app";
import { ModuleProxy } from "./platform/ModuleProxy";
import { setStateAction } from "./reducer";
export function register(module) {
const moduleName = module.name;
if (!app.store.getState().app[moduleName]) {
// To get private property
const initialState = module.initialState;
app.store.dispatch(setStateAction(moduleName, initialState, `@@${moduleName}/@@init`));
console.info(`Module [${moduleName}] registered`);
}
// Transform every method into ActionCreator
const actions = {};
getKeys(module).forEach(actionType => {
const method = module[actionType];
// Attach action name, for @Log reflection
const qualifiedActionType = `${moduleName}/${actionType}`;
method.actionName = qualifiedActionType;
actions[actionType] = (...payload) => ({ type: qualifiedActionType, payload });
app.actionHandlers[qualifiedActionType] = method.bind(module);
});
return new ModuleProxy(module, actions);
}
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