@deathbyjer/react-event-manager
Version:
Handle custom events in react and enable components to broadcast and consume dynamic messaging
389 lines (321 loc) • 12.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
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; }; }();
exports.Provider = Provider;
exports.connectToEventManager = connectToEventManager;
exports.bindListeners = bindListeners;
exports.removeBoundListeners = removeBoundListeners;
exports.useEventManager = useEventManager;
exports.useEventListeners = useEventListeners;
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
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 EventManager = function () {
function EventManager() {
_classCallCheck(this, EventManager);
}
_createClass(EventManager, [{
key: "addEventCondition",
/*
* Event Conditions
********************/
value: function addEventCondition(event_type, event_condition) {
if (typeof event_condition != "function") return;
this.__getEvents(event_type).conditions.push(event_condition);
}
}, {
key: "removeEventCondition",
value: function removeEventCondition(event_type, event_condition) {
var index = this.__getEvents(event_type).conditions.indexOf(event_condition);
if (index >= 0) this.__getEvents(event_type).conditions.splice(index, 1);
}
/*
* Event Listeners
**********************/
}, {
key: "addEventListener",
value: function addEventListener(event_type, event_listener) {
if (typeof event_listener != "function") return;
this.__getEvents(event_type).listeners.push(event_listener);
}
}, {
key: "removeEventListener",
value: function removeEventListener(event_type, event_listener) {
var index = this.__getEvents(event_type).listeners.indexOf(event_listener);
if (index >= 0) this.__getEvents(event_type).listeners.splice(index, 1);
}
/*
* Call the event listener
***************************/
}, {
key: "applyEventListeners",
value: function applyEventListeners(event_type, event_data) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = this.__getEvents(event_type).conditions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var event_condition = _step.value;
if (!event_condition(event_data)) return;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = this.__getEvents(event_type).listeners[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var event_listener = _step2.value;
event_listener(event_data);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
}, {
key: "removeAllEventListeners",
value: function removeAllEventListeners(event_type) {
var event = __getEvents(event_type);
event.conditions.length = 0;
event.listeners.length = 0;
delete this.events[event_type];
}
}, {
key: "__getEvents",
value: function __getEvents(event_type) {
if (!this.events) this.events = {};
if (!this.events[event_type]) this.events[event_type] = { conditions: [], listeners: [] };
return this.events[event_type];
}
}]);
return EventManager;
}();
var EventContext = _react2.default.createContext(new EventManager());
function Provider(props) {
var events = new EventManager();
return _react2.default.createElement(EventContext.Provider, { value: events }, props.children);
}
function connectToEventManager(Component) {
return function (props) {
var children = function children(events) {
return _react2.default.createElement(Component, Object.assign({ events: events }, props));
};
return _react2.default.createElement(EventContext.Consumer, null, children);
};
}
var METHOD_TYPES = ["conditions", "listeners"];
function ensureBoundObject(listeners) {
// It can only be a function, an object or an array. Otherwise, it's wrong
if (!["function", "object"].includes(typeof listeners === "undefined" ? "undefined" : _typeof(listeners))) return { conditions: [], listeners: []
// If it's a function, we're going to make it an array
};if (typeof listeners == "function") listeners = [listeners];
// Now we're going to handle it not being a non-array object.
// The onlt other thing it could be is an array. So in that case
// we'll turn it into an object
if (Array.isArray(listeners)) listeners = { listeners: listeners
// Now we are going to ensure the event object properly
};var event = listeners;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = METHOD_TYPES[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var attr = _step3.value;
// If the attribute is a function, make it an array
if (typeof event[attr] == "function") event[attr] = [event[attr]];
// If the attribute is not an array, then I don't care about it
if (!Array.isArray(event[attr])) event[attr] = [];
// Ensure every element inside the array is a function
event[attr] = event[attr].filter(function (method) {
return typeof method == "function";
});
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return event;
}
function bindListeners(event_manager, context, listeners) {
var bound_listeners = { manager: event_manager, events: {} };
var events = bound_listeners.events;
for (var event_type in listeners) {
var event = ensureBoundObject(listeners[event_type]);
events[event_type] = {};
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = METHOD_TYPES[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var method_type = _step4.value;
events[event_type][method_type] = event[method_type].map(function (method) {
return method.bind(context);
});
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator5 = events[event_type].conditions[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var method = _step5.value;
event_manager.addEventCondition(event_type, method);
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
try {
for (var _iterator6 = events[event_type].listeners[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var _method = _step6.value;
event_manager.addEventListener(event_type, _method);
}
} catch (err) {
_didIteratorError6 = true;
_iteratorError6 = err;
} finally {
try {
if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator6.return();
}
} finally {
if (_didIteratorError6) {
throw _iteratorError6;
}
}
}
}
return bound_listeners;
}
function removeBoundListeners(bound_listeners) {
var event_manager = bound_listeners.manager;
var events = bound_listeners.events;
for (var event_type in events) {
var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false;
var _iteratorError7 = undefined;
try {
for (var _iterator7 = events[event_type].conditions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var event_condition = _step7.value;
event_manager.removeEventCondition(event_type, event_condition);
}
} catch (err) {
_didIteratorError7 = true;
_iteratorError7 = err;
} finally {
try {
if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator7.return();
}
} finally {
if (_didIteratorError7) {
throw _iteratorError7;
}
}
}
events[event_type].conditions = 0;
var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false;
var _iteratorError8 = undefined;
try {
for (var _iterator8 = events[event_type].listeners[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var event_listener = _step8.value;
event_manager.removeEventListener(event_type, event_listener);
}
} catch (err) {
_didIteratorError8 = true;
_iteratorError8 = err;
} finally {
try {
if (!_iteratorNormalCompletion8 && _iterator8.return) {
_iterator8.return();
}
} finally {
if (_didIteratorError8) {
throw _iteratorError8;
}
}
}
events[event_type].listeners = 0;
delete events[event_type];
}
delete bound_listeners.events;
delete bound_listeners.manager;
}
function useEventManager() {
return (0, _react.useContext)(EventContext);
}
function useEventListeners(listeners) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
context = _ref.context;
var events = (0, _react.useContext)(EventContext);
(0, _react.useEffect)(function () {
var boundListeners = bindListeners(events, context, listeners);
return function () {
return removeBoundListeners(boundListeners);
};
});
}