UNPKG

tdesign-react

Version:
326 lines (318 loc) 11.7 kB
/** * tdesign v1.16.2 * (c) 2025 tdesign * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var slicedToArray = require('../../_chunks/dep-5cb0d66d.js'); var React = require('react'); var _util_style = require('../../_chunks/dep-e0735b5f.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-737b8bd8.js'); require('../../_chunks/dep-b304bc94.js'); require('../../_chunks/dep-4ce0670e.js'); require('../../_chunks/dep-b325182b.js'); require('../../_chunks/dep-bdafd287.js'); require('../../_chunks/dep-3448f35f.js'); require('react-is'); require('../../_util/isFragment.js'); require('../../config-provider/ConfigContext.js'); require('../../_chunks/dep-0fe55884.js'); require('../../_chunks/dep-17dea53e.js'); require('../../_chunks/dep-a0cbf081.js'); require('dayjs'); require('../../_chunks/dep-481a1ecc.js'); require('../../_chunks/dep-474eb386.js'); require('../../_chunks/dep-3b256bc0.js'); require('../../_chunks/dep-b6a3ada9.js'); require('../../_chunks/dep-967e785f.js'); require('../../_chunks/dep-5c8525ea.js'); require('../../_chunks/dep-735cd5b9.js'); require('../../_chunks/dep-4d300b8f.js'); require('../../_chunks/dep-3332ad6f.js'); require('../../_chunks/dep-98783318.js'); require('../../_chunks/dep-fc884a8e.js'); require('../../_chunks/dep-008b21d4.js'); require('../../_chunks/dep-9193eded.js'); require('../../_chunks/dep-afe817f9.js'); require('../../_chunks/dep-0b70c7ec.js'); require('../../_chunks/dep-a1e3e59b.js'); require('../../_chunks/dep-24ab8f68.js'); require('../../_chunks/dep-753b7d52.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"; 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 = 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 (triggerElementIsString) { return _util_style.canUseDocument ? document.querySelector(triggerElement) : null; } var element = _util_ref.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; }); }; 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 (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" }); } }); } }; _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, "focus", handleFocus); _util_listener.on(element, "blur", 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, "focus", handleFocus); _util_listener.off(element, "blur", 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 { 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