UNPKG

@fluentui/state

Version:

A set of utils to create framework agnostic and reusable state managers

80 lines (78 loc) 2.71 kB
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