tdesign-react
Version:
TDesign Component for React
81 lines (77 loc) • 2.9 kB
JavaScript
/**
* tdesign v1.16.2
* (c) 2025 tdesign
* @license MIT
*/
import { _ as _slicedToArray } from '../_chunks/dep-10d5731f.js';
import { _ as _typeof } from '../_chunks/dep-8abcbcbc.js';
import { forwardRef, useState, useMemo, useEffect, useImperativeHandle } from 'react';
import { createPortal } from 'react-dom';
import { c as canUseDocument } from '../_chunks/dep-ca8d3fa0.js';
import useConfig from '../hooks/useConfig.js';
import useIsomorphicLayoutEffect from '../hooks/useLayoutEffect.js';
import '../_chunks/dep-74a10cfb.js';
import 'lodash-es';
import '../config-provider/ConfigContext.js';
import '../_chunks/dep-d67deb2c.js';
import '../_chunks/dep-6b235a32.js';
import '../_chunks/dep-b9afa32b.js';
import 'dayjs';
function getAttach(attach, triggerNode) {
if (!canUseDocument) return null;
var el;
if (typeof attach === "string") {
el = document.querySelector(attach);
}
if (typeof attach === "function") {
el = attach(triggerNode);
}
if (_typeof(attach) === "object" && attach instanceof window.HTMLElement) {
el = attach;
}
if (el && el.nodeType === 1) return el;
return document.body;
}
var Portal = /*#__PURE__*/forwardRef(function (props, ref) {
var attach = props.attach,
children = props.children,
triggerNode = props.triggerNode,
style = props.style;
var _useConfig = useConfig(),
classPrefix = _useConfig.classPrefix;
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
mounted = _useState2[0],
setMounted = _useState2[1];
var container = useMemo(function () {
if (!canUseDocument) return null;
var el = document.createElement("div");
el.className = "".concat(classPrefix, "-portal-wrapper");
if (_typeof(style) === "object") {
Object.assign(el.style, style);
}
return el;
}, [classPrefix]);
useIsomorphicLayoutEffect(function () {
var _parentElement$append;
if (!mounted) return;
var parentElement = getAttach(attach, triggerNode);
parentElement === null || parentElement === void 0 || (_parentElement$append = parentElement.appendChild) === null || _parentElement$append === void 0 || _parentElement$append.call(parentElement, container);
return function () {
var _parentElement$remove;
parentElement === null || parentElement === void 0 || (_parentElement$remove = parentElement.removeChild) === null || _parentElement$remove === void 0 || _parentElement$remove.call(parentElement, container);
};
}, [container, attach, triggerNode, mounted]);
useEffect(function () {
if (!mounted) {
setMounted(true);
}
}, []);
useImperativeHandle(ref, function () {
return container;
});
return canUseDocument && mounted ? /*#__PURE__*/createPortal(children, container) : null;
});
Portal.displayName = "Portal";
export { Portal as default, getAttach };
//# sourceMappingURL=Portal.js.map