@rc-component/portal 1.0.0-8 → 1.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/es/Portal.d.ts CHANGED
@@ -14,4 +14,5 @@ export interface PortalProps {
14
14
  /** @private debug name. Do not use in prod */
15
15
  debug?: string;
16
16
  }
17
- export default function Portal(props: PortalProps): JSX.Element;
17
+ declare const Portal: React.ForwardRefExoticComponent<PortalProps & React.RefAttributes<any>>;
18
+ export default Portal;
package/es/Portal.js CHANGED
@@ -1,7 +1,8 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import * as React from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
  import canUseDom from "rc-util/es/Dom/canUseDom";
5
+ import { supportRef, useComposeRef } from "rc-util/es/ref";
5
6
  import OrderContext from "./Context";
6
7
  import useDom from "./useDom";
7
8
  import useScrollLocker from "./useScrollLocker";
@@ -27,7 +28,7 @@ var getPortalContainer = function getPortalContainer(getContainer) {
27
28
  return getContainer;
28
29
  };
29
30
 
30
- export default function Portal(props) {
31
+ var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) {
31
32
  var open = props.open,
32
33
  autoLock = props.autoLock,
33
34
  getContainer = props.getContainer,
@@ -39,9 +40,8 @@ export default function Portal(props) {
39
40
  var _React$useState = React.useState(open),
40
41
  _React$useState2 = _slicedToArray(_React$useState, 2),
41
42
  mergedRender = _React$useState2[0],
42
- setMergedRender = _React$useState2[1];
43
+ setMergedRender = _React$useState2[1]; // ====================== Should Render ======================
43
44
 
44
- useScrollLocker(autoLock && open); // ====================== Should Render ======================
45
45
 
46
46
  React.useEffect(function () {
47
47
  if (autoDestroy || open) {
@@ -67,7 +67,18 @@ export default function Portal(props) {
67
67
  defaultContainer = _useDom2[0],
68
68
  queueCreate = _useDom2[1];
69
69
 
70
- var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer; // ========================= Render ==========================
70
+ var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer; // ========================= Locker ==========================
71
+
72
+ useScrollLocker(autoLock && open && canUseDom() && (mergedContainer === defaultContainer || mergedContainer === document.body)); // =========================== Ref ===========================
73
+
74
+ var childRef = null;
75
+
76
+ if (children && supportRef(children) && ref) {
77
+ var _ref = children;
78
+ childRef = _ref.ref;
79
+ }
80
+
81
+ var mergedRef = useComposeRef(childRef, ref); // ========================= Render ==========================
71
82
  // Do not render when nothing need render
72
83
  // When innerContainer is `undefined`, it may not ready since user use ref in the same render
73
84
 
@@ -77,7 +88,21 @@ export default function Portal(props) {
77
88
 
78
89
 
79
90
  var renderInline = mergedContainer === false || inlineMock();
91
+ var reffedChildren = children;
92
+
93
+ if (ref) {
94
+ reffedChildren = /*#__PURE__*/React.cloneElement(children, {
95
+ ref: mergedRef
96
+ });
97
+ }
98
+
80
99
  return /*#__PURE__*/React.createElement(OrderContext.Provider, {
81
100
  value: queueCreate
82
- }, renderInline ? children : /*#__PURE__*/createPortal(children, mergedContainer));
83
- }
101
+ }, renderInline ? reffedChildren : /*#__PURE__*/createPortal(reffedChildren, mergedContainer));
102
+ });
103
+
104
+ if (process.env.NODE_ENV !== 'production') {
105
+ Portal.displayName = 'Portal';
106
+ }
107
+
108
+ export default Portal;
package/es/useDom.js CHANGED
@@ -1,5 +1,5 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
3
  import * as React from 'react';
4
4
  import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
5
5
  import canUseDom from "rc-util/es/Dom/canUseDom";
@@ -1,4 +1,4 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import * as React from 'react';
3
3
  import { updateCSS, removeCSS } from "rc-util/es/Dom/dynamicCSS";
4
4
  import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
package/lib/Portal.d.ts CHANGED
@@ -14,4 +14,5 @@ export interface PortalProps {
14
14
  /** @private debug name. Do not use in prod */
15
15
  debug?: string;
16
16
  }
17
- export default function Portal(props: PortalProps): JSX.Element;
17
+ declare const Portal: React.ForwardRefExoticComponent<PortalProps & React.RefAttributes<any>>;
18
+ export default Portal;
package/lib/Portal.js CHANGED
@@ -7,7 +7,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.default = Portal;
10
+ exports.default = void 0;
11
11
 
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
 
@@ -17,6 +17,8 @@ var _reactDom = require("react-dom");
17
17
 
18
18
  var _canUseDom = _interopRequireDefault(require("rc-util/lib/Dom/canUseDom"));
19
19
 
20
+ var _ref2 = require("rc-util/lib/ref");
21
+
20
22
  var _Context = _interopRequireDefault(require("./Context"));
21
23
 
22
24
  var _useDom3 = _interopRequireDefault(require("./useDom"));
@@ -45,7 +47,7 @@ var getPortalContainer = function getPortalContainer(getContainer) {
45
47
  return getContainer;
46
48
  };
47
49
 
48
- function Portal(props) {
50
+ var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) {
49
51
  var open = props.open,
50
52
  autoLock = props.autoLock,
51
53
  getContainer = props.getContainer,
@@ -57,9 +59,8 @@ function Portal(props) {
57
59
  var _React$useState = React.useState(open),
58
60
  _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
59
61
  mergedRender = _React$useState2[0],
60
- setMergedRender = _React$useState2[1];
62
+ setMergedRender = _React$useState2[1]; // ====================== Should Render ======================
61
63
 
62
- (0, _useScrollLocker.default)(autoLock && open); // ====================== Should Render ======================
63
64
 
64
65
  React.useEffect(function () {
65
66
  if (autoDestroy || open) {
@@ -85,7 +86,18 @@ function Portal(props) {
85
86
  defaultContainer = _useDom2[0],
86
87
  queueCreate = _useDom2[1];
87
88
 
88
- var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer; // ========================= Render ==========================
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 ==========================
89
101
  // Do not render when nothing need render
90
102
  // When innerContainer is `undefined`, it may not ready since user use ref in the same render
91
103
 
@@ -95,7 +107,22 @@ function Portal(props) {
95
107
 
96
108
 
97
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
+
98
118
  return /*#__PURE__*/React.createElement(_Context.default.Provider, {
99
119
  value: queueCreate
100
- }, renderInline ? children : /*#__PURE__*/(0, _reactDom.createPortal)(children, mergedContainer));
101
- }
120
+ }, renderInline ? reffedChildren : /*#__PURE__*/(0, _reactDom.createPortal)(reffedChildren, mergedContainer));
121
+ });
122
+
123
+ if (process.env.NODE_ENV !== 'production') {
124
+ Portal.displayName = 'Portal';
125
+ }
126
+
127
+ var _default = Portal;
128
+ exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/portal",
3
- "version": "1.0.0-8",
3
+ "version": "1.0.0",
4
4
  "description": "React Portal Component",
5
5
  "keywords": [
6
6
  "react",
@@ -39,7 +39,7 @@
39
39
  "test": "npm run test:client && npm run test:server",
40
40
  "test:client": "umi-test --testPathIgnorePatterns=ssr.test.tsx --testPathIgnorePatterns=ssr.test.tsx",
41
41
  "test:coverage": "npm run test:client --coverage",
42
- "test:server": "umi-test --env=node tests/ssr.test.tsx",
42
+ "test:server": "umi-test --env=node -- tests/ssr.test.tsx",
43
43
  "watch": "father dev"
44
44
  },
45
45
  "dependencies": {
@@ -48,6 +48,7 @@
48
48
  "rc-util": "^5.8.0"
49
49
  },
50
50
  "devDependencies": {
51
+ "@rc-component/father-plugin": "^1.0.0",
51
52
  "@testing-library/jest-dom": "^5.16.4",
52
53
  "@testing-library/react": "^13.0.0",
53
54
  "@types/jest": "^26.0.20",