"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _react = require("react");
// 监听点击组件外部的事件
function useClickOutside(handler, ref, hasKeyboardProps = false) {
  (0, _react.useEffect)(() => {
    function handleClick(event) {
      if (!ref.current || ref.current.contains(event.target)) {
        return;
      }
      handler(event);
    }
    // 向前兼容逻辑：
    // 1. 对于有键盘属性的 VirtualInput，在捕获阶段监听：
    //      这是为了确保在事件被阻止传播之前触发。比如输入框中的单个数字 click 事件会 stopPropagation, 但这里依然能捕获到
    // 2. 对于无键盘属性的 VirtualInput 组件，在冒泡阶段监听：
    //      这种情况通常是 VirtualInput + NumberKeyboard 为兄弟关系，在以前版本中点击 NumberKeyboard **不会**触发 VirtualInput 的 blur 事件
    //      原先原理：通过 NumberKeyboard 内部 onMouseDown 时 preventDefault 阻止的 VirtualInput 内原生的 blur 事件
    //      新的原理：NumberKeyboard 的 Popup 默认会 stopPropagation click, 这里在冒泡阶段监听不到，不会调用 VirtualInput 的 onBlur 回调（非原生事件）。
    document.addEventListener('click', handleClick, hasKeyboardProps ? true : false);
    return () => {
      document.removeEventListener('click', handleClick, hasKeyboardProps ? true : false);
    };
  }, [handler, ref]);
}
var _default = exports.default = useClickOutside;