react-torch
Version:
A lib to server-side render with react.
87 lines (86 loc) • 3.44 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.select = exports.subscribe = exports.createPureModel = void 0;
var store_1 = require("./store");
var lifecircle_1 = require("./lifecircle");
var storeHook_1 = require("./storeHook");
var util_1 = require("./util");
var createPureModel = function (initializer, options) {
if (options === void 0) { options = {}; }
var _a = (0, lifecircle_1.createLifeCircleManager)(), preload = _a.preload, start = _a.start, finish = _a.finish;
var hasStore = false;
var setupStore = function (storeOptions) {
if (hasStore) {
throw new Error("Expected calling setupStore only once in initializer: " + initializer.toString());
}
hasStore = true;
return (0, store_1.createStore)(__assign(__assign({ devtools: true }, storeOptions), { preloadedState: options.preloadedState }));
};
var implementations = {
setupStore: setupStore,
setupPreload: preload.setup,
setupStart: start.setup,
setupFinish: finish.setup,
};
var result = (0, storeHook_1.run)(function () {
var result = initializer();
if (!result) {
throw new Error("Expected initialzer returning { store, actions }, but got " + result);
}
var store = result.store, actions = result.actions;
if (!store) {
throw new Error("Expected initialzer returning { store, actions }, but got a invalid store: " + store);
}
if (!actions) {
throw new Error("Expected initialzer returning { store, actions }, but got a invalid actions: " + actions);
}
return { store: store, actions: actions };
}, implementations);
return __assign(__assign({}, result), { preload: preload, start: start, finish: finish });
};
exports.createPureModel = createPureModel;
function subscribe(model, listener) {
var unsubscribe = model.store.subscribe(function () {
if (!model.start.hasRun()) {
return;
}
var state = model.store.getState();
listener(state);
});
return unsubscribe;
}
exports.subscribe = subscribe;
function select(options) {
if (!(0, util_1.isPlainObject)(options)) {
throw new Error("Expected subscribe(options) recieved { store, listener, selector?, compare? }, instead of " + options);
}
var model = options.model, selector = options.selector, listener = options.listener, _a = options.compare, compare = _a === void 0 ? util_1.shallowEqual : _a;
var prevState = selector(model.store.getState());
var unsubscribe = model.store.subscribe(function () {
if (!model.start.hasRun()) {
return;
}
var state = model.store.getState();
var currState = selector(state);
if (!compare(currState, prevState)) {
prevState = currState;
listener(currState);
}
else {
prevState = currState;
}
});
return unsubscribe;
}
exports.select = select;