UNPKG

react-outer-click

Version:

React component and hook which detect mouse clicks outside of itself.

99 lines (83 loc) 3.97 kB
'use strict'; 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