@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.
@@ -1 +1 @@
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;"}
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, iframeStyle, fallback } = props;
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
- const [iframeHasLoaded, setIframeHasLoaded] = useState(false);
29
- const remoteFrame = /* @__PURE__ */ jsx(
30
- "iframe",
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
- remoteFrame
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 { ComponentType, CSSProperties, FC, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { reduce } from \"remeda\";\n\nexport interface RemoteRendererProps {\n integrations?: RemoteComponentsMap<never>[];\n src: string;\n iframeStyle?: CSSProperties;\n fallback?: ReactNode;\n}\n\nexport const RemoteRendererClient: FC<RemoteRendererProps> = (props) => {\n const { integrations = [], src, iframeStyle, fallback } = props;\n const receiver = useMemo(() => new RemoteReceiver(), []);\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 connect = connectRemoteIframeRef(receiver.connection);\n\n const [iframeHasLoaded, setIframeHasLoaded] = useState(false);\n\n const remoteFrame = (\n <iframe\n onLoad={() => setIframeHasLoaded(true)}\n ref={connect}\n src={src}\n style={\n iframeStyle ?? {\n visibility: \"hidden\",\n height: 0,\n width: 0,\n border: \"none\",\n position: \"absolute\",\n marginLeft: \"-9999px\",\n }\n }\n />\n );\n\n return (\n <>\n {!iframeHasLoaded && fallback}\n <RemoteRootRenderer components={mergedComponents} receiver={receiver} />\n {remoteFrame}\n </>\n );\n};\n\nexport default RemoteRendererClient;\n"],"names":[],"mappings":";;;;;;;AAoBa,MAAA,uBAAgD,CAAC,UAAU;AACtE,QAAM,EAAE,eAAe,IAAI,KAAK,aAAa,aAAa;AAC1D,QAAM,WAAW,QAAQ,MAAM,IAAI,eAAe,GAAG,CAAA,CAAE;AAEjD,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;AAEd,QAAA,UAAU,uBAAuB,SAAS,UAAU;AAE1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAE5D,QAAM,cACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQ,MAAM,mBAAmB,IAAI;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,MACA,OACE,eAAe;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,MAAA;AAAA,IACd;AAAA,EAEJ;AAGF,SAEK,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,CAAC,mBAAmB;AAAA,IACpB,oBAAA,oBAAA,EAAmB,YAAY,kBAAkB,SAAoB,CAAA;AAAA,IACrE;AAAA,EAAA,GACH;AAEJ;"}
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,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
+ {"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 { CSSProperties, FC, ReactNode } from 'react';
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,EAAiB,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIzE,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,mBAAmB,CAgDxD,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
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.85",
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.85",
33
- "@mittwald/flow-remote-elements": "0.2.0-alpha.85",
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.85",
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": "e63cfbd6eb643be82eccce1ba0da914f955535fe"
68
+ "gitHead": "e7790e1caf7262074ef04aef4e335f19bd648192"
69
69
  }