@mittwald/flow-remote-react-renderer 0.2.0-alpha.85 → 0.2.0-alpha.86
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/dist/js/RemoteRenderer.mjs.map +1 -1
- package/dist/js/RemoteRendererClient.mjs +41 -21
- package/dist/js/RemoteRendererClient.mjs.map +1 -1
- package/dist/types/RemoteRenderer.d.ts.map +1 -1
- package/dist/types/RemoteRendererClient.d.ts +1 -3
- package/dist/types/RemoteRendererClient.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteRenderer.mjs","sources":["../../src/RemoteRenderer.tsx"],"sourcesContent":["\"use client\";\nimport type
|
|
1
|
+
{"version":3,"file":"RemoteRenderer.mjs","sources":["../../src/RemoteRenderer.tsx"],"sourcesContent":["\"use client\";\nimport { type FC } from \"react\";\nimport React from \"react\";\nimport { useIsMounted } from \"@/hooks/useIsMounted\";\nimport type { RemoteRendererProps } from \"@/RemoteRendererClient\";\n\nconst RemoteRendererClient = React.lazy(() => import(\"./RemoteRendererClient\"));\n\nexport const RemoteRenderer: FC<RemoteRendererProps> = (props) => {\n const isMounted = useIsMounted();\n return isMounted ? <RemoteRendererClient {...props} /> : null;\n};\n\nexport default RemoteRenderer;\n"],"names":[],"mappings":";;;;AAMA,MAAM,uBAAuB,MAAM,KAAK,MAAM,OAAO,4BAAwB,CAAC;AAEjE,MAAA,iBAA0C,CAAC,UAAU;AAChE,QAAM,YAAY,aAAa;AAC/B,SAAO,YAAY,oBAAC,sBAAsB,EAAA,GAAG,MAAO,CAAA,IAAK;AAC3D;"}
|
|
@@ -5,11 +5,10 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
|
5
5
|
import { components } from "./components.mjs";
|
|
6
6
|
import { RemoteReceiver, RemoteRootRenderer } from "@mfalkenberg/remote-dom-react/host";
|
|
7
7
|
import { connectRemoteIframeRef } from "@mittwald/flow-remote-core";
|
|
8
|
-
import { useMemo, useState } from "react";
|
|
8
|
+
import { useMemo, useRef, useState, useLayoutEffect } from "react";
|
|
9
9
|
import { reduce } from "remeda";
|
|
10
10
|
const RemoteRendererClient = (props) => {
|
|
11
|
-
const { integrations = [], src
|
|
12
|
-
const receiver = useMemo(() => new RemoteReceiver(), []);
|
|
11
|
+
const { integrations = [], src } = props;
|
|
13
12
|
const mergedComponents = useMemo(() => {
|
|
14
13
|
return new Map(
|
|
15
14
|
Object.entries(
|
|
@@ -24,28 +23,49 @@ const RemoteRendererClient = (props) => {
|
|
|
24
23
|
)
|
|
25
24
|
);
|
|
26
25
|
}, [...integrations]);
|
|
26
|
+
const receiver = useMemo(() => new RemoteReceiver(), []);
|
|
27
|
+
const awaiter = useRef({
|
|
28
|
+
promise: null
|
|
29
|
+
}).current;
|
|
30
|
+
const [initialRendered, forceRerender] = useState(false);
|
|
27
31
|
const connect = connectRemoteIframeRef(receiver.connection);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{
|
|
32
|
-
onLoad: () => setIframeHasLoaded(true),
|
|
33
|
-
ref: connect,
|
|
34
|
-
src,
|
|
35
|
-
style: iframeStyle ?? {
|
|
36
|
-
visibility: "hidden",
|
|
37
|
-
height: 0,
|
|
38
|
-
width: 0,
|
|
39
|
-
border: "none",
|
|
40
|
-
position: "absolute",
|
|
41
|
-
marginLeft: "-9999px"
|
|
42
|
-
}
|
|
32
|
+
receiver.subscribe({ id: receiver.root.id }, () => {
|
|
33
|
+
if (awaiter.promise !== null && awaiter.resolve) {
|
|
34
|
+
awaiter.resolve();
|
|
43
35
|
}
|
|
44
|
-
);
|
|
36
|
+
});
|
|
37
|
+
useLayoutEffect(() => {
|
|
38
|
+
if (awaiter.promise !== null || initialRendered) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
awaiter.promise = new Promise((resolve) => {
|
|
42
|
+
awaiter.resolve = () => {
|
|
43
|
+
awaiter.promise = null;
|
|
44
|
+
resolve();
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
forceRerender(true);
|
|
48
|
+
}, [forceRerender]);
|
|
49
|
+
if (awaiter.promise !== null) {
|
|
50
|
+
throw awaiter.promise;
|
|
51
|
+
}
|
|
45
52
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
46
|
-
!iframeHasLoaded && fallback,
|
|
47
53
|
/* @__PURE__ */ jsx(RemoteRootRenderer, { components: mergedComponents, receiver }),
|
|
48
|
-
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"iframe",
|
|
56
|
+
{
|
|
57
|
+
ref: connect,
|
|
58
|
+
src,
|
|
59
|
+
style: {
|
|
60
|
+
visibility: "hidden",
|
|
61
|
+
height: 0,
|
|
62
|
+
width: 0,
|
|
63
|
+
border: "none",
|
|
64
|
+
position: "absolute",
|
|
65
|
+
marginLeft: "-9999px"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
)
|
|
49
69
|
] });
|
|
50
70
|
};
|
|
51
71
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteRendererClient.mjs","sources":["../../src/RemoteRendererClient.tsx"],"sourcesContent":["\"use client\";\nimport { components } from \"@/components\";\nimport type { RemoteComponentsMap } from \"@/lib/types\";\nimport type { RemoteComponentRendererProps } from \"@mfalkenberg/remote-dom-react/host\";\nimport {\n RemoteReceiver,\n RemoteRootRenderer,\n} from \"@mfalkenberg/remote-dom-react/host\";\nimport { connectRemoteIframeRef } from \"@mittwald/flow-remote-core\";\nimport type
|
|
1
|
+
{"version":3,"file":"RemoteRendererClient.mjs","sources":["../../src/RemoteRendererClient.tsx"],"sourcesContent":["\"use client\";\nimport { components } from \"@/components\";\nimport type { RemoteComponentsMap } from \"@/lib/types\";\nimport type { RemoteComponentRendererProps } from \"@mfalkenberg/remote-dom-react/host\";\nimport {\n RemoteReceiver,\n RemoteRootRenderer,\n} from \"@mfalkenberg/remote-dom-react/host\";\nimport { connectRemoteIframeRef } from \"@mittwald/flow-remote-core\";\nimport {\n type ComponentType,\n type FC,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useMemo } from \"react\";\nimport { reduce } from \"remeda\";\n\nexport interface RemoteRendererProps {\n integrations?: RemoteComponentsMap<never>[];\n src: string;\n}\n\ninterface PromiseObject {\n promise: null | Promise<void>;\n resolve?: CallableFunction;\n}\n\nexport const RemoteRendererClient: FC<RemoteRendererProps> = (props) => {\n const { integrations = [], src } = props;\n\n const mergedComponents = useMemo(() => {\n return new Map<string, ComponentType<RemoteComponentRendererProps>>(\n Object.entries(\n reduce(\n [...integrations, components],\n (merged, current) => ({\n ...merged,\n ...current,\n }),\n {},\n ),\n ),\n );\n }, [...integrations]);\n\n const receiver = useMemo(() => new RemoteReceiver(), []);\n const awaiter = useRef<PromiseObject>({\n promise: null,\n }).current;\n\n const [initialRendered, forceRerender] = useState(false);\n const connect = connectRemoteIframeRef(receiver.connection);\n receiver.subscribe({ id: receiver.root.id }, () => {\n if (awaiter.promise !== null && awaiter.resolve) {\n awaiter.resolve();\n }\n });\n\n useLayoutEffect(() => {\n if (awaiter.promise !== null || initialRendered) {\n return;\n }\n\n awaiter.promise = new Promise((resolve) => {\n awaiter.resolve = () => {\n awaiter.promise = null;\n resolve();\n };\n });\n\n forceRerender(true);\n }, [forceRerender]);\n\n if (awaiter.promise !== null) {\n throw awaiter.promise;\n }\n\n return (\n <>\n <RemoteRootRenderer components={mergedComponents} receiver={receiver} />\n <iframe\n ref={connect}\n src={src}\n style={{\n visibility: \"hidden\",\n height: 0,\n width: 0,\n border: \"none\",\n position: \"absolute\",\n marginLeft: \"-9999px\",\n }}\n />\n </>\n );\n};\n\nexport default RemoteRendererClient;\n"],"names":[],"mappings":";;;;;;;AA6Ba,MAAA,uBAAgD,CAAC,UAAU;AACtE,QAAM,EAAE,eAAe,IAAI,IAAQ,IAAA;AAE7B,QAAA,mBAAmB,QAAQ,MAAM;AACrC,WAAO,IAAI;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,CAAC,GAAG,cAAc,UAAU;AAAA,UAC5B,CAAC,QAAQ,aAAa;AAAA,YACpB,GAAG;AAAA,YACH,GAAG;AAAA,UAAA;AAAA,UAEL,CAAA;AAAA,QAAC;AAAA,MACH;AAAA,IAEJ;AAAA,EAAA,GACC,CAAC,GAAG,YAAY,CAAC;AAEpB,QAAM,WAAW,QAAQ,MAAM,IAAI,eAAe,GAAG,CAAA,CAAE;AACvD,QAAM,UAAU,OAAsB;AAAA,IACpC,SAAS;AAAA,EACV,CAAA,EAAE;AAEH,QAAM,CAAC,iBAAiB,aAAa,IAAI,SAAS,KAAK;AACjD,QAAA,UAAU,uBAAuB,SAAS,UAAU;AAC1D,WAAS,UAAU,EAAE,IAAI,SAAS,KAAK,GAAA,GAAM,MAAM;AACjD,QAAI,QAAQ,YAAY,QAAQ,QAAQ,SAAS;AAC/C,cAAQ,QAAQ;AAAA,IAAA;AAAA,EAClB,CACD;AAED,kBAAgB,MAAM;AAChB,QAAA,QAAQ,YAAY,QAAQ,iBAAiB;AAC/C;AAAA,IAAA;AAGF,YAAQ,UAAU,IAAI,QAAQ,CAAC,YAAY;AACzC,cAAQ,UAAU,MAAM;AACtB,gBAAQ,UAAU;AACV,gBAAA;AAAA,MACV;AAAA,IAAA,CACD;AAED,kBAAc,IAAI;AAAA,EAAA,GACjB,CAAC,aAAa,CAAC;AAEd,MAAA,QAAQ,YAAY,MAAM;AAC5B,UAAM,QAAQ;AAAA,EAAA;AAGhB,SAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAC,oBAAA,oBAAA,EAAmB,YAAY,kBAAkB,SAAoB,CAAA;AAAA,IACtE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,QAAA;AAAA,MACd;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteRenderer.d.ts","sourceRoot":"","sources":["../../src/RemoteRenderer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"RemoteRenderer.d.ts","sourceRoot":"","sources":["../../src/RemoteRenderer.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAGlD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { RemoteComponentsMap } from './lib/types';
|
|
2
|
-
import {
|
|
2
|
+
import { FC } from 'react';
|
|
3
3
|
export interface RemoteRendererProps {
|
|
4
4
|
integrations?: RemoteComponentsMap<never>[];
|
|
5
5
|
src: string;
|
|
6
|
-
iframeStyle?: CSSProperties;
|
|
7
|
-
fallback?: ReactNode;
|
|
8
6
|
}
|
|
9
7
|
export declare const RemoteRendererClient: FC<RemoteRendererProps>;
|
|
10
8
|
export default RemoteRendererClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteRendererClient.d.ts","sourceRoot":"","sources":["../../src/RemoteRendererClient.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOvD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"RemoteRendererClient.d.ts","sourceRoot":"","sources":["../../src/RemoteRendererClient.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOvD,OAAO,EAEL,KAAK,EAAE,EAIR,MAAM,OAAO,CAAC;AAIf,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5C,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,mBAAmB,CAmExD,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mittwald/flow-remote-react-renderer",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.86",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "React rendering for Flow Remote Elements",
|
|
6
6
|
"homepage": "https://mittwald.github.io/flow",
|
|
@@ -29,15 +29,15 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@mfalkenberg/remote-dom-react": "1.2.3",
|
|
32
|
-
"@mittwald/flow-remote-core": "0.2.0-alpha.
|
|
33
|
-
"@mittwald/flow-remote-elements": "0.2.0-alpha.
|
|
32
|
+
"@mittwald/flow-remote-core": "0.2.0-alpha.86",
|
|
33
|
+
"@mittwald/flow-remote-elements": "0.2.0-alpha.86",
|
|
34
34
|
"@types/react": "^19.0.10",
|
|
35
35
|
"clsx": "^2.1.1",
|
|
36
36
|
"react-children-utilities": "^2.10.0",
|
|
37
37
|
"remeda": "^2.21.1"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@mittwald/flow-react-components": "0.2.0-alpha.
|
|
40
|
+
"@mittwald/flow-react-components": "0.2.0-alpha.86",
|
|
41
41
|
"@mittwald/typescript-config": "",
|
|
42
42
|
"@types/node": "^22.13.10",
|
|
43
43
|
"nx": "^20.5.0",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"optional": true
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "e7790e1caf7262074ef04aef4e335f19bd648192"
|
|
69
69
|
}
|