@rc-component/portal 1.1.1 → 2.0.0
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/README.md +1 -1
- package/es/Context.d.ts +1 -1
- package/es/Context.js +1 -1
- package/es/Portal.d.ts +2 -2
- package/es/Portal.js +29 -41
- package/es/mock.js +1 -1
- package/es/useDom.js +23 -33
- package/es/useScrollLocker.js +19 -18
- package/lib/Context.d.ts +1 -1
- package/lib/Context.js +4 -4
- package/lib/Portal.d.ts +2 -2
- package/lib/Portal.js +35 -47
- package/lib/index.js +3 -4
- package/lib/mock.js +1 -2
- package/lib/useDom.js +26 -35
- package/lib/useScrollLocker.js +22 -20
- package/package.json +24 -22
package/README.md
CHANGED
package/es/Context.d.ts
CHANGED
package/es/Context.js
CHANGED
package/es/Portal.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type ContainerType = Element | DocumentFragment;
|
|
3
|
+
export type GetContainer = string | ContainerType | (() => ContainerType) | false;
|
|
4
4
|
export interface PortalProps {
|
|
5
5
|
/** Customize container element. Default will create a div in document.body when `open` */
|
|
6
6
|
getContainer?: GetContainer;
|
package/es/Portal.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import canUseDom from "@rc-component/util/es/Dom/canUseDom";
|
|
2
|
+
import { getNodeRef, supportRef, useComposeRef } from "@rc-component/util/es/ref";
|
|
3
|
+
import warning from "@rc-component/util/es/warning";
|
|
2
4
|
import * as React from 'react';
|
|
3
5
|
import { createPortal } from 'react-dom';
|
|
4
|
-
import canUseDom from "rc-util/es/Dom/canUseDom";
|
|
5
|
-
import warning from "rc-util/es/warning";
|
|
6
|
-
import { supportRef, useComposeRef } from "rc-util/es/ref";
|
|
7
6
|
import OrderContext from "./Context";
|
|
7
|
+
import { inlineMock } from "./mock";
|
|
8
8
|
import useDom from "./useDom";
|
|
9
9
|
import useScrollLocker from "./useScrollLocker";
|
|
10
|
-
|
|
11
|
-
var getPortalContainer = function getPortalContainer(getContainer) {
|
|
10
|
+
const getPortalContainer = getContainer => {
|
|
12
11
|
if (getContainer === false) {
|
|
13
12
|
return false;
|
|
14
13
|
}
|
|
@@ -23,61 +22,50 @@ var getPortalContainer = function getPortalContainer(getContainer) {
|
|
|
23
22
|
}
|
|
24
23
|
return getContainer;
|
|
25
24
|
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
autoDestroy =
|
|
33
|
-
children
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
setShouldRender = _React$useState2[1];
|
|
38
|
-
var mergedRender = shouldRender || open;
|
|
25
|
+
const Portal = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
26
|
+
const {
|
|
27
|
+
open,
|
|
28
|
+
autoLock,
|
|
29
|
+
getContainer,
|
|
30
|
+
debug,
|
|
31
|
+
autoDestroy = true,
|
|
32
|
+
children
|
|
33
|
+
} = props;
|
|
34
|
+
const [shouldRender, setShouldRender] = React.useState(open);
|
|
35
|
+
const mergedRender = shouldRender || open;
|
|
39
36
|
|
|
40
37
|
// ========================= Warning =========================
|
|
41
38
|
if (process.env.NODE_ENV !== 'production') {
|
|
42
|
-
warning(canUseDom() || !open,
|
|
39
|
+
warning(canUseDom() || !open, `Portal only work in client side. Please call 'useEffect' to show Portal instead default render in SSR.`);
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
// ====================== Should Render ======================
|
|
46
|
-
React.useEffect(
|
|
43
|
+
React.useEffect(() => {
|
|
47
44
|
if (autoDestroy || open) {
|
|
48
45
|
setShouldRender(open);
|
|
49
46
|
}
|
|
50
47
|
}, [open, autoDestroy]);
|
|
51
48
|
|
|
52
49
|
// ======================== Container ========================
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
|
57
|
-
innerContainer = _React$useState4[0],
|
|
58
|
-
setInnerContainer = _React$useState4[1];
|
|
59
|
-
React.useEffect(function () {
|
|
60
|
-
var customizeContainer = getPortalContainer(getContainer);
|
|
50
|
+
const [innerContainer, setInnerContainer] = React.useState(() => getPortalContainer(getContainer));
|
|
51
|
+
React.useEffect(() => {
|
|
52
|
+
const customizeContainer = getPortalContainer(getContainer);
|
|
61
53
|
|
|
62
54
|
// Tell component that we check this in effect which is safe to be `null`
|
|
63
|
-
setInnerContainer(customizeContainer
|
|
55
|
+
setInnerContainer(customizeContainer ?? null);
|
|
64
56
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
defaultContainer = _useDom2[0],
|
|
68
|
-
queueCreate = _useDom2[1];
|
|
69
|
-
var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer;
|
|
57
|
+
const [defaultContainer, queueCreate] = useDom(mergedRender && !innerContainer, debug);
|
|
58
|
+
const mergedContainer = innerContainer ?? defaultContainer;
|
|
70
59
|
|
|
71
60
|
// ========================= Locker ==========================
|
|
72
61
|
useScrollLocker(autoLock && open && canUseDom() && (mergedContainer === defaultContainer || mergedContainer === document.body));
|
|
73
62
|
|
|
74
63
|
// =========================== Ref ===========================
|
|
75
|
-
|
|
64
|
+
let childRef = null;
|
|
76
65
|
if (children && supportRef(children) && ref) {
|
|
77
|
-
|
|
78
|
-
childRef = _ref.ref;
|
|
66
|
+
childRef = getNodeRef(children);
|
|
79
67
|
}
|
|
80
|
-
|
|
68
|
+
const mergedRef = useComposeRef(childRef, ref);
|
|
81
69
|
|
|
82
70
|
// ========================= Render ==========================
|
|
83
71
|
// Do not render when nothing need render
|
|
@@ -87,8 +75,8 @@ var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
87
75
|
}
|
|
88
76
|
|
|
89
77
|
// Render inline
|
|
90
|
-
|
|
91
|
-
|
|
78
|
+
const renderInline = mergedContainer === false || inlineMock();
|
|
79
|
+
let reffedChildren = children;
|
|
92
80
|
if (ref) {
|
|
93
81
|
reffedChildren = /*#__PURE__*/React.cloneElement(children, {
|
|
94
82
|
ref: mergedRef
|
package/es/mock.js
CHANGED
package/es/useDom.js
CHANGED
|
@@ -1,39 +1,32 @@
|
|
|
1
|
-
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
-
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
1
|
import * as React from 'react';
|
|
4
|
-
import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
|
|
5
|
-
import canUseDom from "rc-util/es/Dom/canUseDom";
|
|
2
|
+
import useLayoutEffect from "@rc-component/util/es/hooks/useLayoutEffect";
|
|
3
|
+
import canUseDom from "@rc-component/util/es/Dom/canUseDom";
|
|
6
4
|
import OrderContext from "./Context";
|
|
7
|
-
|
|
5
|
+
const EMPTY_LIST = [];
|
|
8
6
|
|
|
9
7
|
/**
|
|
10
8
|
* Will add `div` to document. Nest call will keep order
|
|
11
9
|
* @param render Render DOM in document
|
|
12
10
|
*/
|
|
13
11
|
export default function useDom(render, debug) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
_React$useState2 = _slicedToArray(_React$useState, 1),
|
|
25
|
-
ele = _React$useState2[0];
|
|
12
|
+
const [ele] = React.useState(() => {
|
|
13
|
+
if (!canUseDom()) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const defaultEle = document.createElement('div');
|
|
17
|
+
if (process.env.NODE_ENV !== 'production' && debug) {
|
|
18
|
+
defaultEle.setAttribute('data-debug', debug);
|
|
19
|
+
}
|
|
20
|
+
return defaultEle;
|
|
21
|
+
});
|
|
26
22
|
|
|
27
23
|
// ========================== Order ==========================
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
var mergedQueueCreate = queueCreate || (appendedRef.current ? undefined : function (appendFn) {
|
|
35
|
-
setQueue(function (origin) {
|
|
36
|
-
var newQueue = [appendFn].concat(_toConsumableArray(origin));
|
|
24
|
+
const appendedRef = React.useRef(false);
|
|
25
|
+
const queueCreate = React.useContext(OrderContext);
|
|
26
|
+
const [queue, setQueue] = React.useState(EMPTY_LIST);
|
|
27
|
+
const mergedQueueCreate = queueCreate || (appendedRef.current ? undefined : appendFn => {
|
|
28
|
+
setQueue(origin => {
|
|
29
|
+
const newQueue = [appendFn, ...origin];
|
|
37
30
|
return newQueue;
|
|
38
31
|
});
|
|
39
32
|
});
|
|
@@ -46,11 +39,10 @@ export default function useDom(render, debug) {
|
|
|
46
39
|
appendedRef.current = true;
|
|
47
40
|
}
|
|
48
41
|
function cleanup() {
|
|
49
|
-
|
|
50
|
-
(_ele$parentElement = ele.parentElement) === null || _ele$parentElement === void 0 ? void 0 : _ele$parentElement.removeChild(ele);
|
|
42
|
+
ele.parentElement?.removeChild(ele);
|
|
51
43
|
appendedRef.current = false;
|
|
52
44
|
}
|
|
53
|
-
useLayoutEffect(
|
|
45
|
+
useLayoutEffect(() => {
|
|
54
46
|
if (render) {
|
|
55
47
|
if (queueCreate) {
|
|
56
48
|
queueCreate(append);
|
|
@@ -62,11 +54,9 @@ export default function useDom(render, debug) {
|
|
|
62
54
|
}
|
|
63
55
|
return cleanup;
|
|
64
56
|
}, [render]);
|
|
65
|
-
useLayoutEffect(
|
|
57
|
+
useLayoutEffect(() => {
|
|
66
58
|
if (queue.length) {
|
|
67
|
-
queue.forEach(
|
|
68
|
-
return appendFn();
|
|
69
|
-
});
|
|
59
|
+
queue.forEach(appendFn => appendFn());
|
|
70
60
|
setQueue(EMPTY_LIST);
|
|
71
61
|
}
|
|
72
62
|
}, [queue]);
|
package/es/useScrollLocker.js
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
1
|
import * as React from 'react';
|
|
3
|
-
import { updateCSS, removeCSS } from "rc-util/es/Dom/dynamicCSS";
|
|
4
|
-
import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
|
|
5
|
-
import
|
|
2
|
+
import { updateCSS, removeCSS } from "@rc-component/util/es/Dom/dynamicCSS";
|
|
3
|
+
import useLayoutEffect from "@rc-component/util/es/hooks/useLayoutEffect";
|
|
4
|
+
import { getTargetScrollBarSize } from "@rc-component/util/es/getScrollBarSize";
|
|
6
5
|
import { isBodyOverflowing } from "./util";
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const UNIQUE_ID = `rc-util-locker-${Date.now()}`;
|
|
7
|
+
let uuid = 0;
|
|
9
8
|
export default function useScrollLocker(lock) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
id = _React$useState2[0];
|
|
17
|
-
useLayoutEffect(function () {
|
|
9
|
+
const mergedLock = !!lock;
|
|
10
|
+
const [id] = React.useState(() => {
|
|
11
|
+
uuid += 1;
|
|
12
|
+
return `${UNIQUE_ID}_${uuid}`;
|
|
13
|
+
});
|
|
14
|
+
useLayoutEffect(() => {
|
|
18
15
|
if (mergedLock) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
updateCSS(
|
|
16
|
+
const scrollbarSize = getTargetScrollBarSize(document.body).width;
|
|
17
|
+
const isOverflow = isBodyOverflowing();
|
|
18
|
+
updateCSS(`
|
|
19
|
+
html body {
|
|
20
|
+
overflow-y: hidden;
|
|
21
|
+
${isOverflow ? `width: calc(100% - ${scrollbarSize}px);` : ''}
|
|
22
|
+
}`, id);
|
|
22
23
|
} else {
|
|
23
24
|
removeCSS(id);
|
|
24
25
|
}
|
|
25
|
-
return
|
|
26
|
+
return () => {
|
|
26
27
|
removeCSS(id);
|
|
27
28
|
};
|
|
28
29
|
}, [mergedLock, id]);
|
package/lib/Context.d.ts
CHANGED
package/lib/Context.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.default = void 0;
|
|
8
7
|
var React = _interopRequireWildcard(require("react"));
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
|
|
8
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
9
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
10
|
+
const OrderContext = /*#__PURE__*/React.createContext(null);
|
|
11
|
+
var _default = exports.default = OrderContext;
|
package/lib/Portal.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type ContainerType = Element | DocumentFragment;
|
|
3
|
+
export type GetContainer = string | ContainerType | (() => ContainerType) | false;
|
|
4
4
|
export interface PortalProps {
|
|
5
5
|
/** Customize container element. Default will create a div in document.body when `open` */
|
|
6
6
|
getContainer?: GetContainer;
|
package/lib/Portal.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.default = void 0;
|
|
9
|
-
var
|
|
7
|
+
var _canUseDom = _interopRequireDefault(require("@rc-component/util/lib/Dom/canUseDom"));
|
|
8
|
+
var _ref = require("@rc-component/util/lib/ref");
|
|
9
|
+
var _warning = _interopRequireDefault(require("@rc-component/util/lib/warning"));
|
|
10
10
|
var React = _interopRequireWildcard(require("react"));
|
|
11
11
|
var _reactDom = require("react-dom");
|
|
12
|
-
var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom"));
|
|
13
|
-
var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
|
|
14
|
-
var _ref2 = require("rc-util/lib/ref");
|
|
15
12
|
var _Context = _interopRequireDefault(require("./Context"));
|
|
16
|
-
var _useDom3 = _interopRequireDefault(require("./useDom"));
|
|
17
|
-
var _useScrollLocker = _interopRequireDefault(require("./useScrollLocker"));
|
|
18
13
|
var _mock = require("./mock");
|
|
19
|
-
var
|
|
14
|
+
var _useDom = _interopRequireDefault(require("./useDom"));
|
|
15
|
+
var _useScrollLocker = _interopRequireDefault(require("./useScrollLocker"));
|
|
16
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
17
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
const getPortalContainer = getContainer => {
|
|
20
20
|
if (getContainer === false) {
|
|
21
21
|
return false;
|
|
22
22
|
}
|
|
@@ -31,61 +31,50 @@ var getPortalContainer = function getPortalContainer(getContainer) {
|
|
|
31
31
|
}
|
|
32
32
|
return getContainer;
|
|
33
33
|
};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
autoDestroy =
|
|
41
|
-
children
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
setShouldRender = _React$useState2[1];
|
|
46
|
-
var mergedRender = shouldRender || open;
|
|
34
|
+
const Portal = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
35
|
+
const {
|
|
36
|
+
open,
|
|
37
|
+
autoLock,
|
|
38
|
+
getContainer,
|
|
39
|
+
debug,
|
|
40
|
+
autoDestroy = true,
|
|
41
|
+
children
|
|
42
|
+
} = props;
|
|
43
|
+
const [shouldRender, setShouldRender] = React.useState(open);
|
|
44
|
+
const mergedRender = shouldRender || open;
|
|
47
45
|
|
|
48
46
|
// ========================= Warning =========================
|
|
49
47
|
if (process.env.NODE_ENV !== 'production') {
|
|
50
|
-
(0, _warning.default)((0, _canUseDom.default)() || !open,
|
|
48
|
+
(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
49
|
}
|
|
52
50
|
|
|
53
51
|
// ====================== Should Render ======================
|
|
54
|
-
React.useEffect(
|
|
52
|
+
React.useEffect(() => {
|
|
55
53
|
if (autoDestroy || open) {
|
|
56
54
|
setShouldRender(open);
|
|
57
55
|
}
|
|
58
56
|
}, [open, autoDestroy]);
|
|
59
57
|
|
|
60
58
|
// ======================== Container ========================
|
|
61
|
-
|
|
62
|
-
|
|
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);
|
|
59
|
+
const [innerContainer, setInnerContainer] = React.useState(() => getPortalContainer(getContainer));
|
|
60
|
+
React.useEffect(() => {
|
|
61
|
+
const customizeContainer = getPortalContainer(getContainer);
|
|
69
62
|
|
|
70
63
|
// Tell component that we check this in effect which is safe to be `null`
|
|
71
|
-
setInnerContainer(customizeContainer
|
|
64
|
+
setInnerContainer(customizeContainer ?? null);
|
|
72
65
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
defaultContainer = _useDom2[0],
|
|
76
|
-
queueCreate = _useDom2[1];
|
|
77
|
-
var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer;
|
|
66
|
+
const [defaultContainer, queueCreate] = (0, _useDom.default)(mergedRender && !innerContainer, debug);
|
|
67
|
+
const mergedContainer = innerContainer ?? defaultContainer;
|
|
78
68
|
|
|
79
69
|
// ========================= Locker ==========================
|
|
80
70
|
(0, _useScrollLocker.default)(autoLock && open && (0, _canUseDom.default)() && (mergedContainer === defaultContainer || mergedContainer === document.body));
|
|
81
71
|
|
|
82
72
|
// =========================== Ref ===========================
|
|
83
|
-
|
|
84
|
-
if (children && (0,
|
|
85
|
-
|
|
86
|
-
childRef = _ref.ref;
|
|
73
|
+
let childRef = null;
|
|
74
|
+
if (children && (0, _ref.supportRef)(children) && ref) {
|
|
75
|
+
childRef = (0, _ref.getNodeRef)(children);
|
|
87
76
|
}
|
|
88
|
-
|
|
77
|
+
const mergedRef = (0, _ref.useComposeRef)(childRef, ref);
|
|
89
78
|
|
|
90
79
|
// ========================= Render ==========================
|
|
91
80
|
// Do not render when nothing need render
|
|
@@ -95,8 +84,8 @@ var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
95
84
|
}
|
|
96
85
|
|
|
97
86
|
// Render inline
|
|
98
|
-
|
|
99
|
-
|
|
87
|
+
const renderInline = mergedContainer === false || (0, _mock.inlineMock)();
|
|
88
|
+
let reffedChildren = children;
|
|
100
89
|
if (ref) {
|
|
101
90
|
reffedChildren = /*#__PURE__*/React.cloneElement(children, {
|
|
102
91
|
ref: mergedRef
|
|
@@ -109,5 +98,4 @@ var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
109
98
|
if (process.env.NODE_ENV !== 'production') {
|
|
110
99
|
Portal.displayName = 'Portal';
|
|
111
100
|
}
|
|
112
|
-
var _default = Portal;
|
|
113
|
-
exports.default = _default;
|
|
101
|
+
var _default = exports.default = Portal;
|
package/lib/index.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.default = void 0;
|
|
8
7
|
Object.defineProperty(exports, "inlineMock", {
|
|
9
8
|
enumerable: true,
|
|
10
|
-
get: function
|
|
9
|
+
get: function () {
|
|
11
10
|
return _mock.inlineMock;
|
|
12
11
|
}
|
|
13
12
|
});
|
|
14
13
|
var _Portal = _interopRequireDefault(require("./Portal"));
|
|
15
14
|
var _mock = require("./mock");
|
|
16
|
-
|
|
17
|
-
exports.default =
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
var _default = exports.default = _Portal.default;
|
package/lib/mock.js
CHANGED
|
@@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.inline = void 0;
|
|
7
7
|
exports.inlineMock = inlineMock;
|
|
8
|
-
|
|
9
|
-
exports.inline = inline;
|
|
8
|
+
let inline = exports.inline = false;
|
|
10
9
|
function inlineMock(nextInline) {
|
|
11
10
|
if (typeof nextInline === 'boolean') {
|
|
12
11
|
exports.inline = inline = nextInline;
|
package/lib/useDom.js
CHANGED
|
@@ -1,47 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.default = useDom;
|
|
9
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
7
|
var React = _interopRequireWildcard(require("react"));
|
|
12
|
-
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
|
|
13
|
-
var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom"));
|
|
8
|
+
var _useLayoutEffect = _interopRequireDefault(require("@rc-component/util/lib/hooks/useLayoutEffect"));
|
|
9
|
+
var _canUseDom = _interopRequireDefault(require("@rc-component/util/lib/Dom/canUseDom"));
|
|
14
10
|
var _Context = _interopRequireDefault(require("./Context"));
|
|
15
|
-
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
const EMPTY_LIST = [];
|
|
16
15
|
|
|
17
16
|
/**
|
|
18
17
|
* Will add `div` to document. Nest call will keep order
|
|
19
18
|
* @param render Render DOM in document
|
|
20
19
|
*/
|
|
21
20
|
function useDom(render, debug) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 1),
|
|
33
|
-
ele = _React$useState2[0];
|
|
21
|
+
const [ele] = React.useState(() => {
|
|
22
|
+
if (!(0, _canUseDom.default)()) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const defaultEle = document.createElement('div');
|
|
26
|
+
if (process.env.NODE_ENV !== 'production' && debug) {
|
|
27
|
+
defaultEle.setAttribute('data-debug', debug);
|
|
28
|
+
}
|
|
29
|
+
return defaultEle;
|
|
30
|
+
});
|
|
34
31
|
|
|
35
32
|
// ========================== Order ==========================
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
var mergedQueueCreate = queueCreate || (appendedRef.current ? undefined : function (appendFn) {
|
|
43
|
-
setQueue(function (origin) {
|
|
44
|
-
var newQueue = [appendFn].concat((0, _toConsumableArray2.default)(origin));
|
|
33
|
+
const appendedRef = React.useRef(false);
|
|
34
|
+
const queueCreate = React.useContext(_Context.default);
|
|
35
|
+
const [queue, setQueue] = React.useState(EMPTY_LIST);
|
|
36
|
+
const mergedQueueCreate = queueCreate || (appendedRef.current ? undefined : appendFn => {
|
|
37
|
+
setQueue(origin => {
|
|
38
|
+
const newQueue = [appendFn, ...origin];
|
|
45
39
|
return newQueue;
|
|
46
40
|
});
|
|
47
41
|
});
|
|
@@ -54,11 +48,10 @@ function useDom(render, debug) {
|
|
|
54
48
|
appendedRef.current = true;
|
|
55
49
|
}
|
|
56
50
|
function cleanup() {
|
|
57
|
-
|
|
58
|
-
(_ele$parentElement = ele.parentElement) === null || _ele$parentElement === void 0 ? void 0 : _ele$parentElement.removeChild(ele);
|
|
51
|
+
ele.parentElement?.removeChild(ele);
|
|
59
52
|
appendedRef.current = false;
|
|
60
53
|
}
|
|
61
|
-
(0, _useLayoutEffect.default)(
|
|
54
|
+
(0, _useLayoutEffect.default)(() => {
|
|
62
55
|
if (render) {
|
|
63
56
|
if (queueCreate) {
|
|
64
57
|
queueCreate(append);
|
|
@@ -70,11 +63,9 @@ function useDom(render, debug) {
|
|
|
70
63
|
}
|
|
71
64
|
return cleanup;
|
|
72
65
|
}, [render]);
|
|
73
|
-
(0, _useLayoutEffect.default)(
|
|
66
|
+
(0, _useLayoutEffect.default)(() => {
|
|
74
67
|
if (queue.length) {
|
|
75
|
-
queue.forEach(
|
|
76
|
-
return appendFn();
|
|
77
|
-
});
|
|
68
|
+
queue.forEach(appendFn => appendFn());
|
|
78
69
|
setQueue(EMPTY_LIST);
|
|
79
70
|
}
|
|
80
71
|
}, [queue]);
|
package/lib/useScrollLocker.js
CHANGED
|
@@ -1,36 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.default = useScrollLocker;
|
|
9
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
7
|
var React = _interopRequireWildcard(require("react"));
|
|
11
|
-
var _dynamicCSS = require("rc-util/lib/Dom/dynamicCSS");
|
|
12
|
-
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
|
|
13
|
-
var _getScrollBarSize =
|
|
8
|
+
var _dynamicCSS = require("@rc-component/util/lib/Dom/dynamicCSS");
|
|
9
|
+
var _useLayoutEffect = _interopRequireDefault(require("@rc-component/util/lib/hooks/useLayoutEffect"));
|
|
10
|
+
var _getScrollBarSize = require("@rc-component/util/lib/getScrollBarSize");
|
|
14
11
|
var _util = require("./util");
|
|
15
|
-
|
|
16
|
-
var
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
+
const UNIQUE_ID = `rc-util-locker-${Date.now()}`;
|
|
16
|
+
let uuid = 0;
|
|
17
17
|
function useScrollLocker(lock) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
id = _React$useState2[0];
|
|
25
|
-
(0, _useLayoutEffect.default)(function () {
|
|
18
|
+
const mergedLock = !!lock;
|
|
19
|
+
const [id] = React.useState(() => {
|
|
20
|
+
uuid += 1;
|
|
21
|
+
return `${UNIQUE_ID}_${uuid}`;
|
|
22
|
+
});
|
|
23
|
+
(0, _useLayoutEffect.default)(() => {
|
|
26
24
|
if (mergedLock) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
(0, _dynamicCSS.updateCSS)(
|
|
25
|
+
const scrollbarSize = (0, _getScrollBarSize.getTargetScrollBarSize)(document.body).width;
|
|
26
|
+
const isOverflow = (0, _util.isBodyOverflowing)();
|
|
27
|
+
(0, _dynamicCSS.updateCSS)(`
|
|
28
|
+
html body {
|
|
29
|
+
overflow-y: hidden;
|
|
30
|
+
${isOverflow ? `width: calc(100% - ${scrollbarSize}px);` : ''}
|
|
31
|
+
}`, id);
|
|
30
32
|
} else {
|
|
31
33
|
(0, _dynamicCSS.removeCSS)(id);
|
|
32
34
|
}
|
|
33
|
-
return
|
|
35
|
+
return () => {
|
|
34
36
|
(0, _dynamicCSS.removeCSS)(id);
|
|
35
37
|
};
|
|
36
38
|
}, [mergedLock, id]);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rc-component/portal",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "React Portal Component",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -33,44 +33,46 @@
|
|
|
33
33
|
"lint": "eslint src/ --ext .tsx,.ts",
|
|
34
34
|
"lint:tsc": "tsc -p tsconfig.json --noEmit",
|
|
35
35
|
"now-build": "npm run docs:build",
|
|
36
|
-
"
|
|
36
|
+
"prepare": "dumi setup",
|
|
37
|
+
"prepublishOnly": "npm run compile && rc-np",
|
|
37
38
|
"prettier": "prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"",
|
|
38
39
|
"start": "dumi dev",
|
|
39
|
-
"test": "npm run test:
|
|
40
|
-
"test:client": "
|
|
41
|
-
"test:coverage": "npm run test:client --coverage",
|
|
42
|
-
"test:server": "
|
|
40
|
+
"test": "npm run test:server && npm run test:coverage",
|
|
41
|
+
"test:client": "rc-test --testPathIgnorePatterns=ssr.test.tsx --testPathIgnorePatterns=ssr.test.tsx",
|
|
42
|
+
"test:coverage": "npm run test:client -- --coverage",
|
|
43
|
+
"test:server": "rc-test --env=node -- tests/ssr.test.tsx",
|
|
43
44
|
"watch": "father dev"
|
|
44
45
|
},
|
|
45
46
|
"dependencies": {
|
|
46
|
-
"@
|
|
47
|
-
"classnames": "^2.3.2"
|
|
48
|
-
"rc-util": "^5.24.4"
|
|
47
|
+
"@rc-component/util": "^1.2.1",
|
|
48
|
+
"classnames": "^2.3.2"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@rc-component/father-plugin": "^
|
|
51
|
+
"@rc-component/father-plugin": "^2.0.2",
|
|
52
|
+
"@rc-component/np": "^1.0.3",
|
|
52
53
|
"@testing-library/jest-dom": "^5.16.4",
|
|
53
54
|
"@testing-library/react": "^13.0.0",
|
|
54
55
|
"@types/jest": "^26.0.20",
|
|
56
|
+
"@types/node": "^20.9.0",
|
|
55
57
|
"@types/react": "^18.0.0",
|
|
56
58
|
"@types/react-dom": "^18.0.0",
|
|
57
|
-
"@umijs/fabric": "^
|
|
58
|
-
"dumi": "^
|
|
59
|
+
"@umijs/fabric": "^3.0.0",
|
|
60
|
+
"dumi": "^2.0.0",
|
|
59
61
|
"eslint": "^7.18.0",
|
|
60
|
-
"father": "^4.0.0
|
|
61
|
-
"gh-pages": "^
|
|
62
|
-
"
|
|
62
|
+
"father": "^4.0.0",
|
|
63
|
+
"gh-pages": "^6.1.1",
|
|
64
|
+
"glob": "^10.0.0",
|
|
63
65
|
"prettier": "^2.1.2",
|
|
64
|
-
"
|
|
65
|
-
"react
|
|
66
|
-
"
|
|
67
|
-
"
|
|
66
|
+
"rc-test": "^7.1.2",
|
|
67
|
+
"react": "^19.0.0",
|
|
68
|
+
"react-dom": "^19.0.0",
|
|
69
|
+
"typescript": "^5.0.0"
|
|
68
70
|
},
|
|
69
71
|
"peerDependencies": {
|
|
70
|
-
"react": ">=
|
|
71
|
-
"react-dom": ">=
|
|
72
|
+
"react": ">=18.0.0",
|
|
73
|
+
"react-dom": ">=18.0.0"
|
|
72
74
|
},
|
|
73
75
|
"engines": {
|
|
74
|
-
"node": ">=
|
|
76
|
+
"node": ">=12.x"
|
|
75
77
|
}
|
|
76
78
|
}
|