UNPKG

fluxtuate

Version:

a javascript ES7 library for handling complex data transactions

129 lines (107 loc) 5.14 kB
"use strict"; 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;