@webview-bridge/react-native 1.4.3 → 1.4.5

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.
@@ -38,14 +38,22 @@ const createWebView = ({ bridge, debug, responseTimeout = 2000, fallback, }) =>
38
38
  isReady: false,
39
39
  },
40
40
  };
41
- const _webviewRef = (0, react_1.createRef)();
41
+ const _webviewRefStack = new util_1.Stack();
42
42
  const emitter = (0, util_1.createEvents)();
43
43
  bridge.subscribe((state) => {
44
- _webviewRef.current?.injectJavaScript((0, integrations_1.SAFE_NATIVE_EMITTER_EMIT)("bridgeStateChange", state));
44
+ _webviewRefStack
45
+ .top()
46
+ ?.current?.injectJavaScript((0, integrations_1.SAFE_NATIVE_EMITTER_EMIT)("bridgeStateChange", state));
45
47
  });
46
48
  return {
47
49
  WebView: (0, react_1.forwardRef)((props, ref) => {
48
50
  const webviewRef = (0, react_1.useRef)(null);
51
+ (0, react_1.useLayoutEffect)(() => {
52
+ _webviewRefStack.push(webviewRef);
53
+ return () => {
54
+ _webviewRefStack.pop();
55
+ };
56
+ }, []);
49
57
  const bridgeNames = (0, react_1.useMemo)(() => Object.entries(bridge.getState() ?? {})
50
58
  .filter(([_, bridge]) => typeof bridge === "function")
51
59
  .map(([name]) => {
@@ -53,9 +61,6 @@ const createWebView = ({ bridge, debug, responseTimeout = 2000, fallback, }) =>
53
61
  }), []);
54
62
  const initialState = (0, react_1.useMemo)(() => Object.fromEntries(Object.entries(bridge.getState() ?? {}).filter(([_, value]) => typeof value !== "function")), []);
55
63
  (0, react_1.useImperativeHandle)(ref, () => webviewRef.current, []);
56
- (0, react_1.useImperativeHandle)(_webviewRef, () => {
57
- return webviewRef.current;
58
- }, []);
59
64
  const handleMessage = async (event) => {
60
65
  props.onMessage?.(event);
61
66
  if (!webviewRef.current) {
@@ -80,7 +85,9 @@ const createWebView = ({ bridge, debug, responseTimeout = 2000, fallback, }) =>
80
85
  return;
81
86
  }
82
87
  case "getBridgeState": {
83
- _webviewRef.current?.injectJavaScript((0, integrations_1.SAFE_NATIVE_EMITTER_EMIT)("bridgeStateChange", bridge.getState()));
88
+ _webviewRefStack
89
+ .top()
90
+ ?.current?.injectJavaScript((0, integrations_1.SAFE_NATIVE_EMITTER_EMIT)("bridgeStateChange", bridge.getState()));
84
91
  return;
85
92
  }
86
93
  case "registerWebMethod": {
@@ -3,4 +3,5 @@ export * from "./createRandomId";
3
3
  export * from "./equals";
4
4
  export * from "./noop";
5
5
  export * from "./removeUndefinedKeys";
6
+ export * from "./stack";
6
7
  export * from "./timeout";
@@ -19,4 +19,5 @@ __exportStar(require("./createRandomId"), exports);
19
19
  __exportStar(require("./equals"), exports);
20
20
  __exportStar(require("./noop"), exports);
21
21
  __exportStar(require("./removeUndefinedKeys"), exports);
22
+ __exportStar(require("./stack"), exports);
22
23
  __exportStar(require("./timeout"), exports);
@@ -0,0 +1,9 @@
1
+ export declare class Stack<T> {
2
+ private items;
3
+ push(element: T): void;
4
+ pop(): T | undefined;
5
+ top(): T | undefined;
6
+ isEmpty(): boolean;
7
+ size(): number;
8
+ clear(): void;
9
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Stack = void 0;
4
+ class Stack {
5
+ items = [];
6
+ push(element) {
7
+ this.items.push(element);
8
+ }
9
+ pop() {
10
+ return this.items.pop();
11
+ }
12
+ top() {
13
+ return this.items[this.items.length - 1];
14
+ }
15
+ isEmpty() {
16
+ return this.items.length === 0;
17
+ }
18
+ size() {
19
+ return this.items.length;
20
+ }
21
+ clear() {
22
+ this.items = [];
23
+ }
24
+ }
25
+ exports.Stack = Stack;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webview-bridge/react-native",
3
- "version": "1.4.3",
3
+ "version": "1.4.5",
4
4
  "type": "module",
5
5
  "description": "Fully Type-Safe Integration for React Native WebView and Web",
6
6
  "main": "dist/packages/react-native/src/index.js",