react-dom-event
Version:
React context for subscribing to all DOM user interaction events
85 lines (81 loc) • 3.57 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.reactDomEvent = {}, global.React));
})(this, (function (exports, react) { 'use strict';
function _array_like_to_array(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
return arr2;
}
function _array_without_holes(arr) {
if (Array.isArray(arr)) return _array_like_to_array(arr);
}
function _iterable_to_array(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _non_iterable_spread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _to_consumable_array(arr) {
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
}
function _unsupported_iterable_to_array(o, minLen) {
if (!o) return;
if (typeof o === "string") return _array_like_to_array(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(n);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
}
var EventContext = react.createContext(undefined);
function EventProvider(param) {
var _param_events = param.events, events = _param_events === void 0 ? [
'click'
] : _param_events, children = param.children;
var state = react.useState([]);
var handlers = state[0]; // reduce transpiled array helpers
function onEvent(event) {
handlers.forEach(function(handler) {
return handler(event);
});
}
function subscribe(handler) {
handlers.push(handler);
return function() {
return handlers.splice(handlers.indexOf(handler), 1);
};
}
react.useEffect(function() {
events.forEach(function(event) {
return window.document.addEventListener(event, onEvent, true);
});
return function() {
return events.forEach(function(event) {
return window.document.removeEventListener(event, onEvent, true);
});
};
});
return react.createElement(EventContext.Provider, {
value: {
subscribe: subscribe
}
}, children);
}
function useEvent(handler, dependencies) {
var context = react.useContext(EventContext);
if (!context) {
throw new Error('react-dom-event: subscribe not found on context. You might be missing the EventProvider or have multiple instances of react-dom-event');
}
react.useEffect(function() {
return context.subscribe(handler);
}, [
context.subscribe,
handler
].concat(_to_consumable_array(dependencies)));
}
exports.EventContext = EventContext;
exports.EventProvider = EventProvider;
exports.useEvent = useEvent;
}));
//# sourceMappingURL=react-dom-event.cjs.map