UNPKG

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