@cleartrip/ct-design-portal 4.0.0 → 5.1.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 +72 -0
- package/dist/Host.d.ts +3 -0
- package/dist/Host.d.ts.map +1 -0
- package/dist/Portal.d.ts +3 -3
- package/dist/Portal.d.ts.map +1 -1
- package/dist/Portal.native.d.ts +4 -0
- package/dist/Portal.native.d.ts.map +1 -0
- package/dist/PortalProvider.d.ts +8 -0
- package/dist/PortalProvider.d.ts.map +1 -0
- package/dist/ct-design-portal.browser.cjs.js +1 -1
- package/dist/ct-design-portal.browser.cjs.js.map +1 -1
- package/dist/ct-design-portal.browser.esm.js +1 -1
- package/dist/ct-design-portal.browser.esm.js.map +1 -1
- package/dist/ct-design-portal.cjs.js +44 -56
- package/dist/ct-design-portal.cjs.js.map +1 -1
- package/dist/ct-design-portal.esm.js +45 -36
- package/dist/ct-design-portal.esm.js.map +1 -1
- package/dist/ct-design-portal.umd.js +46 -57
- package/dist/ct-design-portal.umd.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.native.d.ts +5 -0
- package/dist/index.native.d.ts.map +1 -0
- package/dist/type.d.ts +10 -5
- package/dist/type.d.ts.map +1 -1
- package/package.json +20 -8
- package/src/Host.tsx +20 -0
- package/src/Portal.native.tsx +19 -0
- package/src/Portal.tsx +24 -0
- package/src/PortalProvider.tsx +35 -0
- package/src/index.native.ts +4 -0
- package/src/index.ts +4 -0
- package/src/type.ts +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Portal
|
|
2
|
+
|
|
3
|
+
A component that renders its children in a different DOM node.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @cleartrip/ct-design-portal
|
|
11
|
+
# or
|
|
12
|
+
pnpm add @cleartrip/ct-design-portal
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Peer dependencies
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Required for all targets
|
|
19
|
+
npm install react
|
|
20
|
+
|
|
21
|
+
# Web only
|
|
22
|
+
npm install react-dom
|
|
23
|
+
|
|
24
|
+
# React Native only
|
|
25
|
+
npm install react-native
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
### Basic
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { Portal } from '@cleartrip/ct-design-portal';
|
|
36
|
+
|
|
37
|
+
function Example() {
|
|
38
|
+
return (
|
|
39
|
+
<Portal>
|
|
40
|
+
{/* Basic usage */}
|
|
41
|
+
</Portal>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Props
|
|
49
|
+
|
|
50
|
+
| Prop | Type | Default | Required | Description |
|
|
51
|
+
|------|------|---------|----------|-------------|
|
|
52
|
+
| `children` | `ReactNode` | — | ✅ Yes | The content to be rendered inside the portal. |
|
|
53
|
+
| `id` | `string` | — | ✅ Yes | Unique identifier for the portal instance. On native, this is used by the |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Accessibility
|
|
58
|
+
|
|
59
|
+
- The component follows accessibility best practices
|
|
60
|
+
- Ensure proper ARIA attributes are provided where needed
|
|
61
|
+
- Test with screen readers to ensure usability
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Migration
|
|
66
|
+
|
|
67
|
+
If migrating from a previous version:
|
|
68
|
+
|
|
69
|
+
```diff
|
|
70
|
+
- import { Portal } from 'yagami/core/components';
|
|
71
|
+
+ import { Portal } from '@cleartrip/ct-design-portal';
|
|
72
|
+
```
|
package/dist/Host.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Host.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Host.tsx"],"names":[],"mappings":"AAKA,QAAA,MAAM,IAAI,sDAYT,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
package/dist/Portal.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
declare const Portal: React.
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPortalProps } from './type';
|
|
3
|
+
declare const Portal: React.FC<IPortalProps>;
|
|
4
4
|
export default Portal;
|
|
5
5
|
//# sourceMappingURL=Portal.d.ts.map
|
package/dist/Portal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Portal.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Portal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAelC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Portal.native.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/Portal.native.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,QAAA,MAAM,MAAM,GAAI,kBAAkB,YAAY,SAW7C,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { IPortalContextProps } from './type';
|
|
3
|
+
declare const PortalProvider: ({ children }: {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default PortalProvider;
|
|
7
|
+
export declare const usePortalContext: () => IPortalContextProps;
|
|
8
|
+
//# sourceMappingURL=PortalProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortalProvider.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/PortalProvider.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAiB,SAAS,EAAqC,MAAM,OAAO,CAAC;AAE3F,OAAO,EAAE,mBAAmB,EAAgB,MAAM,QAAQ,CAAC;AAI3D,QAAA,MAAM,cAAc,GAAI,cAAc;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,4CAoB5D,CAAC;AAEF,eAAe,cAAc,CAAC;AAE9B,eAAO,MAAM,gBAAgB,2BAI5B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("react"),r=require("react-dom");const n=t.createContext(null),o=()=>{const e=t.useContext(n);if(!e)throw new Error("Context out of scope");return e};exports.Portal=({children:n})=>{const o=t.useRef(!1);if(t.useEffect(()=>(o.current=!0,()=>{o.current=!1}),[]),!o.current)return e.jsx(e.Fragment,{children:n});const c=(null===document||void 0===document?void 0:document.getElementById("__next"))||document.body;return r.createPortal(n,c)},exports.PortalHost=()=>{const{componentList:r}=o()||{};return r&&0!==r.length?e.jsx(e.Fragment,{children:r.map(({id:r,children:n},o)=>e.jsx(t.Fragment,{children:n},`${r}-${o}`))}):null},exports.PortalProvider=({children:r})=>{const[o,c]=t.useState([]),l=t.useCallback(({children:e,id:t})=>{c(r=>[...r,{id:t,children:e}])},[]),u=t.useCallback(e=>{c(t=>t.filter(t=>t.id!==e))},[]),s=t.useCallback(()=>{c([])},[]);return e.jsx(n.Provider,{value:{componentList:o,addComponent:l,removeComponent:u,clearAll:s},children:r})},exports.usePortalContext=o;
|
|
2
2
|
//# sourceMappingURL=ct-design-portal.browser.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ct-design-portal.browser.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"ct-design-portal.browser.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["PortalContext","createContext","usePortalContext","portals","useContext","Error","children","isMounted","useRef","useEffect","current","_jsx","jsx","_Fragment","Fragment","targetElement","document","getElementById","body","createPortal","componentList","length","map","id","index","setComponentList","useState","addComponent","useCallback","prevComponents","removeComponent","filter","componentsList","clearAll","Provider","value"],"mappings":"0FAMA,MCFMA,EAAgBC,EAAAA,cAA0C,MA0BnDC,EAAmB,KAC9B,MAAMC,EAAUC,aAAWJ,GAC3B,IAAKG,EAAS,MAAM,IAAIE,MAAM,wBAC9B,OAAOF,kBD3B8B,EAAGG,eACxC,MAAMC,EAAYC,UAAgB,GASlC,GAPAC,EAAAA,UAAU,KACRF,EAAUG,SAAU,EACb,KACLH,EAAUG,SAAU,IAErB,KAEEH,EAAUG,QAAS,OAAOC,EAAAC,IAAAC,EAAAC,SAAA,CAAAR,SAAGA,IAElC,MAAMS,GAAwB,OAARC,eAAA,IAAAA,cAAA,EAAAA,SAAUC,eAAe,YAAaD,SAASE,KAErE,OAAOC,EAAYA,aAACb,EAAUS,uBEfnB,KACX,MAAMK,cAAEA,GAAkBlB,KAAsB,CAAA,EAEhD,OAAKkB,GAA0C,IAAzBA,EAAcC,OAGlCV,MAAAE,EAAAA,SAAA,CAAAP,SACGc,EAAcE,IAAI,EAAGC,KAAIjB,YAA0BkB,IAClDb,EAAAA,IAACG,EAAQA,SAAyB,CAAAR,SAAAA,GAAnB,GAAGiB,KAAMC,QAL2B,6BDFpC,EAAGlB,eACxB,MAAOc,EAAeK,GAAoBC,EAAQA,SAAiB,IAE7DC,EAAeC,EAAWA,YAAC,EAAGtB,WAAUiB,SAC5CE,EAAkBI,GAAmB,IAAIA,EAAgB,CAAEN,KAAIjB,eAC9D,IAEGwB,EAAkBF,cAAaL,IACnCE,EAAkBI,GAAmBA,EAAeE,OAAQC,GAAmBA,EAAeT,KAAOA,KACpG,IAEGU,EAAWL,EAAAA,YAAY,KAC3BH,EAAiB,KAChB,IAEH,OACEd,MAACX,EAAckC,SAAS,CAAAC,MAAO,CAAEf,gBAAeO,eAAcG,kBAAiBG,YAC5E3B,SAAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as r}from"react/jsx-runtime";import
|
|
1
|
+
import{jsx as r,Fragment as e}from"react/jsx-runtime";import{useRef as n,useEffect as t,createContext as o,useState as c,useCallback as d,useContext as i,Fragment as l}from"react";import{createPortal as m}from"react-dom";const u=({children:o})=>{const c=n(!1);if(t(()=>(c.current=!0,()=>{c.current=!1}),[]),!c.current)return r(e,{children:o});const d=(null===document||void 0===document?void 0:document.getElementById("__next"))||document.body;return m(o,d)},s=o(null),a=({children:e})=>{const[n,t]=c([]),o=d(({children:r,id:e})=>{t(n=>[...n,{id:e,children:r}])},[]),i=d(r=>{t(e=>e.filter(e=>e.id!==r))},[]),l=d(()=>{t([])},[]);return r(s.Provider,{value:{componentList:n,addComponent:o,removeComponent:i,clearAll:l},children:e})},h=()=>{const r=i(s);if(!r)throw new Error("Context out of scope");return r},p=()=>{const{componentList:n}=h()||{};return n&&0!==n.length?r(e,{children:n.map(({id:e,children:n},t)=>r(l,{children:n},`${e}-${t}`))}):null};export{u as Portal,p as PortalHost,a as PortalProvider,h as usePortalContext};
|
|
2
2
|
//# sourceMappingURL=ct-design-portal.browser.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ct-design-portal.browser.esm.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["Portal","
|
|
1
|
+
{"version":3,"file":"ct-design-portal.browser.esm.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["Portal","children","isMounted","useRef","useEffect","current","_jsx","_Fragment","targetElement","document","getElementById","body","createPortal","PortalContext","createContext","PortalProvider","componentList","setComponentList","useState","addComponent","useCallback","id","prevComponents","removeComponent","filter","componentsList","clearAll","Provider","value","usePortalContext","portals","useContext","Error","Host","length","map","index","Fragment"],"mappings":"6NAMA,MAAMA,EAAiC,EAAGC,eACxC,MAAMC,EAAYC,GAAgB,GASlC,GAPAC,EAAU,KACRF,EAAUG,SAAU,EACb,KACLH,EAAUG,SAAU,IAErB,KAEEH,EAAUG,QAAS,OAAOC,EAAAC,EAAA,CAAAN,SAAGA,IAElC,MAAMO,GAAwB,OAARC,eAAA,IAAAA,cAAA,EAAAA,SAAUC,eAAe,YAAaD,SAASE,KAErE,OAAOC,EAAaX,EAAUO,IChB1BK,EAAgBC,EAA0C,MAE1DC,EAAiB,EAAGd,eACxB,MAAOe,EAAeC,GAAoBC,EAAyB,IAE7DC,EAAeC,EAAY,EAAGnB,WAAUoB,SAC5CJ,EAAkBK,GAAmB,IAAIA,EAAgB,CAAED,KAAIpB,eAC9D,IAEGsB,EAAkBH,EAAaC,IACnCJ,EAAkBK,GAAmBA,EAAeE,OAAQC,GAAmBA,EAAeJ,KAAOA,KACpG,IAEGK,EAAWN,EAAY,KAC3BH,EAAiB,KAChB,IAEH,OACEX,EAACO,EAAcc,SAAS,CAAAC,MAAO,CAAEZ,gBAAeG,eAAcI,kBAAiBG,YAC5EzB,SAAAA,KAOM4B,EAAmB,KAC9B,MAAMC,EAAUC,EAAWlB,GAC3B,IAAKiB,EAAS,MAAM,IAAIE,MAAM,wBAC9B,OAAOF,GC5BHG,EAAO,KACX,MAAMjB,cAAEA,GAAkBa,KAAsB,CAAA,EAEhD,OAAKb,GAA0C,IAAzBA,EAAckB,OAGlC5B,EAAAC,EAAA,CAAAN,SACGe,EAAcmB,IAAI,EAAGd,KAAIpB,YAA0BmC,IAClD9B,EAAC+B,EAAiC,CAAApC,SAAAA,GAAnB,GAAGoB,KAAMe,QAL2B"}
|
|
@@ -1,65 +1,53 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var useIsomorphicEffect = require('@cleartrip/ct-design-use-isomorphic-effect');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var reactDom = require('react-dom');
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
const Portal = ({ children }) => {
|
|
8
|
+
const isMounted = react.useRef(false);
|
|
9
|
+
react.useEffect(() => {
|
|
10
|
+
isMounted.current = true;
|
|
11
|
+
return () => {
|
|
12
|
+
isMounted.current = false;
|
|
13
|
+
};
|
|
14
|
+
}, []);
|
|
15
|
+
if (!isMounted.current)
|
|
16
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
17
|
+
const targetElement = (document === null || document === void 0 ? void 0 : document.getElementById('__next')) || document.body;
|
|
18
|
+
return reactDom.createPortal(children, targetElement);
|
|
19
|
+
};
|
|
9
20
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
const PortalContext = react.createContext(null);
|
|
22
|
+
const PortalProvider = ({ children }) => {
|
|
23
|
+
const [componentList, setComponentList] = react.useState([]);
|
|
24
|
+
const addComponent = react.useCallback(({ children, id }) => {
|
|
25
|
+
setComponentList((prevComponents) => [...prevComponents, { id, children }]);
|
|
26
|
+
}, []);
|
|
27
|
+
const removeComponent = react.useCallback((id) => {
|
|
28
|
+
setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
|
|
29
|
+
}, []);
|
|
30
|
+
const clearAll = react.useCallback(() => {
|
|
31
|
+
setComponentList([]);
|
|
32
|
+
}, []);
|
|
33
|
+
return (jsxRuntime.jsx(PortalContext.Provider, { value: { componentList, addComponent, removeComponent, clearAll }, children: children }));
|
|
34
|
+
};
|
|
35
|
+
const usePortalContext = () => {
|
|
36
|
+
const portals = react.useContext(PortalContext);
|
|
37
|
+
if (!portals)
|
|
38
|
+
throw new Error(`Context out of scope`);
|
|
39
|
+
return portals;
|
|
40
|
+
};
|
|
27
41
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
var _b = React__namespace.useState(null), mountNode = _b[0], setMountNode = _b[1];
|
|
35
|
-
useIsomorphicEffect__default.default(function () {
|
|
36
|
-
if (!disablePortal) {
|
|
37
|
-
setMountNode(container || document.body);
|
|
38
|
-
}
|
|
39
|
-
}, [container, disablePortal]);
|
|
40
|
-
useIsomorphicEffect__default.default(function () {
|
|
41
|
-
if (mountNode && !disablePortal) {
|
|
42
|
-
if (typeof ref === 'function') {
|
|
43
|
-
ref(mountNode);
|
|
44
|
-
}
|
|
45
|
-
else if (ref) {
|
|
46
|
-
ref.current = mountNode;
|
|
47
|
-
}
|
|
48
|
-
return function () {
|
|
49
|
-
if (typeof ref === 'function') {
|
|
50
|
-
ref(mountNode);
|
|
51
|
-
}
|
|
52
|
-
else if (ref) {
|
|
53
|
-
ref.current = null;
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}, [ref, mountNode, disablePortal]);
|
|
58
|
-
if (disablePortal) {
|
|
59
|
-
return jsxRuntime.jsx(React__namespace.Fragment, { children: children });
|
|
60
|
-
}
|
|
61
|
-
return ReactDOM__namespace.createPortal(children, document.body);
|
|
62
|
-
});
|
|
42
|
+
const Host = () => {
|
|
43
|
+
const { componentList } = usePortalContext() || {};
|
|
44
|
+
if (!componentList || componentList.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: componentList.map(({ id, children }, index) => (jsxRuntime.jsx(react.Fragment, { children: children }, `${id}-${index}`))) }));
|
|
47
|
+
};
|
|
63
48
|
|
|
64
49
|
exports.Portal = Portal;
|
|
50
|
+
exports.PortalHost = Host;
|
|
51
|
+
exports.PortalProvider = PortalProvider;
|
|
52
|
+
exports.usePortalContext = usePortalContext;
|
|
65
53
|
//# sourceMappingURL=ct-design-portal.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ct-design-portal.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"ct-design-portal.cjs.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["useRef","useEffect","_jsx","_Fragment","createPortal","createContext","useState","useCallback","useContext","Fragment"],"mappings":";;;;;;AAMA,MAAM,MAAM,GAA2B,CAAC,EAAE,QAAQ,EAAE,KAAI;AACtD,IAAA,MAAM,SAAS,GAAGA,YAAM,CAAU,KAAK,CAAC,CAAC;IAEzCC,eAAS,CAAC,MAAK;AACb,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AACzB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC5B,SAAC,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI,CAAC;AAE/C,IAAA,MAAM,aAAa,GAAG,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,cAAc,CAAC,QAAQ,CAAC,KAAI,QAAQ,CAAC,IAAI,CAAC;AAE1E,IAAA,OAAOC,qBAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC/C;;ACjBA,MAAM,aAAa,GAAGC,mBAAa,CAA6B,IAAI,CAAC,CAAC;AAEtE,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAA2B,KAAI;IAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,CAAiB,EAAE,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAGC,iBAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAgB,KAAI;AAClE,QAAA,gBAAgB,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC7E,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,CAAC,EAAU,KAAI;QACjD,gBAAgB,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KAC3G,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,QAAQ,GAAGA,iBAAW,CAAC,MAAK;QAChC,gBAAgB,CAAC,EAAE,CAAC,CAAC;KACtB,EAAE,EAAE,CAAC,CAAC;IAEP,QACEL,eAAC,aAAa,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,EACtF,QAAA,EAAA,QAAQ,EACc,CAAA,EACzB;AACJ,EAAE;AAIK,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,OAAO,GAAGM,gBAAU,CAAC,aAAa,CAAC,CAAC;AAC1C,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC,CAAC;AACtD,IAAA,OAAO,OAAO,CAAC;AACjB;;AC7BM,MAAA,IAAI,GAAG,MAAK;IAChB,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAEnD,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AAE9D,IAAA,QACEN,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EACG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAgB,EAAE,KAAa,MAC/DD,cAAC,CAAAO,cAAQ,EAAyB,EAAA,QAAA,EAAA,QAAQ,IAA3B,CAAG,EAAA,EAAE,CAAI,CAAA,EAAA,KAAK,EAAE,CAAuB,CACvD,CAAC,EAAA,CACD,EACH;AACJ;;;;;;;"}
|
|
@@ -1,39 +1,48 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import useIsomorphicEffect from '@cleartrip/ct-design-use-isomorphic-effect';
|
|
1
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef, useEffect, createContext, useState, useCallback, useContext, Fragment as Fragment$1 } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
}, [
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
else if (ref) {
|
|
20
|
-
ref.current = mountNode;
|
|
21
|
-
}
|
|
22
|
-
return function () {
|
|
23
|
-
if (typeof ref === 'function') {
|
|
24
|
-
ref(mountNode);
|
|
25
|
-
}
|
|
26
|
-
else if (ref) {
|
|
27
|
-
ref.current = null;
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
}, [ref, mountNode, disablePortal]);
|
|
32
|
-
if (disablePortal) {
|
|
33
|
-
return jsx(React.Fragment, { children: children });
|
|
34
|
-
}
|
|
35
|
-
return ReactDOM.createPortal(children, document.body);
|
|
36
|
-
});
|
|
5
|
+
const Portal = ({ children }) => {
|
|
6
|
+
const isMounted = useRef(false);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
isMounted.current = true;
|
|
9
|
+
return () => {
|
|
10
|
+
isMounted.current = false;
|
|
11
|
+
};
|
|
12
|
+
}, []);
|
|
13
|
+
if (!isMounted.current)
|
|
14
|
+
return jsx(Fragment, { children: children });
|
|
15
|
+
const targetElement = (document === null || document === void 0 ? void 0 : document.getElementById('__next')) || document.body;
|
|
16
|
+
return createPortal(children, targetElement);
|
|
17
|
+
};
|
|
37
18
|
|
|
38
|
-
|
|
19
|
+
const PortalContext = createContext(null);
|
|
20
|
+
const PortalProvider = ({ children }) => {
|
|
21
|
+
const [componentList, setComponentList] = useState([]);
|
|
22
|
+
const addComponent = useCallback(({ children, id }) => {
|
|
23
|
+
setComponentList((prevComponents) => [...prevComponents, { id, children }]);
|
|
24
|
+
}, []);
|
|
25
|
+
const removeComponent = useCallback((id) => {
|
|
26
|
+
setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
|
|
27
|
+
}, []);
|
|
28
|
+
const clearAll = useCallback(() => {
|
|
29
|
+
setComponentList([]);
|
|
30
|
+
}, []);
|
|
31
|
+
return (jsx(PortalContext.Provider, { value: { componentList, addComponent, removeComponent, clearAll }, children: children }));
|
|
32
|
+
};
|
|
33
|
+
const usePortalContext = () => {
|
|
34
|
+
const portals = useContext(PortalContext);
|
|
35
|
+
if (!portals)
|
|
36
|
+
throw new Error(`Context out of scope`);
|
|
37
|
+
return portals;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const Host = () => {
|
|
41
|
+
const { componentList } = usePortalContext() || {};
|
|
42
|
+
if (!componentList || componentList.length === 0)
|
|
43
|
+
return null;
|
|
44
|
+
return (jsx(Fragment, { children: componentList.map(({ id, children }, index) => (jsx(Fragment$1, { children: children }, `${id}-${index}`))) }));
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export { Portal, Host as PortalHost, PortalProvider, usePortalContext };
|
|
39
48
|
//# sourceMappingURL=ct-design-portal.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ct-design-portal.esm.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ct-design-portal.esm.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["_jsx","_Fragment","Fragment"],"mappings":";;;;AAMA,MAAM,MAAM,GAA2B,CAAC,EAAE,QAAQ,EAAE,KAAI;AACtD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;IAEzC,SAAS,CAAC,MAAK;AACb,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AACzB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC5B,SAAC,CAAC;KACH,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAOA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI,CAAC;AAE/C,IAAA,MAAM,aAAa,GAAG,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,cAAc,CAAC,QAAQ,CAAC,KAAI,QAAQ,CAAC,IAAI,CAAC;AAE1E,IAAA,OAAO,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC/C;;ACjBA,MAAM,aAAa,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAEtE,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAA2B,KAAI;IAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAEvE,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAgB,KAAI;AAClE,QAAA,gBAAgB,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;KAC7E,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,EAAU,KAAI;QACjD,gBAAgB,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KAC3G,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAK;QAChC,gBAAgB,CAAC,EAAE,CAAC,CAAC;KACtB,EAAE,EAAE,CAAC,CAAC;IAEP,QACED,IAAC,aAAa,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,EACtF,QAAA,EAAA,QAAQ,EACc,CAAA,EACzB;AACJ,EAAE;AAIK,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAC1C,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC,CAAC;AACtD,IAAA,OAAO,OAAO,CAAC;AACjB;;AC7BM,MAAA,IAAI,GAAG,MAAK;IAChB,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAEnD,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AAE9D,IAAA,QACEA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EACG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAgB,EAAE,KAAa,MAC/DD,GAAC,CAAAE,UAAQ,EAAyB,EAAA,QAAA,EAAA,QAAQ,IAA3B,CAAG,EAAA,EAAE,CAAI,CAAA,EAAA,KAAK,EAAE,CAAuB,CACvD,CAAC,EAAA,CACD,EACH;AACJ;;;;"}
|
|
@@ -1,66 +1,55 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('react-dom')
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'react-dom'
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CTDesignSystemPortal = {}, global.jsxRuntime, global.React, global.
|
|
5
|
-
})(this, (function (exports, jsxRuntime,
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react/jsx-runtime'), require('react'), require('react-dom')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'react/jsx-runtime', 'react', 'react-dom'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CTDesignSystemPortal = {}, global.jsxRuntime, global.React, global.reactDom));
|
|
5
|
+
})(this, (function (exports, jsxRuntime, react, reactDom) { 'use strict';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
const Portal = ({ children }) => {
|
|
8
|
+
const isMounted = react.useRef(false);
|
|
9
|
+
react.useEffect(() => {
|
|
10
|
+
isMounted.current = true;
|
|
11
|
+
return () => {
|
|
12
|
+
isMounted.current = false;
|
|
13
|
+
};
|
|
14
|
+
}, []);
|
|
15
|
+
if (!isMounted.current)
|
|
16
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
17
|
+
const targetElement = (document === null || document === void 0 ? void 0 : document.getElementById('__next')) || document.body;
|
|
18
|
+
return reactDom.createPortal(children, targetElement);
|
|
19
|
+
};
|
|
8
20
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
const PortalContext = react.createContext(null);
|
|
22
|
+
const PortalProvider = ({ children }) => {
|
|
23
|
+
const [componentList, setComponentList] = react.useState([]);
|
|
24
|
+
const addComponent = react.useCallback(({ children, id }) => {
|
|
25
|
+
setComponentList((prevComponents) => [...prevComponents, { id, children }]);
|
|
26
|
+
}, []);
|
|
27
|
+
const removeComponent = react.useCallback((id) => {
|
|
28
|
+
setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
|
|
29
|
+
}, []);
|
|
30
|
+
const clearAll = react.useCallback(() => {
|
|
31
|
+
setComponentList([]);
|
|
32
|
+
}, []);
|
|
33
|
+
return (jsxRuntime.jsx(PortalContext.Provider, { value: { componentList, addComponent, removeComponent, clearAll }, children: children }));
|
|
34
|
+
};
|
|
35
|
+
const usePortalContext = () => {
|
|
36
|
+
const portals = react.useContext(PortalContext);
|
|
37
|
+
if (!portals)
|
|
38
|
+
throw new Error(`Context out of scope`);
|
|
39
|
+
return portals;
|
|
40
|
+
};
|
|
26
41
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
var _b = React__namespace.useState(null), mountNode = _b[0], setMountNode = _b[1];
|
|
34
|
-
useIsomorphicEffect__default.default(function () {
|
|
35
|
-
if (!disablePortal) {
|
|
36
|
-
setMountNode(container || document.body);
|
|
37
|
-
}
|
|
38
|
-
}, [container, disablePortal]);
|
|
39
|
-
useIsomorphicEffect__default.default(function () {
|
|
40
|
-
if (mountNode && !disablePortal) {
|
|
41
|
-
if (typeof ref === 'function') {
|
|
42
|
-
ref(mountNode);
|
|
43
|
-
}
|
|
44
|
-
else if (ref) {
|
|
45
|
-
ref.current = mountNode;
|
|
46
|
-
}
|
|
47
|
-
return function () {
|
|
48
|
-
if (typeof ref === 'function') {
|
|
49
|
-
ref(mountNode);
|
|
50
|
-
}
|
|
51
|
-
else if (ref) {
|
|
52
|
-
ref.current = null;
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}, [ref, mountNode, disablePortal]);
|
|
57
|
-
if (disablePortal) {
|
|
58
|
-
return jsxRuntime.jsx(React__namespace.Fragment, { children: children });
|
|
59
|
-
}
|
|
60
|
-
return ReactDOM__namespace.createPortal(children, document.body);
|
|
61
|
-
});
|
|
42
|
+
const Host = () => {
|
|
43
|
+
const { componentList } = usePortalContext() || {};
|
|
44
|
+
if (!componentList || componentList.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: componentList.map(({ id, children }, index) => (jsxRuntime.jsx(react.Fragment, { children: children }, `${id}-${index}`))) }));
|
|
47
|
+
};
|
|
62
48
|
|
|
63
49
|
exports.Portal = Portal;
|
|
50
|
+
exports.PortalHost = Host;
|
|
51
|
+
exports.PortalProvider = PortalProvider;
|
|
52
|
+
exports.usePortalContext = usePortalContext;
|
|
64
53
|
|
|
65
54
|
}));
|
|
66
55
|
//# sourceMappingURL=ct-design-portal.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ct-design-portal.umd.js","sources":["../packages/components/Portal/src/Portal.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"ct-design-portal.umd.js","sources":["../packages/components/Portal/src/Portal.tsx","../packages/components/Portal/src/PortalProvider.tsx","../packages/components/Portal/src/Host.tsx"],"sourcesContent":[null,null,null],"names":["useRef","useEffect","_jsx","_Fragment","createPortal","createContext","useState","useCallback","useContext","Fragment"],"mappings":";;;;;;AAMA,UAAM,MAAM,GAA2B,CAAC,EAAE,QAAQ,EAAE,KAAI;IACtD,IAAA,MAAM,SAAS,GAAGA,YAAM,CAAU,KAAK,CAAC,CAAC;QAEzCC,eAAS,CAAC,MAAK;IACb,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;IACzB,QAAA,OAAO,MAAK;IACV,YAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5B,SAAC,CAAC;SACH,EAAE,EAAE,CAAC,CAAC;QAEP,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAI,CAAC;IAE/C,IAAA,MAAM,aAAa,GAAG,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,cAAc,CAAC,QAAQ,CAAC,KAAI,QAAQ,CAAC,IAAI,CAAC;IAE1E,IAAA,OAAOC,qBAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC/C;;ICjBA,MAAM,aAAa,GAAGC,mBAAa,CAA6B,IAAI,CAAC,CAAC;AAEtE,UAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAA2B,KAAI;QAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGC,cAAQ,CAAiB,EAAE,CAAC,CAAC;QAEvE,MAAM,YAAY,GAAGC,iBAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAgB,KAAI;IAClE,QAAA,gBAAgB,CAAC,CAAC,cAAc,KAAK,CAAC,GAAG,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;SAC7E,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,CAAC,EAAU,KAAI;YACjD,gBAAgB,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;SAC3G,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,MAAM,QAAQ,GAAGA,iBAAW,CAAC,MAAK;YAChC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACtB,EAAE,EAAE,CAAC,CAAC;QAEP,QACEL,eAAC,aAAa,CAAC,QAAQ,EAAC,EAAA,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,EACtF,QAAA,EAAA,QAAQ,EACc,CAAA,EACzB;IACJ,EAAE;AAIK,UAAM,gBAAgB,GAAG,MAAK;IACnC,IAAA,MAAM,OAAO,GAAGM,gBAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAA,IAAI,CAAC,OAAO;IAAE,QAAA,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,CAAsB,CAAC,CAAC;IACtD,IAAA,OAAO,OAAO,CAAC;IACjB;;AC7BM,UAAA,IAAI,GAAG,MAAK;QAChB,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAEnD,IAAA,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;IAAE,QAAA,OAAO,IAAI,CAAC;IAE9D,IAAA,QACEN,cAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EACG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAgB,EAAE,KAAa,MAC/DD,cAAC,CAAAO,cAAQ,EAAyB,EAAA,QAAA,EAAA,QAAQ,IAA3B,CAAG,EAAA,EAAE,CAAI,CAAA,EAAA,KAAK,EAAE,CAAuB,CACvD,CAAC,EAAA,CACD,EACH;IACJ;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { default as Portal } from './Portal';
|
|
2
|
-
export
|
|
2
|
+
export { default as PortalProvider, usePortalContext } from './PortalProvider';
|
|
3
|
+
export { default as PortalHost } from './Host';
|
|
4
|
+
export type * from './type';
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,cAAc,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,mBAAmB,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,mBAAmB,QAAQ,CAAC"}
|
package/dist/type.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
export interface
|
|
3
|
-
children
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface IPortalProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
id: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IPortalContextProps {
|
|
7
|
+
componentList: IPortalProps[];
|
|
8
|
+
addComponent: ({ children, id }: IPortalProps) => void;
|
|
9
|
+
removeComponent: (id: string) => void;
|
|
10
|
+
clearAll: () => void;
|
|
6
11
|
}
|
|
7
12
|
//# sourceMappingURL=type.d.ts.map
|
package/dist/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/type.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../packages/components/Portal/src/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,YAAY;IAI3B,QAAQ,EAAE,SAAS,CAAC;IAKpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAIlC,aAAa,EAAE,YAAY,EAAE,CAAC;IAI9B,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;IAIvD,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAItC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB"}
|
package/package.json
CHANGED
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleartrip/ct-design-portal",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "Portal Component",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
|
-
"main": "dist/ct-design-portal.cjs.js",
|
|
6
|
+
"main": "./dist/ct-design-portal.cjs.js",
|
|
7
7
|
"jsnext:main": "dist/ct-design-portal.esm.js",
|
|
8
8
|
"module": "dist/ct-design-portal.esm.js",
|
|
9
|
+
"react-native": "src/index.native.ts",
|
|
9
10
|
"sideEffects": false,
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/ct-design-portal.esm.js",
|
|
15
|
+
"default": "./dist/ct-design-portal.cjs.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
10
18
|
"browser": {
|
|
11
19
|
"./dist/ct-design-portal.esm.js": "./dist/ct-design-portal.browser.esm.js",
|
|
12
20
|
"./dist/ct-design-portal.cjs.js": "./dist/ct-design-portal.browser.cjs.js"
|
|
13
21
|
},
|
|
14
22
|
"files": [
|
|
15
|
-
"dist"
|
|
23
|
+
"dist",
|
|
24
|
+
"src"
|
|
16
25
|
],
|
|
17
26
|
"dependencies": {
|
|
18
|
-
"@cleartrip/ct-design-
|
|
27
|
+
"@cleartrip/ct-design-theme": "5.1.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@emotion/babel-plugin": "^11.12.0"
|
|
19
31
|
},
|
|
20
|
-
"devDependencies": {},
|
|
21
32
|
"peerDependencies": {
|
|
22
33
|
"react": ">=16.8.0",
|
|
23
|
-
"react-dom": ">=16.8.0"
|
|
24
|
-
"styled-components": "^5.3.6"
|
|
34
|
+
"react-dom": ">=16.8.0"
|
|
25
35
|
},
|
|
26
36
|
"publishConfig": {
|
|
27
37
|
"access": "public"
|
|
@@ -32,6 +42,8 @@
|
|
|
32
42
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
33
43
|
"watch-package": "rollup -c -w",
|
|
34
44
|
"build-package": "rollup -c",
|
|
35
|
-
"build-package:clean": "rm -rf dist && rollup -c"
|
|
45
|
+
"build-package:clean": "rm -rf dist && rollup -c",
|
|
46
|
+
"publish-package:local": "yalc publish --no-scripts",
|
|
47
|
+
"publish-package:local:registry": "pnpm publish --registry http://localhost:4873 --no-git-checks --access public"
|
|
36
48
|
}
|
|
37
49
|
}
|
package/src/Host.tsx
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React, { Fragment } from 'react';
|
|
2
|
+
|
|
3
|
+
import { usePortalContext } from './PortalProvider';
|
|
4
|
+
import { IPortalProps } from './type';
|
|
5
|
+
|
|
6
|
+
const Host = () => {
|
|
7
|
+
const { componentList } = usePortalContext() || {};
|
|
8
|
+
|
|
9
|
+
if (!componentList || componentList.length === 0) return null;
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<>
|
|
13
|
+
{componentList.map(({ id, children }: IPortalProps, index: number) => (
|
|
14
|
+
<Fragment key={`${id}-${index}`}>{children}</Fragment>
|
|
15
|
+
))}
|
|
16
|
+
</>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default Host;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import { usePortalContext } from './PortalProvider';
|
|
4
|
+
import { IPortalProps } from './type';
|
|
5
|
+
|
|
6
|
+
const Portal = ({ children, id }: IPortalProps) => {
|
|
7
|
+
const { addComponent, removeComponent } = usePortalContext() || {};
|
|
8
|
+
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
addComponent?.({ children, id });
|
|
11
|
+
return () => {
|
|
12
|
+
removeComponent?.(id);
|
|
13
|
+
};
|
|
14
|
+
}, [addComponent, children, id, removeComponent]);
|
|
15
|
+
|
|
16
|
+
return null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default Portal;
|
package/src/Portal.tsx
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
|
|
5
|
+
import { IPortalProps } from './type';
|
|
6
|
+
|
|
7
|
+
const Portal: React.FC<IPortalProps> = ({ children }) => {
|
|
8
|
+
const isMounted = useRef<boolean>(false);
|
|
9
|
+
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
isMounted.current = true;
|
|
12
|
+
return () => {
|
|
13
|
+
isMounted.current = false;
|
|
14
|
+
};
|
|
15
|
+
}, []);
|
|
16
|
+
|
|
17
|
+
if (!isMounted.current) return <>{children}</>;
|
|
18
|
+
|
|
19
|
+
const targetElement = document?.getElementById('__next') || document.body;
|
|
20
|
+
|
|
21
|
+
return createPortal(children, targetElement);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default Portal;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React, { createContext, ReactNode, useCallback, useContext, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { IPortalContextProps, IPortalProps } from './type';
|
|
4
|
+
|
|
5
|
+
const PortalContext = createContext<IPortalContextProps | null>(null);
|
|
6
|
+
|
|
7
|
+
const PortalProvider = ({ children }: { children: ReactNode }) => {
|
|
8
|
+
const [componentList, setComponentList] = useState<IPortalProps[]>([]);
|
|
9
|
+
|
|
10
|
+
const addComponent = useCallback(({ children, id }: IPortalProps) => {
|
|
11
|
+
setComponentList((prevComponents) => [...prevComponents, { id, children }]);
|
|
12
|
+
}, []);
|
|
13
|
+
|
|
14
|
+
const removeComponent = useCallback((id: string) => {
|
|
15
|
+
setComponentList((prevComponents) => prevComponents.filter((componentsList) => componentsList.id !== id));
|
|
16
|
+
}, []);
|
|
17
|
+
|
|
18
|
+
const clearAll = useCallback(() => {
|
|
19
|
+
setComponentList([]);
|
|
20
|
+
}, []);
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<PortalContext.Provider value={{ componentList, addComponent, removeComponent, clearAll }}>
|
|
24
|
+
{children}
|
|
25
|
+
</PortalContext.Provider>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default PortalProvider;
|
|
30
|
+
|
|
31
|
+
export const usePortalContext = () => {
|
|
32
|
+
const portals = useContext(PortalContext);
|
|
33
|
+
if (!portals) throw new Error(`Context out of scope`);
|
|
34
|
+
return portals;
|
|
35
|
+
};
|
package/src/index.ts
ADDED
package/src/type.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface IPortalProps {
|
|
4
|
+
/**
|
|
5
|
+
* The content to be rendered inside the portal.
|
|
6
|
+
*/
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Unique identifier for the portal instance. On native, this is used by the
|
|
10
|
+
* PortalProvider to register/unregister the portal from the Host.
|
|
11
|
+
*/
|
|
12
|
+
id: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface IPortalContextProps {
|
|
16
|
+
/**
|
|
17
|
+
* List of currently mounted portal entries.
|
|
18
|
+
*/
|
|
19
|
+
componentList: IPortalProps[];
|
|
20
|
+
/**
|
|
21
|
+
* Register a portal entry with the host.
|
|
22
|
+
*/
|
|
23
|
+
addComponent: ({ children, id }: IPortalProps) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Remove a portal entry by its id.
|
|
26
|
+
*/
|
|
27
|
+
removeComponent: (id: string) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Remove every registered portal entry.
|
|
30
|
+
*/
|
|
31
|
+
clearAll: () => void;
|
|
32
|
+
}
|