react-entities
Version:
React Entities - the simplest app state management for React
55 lines (48 loc) • 2.13 kB
JavaScript
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
import _extends from "@babel/runtime/helpers/esm/extends";
export var createSetState = function createSetState(entity, beforeSetState) {
return function (updates) {
for (var _len = arguments.length, updaterArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
updaterArgs[_key - 1] = arguments[_key];
}
if (typeof updates === 'function') updates = updates.apply(void 0, [entity.state].concat(updaterArgs));
if (typeof beforeSetState === 'function') beforeSetState(entity.state, updates);
entity.state = _extends({}, entity.state, {}, updates);
for (var i = 0; i < entity.subscribers.length; i++) {
if (typeof entity.subscribers[i] === 'function') entity.subscribers[i](entity.state);
} // Cleanup any nullified subscribers due to possible
// component unmounts caused by this app state change
entity.subscribers = entity.subscribers.filter(function (item) {
return typeof item === 'function';
});
};
};
export var bindActions = function bindActions(actions, entity, deps) {
var entityActions = {};
for (var key in actions) {
if (typeof actions[key] === 'function') {
var action = actions[key](entity, deps);
if (typeof action !== 'function') throw new Error('Action must be defined using higher-order function.');
entityActions[key] = action;
}
}
return entityActions;
};
export var createEntity = function createEntity(_ref, deps) {
var initialState = _ref.initialState,
_ref$options = _ref.options,
options = _ref$options === void 0 ? {} : _ref$options,
actions = _objectWithoutPropertiesLoose(_ref, ["initialState", "options"]);
var entity = {
state: initialState || {},
initialState: initialState,
subscribers: [],
reset: function reset() {
entity.state = initialState;
}
};
entity.setState = createSetState(entity, options.beforeSetState);
entity.actions = bindActions(actions, entity, deps);
return entity;
};
export default createEntity;