strikejs-react
Version:
A state management framework for ReactJS applications.
155 lines (154 loc) • 5.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var Pool_1 = require("./Pool");
var ManagedState_1 = require("./ManagedState");
/**
* Returns value at a given key with in an object literal.
*
* @export
* @param {object} object the object to use
* @param {string} path the path to return its value
* @param {string} p path separator, defaults to '.'
* @returns {any} the value at the given key
*/
function getDataAt(object, path, p) {
var o = object, key, temp, pathSep = p ? p : '.', list = path.split(pathSep);
while ((key = list.shift()) && (temp = o[key]) && (o = temp))
;
return temp;
}
exports.getDataAt = getDataAt;
/**
* Creates a state container instance with the provided configurations
* @param {StoreCfg} cfg the store configurations.
* @returns {IStore}
*/
function createStore(cfg) {
var components = {};
var actions = {};
var backlog = [];
var middlewares = cfg.middlewares || [];
var trackChanges = typeof cfg.trackChanges === "undefined" ? false : cfg.trackChanges;
var o = null;
var state = {};
var pool = Pool_1.createPool(ManagedState_1.createManagedState);
function connect(el) {
var key = el.getStateKey();
components[key] = el;
state[key] = el.state || {};
return o;
}
function disconnect(el) {
delete components[el.getStateKey()];
delete state[el.getStateKey()];
return o;
}
function getStateAt(key) {
return getDataAt(state, key, '.'); //state[key];
}
function setStateAt(key, val) {
if (components[key]) {
state[key] = val;
components[key].setState(state[key]);
return o;
}
throw new Error("Component with key " + key + " could not be found");
}
function applyMiddleware(action, done) {
var idx = 0;
var m = null;
function next(action) {
if (!action || idx >= middlewares.length) {
return done(action);
}
m = middlewares[idx];
idx++;
return m(action, o, next);
}
next(action);
}
function doExecute(key, action) {
var managedState = pool.get();
var component = components[key];
managedState.setState(state[key]);
var rd = component.getReducer();
if (rd) {
rd(managedState, action);
if (managedState.hasChanges()) {
action.__executed = true;
var changes = managedState.changes();
component.setState(function () { return changes; }, function () {
action.__done && typeof action.__done === "function" && action.__done();
});
}
}
pool.put(managedState);
}
function execute(action) {
if (action) {
if (trackChanges) {
backlog.push(action);
}
for (var key in components) {
doExecute(key, action);
}
if (!action.__executed) {
action.__done();
}
}
}
function onAction(action, cb) {
action.__done = cb;
action.__executed = false;
if (!cb) {
if (typeof Promise !== "undefined") {
return new Promise(function (res) {
action.__done = res;
var act = applyMiddleware(action, function (finalAction) {
finalAction && execute(finalAction);
});
});
}
}
var act = applyMiddleware(action, function (finalAction) {
finalAction && execute(finalAction);
});
}
function onActionFail(err) {
console.log(err, err.message, err.stack);
}
var dispatch = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (args.length === 0) {
throw new Error("No action provided");
}
else if (args.length === 1) {
if (typeof args[0] === "function") {
return args[0](dispatch, getStateAt);
}
else if (typeof args[0] === "object") {
return onAction(args[0]);
}
}
else if (args.length === 2) {
if (typeof args[0] === "function") {
return args[0](dispatch, getStateAt, args[1]);
}
else if (typeof args[0] === "object") {
return onAction(args[0], args[1]);
}
}
};
o = {
connect: connect,
disconnect: disconnect,
getStateAt: getStateAt,
setStateAt: setStateAt,
dispatch: dispatch
};
return o;
}
exports.createStore = createStore;