react-native-instant-webview 0.1.0

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.
Files changed (64) hide show
  1. package/README.md +170 -0
  2. package/lib/commonjs/PooledWebView.js +112 -0
  3. package/lib/commonjs/PooledWebView.js.map +1 -0
  4. package/lib/commonjs/WebViewManager.js +102 -0
  5. package/lib/commonjs/WebViewManager.js.map +1 -0
  6. package/lib/commonjs/WebViewPoolProvider.js +102 -0
  7. package/lib/commonjs/WebViewPoolProvider.js.map +1 -0
  8. package/lib/commonjs/WebViewSlot.js +91 -0
  9. package/lib/commonjs/WebViewSlot.js.map +1 -0
  10. package/lib/commonjs/constants.js +51 -0
  11. package/lib/commonjs/constants.js.map +1 -0
  12. package/lib/commonjs/index.js +41 -0
  13. package/lib/commonjs/index.js.map +1 -0
  14. package/lib/commonjs/types.js +6 -0
  15. package/lib/commonjs/types.js.map +1 -0
  16. package/lib/commonjs/usePooledWebView.js +54 -0
  17. package/lib/commonjs/usePooledWebView.js.map +1 -0
  18. package/lib/module/PooledWebView.js +105 -0
  19. package/lib/module/PooledWebView.js.map +1 -0
  20. package/lib/module/WebViewManager.js +96 -0
  21. package/lib/module/WebViewManager.js.map +1 -0
  22. package/lib/module/WebViewPoolProvider.js +92 -0
  23. package/lib/module/WebViewPoolProvider.js.map +1 -0
  24. package/lib/module/WebViewSlot.js +84 -0
  25. package/lib/module/WebViewSlot.js.map +1 -0
  26. package/lib/module/constants.js +45 -0
  27. package/lib/module/constants.js.map +1 -0
  28. package/lib/module/index.js +5 -0
  29. package/lib/module/index.js.map +1 -0
  30. package/lib/module/types.js +2 -0
  31. package/lib/module/types.js.map +1 -0
  32. package/lib/module/usePooledWebView.js +48 -0
  33. package/lib/module/usePooledWebView.js.map +1 -0
  34. package/lib/typescript/PooledWebView.d.ts +5 -0
  35. package/lib/typescript/PooledWebView.d.ts.map +1 -0
  36. package/lib/typescript/WebViewManager.d.ts +21 -0
  37. package/lib/typescript/WebViewManager.d.ts.map +1 -0
  38. package/lib/typescript/WebViewPoolProvider.d.ts +6 -0
  39. package/lib/typescript/WebViewPoolProvider.d.ts.map +1 -0
  40. package/lib/typescript/WebViewSlot.d.ts +13 -0
  41. package/lib/typescript/WebViewSlot.d.ts.map +1 -0
  42. package/lib/typescript/__mocks__/react-native-webview.d.ts +12 -0
  43. package/lib/typescript/__mocks__/react-native-webview.d.ts.map +1 -0
  44. package/lib/typescript/__mocks__/react-native.d.ts +18 -0
  45. package/lib/typescript/__mocks__/react-native.d.ts.map +1 -0
  46. package/lib/typescript/constants.d.ts +9 -0
  47. package/lib/typescript/constants.d.ts.map +1 -0
  48. package/lib/typescript/index.d.ts +6 -0
  49. package/lib/typescript/index.d.ts.map +1 -0
  50. package/lib/typescript/types.d.ts +62 -0
  51. package/lib/typescript/types.d.ts.map +1 -0
  52. package/lib/typescript/usePooledWebView.d.ts +3 -0
  53. package/lib/typescript/usePooledWebView.d.ts.map +1 -0
  54. package/package.json +87 -0
  55. package/src/PooledWebView.tsx +105 -0
  56. package/src/WebViewManager.ts +120 -0
  57. package/src/WebViewPoolProvider.tsx +138 -0
  58. package/src/WebViewSlot.tsx +107 -0
  59. package/src/__mocks__/react-native-webview.tsx +16 -0
  60. package/src/__mocks__/react-native.ts +14 -0
  61. package/src/constants.ts +46 -0
  62. package/src/index.tsx +17 -0
  63. package/src/types.ts +72 -0
  64. package/src/usePooledWebView.ts +58 -0
