@figliolia/react-hooks
Version:
A small collection of simple React Hooks you're probably rewriting on a regular basis
41 lines (40 loc) • 1.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useClickOutside = void 0;
const react_1 = require("react");
const useClickOutside = ({ callback, open = true, refCallback = false, }) => {
const node = (0, react_1.useRef)(null);
const nodeRef = (0, react_1.useRef)(null);
const ref = (0, react_1.useCallback)((node) => {
nodeRef.current = node;
}, []);
const getNode = (0, react_1.useCallback)(() => node.current || nodeRef.current, []);
const onClickOutside = (0, react_1.useCallback)((e) => {
const node = getNode();
if (!node) {
return;
}
if (!node.contains(e.target)) {
callback(e);
}
}, [callback, getNode]);
(0, react_1.useEffect)(() => {
if (open) {
document.addEventListener("click", onClickOutside, { passive: true });
document.addEventListener("focusin", onClickOutside, { passive: true });
}
else {
document.removeEventListener("click", onClickOutside);
document.removeEventListener("focusin", onClickOutside);
}
return () => {
document.removeEventListener("click", onClickOutside);
document.removeEventListener("focusin", onClickOutside);
};
}, [onClickOutside, open]);
if (refCallback) {
return ref;
}
return node;
};
exports.useClickOutside = useClickOutside;