@fluentui/state
Version:
A set of utils to create framework agnostic and reusable state managers
80 lines (78 loc) • 2.71 kB
JavaScript
export var createManager = function createManager(config) {
var actions = config.actions,
debug = config.debug,
_config$middleware = config.middleware,
middleware = _config$middleware === void 0 ? [] : _config$middleware,
_config$sideEffects = config.sideEffects,
sideEffects = _config$sideEffects === void 0 ? [] : _config$sideEffects,
state = config.state;
var _state = Object.assign({}, state);
var getState = function getState() {
return Object.assign({}, _state);
};
var setState = function setState(partial) {
return Object.assign(_state, partial);
};
var manager = {
actions: {},
get state() {
return getState();
}
};
// assign actions to manager's api
Object.keys(actions).forEach(function (actionName) {
var enhancedAction = actions[actionName];
var action = function action() {
var prevState = getState();
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
applyAction.apply(void 0, [enhancedAction].concat(args));
applyMiddleware(prevState);
applySideEffects(prevState);
};
manager.actions[actionName] = action;
});
var applyAction = function applyAction(action) {
if (process.env.NODE_ENV !== 'production') {
if (debug) {
// eslint-disable-next-line no-console
console.log('manager ACTION', action.name || 'Anonymous');
}
}
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
var actionResult = action.apply(void 0, args)(getState(), manager.actions);
if (actionResult) {
setState(actionResult);
}
};
var applyMiddleware = function applyMiddleware(prevState) {
middleware.forEach(function (middlewareItem, index) {
if (process.env.NODE_ENV !== 'production') {
if (debug) {
// eslint-disable-next-line no-console
console.log("manager MIDDLEWARE[" + index + "]", {
prev: prevState,
next: getState()
});
}
}
setState(middlewareItem(prevState, getState(), manager.actions));
});
};
var applySideEffects = function applySideEffects(prevState) {
sideEffects.forEach(function (sideEffect, index) {
if (process.env.NODE_ENV !== 'production') {
if (debug) {
// eslint-disable-next-line no-console
console.log("manager SIDE_EFFECT[" + index + "]");
}
}
sideEffect(prevState, manager.state);
});
};
return manager;
};
//# sourceMappingURL=createManager.js.map