UNPKG

fluxtuate

Version:

a javascript ES7 library for handling complex data transactions

250 lines (208 loc) 9.6 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 _invokeFunction = require("../utils/invokeFunction"); var _invokeFunction2 = _interopRequireDefault(_invokeFunction); var _internals = require("./_internals"); 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 isPaused = Symbol("fluxtuateEventDispatcher_isPaused"); var children = Symbol("fluxtuateEventDispatcher_children"); var parent = Symbol("fluxtuateEventDispatcher_parent"); function sortEvents(event1, event2) { if (event1.priority > event2.priority) return -1;else if (event2.priority > event1.priority) return 1;else return 0; } var EventDispatcher = function () { function EventDispatcher() { var _this = this; _classCallCheck(this, EventDispatcher); this[_internals.eventDispatchCallback] = null; this[_internals.eventMap] = {}; this[isPaused] = false; this[children] = []; this[_internals.pause] = function () { _this[isPaused] = true; }; this[_internals.resume] = function () { _this[isPaused] = false; }; this[_internals.destroy] = function () { var cs = _this[children].slice(); cs.forEach(function (e) { e[_internals.destroy](); }); _this[children] = []; _this[parent] = undefined; _this[_internals.eventMap] = {}; }; this[_internals.propagateToParent] = function (event, payload, eventMetaData, rootDispatcher) { if (!eventMetaData.shouldPropagate || !eventMetaData.shouldImmediatelyPropagate) { return; } if (_this[parent]) { _this[parent][_internals.sendEvent](Object.assign({}, event, { currentTarget: _this[parent] }), payload, eventMetaData); if (_this[parent]) _this[parent][_internals.propagateToParent](event, payload, eventMetaData, rootDispatcher); } else if (rootDispatcher) { rootDispatcher[_internals.propagateToChildren](event, payload, eventMetaData); } }; this[_internals.propagateToChildren] = function (event, payload, eventMetaData, rootDispatcher) { if (_this[children] && _this[children].length > 0) { for (var i = 0; i < _this[children].length; i++) { if (!eventMetaData.shouldPropagate || !eventMetaData.shouldImmediatelyPropagate) { break; } var c = _this[children][i]; c[_internals.sendEvent](Object.assign({}, event, { currentTarget: c }), payload, eventMetaData); c[_internals.propagateToChildren](event, payload, eventMetaData); } } if (rootDispatcher) { rootDispatcher[_internals.propagateToParent](event, payload, eventMetaData); } }; this[_internals.sendEvent] = function (event, payload, eventMetaData) { var eventList = _this[_internals.eventMap][event.eventName]; if (!eventList) return; if (_this[_internals.eventDispatchCallback]) { _this[_internals.eventDispatchCallback](event, payload, eventMetaData); } eventList = eventList.slice(); eventList = eventList.sort(sortEvents); for (var i = 0; i < eventList.length; i++) { if (!eventMetaData.shouldImmediatelyPropagate) { break; } var eventObject = eventList[i]; if (eventObject.capture && !event.capture || !eventObject.capture && event.capture) { continue; } (0, _invokeFunction2.default)(eventObject.callbackFunction, [event, payload]); if (eventObject.oneShot) { eventObject.remove(); } } }; } _createClass(EventDispatcher, [{ key: "addChild", value: function addChild(eventDispatcher) { if (!eventDispatcher) return; if (this[children].indexOf(eventDispatcher) !== -1) return; this[children].push(eventDispatcher); eventDispatcher[parent] = this; } }, { key: "removeChild", value: function removeChild(eventDispatcher) { var index = this[children].indexOf(eventDispatcher); if (index === -1) return; this[children].splice(index, 1); eventDispatcher[parent] = undefined; } }, { key: "dispatch", value: function dispatch(eventName, payload) { if (this[isPaused]) return; var eventMetaData = { shouldPropagate: true, shouldImmediatelyPropagate: true }; var event = { eventName: eventName, stopPropagation: function stopPropagation() { eventMetaData.shouldPropagate = false; }, stopImmediatePropagation: function stopImmediatePropagation() { eventMetaData.shouldImmediatelyPropagate = false; }, currentTarget: this, target: this }; this[_internals.propagateToParent](event, payload, eventMetaData, this); this[_internals.sendEvent](event, payload, eventMetaData); eventMetaData = { shouldPropagate: true, shouldImmediatelyPropagate: true }; event = { eventName: eventName, capture: true, stopPropagation: function stopPropagation() { eventMetaData.shouldPropagate = false; }, stopImmediatePropagation: function stopImmediatePropagation() { eventMetaData.shouldImmediatelyPropagate = false; }, currentTarget: this, target: this }; this[_internals.sendEvent](event, payload, eventMetaData); this[_internals.propagateToChildren](event, payload, eventMetaData, this); } }, { key: "addListener", value: function addListener(eventName, callbackFunction) { var priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var oneShot = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; if (!this[_internals.eventMap][eventName]) this[_internals.eventMap][eventName] = []; var self = this; var eventObject = { callbackFunction: callbackFunction, oneShot: oneShot, priority: priority, remove: function remove() { var list = self[_internals.eventMap][eventName]; if (!list) return; var index = list.indexOf(eventObject); if (index === -1) return; list.splice(index, 1); } }; this[_internals.eventMap][eventName].push(eventObject); return { remove: eventObject.remove }; } }, { key: "capture", value: function capture(eventName, callbackFunction) { var priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var oneShot = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; if (!this[_internals.eventMap][eventName]) this[_internals.eventMap][eventName] = []; var self = this; var eventObject = { callbackFunction: callbackFunction, oneShot: oneShot, priority: priority, capture: true, remove: function remove() { var list = self[_internals.eventMap][eventName]; if (!list) return; var index = list.indexOf(eventObject); if (index === -1) return; list.splice(index, 1); } }; this[_internals.eventMap][eventName].push(eventObject); return { remove: eventObject.remove }; } }, { key: "children", get: function get() { return this[children].slice(); } }, { key: "parent", get: function get() { return this[parent]; } }]); return EventDispatcher; }(); exports.default = EventDispatcher;