Skip to content

Commit 701038d

Browse files
committed
Create bridges for preact
1 parent dcbac4b commit 701038d

File tree

8 files changed

+79
-25
lines changed

8 files changed

+79
-25
lines changed

package-lock.json

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"babel-jest": "26.6.3",
2727
"jest": "26.6.3",
2828
"metro-react-native-babel-preset": "0.65.0",
29+
"preact": "10.5.13",
2930
"react": "16.13.1",
3031
"react-dom": "16.13.1",
3132
"react-native": "0.63.4",

rollup.config.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ export default [
3434
],
3535
plugins: [typescript()],
3636
},
37+
{
38+
input: "src/web/preact.ts",
39+
output: [
40+
{
41+
file: `${mainDir}/web/preact.js`,
42+
format: "cjs",
43+
},
44+
{
45+
file: `${moduleDir}/web/preact.mjs`,
46+
format: "es",
47+
},
48+
],
49+
plugins: [typescript()],
50+
},
3751
{
3852
input: "src/plugin/index.js",
3953
output: [

src/plugin/__snapshots__/metro.spec.js.snap

Lines changed: 8 additions & 8 deletions
Large diffs are not rendered by default.

src/web/bridge.ts

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
1-
import React, { useEffect } from "react";
2-
import ReactDOM from "react-dom";
31
import { EVENT_KEY, ROOT_ID } from "../common";
42
import { Message } from "../types";
53

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+
};
911
};
1012

1113
export const emit = <T>(message: Message<T>) => {
1214
(window as any).ReactNativeWebView.postMessage(JSON.stringify(message));
1315
};
1416

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+
};
2630
};
2731

2832
const isMessageEvent = <T>(e: any): e is { detail: Message<T> } =>

src/web/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { webViewRender, emit, useSubscribe } from "./bridge";
1+
export { webViewRender, emit, useSubscribe } from "./react";

src/web/preact.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useEffect } from "preact/compat";
2+
import { render } from "preact";
3+
import { buildRender, buildUseSubscribe } from "./bridge";
4+
5+
export const webViewRender = buildRender(render);
6+
7+
export { emit } from "./bridge";
8+
9+
export const useSubscribe = buildUseSubscribe(useEffect);

src/web/react.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useEffect } from "react";
2+
import { render } from "react-dom";
3+
import { buildRender, buildUseSubscribe } from "./bridge";
4+
5+
export const webViewRender = buildRender(render);
6+
7+
export { emit } from "./bridge";
8+
9+
export const useSubscribe = buildUseSubscribe(useEffect);

0 commit comments

Comments
 (0)