react-outer-click
Version:
React component and hook which detect mouse clicks outside of itself.
99 lines (83 loc) • 3.97 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var _extends = require('@babel/runtime/helpers/extends');
var _objectWithoutPropertiesLoose = require('@babel/runtime/helpers/objectWithoutPropertiesLoose');
var PropTypes = require('prop-types');
var react = require('react');
var invariant = require('tiny-invariant');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
var _objectWithoutPropertiesLoose__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutPropertiesLoose);
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
var invariant__default = /*#__PURE__*/_interopDefaultLegacy(invariant);
var isObject = function isObject(value) {
return typeof value === 'object' && value !== null;
};
var updateRef = function updateRef(ref, value) {
if (typeof ref === 'function') {
ref(value);
}
if (isObject(ref)) {
ref.current = value;
}
};
var castArray = function castArray(value) {
return Array.isArray(value) ? value : [value];
};
var useOuterClick = function useOuterClick(refs, handler) {
!(Array.isArray(refs) || isObject(refs)) ? process.env.NODE_ENV !== "production" ? invariant__default["default"](false, 'Expected `refs` to be an array or object') : invariant__default["default"](false) : void 0;
if (Array.isArray(refs)) {
!(refs.length > 0) ? process.env.NODE_ENV !== "production" ? invariant__default["default"](false, 'Expected `refs` to to not be empty') : invariant__default["default"](false) : void 0;
refs.forEach(function (ref, i) {
!isObject(ref) ? process.env.NODE_ENV !== "production" ? invariant__default["default"](false, "Expected `refs[" + i + "]` to be an object") : invariant__default["default"](false) : void 0;
});
}
!(typeof handler === 'function' || handler == null) ? process.env.NODE_ENV !== "production" ? invariant__default["default"](false, 'Expected `handler` to be a function') : invariant__default["default"](false) : void 0;
var eventListenerRef = react.useRef();
react.useEffect(function () {
eventListenerRef.current = function (event) {
if (castArray(refs).every(function (ref) {
return !ref.current || ref.current !== event.target && !ref.current.contains(event.target);
})) {
handler == null ? void 0 : handler(event);
}
};
}, [handler, refs]);
react.useEffect(function () {
var eventListener = function eventListener(event) {
eventListenerRef.current(event);
};
document.addEventListener('mousedown', eventListener, true);
document.addEventListener('touchstart', eventListener, true);
return function () {
document.removeEventListener('mousedown', eventListener, true);
document.removeEventListener('touchstart', eventListener, true);
};
}, []);
};
var _excluded = ["as", "children", "onOuterClick"];
var OuterClick = /*#__PURE__*/react.forwardRef(function (_ref, userRef) {
var _ref$as = _ref.as,
as = _ref$as === void 0 ? 'div' : _ref$as,
_ref$children = _ref.children,
children = _ref$children === void 0 ? null : _ref$children,
onOuterClick = _ref.onOuterClick,
props = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded);
var libRef = react.useRef(null);
useOuterClick(libRef, onOuterClick);
var ref = react.useCallback(function (value) {
libRef.current = value;
updateRef(userRef, value);
}, [userRef]);
return /*#__PURE__*/react.createElement(as, _extends__default["default"]({}, props, {
ref: ref
}), children);
});
OuterClick.propTypes = {
as: PropTypes__default["default"].elementType,
children: PropTypes__default["default"].node,
onOuterClick: PropTypes__default["default"].func
};
exports.OuterClick = OuterClick;
exports.useOuterClick = useOuterClick;
//# sourceMappingURL=index.cjs.js.map