tdesign-react
Version:
TDesign Component for React
298 lines (294 loc) • 10.1 kB
JavaScript
/**
* 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 '../../locale/zh_CN.js';
import '../../_chunks/dep-751cada9.js';
import 'dayjs';
import '../../_chunks/dep-37c4dbb1.js';
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