package/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # react-native-instant-webview
2
+
3
+ WebView pooling library for React Native. Keeps WebView instances alive across screen transitions so users never see a loading spinner twice.
4
+
5
+ ## How It Works
6
+
7
+ ```
8
+ [WebViewPoolProvider] ─── children (your app)
9
+ |
10
+ └── WebViewSlot[0] (hidden or positioned)
11
+ └── WebViewSlot[1]
12
+ └── WebViewSlot[2]
13
+
14
+ [PooledWebView] ─── placeholder View
15
+ | borrow() → slot moves to placeholder position
16
+ └── unmount → release() → cleanup → idle
17
+ ```
18
+
19
+ WebView instances live at the Provider root with absolute positioning. When a `PooledWebView` mounts, it borrows an idle instance and positions it over the placeholder using `measureInWindow`. On unmount, the instance is cleaned up and returned to the pool — the underlying WKWebView/Android WebView is never destroyed.
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ npm install react-native-instant-webview
25
+ ```
26
+
27
+ ### Peer Dependencies
28
+
29
+ ```bash
30
+ npm install react react-native react-native-webview
31
+ ```
32
+
33
+ | Dependency | Version |
34
+ |---|---|
35
+ | react | >= 18.0.0 |
36
+ | react-native | >= 0.70.0 |
37
+ | react-native-webview | >= 13.0.0 |
38
+
39
+ ## Quick Start
40
+
41
+ Wrap your app with `WebViewPoolProvider` and use `PooledWebView` as a drop-in replacement for `WebView`:
42
+
43
+ ```tsx
44
+ import { WebViewPoolProvider, PooledWebView } from 'react-native-instant-webview';
45
+
46
+ function App() {
47
+ return (
48
+ <WebViewPoolProvider config={{ poolSize: 3 }}>
49
+ <Navigation />
50
+ </WebViewPoolProvider>
51
+ );
52
+ }
53
+
54
+ function DetailScreen({ url }: { url: string }) {
55
+ return (
56
+ <View style={{ flex: 1 }}>
57
+ <PooledWebView
58
+ source={{ uri: url }}
59
+ containerStyle={StyleSheet.absoluteFill}
60
+ onPoolExhausted={() => console.warn('Pool exhausted')}
61
+ />
62
+ </View>
63
+ );
64
+ }
65
+ ```
66
+
67
+ When the pool is exhausted, `PooledWebView` automatically falls back to a regular `WebView` so the user always sees content.
68
+
69
+ ## API
70
+
71
+ ### `<WebViewPoolProvider>`
72
+
73
+ Wrap your app root. Initializes the pool and renders hidden WebView slots.
74
+
75
+ ```tsx
76
+ <WebViewPoolProvider config={{ poolSize: 3, cleanupOnReturn: true }}>
77
+ <App />
78
+ </WebViewPoolProvider>
79
+ ```
80
+
81
+ #### Config
82
+
83
+ | Prop | Type | Default | Description |
84
+ |---|---|---|---|
85
+ | `poolSize` | `number` | `3` | Number of WebView instances to keep in the pool |
86
+ | `cleanupOnReturn` | `boolean` | `true` | Run cleanup script when returning to pool |
87
+ | `customCleanupScript` | `string` | built-in | Custom JS to run during cleanup |
88
+ | `defaultWebViewProps` | `Partial<WebViewProps>` | — | Default props applied to all pooled WebViews |
89
+
90
+ ### `<PooledWebView>`
91
+
92
+ Drop-in replacement for `<WebView>`. Accepts all `WebViewProps` plus:
93
+
94
+ | Prop | Type | Description |
95
+ |---|---|---|
96
+ | `containerStyle` | `StyleProp<ViewStyle>` | Style for the placeholder container |
97
+ | `poolKey` | `string` | Stable identifier for the borrower |
98
+ | `onPoolExhausted` | `() => void` | Called when no idle instances are available |
99
+ | `onBorrowed` | `(instanceId: string) => void` | Called when an instance is borrowed |
100
+ | `onReturned` | `(instanceId: string) => void` | Called when an instance is returned |
101
+
102
+ ```tsx
103
+ <PooledWebView
104
+ source={{ uri: 'https://example.com' }}
105
+ containerStyle={StyleSheet.absoluteFill}
106
+ onLoadEnd={() => setLoading(false)}
107
+ onBorrowed={(id) => console.log('Borrowed:', id)}
108
+ onReturned={(id) => console.log('Returned:', id)}
109
+ onPoolExhausted={() => console.warn('Falling back to regular WebView')}
110
+ />
111
+ ```
112
+
113
+ ### `usePooledWebView()`
114
+
115
+ Imperative hook for manual borrow/release control.
116
+
117
+ ```tsx
118
+ function MyComponent() {
119
+ const { borrow, release, instanceId, webViewRef } = usePooledWebView();
120
+
121
+ useEffect(() => {
122
+ const result = borrow();
123
+ if (result) {
124
+ // Use result.webViewRef to interact with the WebView
125
+ }
126
+ return () => release();
127
+ }, []);
128
+ }
129
+ ```
130
+
131
+ ### `useWebViewPool()`
132
+
133
+ Access the pool context directly for advanced use cases.
134
+
135
+ ```tsx
136
+ const { state, borrow, release } = useWebViewPool();
137
+ console.log(state.availableCount, state.borrowedCount);
138
+ ```
139
+
140
+ ## Pool Lifecycle
141
+
142
+ ```
143
+ idle ──borrow()──> borrowed ──release()──> cleaning ──done──> idle
144
+ │ │
145
+ │ WebView stays alive │
146
+ └─────────────────────────────────────────┘
147
+ ```
148
+
149
+ 1. **idle** — Instance is available. WebView is hidden (1x1px at -9999).
150
+ 2. **borrowed** — Instance is positioned over the `PooledWebView` placeholder.
151
+ 3. **cleaning** — Cleanup script runs (scroll reset, timer cleanup, DOM clear), then returns to idle.
152
+
153
+ On the first borrow of each slot, the WebView is lazily created to avoid a [Fabric crash](https://github.com/react-native-webview/react-native-webview/issues) where `didMoveToWindow` fires before the `source` prop is applied.
154
+
155
+ ## Example
156
+
157
+ See [`example/bare/App.tsx`](example/bare/App.tsx) for a full navigation example comparing pooled vs normal WebViews side by side.
158
+
159
+ ## Development
160
+
161
+ ```bash
162
+ npm install
163
+ npm run typecheck # TypeScript check
164
+ npm test # Run tests (20 tests)
165
+ npm run build # Build with react-native-builder-bob
166
+ ```
167
+
168
+ ## License
169
+
170
+ MIT
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _reactNativeWebview = require("react-native-webview");
10
+ var _WebViewPoolProvider = require("./WebViewPoolProvider");
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
13
+ let borrowerIdCounter = 0;
14
+ const PooledWebView = ({
15
+ poolKey,
16
+ containerStyle,
17
+ onPoolExhausted,
18
+ onBorrowed,
19
+ onReturned,
20
+ source,
21
+ ...webViewProps
22
+ }) => {
23
+ const pool = (0, _WebViewPoolProvider.useWebViewPool)();
24
+ const instanceIdRef = (0, _react.useRef)(null);
25
+ const placeholderRef = (0, _react.useRef)(null);
26
+ const borrowerIdRef = (0, _react.useRef)(poolKey ?? `borrower-${++borrowerIdCounter}`);
27
+ const propsRef = (0, _react.useRef)({
28
+ source,
29
+ ...webViewProps
30
+ });
31
+ const [borrowed, setBorrowed] = (0, _react.useState)(false);
32
+ const [fallback, setFallback] = (0, _react.useState)(false);
33
+
34
+ // Keep propsRef in sync without triggering re-renders
35
+ propsRef.current = {
36
+ source,
37
+ ...webViewProps
38
+ };
39
+
40
+ // Borrow on mount
41
+ (0, _react.useEffect)(() => {
42
+ const result = pool.borrow(borrowerIdRef.current);
43
+ if (!result) {
44
+ setFallback(true);
45
+ onPoolExhausted?.();
46
+ return;
47
+ }
48
+ instanceIdRef.current = result.instanceId;
49
+ pool.setInstanceProps(result.instanceId, propsRef.current);
50
+ setBorrowed(true);
51
+ onBorrowed?.(result.instanceId);
52
+ return () => {
53
+ const id = instanceIdRef.current;
54
+ if (id) {
55
+ pool.setInstanceLayout(id, null);
56
+ pool.release(id);
57
+ onReturned?.(id);
58
+ instanceIdRef.current = null;
59
+ }
60
+ };
61
+ // eslint-disable-next-line react-hooks/exhaustive-deps
62
+ }, []);
63
+
64
+ // Update props when source changes (the primary prop that changes)
65
+ (0, _react.useEffect)(() => {
66
+ const id = instanceIdRef.current;
67
+ if (!id || !borrowed) return;
68
+ pool.setInstanceProps(id, propsRef.current);
69
+ // Only re-sync when source actually changes
70
+ // eslint-disable-next-line react-hooks/exhaustive-deps
71
+ }, [source]);
72
+
73
+ // Measure placeholder position
74
+ const handleLayout = (0, _react.useCallback)(_event => {
75
+ const id = instanceIdRef.current;
76
+ if (!id || !placeholderRef.current) return;
77
+ placeholderRef.current.measureInWindow((x, y, width, height) => {
78
+ if (width > 0 && height > 0) {
79
+ pool.setInstanceLayout(id, {
80
+ top: y,
81
+ left: x,
82
+ width,
83
+ height
84
+ });
85
+ }
86
+ });
87
+ }, [pool]);
88
+
89
+ // Pool exhausted — fall back to a regular WebView
90
+ if (fallback) {
91
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
92
+ style: [{
93
+ flex: 1
94
+ }, containerStyle]
95
+ }, /*#__PURE__*/_react.default.createElement(_reactNativeWebview.WebView, _extends({
96
+ source: source
97
+ }, webViewProps, {
98
+ style: {
99
+ flex: 1
100
+ }
101
+ })));
102
+ }
103
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
104
+ ref: placeholderRef,
105
+ style: [{
106
+ flex: 1
107
+ }, containerStyle],
108
+ onLayout: handleLayout
109
+ });
110
+ };
111
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(PooledWebView);
112
+ //# sourceMappingURL=PooledWebView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeWebview","_WebViewPoolProvider","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","borrowerIdCounter","PooledWebView","poolKey","containerStyle","onPoolExhausted","onBorrowed","onReturned","source","webViewProps","pool","useWebViewPool","instanceIdRef","useRef","placeholderRef","borrowerIdRef","propsRef","borrowed","setBorrowed","useState","fallback","setFallback","current","useEffect","result","borrow","instanceId","setInstanceProps","id","setInstanceLayout","release","handleLayout","useCallback","_event","measureInWindow","x","y","width","height","top","left","createElement","View","style","flex","WebView","ref","onLayout","_default","exports","React","memo"],"sourceRoot":"../../src","sources":["PooledWebView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = require("react");
8
+ var _constants = require("./constants");
9
+ class WebViewManager {
10
+ static instance = null;
11
+ config = _constants.DEFAULT_POOL_CONFIG;
12
+ instances = [];
13
+ listeners = new Set();
14
+ initialized = false;
15
+ constructor() {}
16
+ static getInstance() {
17
+ if (!WebViewManager.instance) {
18
+ WebViewManager.instance = new WebViewManager();
19
+ }
20
+ return WebViewManager.instance;
21
+ }
22
+ static resetInstance() {
23
+ WebViewManager.instance = null;
24
+ }
25
+ initialize(config) {
26
+ if (this.initialized) return;
27
+ this.config = {
28
+ ..._constants.DEFAULT_POOL_CONFIG,
29
+ ...config
30
+ };
31
+ this.instances = [];
32
+ for (let i = 0; i < this.config.poolSize; i++) {
33
+ this.instances.push({
34
+ id: `webview-pool-${i}`,
35
+ status: 'idle',
36
+ webViewRef: /*#__PURE__*/(0, _react.createRef)(),
37
+ borrowerId: null,
38
+ createdAt: Date.now(),
39
+ borrowedAt: null
40
+ });
41
+ }
42
+ this.initialized = true;
43
+ this.notify();
44
+ }
45
+ borrow(borrowerId) {
46
+ const idle = this.instances.find(inst => inst.status === 'idle');
47
+ if (!idle) return null;
48
+ idle.status = 'borrowed';
49
+ idle.borrowerId = borrowerId;
50
+ idle.borrowedAt = Date.now();
51
+ this.notify();
52
+ return {
53
+ instanceId: idle.id,
54
+ webViewRef: idle.webViewRef
55
+ };
56
+ }
57
+ release(instanceId) {
58
+ const inst = this.instances.find(i => i.id === instanceId);
59
+ if (!inst || inst.status !== 'borrowed') return;
60
+ if (this.config.cleanupOnReturn) {
61
+ inst.status = 'cleaning';
62
+ } else {
63
+ inst.status = 'idle';
64
+ inst.borrowerId = null;
65
+ inst.borrowedAt = null;
66
+ }
67
+ this.notify();
68
+ }
69
+ markIdle(instanceId) {
70
+ const inst = this.instances.find(i => i.id === instanceId);
71
+ if (!inst) return;
72
+ inst.status = 'idle';
73
+ inst.borrowerId = null;
74
+ inst.borrowedAt = null;
75
+ this.notify();
76
+ }
77
+ getState() {
78
+ return {
79
+ instances: [...this.instances],
80
+ availableCount: this.instances.filter(i => i.status === 'idle').length,
81
+ borrowedCount: this.instances.filter(i => i.status === 'borrowed').length,
82
+ initialized: this.initialized
83
+ };
84
+ }
85
+ getConfig() {
86
+ return {
87
+ ...this.config
88
+ };
89
+ }
90
+ subscribe(listener) {
91
+ this.listeners.add(listener);
92
+ return () => {
93
+ this.listeners.delete(listener);
94
+ };
95
+ }
96
+ notify() {
97
+ const state = this.getState();
98
+ this.listeners.forEach(listener => listener(state));
99
+ }
100
+ }
101
+ var _default = exports.default = WebViewManager;
102
+ //# sourceMappingURL=WebViewManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_constants","WebViewManager","instance","config","DEFAULT_POOL_CONFIG","instances","listeners","Set","initialized","constructor","getInstance","resetInstance","initialize","i","poolSize","push","id","status","webViewRef","createRef","borrowerId","createdAt","Date","now","borrowedAt","notify","borrow","idle","find","inst","instanceId","release","cleanupOnReturn","markIdle","getState","availableCount","filter","length","borrowedCount","getConfig","subscribe","listener","add","delete","state","forEach","_default","exports","default"],"sourceRoot":"../../src","sources":["WebViewManager.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.WebViewPoolProvider = void 0;
7
+ exports.useWebViewPool = useWebViewPool;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactNative = require("react-native");
10
+ var _constants = require("./constants");
11
+ var _WebViewManager = _interopRequireDefault(require("./WebViewManager"));
12
+ var _WebViewSlot = _interopRequireDefault(require("./WebViewSlot"));
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ const WebViewPoolContext = /*#__PURE__*/(0, _react.createContext)(null);
16
+ function useWebViewPool() {
17
+ const ctx = (0, _react.useContext)(WebViewPoolContext);
18
+ if (!ctx) {
19
+ throw new Error('useWebViewPool must be used within a WebViewPoolProvider');
20
+ }
21
+ return ctx;
22
+ }
23
+ const WebViewPoolProvider = ({
24
+ config,
25
+ children
26
+ }) => {
27
+ const managerRef = (0, _react.useRef)(_WebViewManager.default.getInstance());
28
+ const mergedConfig = (0, _react.useRef)({
29
+ ..._constants.DEFAULT_POOL_CONFIG,
30
+ ...config
31
+ }).current;
32
+ const [poolState, setPoolState] = (0, _react.useState)(() => {
33
+ const mgr = managerRef.current;
34
+ mgr.initialize(mergedConfig);
35
+ return mgr.getState();
36
+ });
37
+ const layoutsRef = (0, _react.useRef)(new Map());
38
+ const propsRef = (0, _react.useRef)(new Map());
39
+ const [, forceRender] = (0, _react.useState)(0);
40
+ (0, _react.useEffect)(() => {
41
+ const mgr = managerRef.current;
42
+ const unsub = mgr.subscribe(state => {
43
+ setPoolState(state);
44
+ });
45
+ return unsub;
46
+ }, []);
47
+ const borrow = (0, _react.useCallback)(borrowerId => {
48
+ return managerRef.current.borrow(borrowerId);
49
+ }, []);
50
+ const release = (0, _react.useCallback)(instanceId => {
51
+ layoutsRef.current.delete(instanceId);
52
+ propsRef.current.delete(instanceId);
53
+ managerRef.current.release(instanceId);
54
+ }, []);
55
+ const setInstanceLayout = (0, _react.useCallback)((instanceId, layout) => {
56
+ layoutsRef.current.set(instanceId, layout);
57
+ forceRender(c => c + 1);
58
+ }, []);
59
+ const setInstanceProps = (0, _react.useCallback)((instanceId, props) => {
60
+ propsRef.current.set(instanceId, props);
61
+ // No forceRender here — the slot reads from propsRef on next render
62
+ // triggered by the Manager's state change (borrow/release).
63
+ }, []);
64
+ const getInstanceLayout = (0, _react.useCallback)(instanceId => {
65
+ return layoutsRef.current.get(instanceId) ?? null;
66
+ }, []);
67
+ const getInstanceProps = (0, _react.useCallback)(instanceId => {
68
+ return propsRef.current.get(instanceId);
69
+ }, []);
70
+ const handleCleanupComplete = (0, _react.useCallback)(instanceId => {
71
+ managerRef.current.markIdle(instanceId);
72
+ }, []);
73
+ const contextValue = {
74
+ state: poolState,
75
+ borrow,
76
+ release,
77
+ setInstanceLayout,
78
+ setInstanceProps,
79
+ getInstanceLayout,
80
+ getInstanceProps
81
+ };
82
+ return /*#__PURE__*/_react.default.createElement(WebViewPoolContext.Provider, {
83
+ value: contextValue
84
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
85
+ style: styles.container
86
+ }, children, poolState.instances.map(instance => /*#__PURE__*/_react.default.createElement(_WebViewSlot.default, {
87
+ key: instance.id,
88
+ instance: instance,
89
+ layout: layoutsRef.current.get(instance.id) ?? null,
90
+ instanceProps: propsRef.current.get(instance.id),
91
+ config: mergedConfig,
92
+ onCleanupComplete: handleCleanupComplete
93
+ }))));
94
+ };
95
+ exports.WebViewPoolProvider = WebViewPoolProvider;
96
+ const styles = _reactNative.StyleSheet.create({
97
+ container: {
98
+ flex: 1
99
+ }
100
+ });
101
+ var _default = exports.default = WebViewPoolProvider;
102
+ //# sourceMappingURL=WebViewPoolProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_constants","_WebViewManager","_interopRequireDefault","_WebViewSlot","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","WebViewPoolContext","createContext","useWebViewPool","ctx","useContext","Error","WebViewPoolProvider","config","children","managerRef","useRef","WebViewManager","getInstance","mergedConfig","DEFAULT_POOL_CONFIG","current","poolState","setPoolState","useState","mgr","initialize","getState","layoutsRef","Map","propsRef","forceRender","useEffect","unsub","subscribe","state","borrow","useCallback","borrowerId","release","instanceId","delete","setInstanceLayout","layout","c","setInstanceProps","props","getInstanceLayout","getInstanceProps","handleCleanupComplete","markIdle","contextValue","createElement","Provider","value","View","style","styles","container","instances","map","instance","key","id","instanceProps","onCleanupComplete","exports","StyleSheet","create","flex","_default"],"sourceRoot":"../../src","sources":["WebViewPoolProvider.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _reactNativeWebview = require("react-native-webview");
10
+ var _constants = require("./constants");
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
13
+ const WebViewSlot = ({
14
+ instance,
15
+ layout,
16
+ instanceProps,
17
+ config,
18
+ onCleanupComplete
19
+ }) => {
20
+ const isVisible = instance.status === 'borrowed' && layout != null;
21
+ const prevStatusRef = (0, _react.useRef)(instance.status);
22
+
23
+ // Track whether this slot has ever had a WebView rendered.
24
+ // On first borrow the WebView is created with a valid user source,
25
+ // avoiding the Fabric crash where didMoveToWindow fires before
26
+ // the source prop is applied (causing loadFileURL: with nil URL).
27
+ // After the first borrow, the WebView stays alive through
28
+ // cleaning → idle cycles.
29
+ const [hasWebView, setHasWebView] = (0, _react.useState)(false);
30
+ (0, _react.useEffect)(() => {
31
+ if (instance.status === 'borrowed' && !hasWebView) {
32
+ setHasWebView(true);
33
+ }
34
+ }, [instance.status, hasWebView]);
35
+
36
+ // When entering cleaning state, inject cleanup script then mark idle
37
+ (0, _react.useEffect)(() => {
38
+ if (prevStatusRef.current !== 'cleaning' && instance.status === 'cleaning') {
39
+ const ref = instance.webViewRef.current;
40
+ if (ref) {
41
+ const script = config.customCleanupScript ?? _constants.CLEANUP_SCRIPT;
42
+ ref.injectJavaScript(script);
43
+ }
44
+ const timer = setTimeout(() => {
45
+ onCleanupComplete(instance.id);
46
+ }, 100);
47
+ return () => clearTimeout(timer);
48
+ }
49
+ prevStatusRef.current = instance.status;
50
+ }, [instance.status, instance.id, instance.webViewRef, config.customCleanupScript, onCleanupComplete]);
51
+ const containerStyle = (0, _react.useMemo)(() => {
52
+ if (!isVisible || !layout) {
53
+ return _constants.HIDDEN_STYLE;
54
+ }
55
+ return {
56
+ position: 'absolute',
57
+ top: layout.top,
58
+ left: layout.left,
59
+ width: layout.width,
60
+ height: layout.height
61
+ };
62
+ }, [isVisible, layout]);
63
+ const handleNavigationStateChange = (0, _react.useCallback)(navState => {
64
+ instanceProps?.onNavigationStateChange?.(navState);
65
+ }, [instanceProps]);
66
+ const source = (0, _react.useMemo)(() => {
67
+ if (instance.status === 'borrowed' && instanceProps?.source) {
68
+ return instanceProps.source;
69
+ }
70
+ return _constants.BLANK_HTML_SOURCE;
71
+ }, [instance.status, instanceProps?.source]);
72
+
73
+ // Don't render WebView until the first borrow.
74
+ // This avoids the Fabric crash where didMoveToWindow → visitSource
75
+ // fires before _source prop is applied on the native side.
76
+ const shouldRenderWebView = hasWebView;
77
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
78
+ style: containerStyle,
79
+ pointerEvents: isVisible ? 'auto' : 'none'
80
+ }, shouldRenderWebView && /*#__PURE__*/_react.default.createElement(_reactNativeWebview.WebView, _extends({
81
+ ref: instance.webViewRef
82
+ }, instance.status === 'borrowed' ? instanceProps : undefined, {
83
+ source: source,
84
+ onNavigationStateChange: handleNavigationStateChange,
85
+ style: {
86
+ flex: 1
87
+ }
88
+ }, config.defaultWebViewProps || {})));
89
+ };
90
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(WebViewSlot);
91
+ //# sourceMappingURL=WebViewSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeWebview","_constants","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","WebViewSlot","instance","layout","instanceProps","config","onCleanupComplete","isVisible","status","prevStatusRef","useRef","hasWebView","setHasWebView","useState","useEffect","current","ref","webViewRef","script","customCleanupScript","CLEANUP_SCRIPT","injectJavaScript","timer","setTimeout","id","clearTimeout","containerStyle","useMemo","HIDDEN_STYLE","position","top","left","width","height","handleNavigationStateChange","useCallback","navState","onNavigationStateChange","source","BLANK_HTML_SOURCE","shouldRenderWebView","createElement","View","style","pointerEvents","WebView","undefined","flex","defaultWebViewProps","_default","exports","React","memo"],"sourceRoot":"../../src","sources":["WebViewSlot.tsx"],"mappings":"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","ignoreList":[]}