|
1 | | -import React, { useEffect } from "react"; |
2 | | -import ReactDOM from "react-dom"; |
3 | 1 | import { EVENT_KEY, ROOT_ID } from "../common"; |
4 | 2 | import { Message } from "../types"; |
5 | 3 |
|
6 | | -export const webViewRender = (root: JSX.Element): string => { |
7 | | - ReactDOM.render(root, document.getElementById(ROOT_ID)); |
8 | | - return ""; // dummy |
| 4 | +export const buildRender = <T extends (a: any, b: HTMLElement) => void>( |
| 5 | + render: T |
| 6 | +) => { |
| 7 | + return (root: Parameters<T>[0]): string => { |
| 8 | + render(root, document.getElementById(ROOT_ID)!); |
| 9 | + return ""; // dummy |
| 10 | + }; |
9 | 11 | }; |
10 | 12 |
|
11 | 13 | export const emit = <T>(message: Message<T>) => { |
12 | 14 | (window as any).ReactNativeWebView.postMessage(JSON.stringify(message)); |
13 | 15 | }; |
14 | 16 |
|
15 | | -export const useSubscribe = <T>(onSubscribe: (message: Message<T>) => void) => { |
16 | | - useEffect(() => { |
17 | | - const listener = (e: any) => { |
18 | | - if (!isMessageEvent<T>(e)) return; |
19 | | - onSubscribe({ type: e.detail.type, data: e.detail.data }); |
20 | | - }; |
21 | | - window.addEventListener(EVENT_KEY, listener); |
22 | | - return () => { |
23 | | - window.removeEventListener(EVENT_KEY, listener); |
24 | | - }; |
25 | | - }, [onSubscribe]); |
| 17 | +export const buildUseSubscribe = (useEffect: any) => { |
| 18 | + return <T>(onSubscribe: (message: Message<T>) => void) => { |
| 19 | + useEffect(() => { |
| 20 | + const listener = (e: any) => { |
| 21 | + if (!isMessageEvent<T>(e)) return; |
| 22 | + onSubscribe({ type: e.detail.type, data: e.detail.data }); |
| 23 | + }; |
| 24 | + window.addEventListener(EVENT_KEY, listener); |
| 25 | + return () => { |
| 26 | + window.removeEventListener(EVENT_KEY, listener); |
| 27 | + }; |
| 28 | + }, [onSubscribe]); |
| 29 | + }; |
26 | 30 | }; |
27 | 31 |
|
28 | 32 | const isMessageEvent = <T>(e: any): e is { detail: Message<T> } => |
|
0 commit comments