|
1 | | -import { useCallback, useRef } from "react"; |
| 1 | +import { RefObject, useCallback } from "react"; |
2 | 2 | import type WebView from "react-native-webview"; |
3 | 3 | import type { WebViewMessageEvent, WebViewProps } from "react-native-webview"; |
4 | 4 | import { TO_WEB_EVENT_KEY } from "../constants"; |
@@ -28,23 +28,25 @@ export const buildEmitToWebView = <T>( |
28 | 28 | export const useWebViewMessage = <T>( |
29 | 29 | onSubscribe: (message: WebViewMessage<T>) => void |
30 | 30 | ) => { |
31 | | - const ref = useRef<WebView>(null); |
32 | | - const onMessage: WebViewProps["onMessage"] = useCallback( |
33 | | - (event: WebViewMessageEvent) => { |
| 31 | + return useCallback( |
| 32 | + ((event: WebViewMessageEvent) => { |
34 | 33 | try { |
35 | 34 | const res = JSON.parse(event.nativeEvent.data); |
36 | 35 | onSubscribe({ type: res.type, data: res.data }); |
37 | 36 | } catch (e) { |
38 | 37 | // NOP |
39 | 38 | } |
40 | | - }, |
| 39 | + }) satisfies WebViewProps["onMessage"], |
41 | 40 | [onSubscribe] |
42 | 41 | ); |
43 | | - const emit = useCallback( |
44 | | - (message: ReactNativeMessage<T>) => { |
45 | | - ref.current?.injectJavaScript(buildEmitToWebView(message)); |
46 | | - }, |
47 | | - [ref] |
48 | | - ); |
49 | | - return { ref, onMessage, emit }; |
| 42 | +}; |
| 43 | + |
| 44 | +/** |
| 45 | + * A function to send a message to WebView. |
| 46 | + */ |
| 47 | +export const emit = <T>( |
| 48 | + ref: RefObject<WebView>, |
| 49 | + message: ReactNativeMessage<T> |
| 50 | +) => { |
| 51 | + ref.current?.injectJavaScript(buildEmitToWebView(message)); |
50 | 52 | }; |
0 commit comments