fluxtuate
Version:
a javascript ES7 library for handling complex data transactions
250 lines (208 loc) • 9.6 kB
JavaScript
"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;