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.
- package/README.md +170 -0
- package/lib/commonjs/PooledWebView.js +112 -0
- package/lib/commonjs/PooledWebView.js.map +1 -0
- package/lib/commonjs/WebViewManager.js +102 -0
- package/lib/commonjs/WebViewManager.js.map +1 -0
- package/lib/commonjs/WebViewPoolProvider.js +102 -0
- package/lib/commonjs/WebViewPoolProvider.js.map +1 -0
- package/lib/commonjs/WebViewSlot.js +91 -0
- package/lib/commonjs/WebViewSlot.js.map +1 -0
- package/lib/commonjs/constants.js +51 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/index.js +41 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/usePooledWebView.js +54 -0
- package/lib/commonjs/usePooledWebView.js.map +1 -0
- package/lib/module/PooledWebView.js +105 -0
- package/lib/module/PooledWebView.js.map +1 -0
- package/lib/module/WebViewManager.js +96 -0
- package/lib/module/WebViewManager.js.map +1 -0
- package/lib/module/WebViewPoolProvider.js +92 -0
- package/lib/module/WebViewPoolProvider.js.map +1 -0
- package/lib/module/WebViewSlot.js +84 -0
- package/lib/module/WebViewSlot.js.map +1 -0
- package/lib/module/constants.js +45 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/usePooledWebView.js +48 -0
- package/lib/module/usePooledWebView.js.map +1 -0
- package/lib/typescript/PooledWebView.d.ts +5 -0
- package/lib/typescript/PooledWebView.d.ts.map +1 -0
- package/lib/typescript/WebViewManager.d.ts +21 -0
- package/lib/typescript/WebViewManager.d.ts.map +1 -0
- package/lib/typescript/WebViewPoolProvider.d.ts +6 -0
- package/lib/typescript/WebViewPoolProvider.d.ts.map +1 -0
- package/lib/typescript/WebViewSlot.d.ts +13 -0
- package/lib/typescript/WebViewSlot.d.ts.map +1 -0
- package/lib/typescript/__mocks__/react-native-webview.d.ts +12 -0
- package/lib/typescript/__mocks__/react-native-webview.d.ts.map +1 -0
- package/lib/typescript/__mocks__/react-native.d.ts +18 -0
- package/lib/typescript/__mocks__/react-native.d.ts.map +1 -0
- package/lib/typescript/constants.d.ts +9 -0
- package/lib/typescript/constants.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +6 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +62 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/usePooledWebView.d.ts +3 -0
- package/lib/typescript/usePooledWebView.d.ts.map +1 -0
- package/package.json +87 -0
- package/src/PooledWebView.tsx +105 -0
- package/src/WebViewManager.ts +120 -0
- package/src/WebViewPoolProvider.tsx +138 -0
- package/src/WebViewSlot.tsx +107 -0
- package/src/__mocks__/react-native-webview.tsx +16 -0
- package/src/__mocks__/react-native.ts +14 -0
- package/src/constants.ts +46 -0
- package/src/index.tsx +17 -0
- package/src/types.ts +72 -0
- 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":[]}
|