UNPKG

4.68 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = void 0;
9var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10var React = _interopRequireWildcard(require("react"));
11var _reactDom = require("react-dom");
12var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom"));
13var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
14var _ref2 = require("rc-util/lib/ref");
15var _Context = _interopRequireDefault(require("./Context"));
16var _useDom3 = _interopRequireDefault(require("./useDom"));
17var _useScrollLocker = _interopRequireDefault(require("./useScrollLocker"));
18var _mock = require("./mock");
19var getPortalContainer = function getPortalContainer(getContainer) {
20 if (getContainer === false) {
21 return false;
22 }
23 if (!(0, _canUseDom.default)() || !getContainer) {
24 return null;
25 }
26 if (typeof getContainer === 'string') {
27 return document.querySelector(getContainer);
28 }
29 if (typeof getContainer === 'function') {
30 return getContainer();
31 }
32 return getContainer;
33};
34var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) {
35 var open = props.open,
36 autoLock = props.autoLock,
37 getContainer = props.getContainer,
38 debug = props.debug,
39 _props$autoDestroy = props.autoDestroy,
40 autoDestroy = _props$autoDestroy === void 0 ? true : _props$autoDestroy,
41 children = props.children;
42 var _React$useState = React.useState(open),
43 _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
44 shouldRender = _React$useState2[0],
45 setShouldRender = _React$useState2[1];
46 var mergedRender = shouldRender || open;
47
48 // ========================= Warning =========================
49 if (process.env.NODE_ENV !== 'production') {
50 (0, _warning.default)((0, _canUseDom.default)() || !open, "Portal only work in client side. Please call 'useEffect' to show Portal instead default render in SSR.");
51 }
52
53 // ====================== Should Render ======================
54 React.useEffect(function () {
55 if (autoDestroy || open) {
56 setShouldRender(open);
57 }
58 }, [open, autoDestroy]);
59
60 // ======================== Container ========================
61 var _React$useState3 = React.useState(function () {
62 return getPortalContainer(getContainer);
63 }),
64 _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
65 innerContainer = _React$useState4[0],
66 setInnerContainer = _React$useState4[1];
67 React.useEffect(function () {
68 var customizeContainer = getPortalContainer(getContainer);
69
70 // Tell component that we check this in effect which is safe to be `null`
71 setInnerContainer(customizeContainer !== null && customizeContainer !== void 0 ? customizeContainer : null);
72 });
73 var _useDom = (0, _useDom3.default)(mergedRender && !innerContainer, debug),
74 _useDom2 = (0, _slicedToArray2.default)(_useDom, 2),
75 defaultContainer = _useDom2[0],
76 queueCreate = _useDom2[1];
77 var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer;
78
79 // ========================= Locker ==========================
80 (0, _useScrollLocker.default)(autoLock && open && (0, _canUseDom.default)() && (mergedContainer === defaultContainer || mergedContainer === document.body));
81
82 // =========================== Ref ===========================
83 var childRef = null;
84 if (children && (0, _ref2.supportRef)(children) && ref) {
85 var _ref = children;
86 childRef = _ref.ref;
87 }
88 var mergedRef = (0, _ref2.useComposeRef)(childRef, ref);
89
90 // ========================= Render ==========================
91 // Do not render when nothing need render
92 // When innerContainer is `undefined`, it may not ready since user use ref in the same render
93 if (!mergedRender || !(0, _canUseDom.default)() || innerContainer === undefined) {
94 return null;
95 }
96
97 // Render inline
98 var renderInline = mergedContainer === false || (0, _mock.inlineMock)();
99 var reffedChildren = children;
100 if (ref) {
101 reffedChildren = /*#__PURE__*/React.cloneElement(children, {
102 ref: mergedRef
103 });
104 }
105 return /*#__PURE__*/React.createElement(_Context.default.Provider, {
106 value: queueCreate
107 }, renderInline ? reffedChildren : /*#__PURE__*/(0, _reactDom.createPortal)(reffedChildren, mergedContainer));
108});
109if (process.env.NODE_ENV !== 'production') {
110 Portal.displayName = 'Portal';
111}
112var _default = Portal;
113exports.default = _default;
\No newline at end of file