UNPKG

fluxtuate

Version:

a javascript ES7 library for handling complex data transactions

187 lines (133 loc) 7.55 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 _delegator = require("../delegator"); var _delegator2 = _interopRequireDefault(_delegator); var _mediator = require("./mediator"); var _mediator2 = _interopRequireDefault(_mediator); var _internals = require("./_internals"); var _mediatorController = require("./mediator-controller"); var _mediatorController2 = _interopRequireDefault(_mediatorController); var _array = require("lodash/array"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var mediatorMap = Symbol("fluxtuateMediatorMap__mediatorMap"); var controllerDelegator = Symbol("fluxtuateMediatorMap__controllerDelegator"); var controller = Symbol("fluxtuateMediatorMap__controller"); var isPuased = Symbol("fluxtuateMediatorMap__isPaused"); var MediatorMap = function () { function MediatorMap(context) { var _this = this; _classCallCheck(this, MediatorMap); this[isPuased] = false; this[controllerDelegator] = new _delegator2.default(); this[controller] = new _mediatorController2.default(context); this[controllerDelegator].attachDelegate(this[controller]); this[mediatorMap] = {}; this[_internals.viewCreated] = function (view, viewClass, creationContext) { if (!creationContext) { throw new Error("You must have a context when creating a view! View was created outside of a context!"); } if (creationContext !== context && !creationContext.isChildOf(context)) return; if (_this[isPuased]) return; var viewClassName = viewClass[viewClass[_internals.fluxtuateNameProperty]]; var mediatorClasses = _this[mediatorMap][viewClassName].mediatorClasses; _this[controller][_internals.viewCreated](view, viewClass, mediatorClasses); }; this[_internals.viewDestroyed] = function (view, viewClass, creationContext) { if (creationContext && creationContext !== context && !creationContext.isChildOf(context)) return; var viewClassName = viewClass[viewClass[_internals.fluxtuateNameProperty]]; if (!_this[mediatorMap][viewClassName]) return; var mediatorClasses = _this[mediatorMap][viewClassName].mediatorClasses; _this[controller][_internals.viewDestroyed](view, viewClass, mediatorClasses); }; this[_internals.pause] = function () { _this[isPuased] = true; }; this[_internals.resume] = function () { _this[isPuased] = false; }; this[_internals.destroy] = function () { var _loop = function _loop(key) { var _mediatorMap$key = _this[mediatorMap][key], viewClass = _mediatorMap$key.viewClass, mediatorClasses = _mediatorMap$key.mediatorClasses; mediatorClasses = mediatorClasses.slice(); mediatorClasses.forEach(function (mediator) { _this.unpamView(viewClass, mediator.mediatorClass); }); viewClass[_internals.viewDelegator].detachDelegate(_this); }; for (var key in _this[mediatorMap]) { _loop(key); } _this[mediatorMap] = {}; }; } _createClass(MediatorMap, [{ key: "mapView", value: function mapView(view, mediator) { for (var _len = arguments.length, props = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { props[_key - 2] = arguments[_key]; } if (mediator === _mediator2.default || !(mediator.prototype instanceof _mediator2.default)) throw new Error("Your mediators must inherit fluxtuates Mediator class!"); if (!view[_internals.fluxtuateView]) { throw new Error("You must map a fluxtuate view in the mediator map!"); } var viewClassName = view[view[_internals.fluxtuateNameProperty]]; view[_internals.viewDelegator].attachDelegate(this); var mediatorClasses = []; if (this[mediatorMap][viewClassName]) { mediatorClasses = this[mediatorMap][viewClassName].mediatorClasses; } var mediatorObject = { mediatorClass: mediator, props: props }; mediatorClasses.push(mediatorObject); this[mediatorMap][viewClassName] = { viewClass: view, mediatorClasses: mediatorClasses }; function returnGuardObject() { return { withGuard: function withGuard(guard) { for (var _len2 = arguments.length, guardProperties = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { guardProperties[_key2 - 1] = arguments[_key2]; } if (!mediatorObject.guards) mediatorObject.guards = []; mediatorObject.guards.push({ guard: guard, guardProperties: guardProperties }); return returnGuardObject(); }, withHook: function withHook(hookClass) { for (var _len3 = arguments.length, hookProperties = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { hookProperties[_key3 - 1] = arguments[_key3]; } if (!mediatorObject.hooks) mediatorObject.hooks = []; mediatorObject.hooks.push({ hook: hookClass, hookProperties: hookProperties }); return returnGuardObject(); } }; } return returnGuardObject(); } }, { key: "unpamView", value: function unpamView(view, mediator) { var viewClassName = view[view[_internals.fluxtuateNameProperty]]; if (!this[mediatorMap][viewClassName]) return; var mediatorClasses = this[mediatorMap][viewClassName].mediatorClasses; var index = (0, _array.findIndex)(mediatorClasses, { mediatorClass: mediator }); if (index === -1) return; mediatorClasses.splice(index, 1); if (mediatorClasses.length === 0) view[_internals.viewDelegator].detachDelegate(this); this[controller][_internals.mapRemoved](view, mediator); return mediator; } }]); return MediatorMap; }(); exports.default = MediatorMap;