@amabeth/repeating-wheel-picker 1.1.0 → 1.2.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/LICENSE +20 -20
- package/README.md +57 -57
- package/example/index.ts +8 -0
- package/example/node_modules/@expo/cli/static/template/+html.tsx +28 -0
- package/example/node_modules/@expo/cli/static/template/+native-intent.ts +9 -0
- package/example/node_modules/@expo/cli/static/template/[...rsc]+api.ts +16 -0
- package/example/node_modules/ansi-styles/index.d.ts +345 -0
- package/example/node_modules/chalk/index.d.ts +415 -0
- package/example/node_modules/commander/typings/index.d.ts +627 -0
- package/example/node_modules/expo/Expo.podspec +108 -0
- package/example/node_modules/expo/build/Expo.d.ts +8 -0
- package/example/node_modules/expo/build/Expo.fx.d.ts +4 -0
- package/example/node_modules/expo/build/Expo.fx.web.d.ts +3 -0
- package/example/node_modules/expo/build/devtools/DevToolsPluginClient.d.ts +72 -0
- package/example/node_modules/expo/build/devtools/DevToolsPluginClientFactory.d.ts +16 -0
- package/example/node_modules/expo/build/devtools/DevToolsPluginClientImplApp.d.ts +15 -0
- package/example/node_modules/expo/build/devtools/DevToolsPluginClientImplBrowser.d.ts +14 -0
- package/example/node_modules/expo/build/devtools/MessageFramePacker.d.ts +50 -0
- package/example/node_modules/expo/build/devtools/ProtocolVersion.d.ts +7 -0
- package/example/node_modules/expo/build/devtools/WebSocketBackingStore.d.ts +10 -0
- package/example/node_modules/expo/build/devtools/WebSocketWithReconnect.d.ts +81 -0
- package/example/node_modules/expo/build/devtools/devtools.types.d.ts +42 -0
- package/example/node_modules/expo/build/devtools/getConnectionInfo.d.ts +6 -0
- package/example/node_modules/expo/build/devtools/getConnectionInfo.native.d.ts +6 -0
- package/example/node_modules/expo/build/devtools/index.d.ts +12 -0
- package/example/node_modules/expo/build/devtools/logger.d.ts +6 -0
- package/example/node_modules/expo/build/dom/base.d.ts +5 -0
- package/example/node_modules/expo/build/dom/dom-entry.d.ts +3 -0
- package/example/node_modules/expo/build/dom/dom-hooks.d.ts +8 -0
- package/example/node_modules/expo/build/dom/dom.d.ts +5 -0
- package/example/node_modules/expo/build/dom/dom.types.d.ts +34 -0
- package/example/node_modules/expo/build/dom/dom.web.d.ts +3 -0
- package/example/node_modules/expo/build/dom/global-events.d.ts +4 -0
- package/example/node_modules/expo/build/dom/injection.d.ts +9 -0
- package/example/node_modules/expo/build/dom/internal.d.ts +3 -0
- package/example/node_modules/expo/build/dom/internal.web.d.ts +2 -0
- package/example/node_modules/expo/build/dom/marshal.d.ts +4 -0
- package/example/node_modules/expo/build/dom/webview/ExpoDOMWebView.d.ts +6 -0
- package/example/node_modules/expo/build/dom/webview/RNWebView.d.ts +7 -0
- package/example/node_modules/expo/build/dom/webview/useDebugZeroHeight.d.ts +12 -0
- package/example/node_modules/expo/build/dom/webview-wrapper.d.ts +16 -0
- package/example/node_modules/expo/build/environment/DevLoadingView.d.ts +3 -0
- package/example/node_modules/expo/build/environment/DevLoadingView.web.d.ts +3 -0
- package/example/node_modules/expo/build/environment/DevLoadingViewNativeModule.d.ts +9 -0
- package/example/node_modules/expo/build/environment/DevLoadingViewNativeModule.native.d.ts +3 -0
- package/example/node_modules/expo/build/environment/ExpoGo.d.ts +31 -0
- package/example/node_modules/expo/build/environment/ExpoGo.web.d.ts +3 -0
- package/example/node_modules/expo/build/environment/getInitialSafeArea.d.ts +7 -0
- package/example/node_modules/expo/build/environment/getInitialSafeArea.native.d.ts +11 -0
- package/example/node_modules/expo/build/errors/AppEntryNotFound.d.ts +2 -0
- package/example/node_modules/expo/build/errors/ExpoErrorManager.d.ts +8 -0
- package/example/node_modules/expo/build/errors/ExpoErrorManager.native.d.ts +4 -0
- package/example/node_modules/expo/build/hooks/useEvent.d.ts +59 -0
- package/example/node_modules/expo/build/launch/registerRootComponent.d.ts +30 -0
- package/example/node_modules/expo/build/launch/withDevTools.d.ts +3 -0
- package/example/node_modules/expo/build/launch/withDevTools.ios.d.ts +7 -0
- package/example/node_modules/expo/build/launch/withDevTools.web.d.ts +3 -0
- package/example/node_modules/expo/build/timer/polyfillNextTick.d.ts +6 -0
- package/example/node_modules/expo/build/utils/blobUtils.d.ts +9 -0
- package/example/node_modules/expo/build/utils/getBundleUrl.d.ts +2 -0
- package/example/node_modules/expo/build/utils/getBundleUrl.native.d.ts +2 -0
- package/example/node_modules/expo/build/utils/getBundleUrl.web.d.ts +2 -0
- package/example/node_modules/expo/build/winter/FormData.d.ts +49 -0
- package/example/node_modules/expo/build/winter/ImportMetaRegistry.d.ts +9 -0
- package/example/node_modules/expo/build/winter/TextDecoder.d.ts +20 -0
- package/example/node_modules/expo/build/winter/fetch/ExpoFetchModule.d.ts +2 -0
- package/example/node_modules/expo/build/winter/fetch/ExpoFetchModule.web.d.ts +10 -0
- package/example/node_modules/expo/build/winter/fetch/FetchErrors.d.ts +8 -0
- package/example/node_modules/expo/build/winter/fetch/FetchResponse.d.ts +31 -0
- package/example/node_modules/expo/build/winter/fetch/NativeRequest.d.ts +30 -0
- package/example/node_modules/expo/build/winter/fetch/RequestUtils.d.ts +21 -0
- package/example/node_modules/expo/build/winter/fetch/convertFormData.d.ts +19 -0
- package/example/node_modules/expo/build/winter/fetch/fetch.d.ts +4 -0
- package/example/node_modules/expo/build/winter/fetch/fetch.types.d.ts +16 -0
- package/example/node_modules/expo/build/winter/fetch/fetch.web.d.ts +2 -0
- package/example/node_modules/expo/build/winter/fetch/index.d.ts +3 -0
- package/example/node_modules/expo/build/winter/index.d.ts +2 -0
- package/example/node_modules/expo/build/winter/runtime.d.ts +2 -0
- package/example/node_modules/expo/build/winter/runtime.native.d.ts +2 -0
- package/example/node_modules/expo/build/winter/url.d.ts +23 -0
- package/example/node_modules/expo/config-plugins.d.ts +1 -0
- package/example/node_modules/expo/config.d.ts +1 -0
- package/example/node_modules/expo/devtools.d.ts +1 -0
- package/example/node_modules/expo/dom/global.d.ts +1 -0
- package/example/node_modules/expo/dom/index.d.ts +1 -0
- package/example/node_modules/expo/dom/internal.d.ts +1 -0
- package/example/node_modules/expo/fetch.d.ts +1 -0
- package/example/node_modules/expo/fingerprint.d.ts +1 -0
- package/example/node_modules/expo/metro-config.d.ts +1 -0
- package/example/node_modules/expo/react-native.config.js +50 -0
- package/example/node_modules/expo/src/Expo.fx.tsx +53 -0
- package/example/node_modules/expo/src/Expo.fx.web.tsx +21 -0
- package/example/node_modules/expo/src/Expo.ts +30 -0
- package/example/node_modules/expo/src/devtools/DevToolsPluginClient.ts +240 -0
- package/example/node_modules/expo/src/devtools/DevToolsPluginClientFactory.ts +73 -0
- package/example/node_modules/expo/src/devtools/DevToolsPluginClientImplApp.ts +56 -0
- package/example/node_modules/expo/src/devtools/DevToolsPluginClientImplBrowser.ts +38 -0
- package/example/node_modules/expo/src/devtools/MessageFramePacker.ts +235 -0
- package/example/node_modules/expo/src/devtools/ProtocolVersion.ts +6 -0
- package/example/node_modules/expo/src/devtools/WebSocketBackingStore.ts +10 -0
- package/example/node_modules/expo/src/devtools/WebSocketWithReconnect.ts +318 -0
- package/example/node_modules/expo/src/devtools/devtools.types.ts +50 -0
- package/example/node_modules/expo/src/devtools/getConnectionInfo.native.ts +18 -0
- package/example/node_modules/expo/src/devtools/getConnectionInfo.ts +16 -0
- package/example/node_modules/expo/src/devtools/index.ts +53 -0
- package/example/node_modules/expo/src/devtools/logger.ts +29 -0
- package/example/node_modules/expo/src/dom/base.ts +62 -0
- package/example/node_modules/expo/src/dom/dom-entry.tsx +128 -0
- package/example/node_modules/expo/src/dom/dom-hooks.ts +46 -0
- package/example/node_modules/expo/src/dom/dom.ts +8 -0
- package/example/node_modules/expo/src/dom/dom.types.ts +39 -0
- package/example/node_modules/expo/src/dom/dom.web.ts +6 -0
- package/example/node_modules/expo/src/dom/global-events.ts +16 -0
- package/example/node_modules/expo/src/dom/injection.ts +42 -0
- package/example/node_modules/expo/src/dom/internal.ts +5 -0
- package/example/node_modules/expo/src/dom/internal.web.ts +1 -0
- package/example/node_modules/expo/src/dom/marshal.tsx +116 -0
- package/example/node_modules/expo/src/dom/webview/ExpoDOMWebView.ts +10 -0
- package/example/node_modules/expo/src/dom/webview/RNWebView.ts +12 -0
- package/example/node_modules/expo/src/dom/webview/useDebugZeroHeight.ts +62 -0
- package/example/node_modules/expo/src/dom/webview-wrapper.tsx +253 -0
- package/example/node_modules/expo/src/environment/DevLoadingView.tsx +123 -0
- package/example/node_modules/expo/src/environment/DevLoadingView.web.tsx +135 -0
- package/example/node_modules/expo/src/environment/DevLoadingViewNativeModule.native.ts +3 -0
- package/example/node_modules/expo/src/environment/DevLoadingViewNativeModule.ts +7 -0
- package/example/node_modules/expo/src/environment/ExpoGo.ts +53 -0
- package/example/node_modules/expo/src/environment/ExpoGo.web.ts +7 -0
- package/example/node_modules/expo/src/environment/getInitialSafeArea.native.ts +16 -0
- package/example/node_modules/expo/src/environment/getInitialSafeArea.ts +8 -0
- package/example/node_modules/expo/src/errors/AppEntryNotFound.tsx +35 -0
- package/example/node_modules/expo/src/errors/ExpoErrorManager.native.ts +51 -0
- package/example/node_modules/expo/src/errors/ExpoErrorManager.ts +11 -0
- package/example/node_modules/expo/src/hooks/useEvent.ts +112 -0
- package/example/node_modules/expo/src/launch/registerRootComponent.tsx +64 -0
- package/example/node_modules/expo/src/launch/withDevTools.ios.tsx +47 -0
- package/example/node_modules/expo/src/launch/withDevTools.tsx +30 -0
- package/example/node_modules/expo/src/launch/withDevTools.web.tsx +23 -0
- package/example/node_modules/expo/src/timer/polyfillNextTick.ts +10 -0
- package/example/node_modules/expo/src/ts-declarations/console.d.ts +47 -0
- package/example/node_modules/expo/src/ts-declarations/global.d.ts +12 -0
- package/example/node_modules/expo/src/ts-declarations/react-native.d.ts +34 -0
- package/example/node_modules/expo/src/ts-declarations/whatwg-url-without-unicode.d.ts +186 -0
- package/example/node_modules/expo/src/utils/blobUtils.ts +23 -0
- package/example/node_modules/expo/src/utils/getBundleUrl.native.ts +17 -0
- package/example/node_modules/expo/src/utils/getBundleUrl.ts +5 -0
- package/example/node_modules/expo/src/utils/getBundleUrl.web.ts +21 -0
- package/example/node_modules/expo/src/winter/FormData.ts +222 -0
- package/example/node_modules/expo/src/winter/ImportMetaRegistry.ts +14 -0
- package/example/node_modules/expo/src/winter/TextDecoder.ts +429 -0
- package/example/node_modules/expo/src/winter/fetch/ExpoFetchModule.ts +3 -0
- package/example/node_modules/expo/src/winter/fetch/ExpoFetchModule.web.ts +7 -0
- package/example/node_modules/expo/src/winter/fetch/FetchErrors.ts +11 -0
- package/example/node_modules/expo/src/winter/fetch/FetchResponse.ts +146 -0
- package/example/node_modules/expo/src/winter/fetch/NativeRequest.ts +38 -0
- package/example/node_modules/expo/src/winter/fetch/RequestUtils.ts +124 -0
- package/example/node_modules/expo/src/winter/fetch/convertFormData.ts +92 -0
- package/example/node_modules/expo/src/winter/fetch/fetch.ts +59 -0
- package/example/node_modules/expo/src/winter/fetch/fetch.types.ts +17 -0
- package/example/node_modules/expo/src/winter/fetch/fetch.web.ts +1 -0
- package/example/node_modules/expo/src/winter/fetch/index.ts +2 -0
- package/example/node_modules/expo/src/winter/index.ts +1 -0
- package/example/node_modules/expo/src/winter/runtime.native.ts +41 -0
- package/example/node_modules/expo/src/winter/runtime.ts +5 -0
- package/example/node_modules/expo/src/winter/url.ts +116 -0
- package/example/node_modules/expo/types/global.d.ts +38 -0
- package/example/node_modules/expo/types/index.d.ts +3 -0
- package/example/node_modules/expo/types/metro-require.d.ts +52 -0
- package/example/node_modules/expo/types/react-native-web.d.ts +291 -0
- package/example/node_modules/expo-modules-autolinking/build/ExpoModuleConfig.d.ts +85 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/findModules.d.ts +5 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/generatePackageList.d.ts +11 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/getConfiguration.d.ts +2 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/index.d.ts +17 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/mergeLinkingOptions.d.ts +21 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/resolveModules.d.ts +9 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/utils.d.ts +6 -0
- package/example/node_modules/expo-modules-autolinking/build/autolinking/verifySearchResults.d.ts +5 -0
- package/example/node_modules/expo-modules-autolinking/build/fileUtils.d.ts +18 -0
- package/example/node_modules/expo-modules-autolinking/build/index.d.ts +1 -0
- package/example/node_modules/expo-modules-autolinking/build/platforms/android.d.ts +38 -0
- package/example/node_modules/expo-modules-autolinking/build/platforms/apple.d.ts +15 -0
- package/example/node_modules/expo-modules-autolinking/build/platforms/devtools.d.ts +3 -0
- package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/androidResolver.d.ts +20 -0
- package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/config.d.ts +5 -0
- package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/index.d.ts +2 -0
- package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/iosResolver.d.ts +2 -0
- package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/reactNativeConfig.d.ts +13 -0
- package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/reactNativeConfig.types.d.ts +95 -0
- package/example/node_modules/expo-modules-autolinking/build/types.d.ts +319 -0
- package/example/node_modules/expo-modules-autolinking/e2e/TestUtils.ts +53 -0
- package/example/node_modules/expo-modules-autolinking/exports.d.ts +1 -0
- package/example/node_modules/expo-modules-autolinking/src/ExpoModuleConfig.ts +181 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/findModules.ts +259 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/generatePackageList.ts +46 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/getConfiguration.ts +7 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/index.ts +45 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/mergeLinkingOptions.ts +127 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/resolveModules.ts +46 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/utils.ts +37 -0
- package/example/node_modules/expo-modules-autolinking/src/autolinking/verifySearchResults.ts +33 -0
- package/example/node_modules/expo-modules-autolinking/src/fileUtils.ts +64 -0
- package/example/node_modules/expo-modules-autolinking/src/index.ts +262 -0
- package/example/node_modules/expo-modules-autolinking/src/platforms/android.ts +303 -0
- package/example/node_modules/expo-modules-autolinking/src/platforms/apple.ts +292 -0
- package/example/node_modules/expo-modules-autolinking/src/platforms/devtools.ts +25 -0
- package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/androidResolver.ts +264 -0
- package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/config.ts +67 -0
- package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/index.ts +2 -0
- package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/iosResolver.ts +37 -0
- package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/reactNativeConfig.ts +245 -0
- package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/reactNativeConfig.types.ts +107 -0
- package/example/node_modules/expo-modules-autolinking/src/types.ts +384 -0
- package/example/node_modules/find-up/index.d.ts +138 -0
- package/example/node_modules/glob/dist/commonjs/glob.d.ts +388 -0
- package/example/node_modules/glob/dist/commonjs/has-magic.d.ts +14 -0
- package/example/node_modules/glob/dist/commonjs/ignore.d.ts +24 -0
- package/example/node_modules/glob/dist/commonjs/index.d.ts +97 -0
- package/example/node_modules/glob/dist/commonjs/pattern.d.ts +76 -0
- package/example/node_modules/glob/dist/commonjs/processor.d.ts +59 -0
- package/example/node_modules/glob/dist/commonjs/walker.d.ts +97 -0
- package/example/node_modules/glob/dist/esm/glob.d.ts +388 -0
- package/example/node_modules/glob/dist/esm/has-magic.d.ts +14 -0
- package/example/node_modules/glob/dist/esm/ignore.d.ts +24 -0
- package/example/node_modules/glob/dist/esm/index.d.ts +97 -0
- package/example/node_modules/glob/dist/esm/pattern.d.ts +76 -0
- package/example/node_modules/glob/dist/esm/processor.d.ts +59 -0
- package/example/node_modules/glob/dist/esm/walker.d.ts +97 -0
- package/example/node_modules/locate-path/index.d.ts +83 -0
- package/example/node_modules/log-symbols/node_modules/chalk/types/index.d.ts +97 -0
- package/example/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
- package/example/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
- package/example/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
- package/example/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
- package/example/node_modules/minimatch/dist/commonjs/index.d.ts +94 -0
- package/example/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
- package/example/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
- package/example/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
- package/example/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
- package/example/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
- package/example/node_modules/minimatch/dist/esm/index.d.ts +94 -0
- package/example/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
- package/example/node_modules/ora/index.d.ts +257 -0
- package/example/node_modules/ora/node_modules/chalk/types/index.d.ts +97 -0
- package/example/node_modules/ora/node_modules/strip-ansi/index.d.ts +15 -0
- package/example/node_modules/p-locate/index.d.ts +53 -0
- package/example/node_modules/path-exists/index.d.ts +28 -0
- package/example/package.json +29 -0
- package/example/src/constants/styles.ts +43 -0
- package/example/src/hooks/useComponentHeight.ts +13 -0
- package/example/src/scenes/app.tsx +33 -0
- package/example/src/scenes/booleanPicker.tsx +60 -0
- package/example/src/scenes/customTypePicker.tsx +83 -0
- package/example/src/scenes/numberPicker.tsx +75 -0
- package/example/src/scenes/stringPicker.tsx +64 -0
- package/lib/module/index.js +6 -6
- package/lib/module/index.js.map +1 -1
- package/package.json +168 -183
- package/src/index.tsx +0 -507
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import { DevToolsPluginClient } from './DevToolsPluginClient';
|
|
4
|
+
import { getDevToolsPluginClientAsync } from './DevToolsPluginClientFactory';
|
|
5
|
+
import type { DevToolsPluginClientOptions } from './devtools.types';
|
|
6
|
+
|
|
7
|
+
export { getDevToolsPluginClientAsync, DevToolsPluginClient };
|
|
8
|
+
export type { DevToolsPluginClientOptions };
|
|
9
|
+
// Export the EventSubscription type if people need to use explicit type from `addMessageListener`
|
|
10
|
+
export type { EventSubscription } from './DevToolsPluginClient';
|
|
11
|
+
export { setEnableLogging } from './logger';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A React hook to get the DevToolsPluginClient instance.
|
|
15
|
+
*/
|
|
16
|
+
export function useDevToolsPluginClient(
|
|
17
|
+
pluginName: string,
|
|
18
|
+
options?: DevToolsPluginClientOptions
|
|
19
|
+
): DevToolsPluginClient | null {
|
|
20
|
+
const [client, setClient] = useState<DevToolsPluginClient | null>(null);
|
|
21
|
+
const [error, setError] = useState<Error | null>(null);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
async function setup() {
|
|
25
|
+
try {
|
|
26
|
+
const client = await getDevToolsPluginClientAsync(pluginName, options);
|
|
27
|
+
setClient(client);
|
|
28
|
+
} catch (e: any) {
|
|
29
|
+
setError(new Error('Failed to setup client from useDevToolsPluginClient: ' + e.toString()));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function teardown() {
|
|
34
|
+
try {
|
|
35
|
+
await client?.closeAsync();
|
|
36
|
+
} catch (e: any) {
|
|
37
|
+
setError(
|
|
38
|
+
new Error('Failed to teardown client from useDevToolsPluginClient: ' + e.toString())
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
setup();
|
|
44
|
+
return () => {
|
|
45
|
+
teardown();
|
|
46
|
+
};
|
|
47
|
+
}, [pluginName]);
|
|
48
|
+
|
|
49
|
+
if (error != null) {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
return client;
|
|
53
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
let enableLogging = false;
|
|
2
|
+
|
|
3
|
+
export function log(...params: Parameters<typeof console.log>) {
|
|
4
|
+
if (enableLogging) {
|
|
5
|
+
console.log(...params);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function debug(...params: Parameters<typeof console.debug>) {
|
|
10
|
+
if (enableLogging) {
|
|
11
|
+
console.debug(...params);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function info(...params: Parameters<typeof console.info>) {
|
|
16
|
+
if (enableLogging) {
|
|
17
|
+
console.info(...params);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function warn(...params: Parameters<typeof console.info>) {
|
|
22
|
+
if (enableLogging) {
|
|
23
|
+
console.warn(...params);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function setEnableLogging(enabled: boolean) {
|
|
28
|
+
enableLogging = enabled;
|
|
29
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
let cachedBaseUrl: string | null = null;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Get the base URL for the DOM Components HTML
|
|
5
|
+
*/
|
|
6
|
+
export function getBaseURL(): string {
|
|
7
|
+
if (cachedBaseUrl != null) {
|
|
8
|
+
return cachedBaseUrl;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Serving from updates
|
|
12
|
+
const updatesBaseUrl = getUpdatesBaseURL();
|
|
13
|
+
if (updatesBaseUrl != null) {
|
|
14
|
+
cachedBaseUrl = updatesBaseUrl;
|
|
15
|
+
return cachedBaseUrl;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (process.env.EXPO_OS === 'web') {
|
|
19
|
+
cachedBaseUrl = process.env.EXPO_BASE_URL ?? '';
|
|
20
|
+
return cachedBaseUrl;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Serving from local production
|
|
24
|
+
if (process.env.NODE_ENV === 'production') {
|
|
25
|
+
if (process.env.EXPO_OS === 'android') {
|
|
26
|
+
cachedBaseUrl = 'file:///android_asset/www.bundle';
|
|
27
|
+
} else if (process.env.EXPO_OS === 'ios') {
|
|
28
|
+
cachedBaseUrl = 'www.bundle';
|
|
29
|
+
} else {
|
|
30
|
+
cachedBaseUrl = process.env.EXPO_BASE_URL ?? '';
|
|
31
|
+
}
|
|
32
|
+
return cachedBaseUrl;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Serving from local dev server
|
|
36
|
+
const getDevServer = require('react-native/Libraries/Core/Devtools/getDevServer').default;
|
|
37
|
+
const devServer = getDevServer();
|
|
38
|
+
cachedBaseUrl = new URL('/_expo/@dom', devServer.url).toString();
|
|
39
|
+
return cachedBaseUrl;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get the base URL for the DOM Components when serving from updates
|
|
44
|
+
*/
|
|
45
|
+
function getUpdatesBaseURL(): string | null {
|
|
46
|
+
const ExpoUpdates = globalThis.expo?.modules?.['ExpoUpdates'] as
|
|
47
|
+
| import('expo-updates').ExpoUpdatesModule
|
|
48
|
+
| undefined;
|
|
49
|
+
const updatesIsInstalledAndEnabled = ExpoUpdates?.isEnabled ?? false;
|
|
50
|
+
const updatesIsEmbeddedLaunch = ExpoUpdates?.isEmbeddedLaunch ?? false;
|
|
51
|
+
const shouldServeDomFromUpdates = updatesIsInstalledAndEnabled && !updatesIsEmbeddedLaunch;
|
|
52
|
+
// If updates is installed and enabled, and we're not running from an embedded launch, we should serve the DOM Components from the `.expo-internal` directory
|
|
53
|
+
if (shouldServeDomFromUpdates) {
|
|
54
|
+
const localAssets = ExpoUpdates?.localAssets ?? {};
|
|
55
|
+
const anyLocalAsset = Object.values(localAssets)[0];
|
|
56
|
+
if (anyLocalAsset) {
|
|
57
|
+
// Try to get the `.expo-internal` directory from the first local asset
|
|
58
|
+
return anyLocalAsset.slice(0, anyLocalAsset.lastIndexOf('/'));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Entry file for a DOM Component.
|
|
2
|
+
import '@expo/metro-runtime';
|
|
3
|
+
|
|
4
|
+
import { withErrorOverlay } from '@expo/metro-runtime/error-overlay';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
import { JSONValue } from './dom.types';
|
|
8
|
+
import { addEventListener, getActionsObject } from './marshal';
|
|
9
|
+
import registerRootComponent from '../launch/registerRootComponent';
|
|
10
|
+
|
|
11
|
+
interface MarshalledProps {
|
|
12
|
+
name: string[];
|
|
13
|
+
props: Record<string, JSONValue>;
|
|
14
|
+
[key: string]: undefined | JSONValue;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface WindowType {
|
|
18
|
+
$$EXPO_INITIAL_PROPS?: MarshalledProps;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
declare let window: WindowType;
|
|
22
|
+
|
|
23
|
+
const ACTIONS = getActionsObject!();
|
|
24
|
+
|
|
25
|
+
function isBaseObject(obj: any) {
|
|
26
|
+
if (Object.prototype.toString.call(obj) !== '[object Object]') {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const proto = Object.getPrototypeOf(obj);
|
|
30
|
+
if (proto === null) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return proto === Object.prototype;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isErrorShaped(error: any): error is Error {
|
|
37
|
+
return (
|
|
38
|
+
error &&
|
|
39
|
+
typeof error === 'object' &&
|
|
40
|
+
typeof error.name === 'string' &&
|
|
41
|
+
typeof error.message === 'string'
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* After we throw this error, any number of tools could handle it.
|
|
47
|
+
* This check ensures the error is always in a reasonable state before surfacing it to the runtime.
|
|
48
|
+
*/
|
|
49
|
+
function convertError(error: any) {
|
|
50
|
+
if (isErrorShaped(error)) {
|
|
51
|
+
return error;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (process.env.NODE_ENV === 'development') {
|
|
55
|
+
if (error == null) {
|
|
56
|
+
return new Error('A null/undefined error was thrown.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (isBaseObject(error)) {
|
|
61
|
+
return new Error(JSON.stringify(error));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return new Error(String(error));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function registerDOMComponent(AppModule: any) {
|
|
68
|
+
function DOMComponentRoot(props: Record<string, unknown>) {
|
|
69
|
+
// Props listeners
|
|
70
|
+
const [marshalledProps, setProps] = React.useState(() => {
|
|
71
|
+
if (typeof window.$$EXPO_INITIAL_PROPS === 'undefined') {
|
|
72
|
+
throw new Error(
|
|
73
|
+
'Initial props are not defined. This is a bug in the DOM Component runtime.'
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
return window.$$EXPO_INITIAL_PROPS;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
React.useEffect(() => {
|
|
80
|
+
const remove = addEventListener!((msg) => {
|
|
81
|
+
if (msg.type === '$$props') {
|
|
82
|
+
setProps(msg.data as MarshalledProps);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
return () => {
|
|
86
|
+
remove();
|
|
87
|
+
};
|
|
88
|
+
}, [setProps]);
|
|
89
|
+
|
|
90
|
+
const proxyActions = React.useMemo(() => {
|
|
91
|
+
if (!marshalledProps.names) return {};
|
|
92
|
+
// Create a named map { [name: string]: ProxyFunction }
|
|
93
|
+
// TODO(@kitten): Unclear how this is typed or shaped
|
|
94
|
+
return Object.fromEntries(
|
|
95
|
+
(marshalledProps.names as string[]).map((key: string) => {
|
|
96
|
+
return [key, ACTIONS[key]];
|
|
97
|
+
})
|
|
98
|
+
);
|
|
99
|
+
}, [marshalledProps.names]);
|
|
100
|
+
|
|
101
|
+
return <AppModule {...props} {...(marshalledProps.props || {})} {...proxyActions} />;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
React.startTransition(() => {
|
|
106
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
107
|
+
registerRootComponent(withErrorOverlay(DOMComponentRoot));
|
|
108
|
+
} else {
|
|
109
|
+
registerRootComponent(DOMComponentRoot);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
} catch (e) {
|
|
113
|
+
const error = convertError(e);
|
|
114
|
+
// Prevent the app from throwing confusing:
|
|
115
|
+
// ERROR Invariant Violation: "main" has not been registered. This can happen if:
|
|
116
|
+
// * Metro (the local dev server) is run from the wrong folder. Check if Metro is running, stop it and restart it in the current project.
|
|
117
|
+
// * A module failed to load due to an error and `AppRegistry.registerComponent` wasn't called.
|
|
118
|
+
registerRootComponent(() => React.createElement('div'));
|
|
119
|
+
|
|
120
|
+
console.error(error);
|
|
121
|
+
console.error(`A runtime error has occurred while rendering the root component.`);
|
|
122
|
+
|
|
123
|
+
// Give React a tick to render before throwing.
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
throw error;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useCallback, useEffect, useImperativeHandle, type DependencyList, type Ref } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { DOMImperativeFactory } from './dom.types';
|
|
4
|
+
import { REGISTER_DOM_IMPERATIVE_HANDLE_PROPS } from './injection';
|
|
5
|
+
|
|
6
|
+
declare namespace globalThis {
|
|
7
|
+
let _domRefProxy: undefined | unknown;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A React `useImperativeHandle` like hook for DOM components.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
export function useDOMImperativeHandle<T extends DOMImperativeFactory>(
|
|
15
|
+
ref: Ref<T>,
|
|
16
|
+
init: () => T,
|
|
17
|
+
deps?: DependencyList
|
|
18
|
+
) {
|
|
19
|
+
// @ts-expect-error: Added via react-native-webview
|
|
20
|
+
const isTargetWeb = typeof window.ReactNativeWebView === 'undefined';
|
|
21
|
+
|
|
22
|
+
const stubHandlerFactory = useCallback(() => ({}) as T, deps ?? []);
|
|
23
|
+
|
|
24
|
+
// This standard useImperativeHandle hook is serving for web
|
|
25
|
+
useImperativeHandle(ref, isTargetWeb ? init : stubHandlerFactory, deps);
|
|
26
|
+
|
|
27
|
+
// This `globalThis._domRefProxy` is serving for native
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!isTargetWeb) {
|
|
30
|
+
globalThis._domRefProxy = init();
|
|
31
|
+
// TODO(@kitten): Type `ReactNativeWebView` and the message data
|
|
32
|
+
// @ts-expect-error: Added via react-native-webview
|
|
33
|
+
window.ReactNativeWebView.postMessage(
|
|
34
|
+
JSON.stringify({
|
|
35
|
+
type: REGISTER_DOM_IMPERATIVE_HANDLE_PROPS,
|
|
36
|
+
data: Object.keys(globalThis._domRefProxy as any),
|
|
37
|
+
})
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
if (!isTargetWeb) {
|
|
42
|
+
globalThis._domRefProxy = undefined;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}, deps);
|
|
46
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Native file
|
|
2
|
+
|
|
3
|
+
export * from './dom-hooks';
|
|
4
|
+
export type { DOMProps, DOMImperativeFactory } from './dom.types';
|
|
5
|
+
|
|
6
|
+
// TODO: Maybe this could be a bundler global instead.
|
|
7
|
+
/** @returns `true` when the current JS running in a DOM Component environment. */
|
|
8
|
+
export const IS_DOM = false;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { RNWebView, RNWebViewProps } from './webview/RNWebView';
|
|
2
|
+
|
|
3
|
+
export type JSONValue = boolean | number | string | null | JSONArray | JSONObject;
|
|
4
|
+
|
|
5
|
+
export interface JSONArray extends Array<JSONValue> {}
|
|
6
|
+
|
|
7
|
+
export interface JSONObject {
|
|
8
|
+
[key: string]: JSONValue | undefined;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type BridgeMessage<TData extends JSONValue> = {
|
|
12
|
+
type: string;
|
|
13
|
+
data: TData;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The return type of the init function for `useDOMImperativeHandle`.
|
|
18
|
+
*/
|
|
19
|
+
export interface DOMImperativeFactory {
|
|
20
|
+
[key: string]: (...args: JSONValue[]) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type RNWebViewRef = RNWebView;
|
|
24
|
+
export type WebViewRef = RNWebViewRef;
|
|
25
|
+
export type WebViewProps = RNWebViewProps;
|
|
26
|
+
|
|
27
|
+
export interface DOMProps extends Omit<RNWebViewProps, 'source'> {
|
|
28
|
+
/**
|
|
29
|
+
* Whether to resize the native WebView size based on the DOM content size.
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
32
|
+
matchContents?: boolean;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Whether to use the `@expo/dom-webview` as the underlying WebView implementation.
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
useExpoDOMWebView?: boolean;
|
|
39
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BridgeMessage, JSONValue } from './dom.types';
|
|
2
|
+
|
|
3
|
+
const globalListeners = new Set<(message: BridgeMessage<any>) => void>();
|
|
4
|
+
|
|
5
|
+
export function _emitGlobalEvent<TData extends JSONValue>(message: BridgeMessage<TData>) {
|
|
6
|
+
globalListeners.forEach((listener) => listener(message));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const addGlobalDomEventListener = <TData extends JSONValue>(
|
|
10
|
+
onSubscribe: (message: BridgeMessage<TData>) => void
|
|
11
|
+
): (() => void) => {
|
|
12
|
+
globalListeners.add(onSubscribe);
|
|
13
|
+
return () => {
|
|
14
|
+
globalListeners.delete(onSubscribe);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { BridgeMessage } from './dom.types';
|
|
2
|
+
|
|
3
|
+
export const NATIVE_ACTION = '$$native_action';
|
|
4
|
+
export const NATIVE_ACTION_RESULT = '$$native_action_result';
|
|
5
|
+
export const DOM_EVENT = '$$dom_event';
|
|
6
|
+
export const MATCH_CONTENTS_EVENT = '$$match_contents_event';
|
|
7
|
+
export const REGISTER_DOM_IMPERATIVE_HANDLE_PROPS = '$$register_dom_imperative_handle_props';
|
|
8
|
+
|
|
9
|
+
export const getInjectEventScript = <T extends BridgeMessage<any>>(detail: T) => {
|
|
10
|
+
return `;(function() {
|
|
11
|
+
try {
|
|
12
|
+
window.dispatchEvent(new CustomEvent("${DOM_EVENT}",${JSON.stringify({ detail })}));
|
|
13
|
+
} catch (e) {}
|
|
14
|
+
})();
|
|
15
|
+
true;`;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export function getInjectBodySizeObserverScript() {
|
|
19
|
+
return `;(function observeDocumentBodySize() {
|
|
20
|
+
window.addEventListener('DOMContentLoaded', () => {
|
|
21
|
+
new ResizeObserver(entries => {
|
|
22
|
+
const { width, height } = entries[0].contentRect;
|
|
23
|
+
window.ReactNativeWebView?.postMessage(JSON.stringify({
|
|
24
|
+
type: '${MATCH_CONTENTS_EVENT}',
|
|
25
|
+
data: {
|
|
26
|
+
width,
|
|
27
|
+
height,
|
|
28
|
+
},
|
|
29
|
+
}));
|
|
30
|
+
})
|
|
31
|
+
.observe(document.body);
|
|
32
|
+
window.ReactNativeWebView?.postMessage(JSON.stringify({
|
|
33
|
+
type: '${MATCH_CONTENTS_EVENT}',
|
|
34
|
+
data: {
|
|
35
|
+
width: document.body.clientWidth,
|
|
36
|
+
height: document.body.clientHeight,
|
|
37
|
+
},
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
})();
|
|
41
|
+
true;`;
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { registerDOMComponent } from './dom-entry';
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { BridgeMessage, JSONValue } from './dom.types';
|
|
2
|
+
import { DOM_EVENT, NATIVE_ACTION, NATIVE_ACTION_RESULT } from './injection';
|
|
3
|
+
|
|
4
|
+
const IS_DOM =
|
|
5
|
+
typeof window !== 'undefined' &&
|
|
6
|
+
// @ts-expect-error: Added via react-native-webview
|
|
7
|
+
typeof window.ReactNativeWebView !== 'undefined';
|
|
8
|
+
|
|
9
|
+
const emit = <TData extends JSONValue>(message: BridgeMessage<TData>) => {
|
|
10
|
+
if (!IS_DOM) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
(window as any).ReactNativeWebView.postMessage(JSON.stringify(message));
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const addEventListener = <TData extends JSONValue>(
|
|
17
|
+
onSubscribe: (message: BridgeMessage<TData>) => void
|
|
18
|
+
): (() => void) => {
|
|
19
|
+
if (!IS_DOM) {
|
|
20
|
+
return () => {};
|
|
21
|
+
}
|
|
22
|
+
const listener = ({ detail }: any) => {
|
|
23
|
+
onSubscribe(detail);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// TODO: Add component ID to the event name to prevent conflicts with other components.
|
|
27
|
+
window.addEventListener(DOM_EVENT, listener);
|
|
28
|
+
return () => {
|
|
29
|
+
window.removeEventListener(DOM_EVENT, listener);
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function invokeNativeAction(actionId: string, args: any[]): Promise<any> {
|
|
34
|
+
if (!IS_DOM) {
|
|
35
|
+
throw new Error('Cannot invoke native actions outside of a webview');
|
|
36
|
+
}
|
|
37
|
+
return new Promise((res, rej) => {
|
|
38
|
+
const uid = Math.random().toString(36).slice(2);
|
|
39
|
+
const sub = addEventListener<{
|
|
40
|
+
uid: string;
|
|
41
|
+
actionId: string;
|
|
42
|
+
result?: any;
|
|
43
|
+
error?: any;
|
|
44
|
+
}>((message) => {
|
|
45
|
+
if (
|
|
46
|
+
message.type === NATIVE_ACTION_RESULT &&
|
|
47
|
+
message.data.uid === uid &&
|
|
48
|
+
message.data.actionId === actionId
|
|
49
|
+
) {
|
|
50
|
+
// Unsubscribe from the event listener
|
|
51
|
+
sub();
|
|
52
|
+
if ('error' in message.data) {
|
|
53
|
+
rej(errorFromJson(message.data.error));
|
|
54
|
+
}
|
|
55
|
+
res(message.data.result);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
emit({
|
|
59
|
+
type: NATIVE_ACTION,
|
|
60
|
+
data: {
|
|
61
|
+
uid,
|
|
62
|
+
actionId,
|
|
63
|
+
args,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function getActionsObject(): Record<string, (...args: any[]) => void | Promise<any>> {
|
|
70
|
+
return new Proxy(
|
|
71
|
+
{},
|
|
72
|
+
{
|
|
73
|
+
get(_target, prop) {
|
|
74
|
+
return async (...args: any[]) => {
|
|
75
|
+
const resolvedProps = await Promise.all(
|
|
76
|
+
args.map((arg, index) => {
|
|
77
|
+
if (arg instanceof Promise) {
|
|
78
|
+
console.warn(
|
|
79
|
+
`The promise passed to native action "${prop.toString()}(${new Array(index).fill(',').join('')}promise)" will be evaluated on the web-side before sending to native. This may not be what you want.`
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return arg;
|
|
83
|
+
})
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
// Assert that props must be serializable
|
|
87
|
+
resolvedProps.forEach((arg, index) => {
|
|
88
|
+
if (!arg) return;
|
|
89
|
+
|
|
90
|
+
if (typeof arg === 'function') {
|
|
91
|
+
console.error('Functions are not supported in arguments');
|
|
92
|
+
throw new Error('Functions are not supported in arguments');
|
|
93
|
+
} else if (typeof arg === 'object') {
|
|
94
|
+
try {
|
|
95
|
+
JSON.stringify(arg);
|
|
96
|
+
} catch (cause) {
|
|
97
|
+
console.error('Functions are not supported in arguments');
|
|
98
|
+
throw new Error(`Argument at index ${index} is not serializable`, { cause });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return invokeNativeAction(prop.toString(), resolvedProps);
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function errorFromJson(errorJson: any) {
|
|
111
|
+
const error = new Error(errorJson.message);
|
|
112
|
+
for (const key of Object.keys(errorJson)) {
|
|
113
|
+
(error as any)[key] = errorJson[key];
|
|
114
|
+
}
|
|
115
|
+
return error;
|
|
116
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A re-export of `react-native-webview` that supports optional dependency.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
let module: undefined | typeof import('react-native-webview').WebView;
|
|
6
|
+
try {
|
|
7
|
+
module = require('react-native-webview').WebView;
|
|
8
|
+
} catch {}
|
|
9
|
+
|
|
10
|
+
export default module;
|
|
11
|
+
|
|
12
|
+
export type { WebView as RNWebView, WebViewProps as RNWebViewProps } from 'react-native-webview';
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { type ViewProps } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import { type DOMProps, type WebViewProps } from '../dom.types';
|
|
5
|
+
|
|
6
|
+
type UseDebugZeroHeightType = (dom?: DOMProps) => {
|
|
7
|
+
debugZeroHeightStyle: WebViewProps['containerStyle'] | undefined;
|
|
8
|
+
debugOnLayout: ViewProps['onLayout'];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Debug only hook to help identify zero height issues in the DOM component.
|
|
13
|
+
*/
|
|
14
|
+
export const useDebugZeroHeight: UseDebugZeroHeightType = __DEV__
|
|
15
|
+
? (dom) => {
|
|
16
|
+
const [debugZeroHeightStyle, setDebugZeroHeightStyle] = useState<
|
|
17
|
+
WebViewProps['containerStyle'] | undefined
|
|
18
|
+
>(undefined);
|
|
19
|
+
const [hasLoggedWarning, setHasLoggedWarning] = useState(false);
|
|
20
|
+
|
|
21
|
+
const debugOnLayout = useCallback<NonNullable<ViewProps['onLayout']>>(
|
|
22
|
+
(event) => {
|
|
23
|
+
dom?.onLayout?.(event);
|
|
24
|
+
if (dom?.matchContents) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (debugZeroHeightStyle !== undefined) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (event.nativeEvent.layout.height === 0) {
|
|
31
|
+
if (!hasLoggedWarning) {
|
|
32
|
+
console.warn(`
|
|
33
|
+
The DOM component has a zero height in native hierarchy.
|
|
34
|
+
We are adding a debug style to help you identify the issue.
|
|
35
|
+
You can remove this style by using the \`matchContents\` prop or explicitly add a height from the component callsite.
|
|
36
|
+
\`\`\`
|
|
37
|
+
<YourDomComponent dom={{ matchContents: true }} />
|
|
38
|
+
// or
|
|
39
|
+
<YourDomComponent dom={{ style: { height: 50 } }} />
|
|
40
|
+
\`\`\`
|
|
41
|
+
`);
|
|
42
|
+
setHasLoggedWarning(true);
|
|
43
|
+
}
|
|
44
|
+
setDebugZeroHeightStyle({
|
|
45
|
+
borderWidth: 1,
|
|
46
|
+
borderColor: 'red',
|
|
47
|
+
borderRadius: 2,
|
|
48
|
+
minHeight: 40,
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
setDebugZeroHeightStyle({});
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
[dom?.matchContents, dom?.onLayout, debugZeroHeightStyle, hasLoggedWarning]
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
return { debugZeroHeightStyle, debugOnLayout };
|
|
58
|
+
}
|
|
59
|
+
: (dom) => ({
|
|
60
|
+
debugZeroHeightStyle: undefined,
|
|
61
|
+
debugOnLayout: dom?.onLayout,
|
|
62
|
+
});
|