awv3
Version:
⚡ AWV3 embedded CAD
245 lines (201 loc) • 9.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mixin = undefined;
var _defineProperty2 = require('babel-runtime/core-js/object/define-property');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _defineProperty4 = require('babel-runtime/helpers/defineProperty');
var _defineProperty5 = _interopRequireDefault(_defineProperty4);
var _extends6 = require('babel-runtime/helpers/extends');
var _extends7 = _interopRequireDefault(_extends6);
var _uuidV = require('uuid-v4');
var _uuidV2 = _interopRequireDefault(_uuidV);
var _omit = require('lodash/omit');
var _omit2 = _interopRequireDefault(_omit);
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _error = require('../core/error');
var _helpers = require('./helpers');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Store mixin which creates four actions: register(id, props), unregister(id), update(id, props) & patch(props)
var mixin = exports.mixin = function mixin(name, subReducer) {
var references = {};
var types = {
register: name + '/REGISTER',
registerQueue: name + '/REGISTERQUEUE',
unregister: name + '/UNREGISTER',
update: name + '/UPDATE',
merge: name + '/MERGE'
};
return {
references: references,
types: types,
actions: {
register: function register(reference, props) {
return function (dispatch) {
// Store references to the actual lifecycle class making the register call
references[reference.id] = reference;
dispatch({ type: types.register, payload: { id: reference.id, props: props } });
};
},
unregister: function unregister(ids) {
return function (dispatch) {
var objects = Array.isArray(ids) ? ids : [ids];
dispatch({ type: types.unregister, payload: { ids: ids } });
objects.forEach(function (id) {
// Destroy & remove reference
if (references[id]) {
references[id].destroy(false);
delete references[id];
}
});
};
},
update: function update(id, props) {
return { type: types.update, payload: { id: id, props: props } };
},
merge: function merge(props) {
return { type: types.merge, payload: { props: props } };
}
},
reducer: function reducer() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _ref = arguments[1];
var type = _ref.type,
payload = _ref.payload;
switch (type) {
case types.register:
return (0, _extends7.default)({}, state, (0, _defineProperty5.default)({}, payload.id, (0, _extends7.default)({ id: payload.id }, payload.props)));
case types.unregister:
return (0, _omit2.default)(state, payload.ids);
case types.update:
return (0, _extends7.default)({}, state, (0, _defineProperty5.default)({}, payload.id, (0, _extends7.default)({}, state[payload.id], payload.props)));
case types.merge:
return (0, _keys2.default)(payload.props).reduce(function (prev, key) {
return (0, _extends7.default)({}, prev, (0, _defineProperty5.default)({}, key, (0, _extends7.default)({ id: key }, prev[key], payload.props[key])));
}, state);
default:
if (payload && payload.id && state[payload.id]) {
return (0, _extends7.default)({}, state, (0, _defineProperty5.default)({}, payload.id, subReducer(state[payload.id], { type: type, payload: payload })));
}
}
return state;
}
};
};
// Base for all objects tied to the store. Lifecycle takes care of the initial
// register, watches for removal, manages child-relations and observers
// Lifecycle eligiable objects must have store actions that expose:
// 1. register(id, props) method
// 2. unregister(id) method
// 3. update(id, props) method
exports.default = function () {
var Base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {
function _class() {
(0, _classCallCheck3.default)(this, _class);
}
return _class;
}();
var arg = arguments[1];
return function (_Base) {
(0, _inherits3.default)(Lifecycle, _Base);
function Lifecycle() {
var session = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _error.halt)("Lifecycle object is missing a session");
var actions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _error.halt)("Lifecycle object is missing link to actions");
var selector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _error.halt)("Lifecycle object is missing a selector");
var props = arguments[3];
(0, _classCallCheck3.default)(this, Lifecycle);
var _this = (0, _possibleConstructorReturn3.default)(this, (Lifecycle.__proto__ || (0, _getPrototypeOf2.default)(Lifecycle)).call(this, arg));
_this.id = (0, _uuidV2.default)();
_this.session = session;
_this.store = session.store;
_this.actions = actions;
_this.getState = function () {
return selector(_this.store.getState());
};
_this.subscriptions = [];
_this.dependencies = [];
// Register object and store original properties
_this.store.dispatch(actions.register(_this, props));
_this.props = (0, _cloneDeep2.default)(props);
// Create managed observer
var observer = (0, _helpers.createObserver)(_this.store, _this.getState);
_this.observe = function (selector, callback, options) {
return observer(selector, callback, (0, _extends7.default)({ manager: _this.addSubscription.bind(_this) }, options));
};
// Make props available on the object with automatic setters/getters
var _loop = function _loop(prop) {
!_this[prop] && (0, _defineProperty3.default)(_this, prop, {
configurable: true,
get: function get() {
var state = _this.getState();
return state && state[prop];
},
set: function set(value) {
return _this.store.dispatch(actions.update(_this.id, (0, _defineProperty5.default)({}, prop, value)));
}
});
};
for (var prop in props) {
_loop(prop);
}
return _this;
}
(0, _createClass3.default)(Lifecycle, [{
key: 'reset',
value: function reset() {
this.store.dispatch(actions.update(this.id, this.props));
}
}, {
key: 'destroy',
value: function destroy() {
var dispatchUnregister = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
if (dispatchUnregister) {
this.store.dispatch(this.actions.unregister(this.id));
} else {
this.removeSubscriptions();
this.__onDestroyed && this.__onDestroyed();
this.onDestroyed();
this.dependencies.slice().forEach(function (child) {
return child.destroy();
});
this.dependencies = [];
}
}
}, {
key: 'addSubscription',
value: function addSubscription(unsubscribe) {
this.subscriptions.push(unsubscribe);
return unsubscribe;
}
}, {
key: 'removeSubscriptions',
value: function removeSubscriptions() {
this.subscriptions.forEach(function (unsubscribe) {
return unsubscribe();
});
this.subscriptions = [];
this.dependencies.forEach(function (child) {
return child.removeSubscriptions();
});
}
}, {
key: 'onDestroyed',
value: function onDestroyed() {}
}]);
return Lifecycle;
}(Base);
};