@rc-component/portal 1.0.0-0 → 1.0.0-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/Portal.d.ts +5 -1
- package/es/Portal.js +44 -8
- package/es/index.d.ts +2 -0
- package/es/index.js +2 -0
- package/es/mock.d.ts +2 -0
- package/es/mock.js +8 -0
- package/es/useDom.d.ts +1 -1
- package/es/useDom.js +8 -2
- package/lib/Portal.d.ts +5 -1
- package/lib/Portal.js +45 -6
- package/lib/index.d.ts +2 -0
- package/lib/index.js +8 -0
- package/lib/mock.d.ts +2 -0
- package/lib/mock.js +17 -0
- package/lib/useDom.d.ts +1 -1
- package/lib/useDom.js +8 -2
- package/package.json +1 -1
package/es/Portal.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
export declare type ContainerType = Element | DocumentFragment;
|
|
3
|
+
export declare type GetContainer = string | ContainerType | (() => ContainerType) | false;
|
|
2
4
|
export interface PortalProps {
|
|
3
5
|
/** Customize container element. Default will create a div in document.body when `open` */
|
|
4
|
-
getContainer?:
|
|
6
|
+
getContainer?: GetContainer;
|
|
5
7
|
children?: React.ReactNode;
|
|
6
8
|
/** Show the portal children */
|
|
7
9
|
open?: boolean;
|
|
8
10
|
/** Lock screen scroll when open */
|
|
9
11
|
autoLock?: boolean;
|
|
12
|
+
/** @private debug name. Do not use in prod */
|
|
13
|
+
debug?: string;
|
|
10
14
|
}
|
|
11
15
|
export default function Portal(props: PortalProps): JSX.Element;
|
package/es/Portal.js
CHANGED
|
@@ -1,15 +1,37 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { createPortal } from 'react-dom';
|
|
4
|
+
import canUseDom from "rc-util/es/Dom/canUseDom";
|
|
4
5
|
import OrderContext from "./Context";
|
|
5
6
|
import useDom from "./useDom";
|
|
6
|
-
import useScrollLocker from "./useScrollLocker";
|
|
7
|
-
|
|
7
|
+
import useScrollLocker from "./useScrollLocker";
|
|
8
|
+
import { inlineMock } from "./mock";
|
|
9
|
+
|
|
10
|
+
var getPortalContainer = function getPortalContainer(getContainer) {
|
|
11
|
+
if (getContainer === false) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!canUseDom() || !getContainer) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (typeof getContainer === 'string') {
|
|
20
|
+
return document.querySelector(getContainer);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (typeof getContainer === 'function') {
|
|
24
|
+
return getContainer();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return getContainer;
|
|
28
|
+
};
|
|
8
29
|
|
|
9
30
|
export default function Portal(props) {
|
|
10
31
|
var open = props.open,
|
|
11
32
|
autoLock = props.autoLock,
|
|
12
33
|
getContainer = props.getContainer,
|
|
34
|
+
debug = props.debug,
|
|
13
35
|
children = props.children;
|
|
14
36
|
|
|
15
37
|
var _React$useState = React.useState(open),
|
|
@@ -23,21 +45,35 @@ export default function Portal(props) {
|
|
|
23
45
|
setMergedRender(open);
|
|
24
46
|
}, [open]); // ======================== Container ========================
|
|
25
47
|
|
|
26
|
-
var
|
|
48
|
+
var _React$useState3 = React.useState(function () {
|
|
49
|
+
return getPortalContainer(getContainer);
|
|
50
|
+
}),
|
|
51
|
+
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
|
52
|
+
innerContainer = _React$useState4[0],
|
|
53
|
+
setInnerContainer = _React$useState4[1];
|
|
54
|
+
|
|
55
|
+
React.useEffect(function () {
|
|
56
|
+
var customizeContainer = getPortalContainer(getContainer); // Tell component that we check this in effect which is safe to be `null`
|
|
27
57
|
|
|
28
|
-
|
|
58
|
+
setInnerContainer(customizeContainer !== null && customizeContainer !== void 0 ? customizeContainer : null);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
var _useDom = useDom(mergedRender && !innerContainer, debug),
|
|
29
62
|
_useDom2 = _slicedToArray(_useDom, 2),
|
|
30
63
|
defaultContainer = _useDom2[0],
|
|
31
64
|
queueCreate = _useDom2[1];
|
|
32
65
|
|
|
33
|
-
var mergedContainer =
|
|
66
|
+
var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer; // ========================= Render ==========================
|
|
34
67
|
// Do not render when nothing need render
|
|
68
|
+
// When innerContainer is `undefined`, it may not ready since user use ref in the same render
|
|
35
69
|
|
|
36
|
-
if (!mergedRender) {
|
|
70
|
+
if (!mergedRender || !canUseDom() || innerContainer === undefined) {
|
|
37
71
|
return null;
|
|
38
|
-
}
|
|
72
|
+
} // Render inline
|
|
73
|
+
|
|
39
74
|
|
|
75
|
+
var renderInline = mergedContainer === false || inlineMock();
|
|
40
76
|
return /*#__PURE__*/React.createElement(OrderContext.Provider, {
|
|
41
77
|
value: queueCreate
|
|
42
|
-
}, /*#__PURE__*/createPortal(children, mergedContainer));
|
|
78
|
+
}, renderInline ? children : /*#__PURE__*/createPortal(children, mergedContainer));
|
|
43
79
|
}
|
package/es/index.d.ts
CHANGED
package/es/index.js
CHANGED
package/es/mock.d.ts
ADDED
package/es/mock.js
ADDED
package/es/useDom.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import type { QueueCreate } from './Context';
|
|
|
3
3
|
* Will add `div` to document. Nest call will keep order
|
|
4
4
|
* @param render Render DOM in document
|
|
5
5
|
*/
|
|
6
|
-
export default function useDom(render: boolean): [HTMLDivElement, QueueCreate];
|
|
6
|
+
export default function useDom(render: boolean, debug?: string): [HTMLDivElement, QueueCreate];
|
package/es/useDom.js
CHANGED
|
@@ -9,9 +9,14 @@ var EMPTY_LIST = [];
|
|
|
9
9
|
* @param render Render DOM in document
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
export default function useDom(render) {
|
|
12
|
+
export default function useDom(render, debug) {
|
|
13
13
|
var _React$useState = React.useState(function () {
|
|
14
14
|
var defaultEle = document.createElement('div');
|
|
15
|
+
|
|
16
|
+
if (process.env.NODE_ENV !== 'production' && debug) {
|
|
17
|
+
defaultEle.setAttribute('data-debug', debug);
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
return defaultEle;
|
|
16
21
|
}),
|
|
17
22
|
_React$useState2 = _slicedToArray(_React$useState, 1),
|
|
@@ -27,7 +32,8 @@ export default function useDom(render) {
|
|
|
27
32
|
|
|
28
33
|
var mergedQueueCreate = queueCreate || function (appendFn) {
|
|
29
34
|
setQueue(function (origin) {
|
|
30
|
-
|
|
35
|
+
var newQueue = [appendFn].concat(_toConsumableArray(origin));
|
|
36
|
+
return newQueue;
|
|
31
37
|
});
|
|
32
38
|
}; // =========================== DOM ===========================
|
|
33
39
|
|
package/lib/Portal.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
export declare type ContainerType = Element | DocumentFragment;
|
|
3
|
+
export declare type GetContainer = string | ContainerType | (() => ContainerType) | false;
|
|
2
4
|
export interface PortalProps {
|
|
3
5
|
/** Customize container element. Default will create a div in document.body when `open` */
|
|
4
|
-
getContainer?:
|
|
6
|
+
getContainer?: GetContainer;
|
|
5
7
|
children?: React.ReactNode;
|
|
6
8
|
/** Show the portal children */
|
|
7
9
|
open?: boolean;
|
|
8
10
|
/** Lock screen scroll when open */
|
|
9
11
|
autoLock?: boolean;
|
|
12
|
+
/** @private debug name. Do not use in prod */
|
|
13
|
+
debug?: string;
|
|
10
14
|
}
|
|
11
15
|
export default function Portal(props: PortalProps): JSX.Element;
|
package/lib/Portal.js
CHANGED
|
@@ -15,16 +15,41 @@ var React = _interopRequireWildcard(require("react"));
|
|
|
15
15
|
|
|
16
16
|
var _reactDom = require("react-dom");
|
|
17
17
|
|
|
18
|
+
var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom"));
|
|
19
|
+
|
|
18
20
|
var _Context = _interopRequireDefault(require("./Context"));
|
|
19
21
|
|
|
20
22
|
var _useDom3 = _interopRequireDefault(require("./useDom"));
|
|
21
23
|
|
|
22
24
|
var _useScrollLocker = _interopRequireDefault(require("./useScrollLocker"));
|
|
23
25
|
|
|
26
|
+
var _mock = require("./mock");
|
|
27
|
+
|
|
28
|
+
var getPortalContainer = function getPortalContainer(getContainer) {
|
|
29
|
+
if (getContainer === false) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!(0, _canUseDom.default)() || !getContainer) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (typeof getContainer === 'string') {
|
|
38
|
+
return document.querySelector(getContainer);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (typeof getContainer === 'function') {
|
|
42
|
+
return getContainer();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return getContainer;
|
|
46
|
+
};
|
|
47
|
+
|
|
24
48
|
function Portal(props) {
|
|
25
49
|
var open = props.open,
|
|
26
50
|
autoLock = props.autoLock,
|
|
27
51
|
getContainer = props.getContainer,
|
|
52
|
+
debug = props.debug,
|
|
28
53
|
children = props.children;
|
|
29
54
|
|
|
30
55
|
var _React$useState = React.useState(open),
|
|
@@ -38,21 +63,35 @@ function Portal(props) {
|
|
|
38
63
|
setMergedRender(open);
|
|
39
64
|
}, [open]); // ======================== Container ========================
|
|
40
65
|
|
|
41
|
-
var
|
|
66
|
+
var _React$useState3 = React.useState(function () {
|
|
67
|
+
return getPortalContainer(getContainer);
|
|
68
|
+
}),
|
|
69
|
+
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
|
|
70
|
+
innerContainer = _React$useState4[0],
|
|
71
|
+
setInnerContainer = _React$useState4[1];
|
|
72
|
+
|
|
73
|
+
React.useEffect(function () {
|
|
74
|
+
var customizeContainer = getPortalContainer(getContainer); // Tell component that we check this in effect which is safe to be `null`
|
|
75
|
+
|
|
76
|
+
setInnerContainer(customizeContainer !== null && customizeContainer !== void 0 ? customizeContainer : null);
|
|
77
|
+
});
|
|
42
78
|
|
|
43
|
-
var _useDom = (0, _useDom3.default)(mergedRender && !
|
|
79
|
+
var _useDom = (0, _useDom3.default)(mergedRender && !innerContainer, debug),
|
|
44
80
|
_useDom2 = (0, _slicedToArray2.default)(_useDom, 2),
|
|
45
81
|
defaultContainer = _useDom2[0],
|
|
46
82
|
queueCreate = _useDom2[1];
|
|
47
83
|
|
|
48
|
-
var mergedContainer =
|
|
84
|
+
var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer; // ========================= Render ==========================
|
|
49
85
|
// Do not render when nothing need render
|
|
86
|
+
// When innerContainer is `undefined`, it may not ready since user use ref in the same render
|
|
50
87
|
|
|
51
|
-
if (!mergedRender) {
|
|
88
|
+
if (!mergedRender || !(0, _canUseDom.default)() || innerContainer === undefined) {
|
|
52
89
|
return null;
|
|
53
|
-
}
|
|
90
|
+
} // Render inline
|
|
91
|
+
|
|
54
92
|
|
|
93
|
+
var renderInline = mergedContainer === false || (0, _mock.inlineMock)();
|
|
55
94
|
return /*#__PURE__*/React.createElement(_Context.default.Provider, {
|
|
56
95
|
value: queueCreate
|
|
57
|
-
}, /*#__PURE__*/(0, _reactDom.createPortal)(children, mergedContainer));
|
|
96
|
+
}, renderInline ? children : /*#__PURE__*/(0, _reactDom.createPortal)(children, mergedContainer));
|
|
58
97
|
}
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -6,8 +6,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.default = void 0;
|
|
9
|
+
Object.defineProperty(exports, "inlineMock", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function get() {
|
|
12
|
+
return _mock.inlineMock;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
9
15
|
|
|
10
16
|
var _Portal = _interopRequireDefault(require("./Portal"));
|
|
11
17
|
|
|
18
|
+
var _mock = require("./mock");
|
|
19
|
+
|
|
12
20
|
var _default = _Portal.default;
|
|
13
21
|
exports.default = _default;
|
package/lib/mock.d.ts
ADDED
package/lib/mock.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.inline = void 0;
|
|
7
|
+
exports.inlineMock = inlineMock;
|
|
8
|
+
var inline = false;
|
|
9
|
+
exports.inline = inline;
|
|
10
|
+
|
|
11
|
+
function inlineMock(nextInline) {
|
|
12
|
+
if (typeof nextInline === 'boolean') {
|
|
13
|
+
exports.inline = inline = nextInline;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return inline;
|
|
17
|
+
}
|
package/lib/useDom.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import type { QueueCreate } from './Context';
|
|
|
3
3
|
* Will add `div` to document. Nest call will keep order
|
|
4
4
|
* @param render Render DOM in document
|
|
5
5
|
*/
|
|
6
|
-
export default function useDom(render: boolean): [HTMLDivElement, QueueCreate];
|
|
6
|
+
export default function useDom(render: boolean, debug?: string): [HTMLDivElement, QueueCreate];
|
package/lib/useDom.js
CHANGED
|
@@ -25,9 +25,14 @@ var EMPTY_LIST = [];
|
|
|
25
25
|
* @param render Render DOM in document
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
-
function useDom(render) {
|
|
28
|
+
function useDom(render, debug) {
|
|
29
29
|
var _React$useState = React.useState(function () {
|
|
30
30
|
var defaultEle = document.createElement('div');
|
|
31
|
+
|
|
32
|
+
if (process.env.NODE_ENV !== 'production' && debug) {
|
|
33
|
+
defaultEle.setAttribute('data-debug', debug);
|
|
34
|
+
}
|
|
35
|
+
|
|
31
36
|
return defaultEle;
|
|
32
37
|
}),
|
|
33
38
|
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 1),
|
|
@@ -43,7 +48,8 @@ function useDom(render) {
|
|
|
43
48
|
|
|
44
49
|
var mergedQueueCreate = queueCreate || function (appendFn) {
|
|
45
50
|
setQueue(function (origin) {
|
|
46
|
-
|
|
51
|
+
var newQueue = [appendFn].concat((0, _toConsumableArray2.default)(origin));
|
|
52
|
+
return newQueue;
|
|
47
53
|
});
|
|
48
54
|
}; // =========================== DOM ===========================
|
|
49
55
|
|