tdesign-react
Version:
TDesign Component for React
346 lines (338 loc) • 13 kB
JavaScript
/**
* tdesign v1.16.6
* (c) 2026 tdesign
* @license MIT
*/
;
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