use-dismiss
Version:
React hook that triggers a callback when user clicks outside the element.
93 lines (74 loc) • 2.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.useEscape = exports.useClickAway = void 0;
var _react = require("react");
var MOUSEDOWN = "mousedown";
var KEYDOWN = "keydown";
var isEscaped = function isEscaped(event) {
return event.key === "Escape";
};
var containsRef = function containsRef(ref, event) {
return ref.current.contains(event.target);
};
var useClickAway = function useClickAway(callback) {
var ref = (0, _react.useRef)(null);
(0, _react.useEffect)(function () {
var listener = function listener(event) {
if (!ref || !ref.current || containsRef(ref, event)) {
return;
}
callback(event);
};
document.addEventListener(MOUSEDOWN, listener);
return function () {
document.removeEventListener(MOUSEDOWN, listener);
};
}, [callback]);
return ref;
};
exports.useClickAway = useClickAway;
var useEscape = function useEscape(callback) {
var ref = (0, _react.useRef)(null);
(0, _react.useEffect)(function () {
var listener = function listener(event) {
if (!ref || !ref.current || !isEscaped(event)) {
return;
}
callback(event);
};
document.addEventListener(KEYDOWN, listener);
return function () {
document.removeEventListener(KEYDOWN, listener);
};
}, [callback]);
return ref;
};
exports.useEscape = useEscape;
var useDismiss = function useDismiss(callback) {
var ref = (0, _react.useRef)(null);
(0, _react.useEffect)(function () {
var mousedownListener = function mousedownListener(event) {
if (!ref || !ref.current || containsRef(ref, event)) {
return;
}
callback(event);
};
var keydownListener = function keydownListener(event) {
if (!ref || !ref.current || !isEscaped(event)) {
return;
}
callback(event);
};
document.addEventListener(KEYDOWN, keydownListener);
document.addEventListener(MOUSEDOWN, mousedownListener);
return function () {
document.removeEventListener(MOUSEDOWN, mousedownListener);
document.removeEventListener(KEYDOWN, keydownListener);
};
}, [callback]);
return ref;
};
var _default = useDismiss;
exports["default"] = _default;