Skip to content

Commit b181b02

Browse files
authored
Merge pull request #175 from inokawa/message-type
Seprate Message type into 2 types
2 parents ef121b3 + 06162ca commit b181b02

File tree

7 files changed

+32
-25
lines changed

7 files changed

+32
-25
lines changed

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
*
44
* @module
55
*/
6-
export type { Message } from "./types";
6+
export type { ReactNativeMessage, WebViewMessage } from "./types";
77
export { useWebViewMessage } from "./native";

src/native/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import { useCallback, useRef } from "react";
22
import type WebView from "react-native-webview";
33
import type { WebViewMessageEvent, WebViewProps } from "react-native-webview";
44
import { TO_WEB_EVENT_KEY } from "../constants";
5-
import type { Message } from "../types";
5+
import type { ReactNativeMessage, WebViewMessage } from "../types";
66

77
/**
88
* @internal
99
*/
10-
export const buildEmitCode = <T>(message: Message<T>): string => {
10+
export const buildEmitToWebView = <T>(
11+
message: ReactNativeMessage<T>
12+
): string => {
1113
return `(function() {
1214
try {
1315
window.dispatchEvent(new CustomEvent("${TO_WEB_EVENT_KEY}",{detail:${JSON.stringify(
@@ -24,7 +26,7 @@ export const buildEmitCode = <T>(message: Message<T>): string => {
2426
* A hook to subscribe messages from WebView.
2527
*/
2628
export const useWebViewMessage = <T>(
27-
onSubscribe: (message: Message<T>) => void
29+
onSubscribe: (message: WebViewMessage<T>) => void
2830
) => {
2931
const ref = useRef<WebView>(null);
3032
const onMessage: WebViewProps["onMessage"] = useCallback(
@@ -39,8 +41,8 @@ export const useWebViewMessage = <T>(
3941
[onSubscribe]
4042
);
4143
const emit = useCallback(
42-
(message: Message<T>) => {
43-
ref.current?.injectJavaScript(buildEmitCode(message));
44+
(message: ReactNativeMessage<T>) => {
45+
ref.current?.injectJavaScript(buildEmitToWebView(message));
4446
},
4547
[ref]
4648
);

src/types.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
export type Message<T> = {
1+
export interface WebViewMessage<T> {
22
type: string;
33
data: T;
4-
};
4+
}
5+
6+
export interface ReactNativeMessage<T> {
7+
type: string;
8+
data: T;
9+
}

src/web/core.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { TO_WEB_EVENT_KEY, WEB_ROOT_ID } from "../constants";
2-
import type { Message } from "../types";
2+
import type { ReactNativeMessage, WebViewMessage } from "../types";
33

44
/**
55
* @internal
@@ -10,15 +10,15 @@ export const getWebViewRootElement = (): HTMLElement =>
1010
/**
1111
* A function to send a message to React Native
1212
*/
13-
export const emit = <T>(message: Message<T>) => {
13+
export const emitToNative = <T>(message: WebViewMessage<T>) => {
1414
(window as any).ReactNativeWebView.postMessage(JSON.stringify(message));
1515
};
1616

1717
/**
1818
* @internal
1919
*/
2020
export const listenNativeMessage = <T>(
21-
onSubscribe: (message: Message<T>) => void
21+
onSubscribe: (message: ReactNativeMessage<T>) => void
2222
) => {
2323
const listener = (e: any) => {
2424
if (!isMessageEvent<T>(e)) return;
@@ -30,5 +30,5 @@ export const listenNativeMessage = <T>(
3030
};
3131
};
3232

33-
const isMessageEvent = <T>(e: any): e is { detail: Message<T> } =>
33+
const isMessageEvent = <T>(e: any): e is { detail: ReactNativeMessage<T> } =>
3434
e && e.detail;

src/web/preact.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
*/
66
import { useEffect } from "preact/compat";
77
import { render, ComponentChild } from "preact";
8-
import { listenNativeMessage, emit, getWebViewRootElement } from "./core";
9-
import type { Message } from "../types";
8+
import { listenNativeMessage, emitToNative, getWebViewRootElement } from "./core";
9+
import type { ReactNativeMessage } from "../types";
1010

1111
/**
1212
* The entry point of web file
@@ -23,9 +23,9 @@ export const webViewRender = (root: ComponentChild): string => {
2323
* A hook to subscribe messages from React Native.
2424
*/
2525
export const useNativeMessage = <T>(
26-
onSubscribe: (message: Message<T>) => void
26+
onSubscribe: (message: ReactNativeMessage<T>) => void
2727
) => {
2828
useEffect(() => listenNativeMessage(onSubscribe), [onSubscribe]);
2929
};
3030

31-
export { emit };
31+
export { emitToNative as emit };

src/web/react.spec.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import { afterEach, describe, expect, it } from "vitest";
33
import { cleanup, render, screen, waitFor } from "@testing-library/react";
44
import { useNativeMessage, emit } from "./react";
5-
import { useWebViewMessage, buildEmitCode } from "../native";
5+
import { useWebViewMessage, buildEmitToWebView } from "../native";
66
import { useEffect, useState } from "react";
7-
import { Message } from "../types";
7+
import { ReactNativeMessage, WebViewMessage } from "../types";
88

99
const ReactNativeWebViewEvent = "RNW";
1010

@@ -19,11 +19,11 @@ const ReactNativeWebViewEvent = "RNW";
1919
afterEach(cleanup);
2020

2121
describe("send message to web", () => {
22-
const NativeApp = ({ message }: { message: Message<string> }) => {
22+
const NativeApp = ({ message }: { message: ReactNativeMessage<string> }) => {
2323
return (
2424
<button
2525
onClick={() => {
26-
eval(buildEmitCode(message));
26+
eval(buildEmitToWebView(message));
2727
}}
2828
>
2929
send
@@ -84,7 +84,7 @@ describe("send message to web", () => {
8484
});
8585

8686
describe("send message to native", () => {
87-
const WebApp = ({ message }: { message: Message<string> }) => {
87+
const WebApp = ({ message }: { message: WebViewMessage<string> }) => {
8888
return (
8989
<button
9090
onClick={() => {

src/web/react.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import { ReactElement, useEffect } from "react";
77
import { render } from "react-dom";
88
import { createRoot } from "react-dom/client";
9-
import { emit, getWebViewRootElement, listenNativeMessage } from "./core";
10-
import type { Message } from "../types";
9+
import { emitToNative, getWebViewRootElement, listenNativeMessage } from "./core";
10+
import type { ReactNativeMessage } from "../types";
1111

1212
/**
1313
* The entry point of web file
@@ -32,9 +32,9 @@ export const webViewCreateRoot = (root: ReactElement): string => {
3232
* A hook to subscribe messages from React Native.
3333
*/
3434
export const useNativeMessage = <T>(
35-
onSubscribe: (message: Message<T>) => void
35+
onSubscribe: (message: ReactNativeMessage<T>) => void
3636
) => {
3737
useEffect(() => listenNativeMessage(onSubscribe), [onSubscribe]);
3838
};
3939

40-
export { emit };
40+
export { emitToNative as emit };

0 commit comments

Comments
 (0)