@getuserfeedback/react-native 3.0.30 → 3.0.31

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,7 +1,6 @@
1
1
  import type { CoreHostBootstrapTransport } from "@getuserfeedback/protocol/internal/core-host-bootstrap";
2
2
  import { type CoreWebViewBridgeMessage } from "./core-webview-bridge-adapter.js";
3
- import { type WebViewHandle, type WebViewHostController } from "./webview-host-controller.js";
4
- export type CoreWebViewHandle = WebViewHandle;
3
+ import { type WebViewHostController } from "./webview-host-controller.js";
5
4
  export type CoreWebViewHostConnection = {
6
5
  generation: number;
7
6
  transport: CoreHostBootstrapTransport;
@@ -9,46 +9,12 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import { createElement, useCallback, useEffect, useMemo, useRef, } from "react";
12
+ import { createElement, useMemo, useRef, } from "react";
13
13
  import { buildCoreWebViewBridgeScript, parseCoreWebViewBridgeMessage, toExternalCoreUrl, } from "./core-webview-bridge-adapter.js";
14
14
  import { createCoreWebViewHostController, } from "./core-webview-host-controller.js";
15
+ import { WebViewDocumentHost } from "./webview-document-host.js";
15
16
  let nextBridgeId = 0;
16
- const resolveWebViewComponent = () => {
17
- var _a;
18
- const webViewModule = require("react-native-webview");
19
- const WebView = (_a = webViewModule.WebView) !== null && _a !== void 0 ? _a : webViewModule.default;
20
- if (!WebView) {
21
- throw new Error("react-native-webview must export WebView to render the core host");
22
- }
23
- return WebView;
24
- };
25
- const toMessageData = (value) => {
26
- if (typeof value !== "string") {
27
- return value;
28
- }
29
- try {
30
- return JSON.parse(value);
31
- }
32
- catch (_a) {
33
- return value;
34
- }
35
- };
36
- const toEventHandler = (value) => typeof value === "function" ? value : undefined;
37
- const toInjectionScript = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
38
- const toTruthyInjectionScript = (value) => {
39
- const script = toInjectionScript(value);
40
- return script ? `${script}\ntrue;` : undefined;
41
- };
42
- const isBridgeMessageCandidate = (value, bridgeId) => typeof value === "object" &&
43
- value !== null &&
44
- "bridgeId" in value &&
45
- value.bridgeId === bridgeId;
46
- const composeInjectionScripts = (bridgeScript, callerScript) => {
47
- const script = toInjectionScript(callerScript);
48
- return script ? `${bridgeScript}\n${script}\ntrue;` : bridgeScript;
49
- };
50
17
  function CoreWebViewHostDocument({ externalCoreUrl, onConnected, onDisconnected, onInvalidMessage, webViewComponent, webViewProps, }) {
51
- const WebView = webViewComponent !== null && webViewComponent !== void 0 ? webViewComponent : resolveWebViewComponent();
52
18
  const bridgeIdRef = useRef(null);
53
19
  if (bridgeIdRef.current === null) {
54
20
  nextBridgeId += 1;
@@ -57,10 +23,8 @@ function CoreWebViewHostDocument({ externalCoreUrl, onConnected, onDisconnected,
57
23
  const bridgeId = bridgeIdRef.current;
58
24
  const onConnectedRef = useRef(onConnected);
59
25
  const onDisconnectedRef = useRef(onDisconnected);
60
- const onInvalidMessageRef = useRef(onInvalidMessage);
61
26
  onConnectedRef.current = onConnected;
62
27
  onDisconnectedRef.current = onDisconnected;
63
- onInvalidMessageRef.current = onInvalidMessage;
64
28
  const controllerRef = useRef(null);
65
29
  if (controllerRef.current === null) {
66
30
  controllerRef.current = createCoreWebViewHostController({
@@ -75,47 +39,18 @@ function CoreWebViewHostDocument({ externalCoreUrl, onConnected, onDisconnected,
75
39
  });
76
40
  }
77
41
  const controller = controllerRef.current;
78
- const documentStartBridgeScript = useMemo(() => buildCoreWebViewBridgeScript({ bridgeId, phase: "documentStart" }), [bridgeId]);
42
+ const buildDocumentStartScript = useMemo(() => () => buildCoreWebViewBridgeScript({ bridgeId, phase: "documentStart" }), [bridgeId]);
79
43
  const source = useMemo(() => ({ uri: externalCoreUrl }), [externalCoreUrl]);
80
- const callerOnLoadStart = toEventHandler(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.onLoadStart);
81
- const callerOnLoad = toEventHandler(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.onLoad);
82
- const callerOnMessage = toEventHandler(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.onMessage);
83
- useEffect(() => () => {
84
- controller.detach();
85
- }, [controller]);
86
- const setWebViewRef = useCallback((handle) => {
87
- if (!handle || typeof handle.injectJavaScript !== "function") {
88
- controller.detach();
89
- return;
90
- }
91
- controller.attach(handle);
92
- }, [controller]);
93
- const handleLoadStart = useCallback((event) => {
94
- controller.beginLoad();
95
- callerOnLoadStart === null || callerOnLoadStart === void 0 ? void 0 : callerOnLoadStart(event);
96
- }, [callerOnLoadStart, controller]);
97
- const handleLoad = useCallback((event) => {
98
- controller.completeLoad();
99
- callerOnLoad === null || callerOnLoad === void 0 ? void 0 : callerOnLoad(event);
100
- }, [callerOnLoad, controller]);
101
- const handleMessage = useCallback((event) => {
102
- var _a, _b;
103
- const value = toMessageData((_a = event.nativeEvent) === null || _a === void 0 ? void 0 : _a.data);
104
- let message;
105
- try {
106
- message = parseCoreWebViewBridgeMessage(value);
107
- }
108
- catch (error) {
109
- if (!callerOnMessage || isBridgeMessageCandidate(value, bridgeId)) {
110
- (_b = onInvalidMessageRef.current) === null || _b === void 0 ? void 0 : _b.call(onInvalidMessageRef, error instanceof Error ? error : new Error(String(error)), value);
111
- }
112
- callerOnMessage === null || callerOnMessage === void 0 ? void 0 : callerOnMessage(event);
113
- return;
114
- }
115
- controller.handleMessage(message);
116
- callerOnMessage === null || callerOnMessage === void 0 ? void 0 : callerOnMessage(event);
117
- }, [bridgeId, callerOnMessage, controller]);
118
- return createElement(WebView, Object.assign(Object.assign({}, webViewProps), { injectedJavaScript: toTruthyInjectionScript(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.injectedJavaScript), injectedJavaScriptBeforeContentLoaded: composeInjectionScripts(documentStartBridgeScript, webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.injectedJavaScriptBeforeContentLoaded), onLoad: handleLoad, onLoadStart: handleLoadStart, onMessage: handleMessage, ref: setWebViewRef, source }));
44
+ return createElement((WebViewDocumentHost), {
45
+ bridgeId,
46
+ buildDocumentStartScript,
47
+ controller,
48
+ parseMessage: parseCoreWebViewBridgeMessage,
49
+ source,
50
+ webViewComponent,
51
+ webViewProps,
52
+ onInvalidMessage,
53
+ });
119
54
  }
120
55
  export function CoreWebViewHost(_a) {
121
56
  var { coreUrl } = _a, props = __rest(_a, ["coreUrl"]);
package/dist/version.js CHANGED
@@ -3,4 +3,4 @@ const reactNativeSdkVersion = typeof __GX_REACT_NATIVE_SDK_VERSION__ === "string
3
3
  : "";
4
4
  // Build scripts patch this fallback to the package version for published artifacts.
5
5
  // Source-linked workspace usage keeps the local fallback.
6
- export const REACT_NATIVE_SDK_VERSION = reactNativeSdkVersion.length > 0 ? reactNativeSdkVersion : "3.0.30";
6
+ export const REACT_NATIVE_SDK_VERSION = reactNativeSdkVersion.length > 0 ? reactNativeSdkVersion : "3.0.31";
@@ -0,0 +1,13 @@
1
+ import { type ComponentType, type ReactElement } from "react";
2
+ import type { WebViewBridgeMessageIdentity, WebViewHostController } from "./webview-host-controller.js";
3
+ export type WebViewDocumentHostProps<TMessage extends WebViewBridgeMessageIdentity> = {
4
+ bridgeId: string;
5
+ buildDocumentStartScript: () => string;
6
+ controller: WebViewHostController<TMessage>;
7
+ parseMessage: (value: unknown) => TMessage;
8
+ source: Record<string, unknown>;
9
+ webViewComponent?: ComponentType<Record<string, unknown>>;
10
+ webViewProps?: Record<string, unknown>;
11
+ onInvalidMessage?: (error: Error, value: unknown) => void;
12
+ };
13
+ export declare function WebViewDocumentHost<TMessage extends WebViewBridgeMessageIdentity>({ bridgeId, buildDocumentStartScript, controller, parseMessage, source, webViewComponent, webViewProps, onInvalidMessage, }: WebViewDocumentHostProps<TMessage>): ReactElement;
@@ -0,0 +1,80 @@
1
+ import { createElement, useCallback, useEffect, useMemo, useRef, } from "react";
2
+ const resolveWebViewComponent = () => {
3
+ var _a;
4
+ const webViewModule = require("react-native-webview");
5
+ const WebView = (_a = webViewModule.WebView) !== null && _a !== void 0 ? _a : webViewModule.default;
6
+ if (!WebView) {
7
+ throw new Error("react-native-webview must export WebView to render a WebView host");
8
+ }
9
+ return WebView;
10
+ };
11
+ const toMessageData = (value) => {
12
+ if (typeof value !== "string") {
13
+ return value;
14
+ }
15
+ try {
16
+ return JSON.parse(value);
17
+ }
18
+ catch (_a) {
19
+ return value;
20
+ }
21
+ };
22
+ const toEventHandler = (value) => typeof value === "function" ? value : undefined;
23
+ const toInjectionScript = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
24
+ const toTruthyInjectionScript = (value) => {
25
+ const script = toInjectionScript(value);
26
+ return script ? `${script}\ntrue;` : undefined;
27
+ };
28
+ const composeInjectionScripts = (bridgeScript, callerScript) => {
29
+ const script = toInjectionScript(callerScript);
30
+ return script ? `${bridgeScript}\n${script}\ntrue;` : bridgeScript;
31
+ };
32
+ const isBridgeMessageCandidate = (value, bridgeId) => typeof value === "object" &&
33
+ value !== null &&
34
+ "bridgeId" in value &&
35
+ value.bridgeId === bridgeId;
36
+ export function WebViewDocumentHost({ bridgeId, buildDocumentStartScript, controller, parseMessage, source, webViewComponent, webViewProps, onInvalidMessage, }) {
37
+ const WebView = webViewComponent !== null && webViewComponent !== void 0 ? webViewComponent : resolveWebViewComponent();
38
+ const onInvalidMessageRef = useRef(onInvalidMessage);
39
+ onInvalidMessageRef.current = onInvalidMessage;
40
+ const documentStartBridgeScript = useMemo(() => buildDocumentStartScript(), [buildDocumentStartScript]);
41
+ const callerOnLoadStart = toEventHandler(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.onLoadStart);
42
+ const callerOnLoad = toEventHandler(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.onLoad);
43
+ const callerOnMessage = toEventHandler(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.onMessage);
44
+ useEffect(() => () => {
45
+ controller.detach();
46
+ }, [controller]);
47
+ const setWebViewRef = useCallback((handle) => {
48
+ if (!handle || typeof handle.injectJavaScript !== "function") {
49
+ controller.detach();
50
+ return;
51
+ }
52
+ controller.attach(handle);
53
+ }, [controller]);
54
+ const handleLoadStart = useCallback((event) => {
55
+ controller.beginLoad();
56
+ callerOnLoadStart === null || callerOnLoadStart === void 0 ? void 0 : callerOnLoadStart(event);
57
+ }, [callerOnLoadStart, controller]);
58
+ const handleLoad = useCallback((event) => {
59
+ controller.completeLoad();
60
+ callerOnLoad === null || callerOnLoad === void 0 ? void 0 : callerOnLoad(event);
61
+ }, [callerOnLoad, controller]);
62
+ const handleMessage = useCallback((event) => {
63
+ var _a, _b;
64
+ const value = toMessageData((_a = event.nativeEvent) === null || _a === void 0 ? void 0 : _a.data);
65
+ let message;
66
+ try {
67
+ message = parseMessage(value);
68
+ }
69
+ catch (error) {
70
+ if (!callerOnMessage || isBridgeMessageCandidate(value, bridgeId)) {
71
+ (_b = onInvalidMessageRef.current) === null || _b === void 0 ? void 0 : _b.call(onInvalidMessageRef, error instanceof Error ? error : new Error(String(error)), value);
72
+ }
73
+ callerOnMessage === null || callerOnMessage === void 0 ? void 0 : callerOnMessage(event);
74
+ return;
75
+ }
76
+ controller.handleMessage(message);
77
+ callerOnMessage === null || callerOnMessage === void 0 ? void 0 : callerOnMessage(event);
78
+ }, [bridgeId, callerOnMessage, controller, parseMessage]);
79
+ return createElement(WebView, Object.assign(Object.assign({}, webViewProps), { injectedJavaScript: toTruthyInjectionScript(webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.injectedJavaScript), injectedJavaScriptBeforeContentLoaded: composeInjectionScripts(documentStartBridgeScript, webViewProps === null || webViewProps === void 0 ? void 0 : webViewProps.injectedJavaScriptBeforeContentLoaded), onLoad: handleLoad, onLoadStart: handleLoadStart, onMessage: handleMessage, ref: setWebViewRef, source }));
80
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getuserfeedback/react-native",
3
- "version": "3.0.30",
3
+ "version": "3.0.31",
4
4
  "description": "getuserfeedback React Native SDK",
5
5
  "keywords": [
6
6
  "getuserfeedback",