@getuserfeedback/react-native 1.0.0 → 1.3.2
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 +148 -1
- package/dist/host-viewport.d.ts +3 -0
- package/dist/host-viewport.js +69 -0
- package/dist/index.d.ts +80 -14
- package/dist/index.js +894 -10
- package/dist/version.d.ts +1 -0
- package/dist/version.js +6 -0
- package/dist/webview-bridge-script.d.ts +16 -0
- package/dist/webview-bridge-script.js +290 -0
- package/dist/widget-host-lifecycle-machine.d.ts +34 -0
- package/dist/widget-host-lifecycle-machine.js +37 -0
- package/dist/widget-host.d.ts +38 -0
- package/dist/widget-host.js +327 -0
- package/package.json +8 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const REACT_NATIVE_SDK_VERSION: string;
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const reactNativeSdkVersion = typeof __GX_REACT_NATIVE_SDK_VERSION__ === "string"
|
|
2
|
+
? __GX_REACT_NATIVE_SDK_VERSION__.trim()
|
|
3
|
+
: "";
|
|
4
|
+
// Build scripts patch this fallback to the package version for published artifacts.
|
|
5
|
+
// Source-linked workspace usage keeps the local fallback.
|
|
6
|
+
export const REACT_NATIVE_SDK_VERSION = reactNativeSdkVersion.length > 0 ? reactNativeSdkVersion : "1.3.2";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WebViewTransportNativeMessage } from "@getuserfeedback/protocol/webview-transport";
|
|
2
|
+
export declare function buildLoaderHtml(loaderUrl: string, input?: {
|
|
3
|
+
bridgeScript?: string;
|
|
4
|
+
}): string;
|
|
5
|
+
export declare function buildHostViewportInjectionScript(input: {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
version?: number;
|
|
9
|
+
}): string;
|
|
10
|
+
export declare function buildHostViewportResetInjectionScript(input?: {
|
|
11
|
+
version?: number;
|
|
12
|
+
}): string;
|
|
13
|
+
export declare function buildWebViewBridgeScript(input?: {
|
|
14
|
+
instanceId?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare function buildNativeMessageInjectionScript(message: WebViewTransportNativeMessage): string;
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
const HOST_EVENT_PREFIX = "getuserfeedback:";
|
|
2
|
+
const VIEW_SIZE_FLUSH_EVENT = "gx:view-size:flush";
|
|
3
|
+
const HOST_VIEWPORT_VERSION_KEY = "__getuserfeedback_host_viewport_version";
|
|
4
|
+
const HOST_EVENT_NAMES = [
|
|
5
|
+
"instance:flow:state-changed",
|
|
6
|
+
"instance:flow:state-changed:instance",
|
|
7
|
+
"instance:command:settled",
|
|
8
|
+
"instance:handle:invalidated",
|
|
9
|
+
"instance:command:unsupported",
|
|
10
|
+
"instance:open:requested",
|
|
11
|
+
"instance:error",
|
|
12
|
+
"instance:app-event",
|
|
13
|
+
"loader:error",
|
|
14
|
+
];
|
|
15
|
+
const serializeForJavaScript = (value) => JSON.stringify(value).replace(/</g, "\\u003c");
|
|
16
|
+
const escapeScriptTagContent = (script) => script.replace(/<\/script/gi, "<\\/script");
|
|
17
|
+
export function buildLoaderHtml(loaderUrl, input) {
|
|
18
|
+
const serializedLoaderUrl = serializeForJavaScript(loaderUrl);
|
|
19
|
+
const bridgeScript = (input === null || input === void 0 ? void 0 : input.bridgeScript)
|
|
20
|
+
? ` <script>
|
|
21
|
+
${escapeScriptTagContent(input.bridgeScript)}
|
|
22
|
+
</script>
|
|
23
|
+
`
|
|
24
|
+
: "";
|
|
25
|
+
return `<!doctype html>
|
|
26
|
+
<html>
|
|
27
|
+
<head>
|
|
28
|
+
<meta charset="utf-8">
|
|
29
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
30
|
+
${bridgeScript}\
|
|
31
|
+
<script>
|
|
32
|
+
(function () {
|
|
33
|
+
var script = document.createElement("script");
|
|
34
|
+
script.async = true;
|
|
35
|
+
script.src = ${serializedLoaderUrl};
|
|
36
|
+
document.head.appendChild(script);
|
|
37
|
+
})();
|
|
38
|
+
</script>
|
|
39
|
+
</head>
|
|
40
|
+
<body></body>
|
|
41
|
+
</html>`;
|
|
42
|
+
}
|
|
43
|
+
export function buildHostViewportInjectionScript(input) {
|
|
44
|
+
return `
|
|
45
|
+
(function () {
|
|
46
|
+
var viewport = ${serializeForJavaScript(input)};
|
|
47
|
+
var hasViewportVersion =
|
|
48
|
+
typeof viewport.version === "number" && Number.isFinite(viewport.version);
|
|
49
|
+
var viewportVersion = hasViewportVersion ? viewport.version : 0;
|
|
50
|
+
var previousViewportVersion = window.${HOST_VIEWPORT_VERSION_KEY};
|
|
51
|
+
if (
|
|
52
|
+
hasViewportVersion &&
|
|
53
|
+
typeof previousViewportVersion === "number" &&
|
|
54
|
+
previousViewportVersion >= viewportVersion
|
|
55
|
+
) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (hasViewportVersion) {
|
|
59
|
+
window.${HOST_VIEWPORT_VERSION_KEY} = viewportVersion;
|
|
60
|
+
}
|
|
61
|
+
var didApplyHostViewport = false;
|
|
62
|
+
if (
|
|
63
|
+
typeof viewport.width === "number" &&
|
|
64
|
+
Number.isFinite(viewport.width) &&
|
|
65
|
+
viewport.width > 0
|
|
66
|
+
) {
|
|
67
|
+
try {
|
|
68
|
+
Object.defineProperty(window, "innerWidth", {
|
|
69
|
+
configurable: true,
|
|
70
|
+
get: function () {
|
|
71
|
+
return viewport.width;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
} catch (error) {
|
|
75
|
+
// The loader can still run with the WebView-provided width.
|
|
76
|
+
}
|
|
77
|
+
didApplyHostViewport = true;
|
|
78
|
+
}
|
|
79
|
+
if (
|
|
80
|
+
typeof viewport.height === "number" &&
|
|
81
|
+
Number.isFinite(viewport.height) &&
|
|
82
|
+
viewport.height > 0
|
|
83
|
+
) {
|
|
84
|
+
try {
|
|
85
|
+
Object.defineProperty(window, "innerHeight", {
|
|
86
|
+
configurable: true,
|
|
87
|
+
get: function () {
|
|
88
|
+
return viewport.height;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
} catch (error) {
|
|
92
|
+
// The loader can still run with the WebView-provided height.
|
|
93
|
+
}
|
|
94
|
+
if (
|
|
95
|
+
typeof document !== "undefined" &&
|
|
96
|
+
document.documentElement &&
|
|
97
|
+
document.documentElement.style &&
|
|
98
|
+
typeof document.documentElement.style.setProperty === "function"
|
|
99
|
+
) {
|
|
100
|
+
document.documentElement.style.setProperty(
|
|
101
|
+
"--gx-host-viewport-max-height",
|
|
102
|
+
viewport.height + "px"
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
didApplyHostViewport = true;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
if (typeof window.dispatchEvent === "function") {
|
|
109
|
+
if (didApplyHostViewport && typeof Event === "function") {
|
|
110
|
+
window.dispatchEvent(new Event("resize"));
|
|
111
|
+
}
|
|
112
|
+
if (didApplyHostViewport && typeof CustomEvent === "function") {
|
|
113
|
+
window.dispatchEvent(
|
|
114
|
+
new CustomEvent("${VIEW_SIZE_FLUSH_EVENT}", {
|
|
115
|
+
detail: { mode: "sync" }
|
|
116
|
+
})
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
} catch (error) {
|
|
121
|
+
// Viewport updates are best-effort; keep the WebView runtime alive.
|
|
122
|
+
}
|
|
123
|
+
})();
|
|
124
|
+
true;`;
|
|
125
|
+
}
|
|
126
|
+
export function buildHostViewportResetInjectionScript(input) {
|
|
127
|
+
return `
|
|
128
|
+
(function () {
|
|
129
|
+
var viewportReset = ${serializeForJavaScript(input !== null && input !== void 0 ? input : {})};
|
|
130
|
+
var hasViewportVersion =
|
|
131
|
+
typeof viewportReset.version === "number" &&
|
|
132
|
+
Number.isFinite(viewportReset.version);
|
|
133
|
+
var viewportVersion = hasViewportVersion ? viewportReset.version : 0;
|
|
134
|
+
var previousViewportVersion = window.${HOST_VIEWPORT_VERSION_KEY};
|
|
135
|
+
if (
|
|
136
|
+
hasViewportVersion &&
|
|
137
|
+
typeof previousViewportVersion === "number" &&
|
|
138
|
+
previousViewportVersion >= viewportVersion
|
|
139
|
+
) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (hasViewportVersion) {
|
|
143
|
+
window.${HOST_VIEWPORT_VERSION_KEY} = viewportVersion;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
delete window.innerWidth;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
// The WebView can continue with its current width.
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
delete window.innerHeight;
|
|
152
|
+
} catch (error) {
|
|
153
|
+
// The WebView can continue with its current height.
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
if (
|
|
157
|
+
typeof document !== "undefined" &&
|
|
158
|
+
document.documentElement &&
|
|
159
|
+
document.documentElement.style &&
|
|
160
|
+
typeof document.documentElement.style.removeProperty === "function"
|
|
161
|
+
) {
|
|
162
|
+
document.documentElement.style.removeProperty(
|
|
163
|
+
"--gx-host-viewport-max-height"
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
} catch (error) {
|
|
167
|
+
// Viewport resets are best-effort; keep the WebView runtime alive.
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
if (typeof window.dispatchEvent === "function") {
|
|
171
|
+
if (typeof Event === "function") {
|
|
172
|
+
window.dispatchEvent(new Event("resize"));
|
|
173
|
+
}
|
|
174
|
+
if (typeof CustomEvent === "function") {
|
|
175
|
+
window.dispatchEvent(
|
|
176
|
+
new CustomEvent("${VIEW_SIZE_FLUSH_EVENT}", {
|
|
177
|
+
detail: { mode: "sync" }
|
|
178
|
+
})
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
} catch (error) {
|
|
183
|
+
// Viewport resets are best-effort; keep the WebView runtime alive.
|
|
184
|
+
}
|
|
185
|
+
})();
|
|
186
|
+
true;`;
|
|
187
|
+
}
|
|
188
|
+
export function buildWebViewBridgeScript(input) {
|
|
189
|
+
const readyMessage = Object.assign({ kind: "ready" }, ((input === null || input === void 0 ? void 0 : input.instanceId) ? { instanceId: input.instanceId } : {}));
|
|
190
|
+
return `
|
|
191
|
+
(function () {
|
|
192
|
+
var hostEventNames = ${serializeForJavaScript(HOST_EVENT_NAMES)};
|
|
193
|
+
var readyMessage = ${serializeForJavaScript(readyMessage)};
|
|
194
|
+
var existingTransport = window.__getuserfeedback_webview_transport;
|
|
195
|
+
|
|
196
|
+
function postMessage(message) {
|
|
197
|
+
try {
|
|
198
|
+
var bridge = window.ReactNativeWebView;
|
|
199
|
+
if (!bridge || typeof bridge.postMessage !== "function") {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
bridge.postMessage(JSON.stringify(message));
|
|
203
|
+
return true;
|
|
204
|
+
} catch (error) {
|
|
205
|
+
// React Native is the reporting boundary; keep the WebView runtime alive.
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (
|
|
211
|
+
existingTransport &&
|
|
212
|
+
existingTransport.__getuserfeedbackBridgeInstalled === true
|
|
213
|
+
) {
|
|
214
|
+
if (
|
|
215
|
+
existingTransport.__getuserfeedbackReadyPosted !== true &&
|
|
216
|
+
postMessage(readyMessage)
|
|
217
|
+
) {
|
|
218
|
+
existingTransport.__getuserfeedbackReadyPosted = true;
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function ensureQueue() {
|
|
224
|
+
if (!Array.isArray(window.__getuserfeedback_queue)) {
|
|
225
|
+
window.__getuserfeedback_queue = [];
|
|
226
|
+
}
|
|
227
|
+
return window.__getuserfeedback_queue;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
window.__getuserfeedback_webview_transport = {
|
|
231
|
+
__getuserfeedbackBridgeInstalled: true,
|
|
232
|
+
__getuserfeedbackReadyPosted: false,
|
|
233
|
+
enqueueNativeMessage: function (message) {
|
|
234
|
+
if (!message || message.kind !== "enqueueCommand" || !message.envelope) {
|
|
235
|
+
postMessage({
|
|
236
|
+
kind: "error",
|
|
237
|
+
error: {
|
|
238
|
+
message: "Invalid native WebView transport message",
|
|
239
|
+
code: "INVALID_NATIVE_MESSAGE"
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
ensureQueue().push(message.envelope);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
for (var index = 0; index < hostEventNames.length; index += 1) {
|
|
249
|
+
(function (name) {
|
|
250
|
+
window.addEventListener("${HOST_EVENT_PREFIX}" + name, function (event) {
|
|
251
|
+
if (
|
|
252
|
+
name === "instance:open:requested" &&
|
|
253
|
+
event &&
|
|
254
|
+
typeof event.preventDefault === "function"
|
|
255
|
+
) {
|
|
256
|
+
event.preventDefault();
|
|
257
|
+
}
|
|
258
|
+
postMessage({
|
|
259
|
+
kind: "hostEvent",
|
|
260
|
+
event: {
|
|
261
|
+
name: name,
|
|
262
|
+
detail: event.detail
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
})(hostEventNames[index]);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (postMessage(readyMessage)) {
|
|
270
|
+
window.__getuserfeedback_webview_transport.__getuserfeedbackReadyPosted = true;
|
|
271
|
+
}
|
|
272
|
+
})();
|
|
273
|
+
true;`;
|
|
274
|
+
}
|
|
275
|
+
export function buildNativeMessageInjectionScript(message) {
|
|
276
|
+
return `
|
|
277
|
+
(function () {
|
|
278
|
+
var message = ${serializeForJavaScript(message)};
|
|
279
|
+
var transport = window.__getuserfeedback_webview_transport;
|
|
280
|
+
if (!transport || typeof transport.enqueueNativeMessage !== "function") {
|
|
281
|
+
window.__getuserfeedback_queue = window.__getuserfeedback_queue || [];
|
|
282
|
+
if (message && message.kind === "enqueueCommand" && message.envelope) {
|
|
283
|
+
window.__getuserfeedback_queue.push(message.envelope);
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
transport.enqueueNativeMessage(message);
|
|
288
|
+
})();
|
|
289
|
+
true;`;
|
|
290
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type WebViewHandle = {
|
|
2
|
+
injectJavaScript?: (script: string) => void;
|
|
3
|
+
};
|
|
4
|
+
export type WidgetHostLifecycleState = "awaitingReady" | "ready";
|
|
5
|
+
export type WidgetHostLifecycleEvent = {
|
|
6
|
+
type: "sourceChanged";
|
|
7
|
+
sourceKey: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: "refAttached";
|
|
10
|
+
handle: WebViewHandle;
|
|
11
|
+
} | {
|
|
12
|
+
type: "refDetached";
|
|
13
|
+
} | {
|
|
14
|
+
type: "bridgeReady";
|
|
15
|
+
sourceKey: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: "commandInjected";
|
|
18
|
+
messageId: string;
|
|
19
|
+
};
|
|
20
|
+
export type WidgetHostLifecycleSnapshot = {
|
|
21
|
+
deliveredMessageIds: ReadonlySet<string>;
|
|
22
|
+
handle: WebViewHandle | null;
|
|
23
|
+
readySequence: number;
|
|
24
|
+
sourceKey: string;
|
|
25
|
+
state: WidgetHostLifecycleState;
|
|
26
|
+
};
|
|
27
|
+
export type WidgetHostLifecycleController = {
|
|
28
|
+
getSnapshot: () => WidgetHostLifecycleSnapshot;
|
|
29
|
+
send: (event: WidgetHostLifecycleEvent) => void;
|
|
30
|
+
};
|
|
31
|
+
export declare function createWidgetHostLifecycleController(input: {
|
|
32
|
+
onChange?: () => void;
|
|
33
|
+
sourceKey: string;
|
|
34
|
+
}): WidgetHostLifecycleController;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createMachine, guard, interpret, reduce, state, transition, } from "robot3";
|
|
2
|
+
const attachHandle = reduce((context, event) => (Object.assign(Object.assign({}, context), { handle: event.handle })));
|
|
3
|
+
const detachHandle = reduce((context) => (Object.assign(Object.assign({}, context), { deliveredMessageIds: new Set(), handle: null })));
|
|
4
|
+
const markSourceChanged = reduce((context, event) => (Object.assign(Object.assign({}, context), { deliveredMessageIds: new Set(), readySequence: 0, sourceKey: event.sourceKey })));
|
|
5
|
+
const markReady = reduce((context, event) => (Object.assign(Object.assign({}, context), { deliveredMessageIds: new Set(), readySequence: context.readySequence + 1, sourceKey: event.sourceKey })));
|
|
6
|
+
const isCurrentSource = guard((context, event) => context.sourceKey === event.sourceKey);
|
|
7
|
+
const markCommandInjected = reduce((context, event) => (Object.assign(Object.assign({}, context), { deliveredMessageIds: new Set(context.deliveredMessageIds).add(event.messageId) })));
|
|
8
|
+
function createWidgetHostLifecycleMachine() {
|
|
9
|
+
const states = {
|
|
10
|
+
awaitingReady: state(transition("sourceChanged", "awaitingReady", markSourceChanged), transition("refAttached", "awaitingReady", attachHandle), transition("refDetached", "awaitingReady", detachHandle), transition("bridgeReady", "ready", isCurrentSource, markReady)),
|
|
11
|
+
ready: state(transition("sourceChanged", "awaitingReady", markSourceChanged), transition("refAttached", "ready", attachHandle), transition("refDetached", "awaitingReady", detachHandle), transition("bridgeReady", "ready", isCurrentSource, markReady), transition("commandInjected", "ready", markCommandInjected)),
|
|
12
|
+
};
|
|
13
|
+
return createMachine(states, (context) => context);
|
|
14
|
+
}
|
|
15
|
+
export function createWidgetHostLifecycleController(input) {
|
|
16
|
+
const service = interpret(createWidgetHostLifecycleMachine(), () => {
|
|
17
|
+
var _a;
|
|
18
|
+
(_a = input.onChange) === null || _a === void 0 ? void 0 : _a.call(input);
|
|
19
|
+
}, {
|
|
20
|
+
deliveredMessageIds: new Set(),
|
|
21
|
+
handle: null,
|
|
22
|
+
readySequence: 0,
|
|
23
|
+
sourceKey: input.sourceKey,
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
getSnapshot: () => ({
|
|
27
|
+
deliveredMessageIds: service.context.deliveredMessageIds,
|
|
28
|
+
handle: service.context.handle,
|
|
29
|
+
readySequence: service.context.readySequence,
|
|
30
|
+
sourceKey: service.context.sourceKey,
|
|
31
|
+
state: service.machine.current,
|
|
32
|
+
}),
|
|
33
|
+
send: (event) => {
|
|
34
|
+
service.send(event);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type WebViewTransportNativeMessage, type WebViewTransportWebMessage } from "@getuserfeedback/protocol/webview-transport";
|
|
2
|
+
import { type ComponentType, type ReactElement } from "react";
|
|
3
|
+
export type WidgetHostSource = {
|
|
4
|
+
uri: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
method?: string;
|
|
7
|
+
body?: string;
|
|
8
|
+
} | {
|
|
9
|
+
html: string;
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
};
|
|
12
|
+
interface WidgetHostBaseProps {
|
|
13
|
+
hostViewport?: {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
};
|
|
17
|
+
instanceId?: string;
|
|
18
|
+
onWebMessage?: (message: WebViewTransportWebMessage) => void;
|
|
19
|
+
onInvalidWebMessage?: (error: Error, rawMessage: unknown) => void;
|
|
20
|
+
onReady?: (event: {
|
|
21
|
+
readySequence: number;
|
|
22
|
+
sourceKey: string;
|
|
23
|
+
}) => void;
|
|
24
|
+
onReadyStateChange?: (event: {
|
|
25
|
+
isReady: boolean;
|
|
26
|
+
readySequence: number;
|
|
27
|
+
sourceKey: string;
|
|
28
|
+
}) => unknown;
|
|
29
|
+
nativeMessages?: readonly WebViewTransportNativeMessage[];
|
|
30
|
+
webViewProps?: Record<string, unknown>;
|
|
31
|
+
webViewComponent?: ComponentType<Record<string, unknown>>;
|
|
32
|
+
}
|
|
33
|
+
export interface WidgetHostProps extends WidgetHostBaseProps {
|
|
34
|
+
loaderUrl?: string;
|
|
35
|
+
source?: WidgetHostSource;
|
|
36
|
+
}
|
|
37
|
+
export declare function WidgetHost({ hostViewport, instanceId, loaderUrl, nativeMessages, onInvalidWebMessage, onReady, onReadyStateChange, onWebMessage, source, webViewComponent, webViewProps, }: WidgetHostProps): ReactElement;
|
|
38
|
+
export {};
|