fluxtuate
Version:
a javascript ES7 library for handling complex data transactions
129 lines (107 loc) • 5.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _internals = require("./_internals");
var _lang = require("lodash/lang");
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var destroyed = Symbol("fluxtuateMediator_destroyed");
var updateMediatorPropsFromModel = Symbol("fluxtuateMediator_updateMediatorPropsFromModel");
var modelUpdateListeners = Symbol("fluxtuateMediator_modelUpdateListeners");
var linkedModels = Symbol("fluxtuateMediator_linkedModels");
var defaultModelReducer = function defaultModelReducer(modelPayload) {
return modelPayload.data;
};
var Mediator = function () {
function Mediator() {
var _this = this;
_classCallCheck(this, Mediator);
this[destroyed] = false;
this[modelUpdateListeners] = [];
this[linkedModels] = [];
this[_internals.destroy] = function () {
while (_this[modelUpdateListeners].length > 0) {
_this[modelUpdateListeners][0].remove();
_this[modelUpdateListeners].shift();
}
_this[destroyed] = true;
};
this[updateMediatorPropsFromModel] = function (modelData) {
if ((0, _lang.isFunction)(_this.setProps)) _this.setProps(modelData);
};
setTimeout(function () {
if (_this[destroyed]) return;
if (_this[_internals.boundModels]) {
_this[_internals.boundModels].forEach(function (boundModel) {
if (_this[boundModel.key]) {
_this.linkModel(_this[boundModel.key], boundModel.bindFunction.bind(_this));
}
});
}
if (_this[_internals.autoDispatches]) {
_this[_internals.autoDispatches].forEach(function (autoDispatch) {
var autoDispatchFunction = void 0;
if ((0, _lang.isFunction)(_this[autoDispatch.key])) {
autoDispatchFunction = _this[autoDispatch.key];
} else {
autoDispatchFunction = function autoDispatchFunction(descriptorPayload) {
return descriptorPayload;
};
}
Object.defineProperty(_this, autoDispatch.key, {
value: function value() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var returnValue = autoDispatchFunction.apply(_this, args);
_this[_internals.dispatchFunction](autoDispatch.dispatchKey, returnValue);
return returnValue;
},
configurable: true,
writable: false
});
});
}
if ((0, _lang.isFunction)(_this.destroy)) {
var dest = _this.destroy;
_this.destroy = function () {
if (_this[destroyed]) return;
dest.apply(_this);
};
}
}, 0);
}
_createClass(Mediator, [{
key: "linkModel",
value: function linkModel(model) {
var _this2 = this;
var modelReducer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultModelReducer;
this.unlinkModel(model);
if ((0, _lang.isFunction)(model.onUpdate)) {
this[modelUpdateListeners].push(model.onUpdate(function (modelPayload) {
_this2[updateMediatorPropsFromModel](modelReducer(modelPayload));
}));
this[linkedModels].push(model);
}
}
}, {
key: "unlinkModel",
value: function unlinkModel(model) {
var index = this[linkedModels].indexOf(model);
if (index !== -1) {
this[modelUpdateListeners][index].remove();
this[modelUpdateListeners].splice(index, 1);
this[linkedModels].splice(index, 1);
}
}
}, {
key: "destroyed",
get: function get() {
return this[destroyed];
}
}]);
return Mediator;
}();
exports.default = Mediator;