/**
 * amis-ui v6.14.0-beta.1
 * Copyright 2018-2025 fex
 */

import { useCallback, useEffect } from 'react';

// 存储所有点击事件监听器的集合
var listeners = new Set();
// 添加点击事件监听器
var addClickListener = function (callback) {
    return listeners.add(callback);
};
// 移除点击事件监听器
var removeClickListener = function (callback) {
    return listeners.delete(callback);
};
// 处理点击事件，调用所有监听器
function handleEvent(e) {
    listeners.forEach(function (listener) { return listener(e); });
}
// 默认的事件类型
var defaultEvents = ['mousedown', 'touchstart'];
/**
 * 自定义 Hook：useClickAway
 * 当点击事件发生在指定元素外部时，触发回调函数
 *
 * @param ref - 目标元素的引用
 * @param onClickAway - 点击外部时的回调函数
 * @param doc - Document 对象，默认为当前文档
 * @param events - 监听的事件类型，默认为 ['mousedown', 'touchstart']
 */
var useClickAway = function (ref, onClickAway, doc, events) {
    if (doc === void 0) { doc = document; }
    if (events === void 0) { events = defaultEvents; }
    // 事件处理函数
    var handler = useCallback(function (e) {
        var el = ref.current;
        el && !el.contains(e.target) && onClickAway(e);
    }, [ref]);
    useEffect(function () {
        // 添加事件监听器
        if (!listeners.has(handler)) {
            addClickListener(handler);
        }
        events.forEach(function (event) { return doc.addEventListener(event, handleEvent); });
        // 清理函数，移除事件监听器
        return function () {
            removeClickListener(handler);
            events.forEach(function (event) { return doc.removeEventListener(event, handleEvent); });
        };
    }, [events, ref, doc]);
};

export { useClickAway as default };
