UNPKG

tdesign-react

Version:
346 lines (338 loc) 13 kB
/** * tdesign v1.16.6 * (c) 2026 tdesign * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var slicedToArray = require('../../_chunks/dep-3281986a.js'); var React = require('react'); var _util_style = require('../../_chunks/dep-2bbded38.js'); var _util_listener = require('../../_util/listener.js'); var _util_ref = require('../../_util/ref.js'); var hooks_useConfig = require('../../hooks/useConfig.js'); require('../../_chunks/dep-54373955.js'); require('../../_chunks/dep-ef5bfcf1.js'); require('../../_chunks/dep-202d6c73.js'); require('../../_chunks/dep-615c149d.js'); require('../../_chunks/dep-90a93885.js'); require('../../_chunks/dep-a8d5081a.js'); require('../../_chunks/dep-0173c82c.js'); require('react-is'); require('../../_util/isFragment.js'); require('../../config-provider/ConfigContext.js'); require('../../_chunks/dep-1f6c39e3.js'); require('../../_chunks/dep-875a5344.js'); require('../../_chunks/dep-20f09a63.js'); require('dayjs'); require('../../_chunks/dep-e691746e.js'); require('../../_chunks/dep-9d3b1a05.js'); require('../../_chunks/dep-1f8c969d.js'); require('../../_chunks/dep-403f5edf.js'); require('../../_chunks/dep-d24b94bc.js'); require('../../_chunks/dep-6478e7e3.js'); require('../../_chunks/dep-c9025587.js'); require('../../_chunks/dep-8663a5c9.js'); require('../../_chunks/dep-50349518.js'); require('../../_chunks/dep-8c9795f9.js'); require('../../_chunks/dep-723e29d6.js'); require('../../_chunks/dep-0bd8b970.js'); require('../../_chunks/dep-73ef2133.js'); require('../../_chunks/dep-cae1e5aa.js'); require('../../_chunks/dep-0b97e212.js'); require('../../_chunks/dep-0652d2a6.js'); require('../../_chunks/dep-1a7ce20e.js'); require('../../_chunks/dep-116af952.js'); require('../../_chunks/dep-f6a777ad.js'); require('../../_chunks/dep-ff301423.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var ESC_KEY = "Escape"; var isEventFromDisabledElement = function isEventFromDisabledElement(e, container) { var _target$closest; var target = e.target; var disabledEl = target === null || target === void 0 || (_target$closest = target.closest) === null || _target$closest === void 0 ? void 0 : _target$closest.call(target, "[disabled]"); return !!(disabledEl && container.contains(disabledEl)); }; function useTrigger(_ref) { var triggerElement = _ref.triggerElement, content = _ref.content, disabled = _ref.disabled, trigger = _ref.trigger, visible = _ref.visible, onVisibleChange = _ref.onVisibleChange, delay = _ref.delay, popupElement = _ref.popupElement; var _useConfig = hooks_useConfig["default"](), classPrefix = _useConfig.classPrefix; var triggerElementIsString = typeof triggerElement === "string"; var triggerRef = React.useRef(null); var hasPopupMouseDown = React.useRef(false); var visibleTimer = React.useRef(null); var shouldToggle = React.useMemo(function () { if (disabled) return false; return content === 0 ? true : !!content; }, [disabled, content]); var _useMemo = React.useMemo(function () { if (Array.isArray(delay)) return delay; return [delay, delay]; }, [delay]), _useMemo2 = slicedToArray._slicedToArray(_useMemo, 2), _useMemo2$ = _useMemo2[0], appearDelay = _useMemo2$ === void 0 ? 0 : _useMemo2$, _useMemo2$2 = _useMemo2[1], exitDelay = _useMemo2$2 === void 0 ? 0 : _useMemo2$2; function callFuncWithDelay(_ref2) { var delay2 = _ref2.delay, callback = _ref2.callback; clearTimeout(visibleTimer.current); if (delay2) { visibleTimer.current = setTimeout(callback, delay2); } else { callback(); } } var getTriggerElement = React.useCallback(function () { if (!_util_style.canUseDocument) return null; if (triggerElementIsString) return document.querySelector(triggerElement); var element = _util_ref.getRefDom(triggerRef); return element instanceof Element ? element : null; }, [triggerElementIsString, triggerElement]); var handleMouseEnter = function handleMouseEnter(e) { if (trigger === "hover") { callFuncWithDelay({ delay: appearDelay, callback: function callback() { return onVisibleChange(true, { e: e, trigger: "trigger-element-hover" }); } }); } }; var handleMouseLeave = function handleMouseLeave(e) { var _relatedTarget$closes, _popupElement$isEqual; if (trigger !== "hover" || hasPopupMouseDown.current) return; var relatedTarget = e.relatedTarget; var closestPopup = relatedTarget === null || relatedTarget === void 0 || (_relatedTarget$closes = relatedTarget.closest) === null || _relatedTarget$closes === void 0 ? void 0 : _relatedTarget$closes.call(relatedTarget, ".".concat(classPrefix, "-popup")); var isMovingToCurrentPopup = popupElement ? popupElement === null || popupElement === void 0 || (_popupElement$isEqual = popupElement.isEqualNode) === null || _popupElement$isEqual === void 0 ? void 0 : _popupElement$isEqual.call(popupElement, closestPopup) : closestPopup; if (isMovingToCurrentPopup) return; callFuncWithDelay({ delay: exitDelay, callback: function callback() { return onVisibleChange(false, { e: e, trigger: "trigger-element-hover" }); } }); }; var handlePopupMouseDown = function handlePopupMouseDown() { hasPopupMouseDown.current = true; }; var handlePopupMouseUp = function handlePopupMouseUp() { requestAnimationFrame(function () { hasPopupMouseDown.current = false; }); }; React.useEffect(function () { return clearTimeout(visibleTimer.current); }, []); React.useEffect(function () { if (!shouldToggle) return; var element = getTriggerElement(); if (!element) return; var handleClick = function handleClick(e) { if (isEventFromDisabledElement(e, element)) return; if (trigger === "click") { callFuncWithDelay({ delay: visible ? appearDelay : exitDelay, callback: function callback() { return onVisibleChange(!visible, { e: e, trigger: "trigger-element-click" }); } }); } }; var handleMouseDown = function handleMouseDown(e) { if (isEventFromDisabledElement(e, element)) return; if (trigger === "mousedown") { callFuncWithDelay({ delay: visible ? appearDelay : exitDelay, callback: function callback() { return onVisibleChange(!visible, { e: e, trigger: "trigger-element-mousedown" }); } }); } }; var handleFocus = function handleFocus(e) { if (isEventFromDisabledElement(e, element)) return; if (trigger === "focus") { callFuncWithDelay({ delay: appearDelay, callback: function callback() { return onVisibleChange(true, { e: e, trigger: "trigger-element-focus" }); } }); } }; var handleBlur = function handleBlur(e) { if (isEventFromDisabledElement(e, element)) return; var relatedTarget = e.relatedTarget; if (relatedTarget && element.contains(relatedTarget)) return; if (trigger === "focus") { callFuncWithDelay({ delay: exitDelay, callback: function callback() { return onVisibleChange(false, { e: e, trigger: "trigger-element-blur" }); } }); } }; var handleContextMenu = function handleContextMenu(e) { if (isEventFromDisabledElement(e, element)) return; if (trigger === "context-menu") { e.preventDefault(); callFuncWithDelay({ delay: appearDelay, callback: function callback() { return onVisibleChange(true, { e: e, trigger: "context-menu" }); } }); } }; var handleTouchStart = function handleTouchStart(e) { if (isEventFromDisabledElement(e, element)) return; if (trigger === "hover" || trigger === "mousedown") { callFuncWithDelay({ delay: appearDelay, callback: function callback() { return onVisibleChange(true, { e: e, trigger: "trigger-element-hover" }); } }); } }; var handleKeyDown = function handleKeyDown(e) { if (isEventFromDisabledElement(e, element)) return; if ((e === null || e === void 0 ? void 0 : e.key) === ESC_KEY) { callFuncWithDelay({ delay: exitDelay, callback: function callback() { return onVisibleChange(false, { e: e, trigger: "keydown-esc" }); } }); } }; _util_listener.on(element, "click", handleClick); _util_listener.on(element, "mousedown", handleMouseDown); _util_listener.on(element, "mouseenter", handleMouseEnter); _util_listener.on(element, "mouseleave", handleMouseLeave); _util_listener.on(element, "focusin", handleFocus); _util_listener.on(element, "focusout", handleBlur); _util_listener.on(element, "contextmenu", handleContextMenu); _util_listener.on(element, "touchstart", handleTouchStart, { passive: true }); _util_listener.on(element, "keydown", handleKeyDown); return function () { _util_listener.off(element, "click", handleClick); _util_listener.off(element, "mousedown", handleMouseDown); _util_listener.off(element, "mouseenter", handleMouseEnter); _util_listener.off(element, "mouseleave", handleMouseLeave); _util_listener.off(element, "focusin", handleFocus); _util_listener.off(element, "focusout", handleBlur); _util_listener.off(element, "contextmenu", handleContextMenu); _util_listener.off(element, "touchstart", handleTouchStart, { passive: true }); _util_listener.off(element, "keydown", handleKeyDown); }; }, [classPrefix, shouldToggle, appearDelay, exitDelay, trigger, visible, onVisibleChange]); React.useEffect(function () { if (!shouldToggle) return; var handleDocumentClick = function handleDocumentClick(e) { var _getTriggerElement, _getTriggerElement$co; if (!visible || (_getTriggerElement = getTriggerElement()) !== null && _getTriggerElement !== void 0 && (_getTriggerElement$co = _getTriggerElement.contains) !== null && _getTriggerElement$co !== void 0 && _getTriggerElement$co.call(_getTriggerElement, e.target) || hasPopupMouseDown.current) return; onVisibleChange(false, { e: e, trigger: "document" }); }; _util_listener.on(document, "mousedown", handleDocumentClick); _util_listener.on(document, "touchend", handleDocumentClick, { passive: true }); return function () { requestAnimationFrame(function () { _util_listener.off(document, "mousedown", handleDocumentClick); _util_listener.off(document, "touchend", handleDocumentClick, { passive: true }); }); }; }, [classPrefix, shouldToggle, visible, onVisibleChange, getTriggerElement]); React.useEffect(function () { var element = getTriggerElement(); if (visible) { element === null || element === void 0 || element.classList.add("".concat(classPrefix, "-popup-open")); } else { element === null || element === void 0 || element.classList.remove("".concat(classPrefix, "-popup-open")); } return function () { element === null || element === void 0 || element.classList.remove("".concat(classPrefix, "-popup-open")); }; }, [visible, classPrefix, getTriggerElement]); function getTriggerNode(children) { if (triggerElementIsString) return; if (_util_ref.supportNodeRef(children)) { var childRef = _util_ref.getNodeRef(children); var ref = _util_ref.composeRefs(triggerRef, childRef); return /*#__PURE__*/React__default["default"].cloneElement(children, { ref: ref }); } return /* @__PURE__ */React__default["default"].createElement("span", { ref: triggerRef, className: "".concat(classPrefix, "-trigger") }, children); } function getPopupProps() { return { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onMouseDown: handlePopupMouseDown, onMouseUp: handlePopupMouseUp, onTouchStart: handlePopupMouseDown, onTouchEnd: handlePopupMouseUp }; } return { triggerElementIsString: triggerElementIsString, getTriggerElement: getTriggerElement, getTriggerNode: getTriggerNode, getPopupProps: getPopupProps }; } exports["default"] = useTrigger; //# sourceMappingURL=useTrigger.js.map