clean-architecture
Version:
Utilities for implementing clean architecture using Redux
76 lines • 2.75 kB
JavaScript
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createReactApi = void 0;
var react_1 = require("react");
var capitalize_1 = require("tsafe/capitalize");
var Reflect_1 = require("tsafe/Reflect");
var Deferred_1 = require("evt/tools/Deferred");
var useEvt_1 = require("evt/hooks/useEvt");
var hasCreateApiBeenCalled = false;
function createReactApi(params) {
if (hasCreateApiBeenCalled) {
console.log([
"clean-architecture: createReactApi has been called again,",
"probably HMR, the core have changed, reloading the app"
].join(" "));
window.location.reload();
}
hasCreateApiBeenCalled = true;
var bootstrapCore = params.bootstrapCore;
var dCore = new Deferred_1.Deferred();
var core = undefined;
function getCoreSync() {
if (core === undefined) {
throw dCore.pr;
}
return core;
}
function getCore() {
return dCore.pr;
}
var hasBootstrapCoreBeenCalled = false;
function triggerCoreBootstrap(params) {
if (hasBootstrapCoreBeenCalled) {
return;
}
hasBootstrapCoreBeenCalled = true;
bootstrapCore(params).then(function (r) {
core = r.core;
dCore.resolve(core);
});
}
function useCoreState(usecaseName, selectorName) {
var core = getCoreSync();
var getSelectedState = (0, react_1.useCallback)(function () { return core.states[usecaseName]["get".concat((0, capitalize_1.capitalize)(selectorName))](); }, [usecaseName, selectorName]);
var _a = __read((0, react_1.useState)(function () { return getSelectedState(); }), 2), selectedState = _a[0], setSelectedState = _a[1];
(0, useEvt_1.useEvt)(function (ctx) {
core.evtStateUpdated.attach(ctx, function () { return setSelectedState(getSelectedState()); });
}, [getSelectedState]);
return selectedState;
}
return {
ofTypeCore: (0, Reflect_1.Reflect)(),
getCoreSync: getCoreSync,
getCore: getCore,
triggerCoreBootstrap: triggerCoreBootstrap,
useCoreState: useCoreState
};
}
exports.createReactApi = createReactApi;
//# sourceMappingURL=react.js.map
;