UNPKG

tdesign-react

Version:
297 lines (293 loc) 10.1 kB
/** * tdesign v1.16.2 * (c) 2025 tdesign * @license MIT */ import { _ as _slicedToArray } from '../../_chunks/dep-10d5731f.js'; import React, { useRef, useMemo, useCallback, useEffect } from 'react'; import { c as canUseDocument } from '../../_chunks/dep-ca8d3fa0.js'; import { on, off } from '../../_util/listener.js'; import { getRefDom, supportNodeRef, getNodeRef, composeRefs } from '../../_util/ref.js'; import useConfig from '../../hooks/useConfig.js'; import '../../_chunks/dep-74a10cfb.js'; import 'lodash-es'; import '../../_chunks/dep-8abcbcbc.js'; import 'react-is'; import '../../_util/isFragment.js'; import '../../config-provider/ConfigContext.js'; import '../../_chunks/dep-d67deb2c.js'; import '../../_chunks/dep-6b235a32.js'; import '../../_chunks/dep-b9afa32b.js'; import 'dayjs'; var ESC_KEY = "Escape"; 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; var _useConfig = useConfig(), classPrefix = _useConfig.classPrefix; var triggerElementIsString = typeof triggerElement === "string"; var triggerRef = useRef(null); var hasPopupMouseDown = useRef(false); var visibleTimer = useRef(null); var shouldToggle = useMemo(function () { if (disabled) return false; return content === 0 ? true : !!content; }, [disabled, content]); var _useMemo = useMemo(function () { if (Array.isArray(delay)) return delay; return [delay, delay]; }, [delay]), _useMemo2 = _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 = useCallback(function () { if (triggerElementIsString) { return canUseDocument ? document.querySelector(triggerElement) : null; } var element = getRefDom(triggerRef); return typeof HTMLElement !== "undefined" && element instanceof HTMLElement ? element : null; }, [triggerElementIsString, triggerElement]); var handleMouseLeave = function handleMouseLeave(e) { var _relatedTarget$closes; if (trigger !== "hover" || hasPopupMouseDown.current) return; var relatedTarget = e.relatedTarget; var isMovingToContent = relatedTarget === null || relatedTarget === void 0 || (_relatedTarget$closes = relatedTarget.closest) === null || _relatedTarget$closes === void 0 ? void 0 : _relatedTarget$closes.call(relatedTarget, ".".concat(classPrefix, "-popup")); if (isMovingToContent) 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; }); }; useEffect(function () { return clearTimeout(visibleTimer.current); }, []); useEffect(function () { if (!shouldToggle) return; var element = getTriggerElement(); if (!element) return; var handleClick = function handleClick(e) { 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 (trigger === "mousedown") { callFuncWithDelay({ delay: visible ? appearDelay : exitDelay, callback: function callback() { return onVisibleChange(!visible, { e: e, trigger: "trigger-element-mousedown" }); } }); } }; var handleMouseEnter = function handleMouseEnter(e) { if (trigger === "hover") { callFuncWithDelay({ delay: appearDelay, callback: function callback() { return onVisibleChange(true, { e: e, trigger: "trigger-element-hover" }); } }); } }; var handleFocus = function handleFocus(e) { if (trigger === "focus") { callFuncWithDelay({ delay: appearDelay, callback: function callback() { return onVisibleChange(true, { e: e, trigger: "trigger-element-focus" }); } }); } }; var handleBlur = function handleBlur(e) { if (trigger === "focus") { callFuncWithDelay({ delay: exitDelay, callback: function callback() { return onVisibleChange(false, { e: e, trigger: "trigger-element-blur" }); } }); } }; var handleContextMenu = function handleContextMenu(e) { 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 (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 ((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" }); } }); } }; on(element, "click", handleClick); on(element, "mousedown", handleMouseDown); on(element, "mouseenter", handleMouseEnter); on(element, "mouseleave", handleMouseLeave); on(element, "focus", handleFocus); on(element, "blur", handleBlur); on(element, "contextmenu", handleContextMenu); on(element, "touchstart", handleTouchStart, { passive: true }); on(element, "keydown", handleKeyDown); return function () { off(element, "click", handleClick); off(element, "mousedown", handleMouseDown); off(element, "mouseenter", handleMouseEnter); off(element, "mouseleave", handleMouseLeave); off(element, "focus", handleFocus); off(element, "blur", handleBlur); off(element, "contextmenu", handleContextMenu); off(element, "touchstart", handleTouchStart, { passive: true }); off(element, "keydown", handleKeyDown); }; }, [classPrefix, shouldToggle, appearDelay, exitDelay, trigger, visible, onVisibleChange]); 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" }); }; on(document, "mousedown", handleDocumentClick); on(document, "touchend", handleDocumentClick, { passive: true }); return function () { requestAnimationFrame(function () { off(document, "mousedown", handleDocumentClick); off(document, "touchend", handleDocumentClick, { passive: true }); }); }; }, [classPrefix, shouldToggle, visible, onVisibleChange, getTriggerElement]); 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 (supportNodeRef(children)) { var childRef = getNodeRef(children); var ref = composeRefs(triggerRef, childRef); return /*#__PURE__*/React.cloneElement(children, { ref: ref }); } return /* @__PURE__ */React.createElement("span", { ref: triggerRef, className: "".concat(classPrefix, "-trigger") }, children); } function getPopupProps() { return { onMouseLeave: handleMouseLeave, onMouseDown: handlePopupMouseDown, onMouseUp: handlePopupMouseUp, onTouchStart: handlePopupMouseDown, onTouchEnd: handlePopupMouseUp }; } return { triggerElementIsString: triggerElementIsString, getTriggerElement: getTriggerElement, getTriggerNode: getTriggerNode, getPopupProps: getPopupProps }; } export { useTrigger as default }; //# sourceMappingURL=useTrigger.js.map