react-native-inapp-inspector 2.3.14 → 2.3.15

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 (65) hide show
  1. package/dist/commonjs/components/AnimatedEntrance.js +3 -3
  2. package/dist/commonjs/components/ConsoleLogCard.js +174 -100
  3. package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -16
  4. package/dist/commonjs/components/Inspector/CrashTab.js +19 -5
  5. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
  6. package/dist/commonjs/components/Inspector/InspectorHeader.js +2 -2
  7. package/dist/commonjs/components/Inspector/MainScreen.js +56 -56
  8. package/dist/commonjs/components/Inspector/NetworkTab.js +1 -335
  9. package/dist/commonjs/components/Inspector/PerformanceTab.js +32 -6
  10. package/dist/commonjs/components/Inspector/ReduxTab.js +3 -1
  11. package/dist/commonjs/components/Inspector/StorageTab.js +23 -5
  12. package/dist/commonjs/components/JsonViewer.js +14 -2
  13. package/dist/commonjs/components/LogCard.js +428 -227
  14. package/dist/commonjs/constants/version.d.ts +1 -1
  15. package/dist/commonjs/constants/version.js +1 -1
  16. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  17. package/dist/commonjs/customHooks/consoleLogger.js +34 -2
  18. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  19. package/dist/commonjs/customHooks/networkLogger.js +184 -26
  20. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  21. package/dist/commonjs/helpers/searchQueryParser.js +37 -291
  22. package/dist/commonjs/index.js +141 -27
  23. package/dist/esm/components/AnimatedEntrance.js +3 -3
  24. package/dist/esm/components/ConsoleLogCard.js +141 -100
  25. package/dist/esm/components/Inspector/ConsoleTab.js +25 -16
  26. package/dist/esm/components/Inspector/CrashTab.js +19 -5
  27. package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
  28. package/dist/esm/components/Inspector/InspectorHeader.js +3 -3
  29. package/dist/esm/components/Inspector/MainScreen.js +56 -56
  30. package/dist/esm/components/Inspector/NetworkTab.js +2 -336
  31. package/dist/esm/components/Inspector/PerformanceTab.js +32 -6
  32. package/dist/esm/components/Inspector/ReduxTab.js +3 -1
  33. package/dist/esm/components/Inspector/StorageTab.js +23 -5
  34. package/dist/esm/components/JsonViewer.js +14 -2
  35. package/dist/esm/components/LogCard.js +422 -221
  36. package/dist/esm/constants/version.d.ts +1 -1
  37. package/dist/esm/constants/version.js +1 -1
  38. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  39. package/dist/esm/customHooks/consoleLogger.js +34 -2
  40. package/dist/esm/customHooks/crashHandler.js +1 -1
  41. package/dist/esm/customHooks/networkLogger.js +184 -26
  42. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  43. package/dist/esm/helpers/searchQueryParser.js +37 -291
  44. package/dist/esm/index.js +141 -27
  45. package/package.json +1 -1
  46. package/src/components/AnimatedEntrance.tsx +3 -3
  47. package/src/components/ConsoleLogCard.tsx +154 -103
  48. package/src/components/Inspector/ConsoleTab.tsx +27 -18
  49. package/src/components/Inspector/CrashTab.tsx +19 -5
  50. package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
  51. package/src/components/Inspector/InspectorHeader.tsx +5 -3
  52. package/src/components/Inspector/MainScreen.tsx +2 -3
  53. package/src/components/Inspector/NetworkTab.tsx +1 -402
  54. package/src/components/Inspector/PerformanceTab.tsx +36 -7
  55. package/src/components/Inspector/ReduxTab.tsx +9 -1
  56. package/src/components/Inspector/StorageTab.tsx +27 -7
  57. package/src/components/JsonViewer.tsx +15 -2
  58. package/src/components/LogCard.tsx +528 -339
  59. package/src/constants/version.ts +1 -1
  60. package/src/customHooks/analyticsLogger.ts +1 -1
  61. package/src/customHooks/consoleLogger.ts +36 -3
  62. package/src/customHooks/crashHandler.ts +1 -1
  63. package/src/customHooks/networkLogger.ts +214 -26
  64. package/src/helpers/searchQueryParser.ts +40 -285
  65. package/src/index.tsx +332 -211
@@ -1,311 +1,57 @@
1
- export function matchNetworkLogQuery(log, searchQuery, routePath, options) {
1
+ export function matchNetworkLogQuery(log, searchQuery, routePath, _options) {
2
2
  if (!searchQuery || searchQuery.trim().length === 0)
3
3
  return true;
4
- const rawTokens = searchQuery.trim().match(/(?:[^\s,"']+|"[^"]*"|'[^']*')+/g) || [];
4
+ const rawTokens = searchQuery.trim().toLowerCase().split(/\s+/).filter(Boolean);
5
5
  if (rawTokens.length === 0)
6
6
  return true;
7
- const isCaseSensitive = Boolean(options?.isCaseSensitive);
8
- const isRegex = Boolean(options?.isRegex);
9
- const scope = options?.scope || 'all';
10
- const methodRaw = log.method || '';
11
- const urlRaw = log.url || '';
7
+ const methodRaw = (log.method || '').toLowerCase();
8
+ const urlRaw = (log.url || '').toLowerCase();
9
+ const statusStr = log.status != null ? String(log.status).toLowerCase() : 'pending';
12
10
  const statusNum = typeof log.status === 'number'
13
11
  ? log.status
14
12
  : log.status != null
15
13
  ? parseInt(String(log.status), 10)
16
14
  : null;
17
- const statusStr = log.status != null ? String(log.status) : 'pending';
18
- const durationNum = log.duration || 0;
19
- const clientRaw = log.client || '';
20
- const callerRaw = log.caller || '';
15
+ const clientRaw = (log.client || '').toLowerCase();
16
+ const callerRaw = (log.caller || '').toLowerCase();
17
+ const pathRaw = (routePath || log?.routeInfo?.path || '').toLowerCase();
21
18
  const reqRaw = typeof log.request === 'string'
22
- ? log.request
19
+ ? log.request.toLowerCase()
23
20
  : log.request != null
24
- ? JSON.stringify(log.request)
21
+ ? JSON.stringify(log.request).toLowerCase()
25
22
  : '';
26
23
  const resRaw = typeof log.response === 'string'
27
- ? log.response
24
+ ? log.response.toLowerCase()
28
25
  : log.response != null
29
- ? JSON.stringify(log.response)
26
+ ? JSON.stringify(log.response).toLowerCase()
30
27
  : '';
31
28
  const reqHeadersRaw = log.requestHeaders
32
- ? JSON.stringify(log.requestHeaders)
29
+ ? JSON.stringify(log.requestHeaders).toLowerCase()
33
30
  : '';
34
31
  const resHeadersRaw = log.responseHeaders
35
- ? JSON.stringify(log.responseHeaders)
32
+ ? JSON.stringify(log.responseHeaders).toLowerCase()
36
33
  : '';
37
- const pathRaw = routePath || log?.routeInfo?.path || '';
38
- const getScopedCorpus = (caseSens) => {
39
- let parts = [];
40
- if (scope === 'url') {
41
- parts = [methodRaw, urlRaw, pathRaw, callerRaw];
42
- }
43
- else if (scope === 'reqBody') {
44
- parts = [reqRaw];
45
- }
46
- else if (scope === 'resBody') {
47
- parts = [resRaw];
48
- }
49
- else if (scope === 'headers') {
50
- parts = [reqHeadersRaw, resHeadersRaw];
51
- }
52
- else {
53
- parts = [
54
- methodRaw,
55
- urlRaw,
56
- statusStr,
57
- pathRaw,
58
- callerRaw,
59
- clientRaw,
60
- reqRaw,
61
- resRaw,
62
- reqHeadersRaw,
63
- resHeadersRaw,
64
- ];
65
- }
66
- const combined = parts.join(' ');
67
- return caseSens ? combined : combined.toLowerCase();
68
- };
69
- const targetCorpus = getScopedCorpus(isCaseSensitive);
70
- const methodStr = methodRaw.toLowerCase();
71
- const urlStr = urlRaw.toLowerCase();
72
- const clientStr = clientRaw.toLowerCase();
73
- const callerStr = callerRaw.toLowerCase();
74
- const reqStr = reqRaw.toLowerCase();
75
- const resStr = resRaw.toLowerCase();
76
- const reqHeadersStr = reqHeadersRaw.toLowerCase();
77
- const resHeadersStr = resHeadersRaw.toLowerCase();
78
- const pathStr = pathRaw.toLowerCase();
79
- for (const rawToken of rawTokens) {
80
- const token = rawToken.replace(/^["']|["']$/g, '').trim();
81
- if (!token)
82
- continue;
83
- const lowerToken = token.toLowerCase();
84
- if (lowerToken.startsWith('method:') || lowerToken.startsWith('m:')) {
85
- const targetMethod = lowerToken.replace(/^(method:|m:)/, '').trim();
86
- if (targetMethod.startsWith('!')) {
87
- if (methodStr === targetMethod.slice(1))
88
- return false;
89
- }
90
- else {
91
- if (methodStr !== targetMethod)
92
- return false;
93
- }
94
- continue;
95
- }
96
- if (lowerToken.startsWith('status:') || lowerToken.startsWith('s:')) {
97
- const val = lowerToken.replace(/^(status:|s:)/, '').trim();
98
- if (val === 'pending' || val === 'loading') {
99
- if (log.status != null)
100
- return false;
101
- }
102
- else if (val.startsWith('>=')) {
103
- const threshold = parseInt(val.slice(2), 10);
104
- if (isNaN(threshold) || statusNum === null || statusNum < threshold)
105
- return false;
106
- }
107
- else if (val.startsWith('>')) {
108
- const threshold = parseInt(val.slice(1), 10);
109
- if (isNaN(threshold) || statusNum === null || statusNum <= threshold)
110
- return false;
111
- }
112
- else if (val.startsWith('<=')) {
113
- const threshold = parseInt(val.slice(2), 10);
114
- if (isNaN(threshold) || statusNum === null || statusNum > threshold)
115
- return false;
116
- }
117
- else if (val.startsWith('<')) {
118
- const threshold = parseInt(val.slice(1), 10);
119
- if (isNaN(threshold) || statusNum === null || statusNum >= threshold)
120
- return false;
121
- }
122
- else if (val.endsWith('xx') || val.endsWith('x')) {
123
- const prefix = val.replace(/x/g, '');
124
- if (!statusStr.startsWith(prefix))
125
- return false;
126
- }
127
- else {
128
- const targetCode = parseInt(val, 10);
129
- if (!isNaN(targetCode)) {
130
- if (statusNum !== targetCode)
131
- return false;
132
- }
133
- else if (!statusStr.includes(val)) {
134
- return false;
135
- }
136
- }
137
- continue;
138
- }
139
- if (lowerToken.startsWith('is:')) {
140
- const flag = lowerToken.slice(3).trim();
141
- if (flag === 'error' ||
142
- flag === 'failed' ||
143
- flag === 'err' ||
144
- flag === 'fail') {
145
- const isErr = log.status === 0 || (statusNum !== null && statusNum >= 400);
146
- if (!isErr)
147
- return false;
148
- }
149
- else if (flag === 'success' || flag === 'ok' || flag === '2xx') {
150
- const isSuccess = statusNum !== null && statusNum >= 200 && statusNum < 300;
151
- if (!isSuccess)
152
- return false;
153
- }
154
- else if (flag === 'pending' || flag === 'loading') {
155
- if (log.status != null)
156
- return false;
157
- }
158
- else if (flag === 'slow') {
159
- if (durationNum < 1000)
160
- return false;
161
- }
162
- else if (flag === 'fast') {
163
- if (durationNum >= 200)
164
- return false;
165
- }
166
- else if (flag === 'graphql' || flag === 'gql') {
167
- const isGql = urlStr.includes('graphql') ||
168
- clientStr === 'graphql' ||
169
- clientStr === 'apollo';
170
- if (!isGql)
171
- return false;
172
- }
173
- else if (flag === 'https') {
174
- if (!urlStr.startsWith('https'))
175
- return false;
176
- }
177
- else if (flag === 'http') {
178
- if (urlStr.startsWith('https') || !urlStr.startsWith('http'))
179
- return false;
180
- }
181
- else if (flag === 'json') {
182
- const isJson = reqHeadersStr.includes('application/json') ||
183
- resHeadersStr.includes('application/json') ||
184
- urlStr.includes('.json');
185
- if (!isJson)
186
- return false;
187
- }
188
- else if (flag === 'image') {
189
- const isImg = resHeadersStr.includes('image/') ||
190
- /\.(png|jpe?g|gif|webp|svg)/i.test(urlStr);
191
- if (!isImg)
192
- return false;
193
- }
194
- continue;
195
- }
196
- if (lowerToken.startsWith('slow:') ||
197
- lowerToken.startsWith('dur:') ||
198
- lowerToken.startsWith('duration:')) {
199
- const val = lowerToken.replace(/^(slow:|dur:|duration:)/, '').trim();
200
- let thresholdMs = 0;
201
- let isGreater = true;
202
- let cleanVal = val;
203
- if (val.startsWith('>=')) {
204
- isGreater = true;
205
- cleanVal = val.slice(2);
206
- }
207
- else if (val.startsWith('>')) {
208
- isGreater = true;
209
- cleanVal = val.slice(1);
210
- }
211
- else if (val.startsWith('<=')) {
212
- isGreater = false;
213
- cleanVal = val.slice(2);
214
- }
215
- else if (val.startsWith('<')) {
216
- isGreater = false;
217
- cleanVal = val.slice(1);
218
- }
219
- if (cleanVal.endsWith('s') && !cleanVal.endsWith('ms')) {
220
- thresholdMs = parseFloat(cleanVal.slice(0, -1)) * 1000;
221
- }
222
- else if (cleanVal.endsWith('ms')) {
223
- thresholdMs = parseFloat(cleanVal.slice(0, -2));
224
- }
225
- else {
226
- thresholdMs = parseFloat(cleanVal);
227
- }
228
- if (!isNaN(thresholdMs)) {
229
- if (isGreater) {
230
- if (durationNum < thresholdMs)
231
- return false;
232
- }
233
- else {
234
- if (durationNum > thresholdMs)
235
- return false;
236
- }
237
- }
238
- continue;
239
- }
240
- if (lowerToken.startsWith('client:') || lowerToken.startsWith('c:')) {
241
- const targetClient = lowerToken.replace(/^(client:|c:)/, '').trim();
242
- if (!clientStr.includes(targetClient))
243
- return false;
244
- continue;
245
- }
246
- if (lowerToken.startsWith('domain:') || lowerToken.startsWith('d:')) {
247
- const targetDomain = lowerToken.replace(/^(domain:|d:)/, '').trim();
248
- if (!urlStr.includes(targetDomain))
249
- return false;
250
- continue;
251
- }
252
- if (lowerToken.startsWith('path:') ||
253
- lowerToken.startsWith('p:') ||
254
- lowerToken.startsWith('page:')) {
255
- const targetPath = lowerToken
256
- .replace(/^(path:|p:|page:)/, '')
257
- .trim();
258
- if (!urlStr.includes(targetPath) &&
259
- !pathStr.includes(targetPath) &&
260
- !callerStr.includes(targetPath)) {
261
- return false;
262
- }
263
- continue;
264
- }
265
- if (lowerToken.startsWith('req:') || lowerToken.startsWith('body:')) {
266
- const target = lowerToken.replace(/^(req:|body:)/, '').trim();
267
- if (!reqStr.includes(target))
268
- return false;
269
- continue;
270
- }
271
- if (lowerToken.startsWith('res:')) {
272
- const target = lowerToken.slice(4).trim();
273
- if (!resStr.includes(target))
274
- return false;
275
- continue;
276
- }
277
- if (lowerToken.startsWith('header:') || lowerToken.startsWith('h:')) {
278
- const target = lowerToken.replace(/^(header:|h:)/, '').trim();
279
- if (!reqHeadersStr.includes(target) && !resHeadersStr.includes(target)) {
280
- return false;
281
- }
282
- continue;
283
- }
284
- if (isRegex) {
285
- try {
286
- const re = new RegExp(token, isCaseSensitive ? '' : 'i');
287
- if (!re.test(targetCorpus))
288
- return false;
289
- }
290
- catch {
291
- const queryTerm = isCaseSensitive ? token : lowerToken;
292
- if (!targetCorpus.includes(queryTerm))
293
- return false;
294
- }
295
- }
296
- else {
297
- const queryTerm = isCaseSensitive ? token : lowerToken;
298
- if (!targetCorpus.includes(queryTerm)) {
299
- if (queryTerm === 'error' ||
300
- queryTerm === 'failed' ||
301
- queryTerm === 'fail') {
302
- const isErr = log.status === 0 || (statusNum !== null && statusNum >= 400);
303
- if (isErr)
304
- continue;
305
- }
306
- return false;
307
- }
308
- }
309
- }
310
- return true;
34
+ const corpus = [
35
+ methodRaw,
36
+ urlRaw,
37
+ statusStr,
38
+ pathRaw,
39
+ callerRaw,
40
+ clientRaw,
41
+ reqRaw,
42
+ resRaw,
43
+ reqHeadersRaw,
44
+ resHeadersRaw,
45
+ ].join(' ');
46
+ return rawTokens.every(token => {
47
+ if (corpus.includes(token))
48
+ return true;
49
+ if (token === 'error' || token === 'failed' || token === 'err' || token === 'fail') {
50
+ return log.status === 0 || (statusNum !== null && statusNum >= 400);
51
+ }
52
+ if (token === 'success' || token === 'ok' || token === '2xx') {
53
+ return statusNum !== null && statusNum >= 200 && statusNum < 300;
54
+ }
55
+ return false;
56
+ });
311
57
  }
package/dist/esm/index.js CHANGED
@@ -127,7 +127,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
127
127
  const [maxConsoleLogs, setMaxConsoleLogs] = useState(100);
128
128
  const [showConsoleLevels, setShowConsoleLevels] = useState({
129
129
  info: true,
130
- warn: false,
130
+ warn: true,
131
131
  error: true,
132
132
  });
133
133
  const visibleConsoleLogs = useMemo(() => {
@@ -155,7 +155,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
155
155
  return filtered.slice(0, maxConsoleLogs);
156
156
  }, [consoleLogs, showConsoleLevels, maxConsoleLogs]);
157
157
  const [logSearch, setLogSearch] = useState('');
158
- const [logFilters, setLogFilters] = useState(new Set(['user-log']));
158
+ const [logFilters, setLogFilters] = useState(new Set(['all']));
159
159
  const [settingsPage, setSettingsPage] = useState(null);
160
160
  const [settingsActiveSubTab, setSettingsActiveSubTab] = useState('module');
161
161
  const [tabVisibility, setTabVisibility] = useState({
@@ -170,8 +170,8 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
170
170
  storage: false,
171
171
  debugging: false,
172
172
  });
173
- const [maxNetworkLogs, setMaxNetworkLogs] = useState(100);
174
- const [maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit] = useState(75);
173
+ const [maxNetworkLogs, setMaxNetworkLogs] = useState(250);
174
+ const [maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit] = useState(150);
175
175
  const [isAutoRamLimitEnabled, setIsAutoRamLimitEnabled] = useState(true);
176
176
  const [deviceFreeRamMb, setDeviceFreeRamMb] = useState(1800);
177
177
  const [reduxAutoRefresh, setReduxAutoRefreshState] = useState(true);
@@ -1366,27 +1366,18 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1366
1366
  log.caller || '',
1367
1367
  log.type || '',
1368
1368
  log.sourceMethod || '',
1369
+ log.stack || '',
1369
1370
  ].join(' ').toLowerCase();
1370
1371
  return queryTokens.every(token => {
1371
- if (token.startsWith('level:') || token.startsWith('is:') || token.startsWith('type:')) {
1372
- const flag = token.replace(/^(level:|is:|type:)/, '').trim();
1373
- if (flag === 'error' || flag === 'err')
1374
- return log.type === 'error';
1375
- if (flag === 'warn' || flag === 'warning')
1376
- return log.type === 'warn';
1377
- if (flag === 'info')
1378
- return log.type === 'info';
1379
- if (flag === 'log')
1380
- return log.sourceMethod === 'log';
1381
- if (flag === 'analytics')
1382
- return (log.message || '').toLowerCase().includes('[analytics');
1383
- }
1384
1372
  if (token === 'error' || token === 'err') {
1385
1373
  return log.type === 'error' || searchTarget.includes(token);
1386
1374
  }
1387
1375
  if (token === 'warn' || token === 'warning') {
1388
1376
  return log.type === 'warn' || searchTarget.includes(token);
1389
1377
  }
1378
+ if (token === 'info') {
1379
+ return log.type === 'info' || searchTarget.includes(token);
1380
+ }
1390
1381
  return searchTarget.includes(token);
1391
1382
  });
1392
1383
  });
@@ -1431,8 +1422,20 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1431
1422
  log.caller || '',
1432
1423
  log.type || '',
1433
1424
  log.sourceMethod || '',
1425
+ log.stack || '',
1434
1426
  ].join(' ').toLowerCase();
1435
- return queryTokens.every(token => searchTarget.includes(token));
1427
+ return queryTokens.every(token => {
1428
+ if (token === 'error' || token === 'err') {
1429
+ return log.type === 'error' || searchTarget.includes(token);
1430
+ }
1431
+ if (token === 'warn' || token === 'warning') {
1432
+ return log.type === 'warn' || searchTarget.includes(token);
1433
+ }
1434
+ if (token === 'info') {
1435
+ return log.type === 'info' || searchTarget.includes(token);
1436
+ }
1437
+ return searchTarget.includes(token);
1438
+ });
1436
1439
  });
1437
1440
  }
1438
1441
  const total = visibleConsoleLogs.length;
@@ -1446,14 +1449,15 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1446
1449
  };
1447
1450
  }, [visibleConsoleLogs, logSearch]);
1448
1451
  function closeModal() {
1449
- animateNextLayout();
1450
1452
  setVisible(false);
1451
- setSelected(null);
1452
- setSelectedEvent(null);
1453
- setSelectedLog(null);
1454
- setSelectedReduxSlice(null);
1455
- setSelectedReduxAction(null);
1456
- setSelectedCrash(null);
1453
+ setTimeout(() => {
1454
+ setSelected(null);
1455
+ setSelectedEvent(null);
1456
+ setSelectedLog(null);
1457
+ setSelectedReduxSlice(null);
1458
+ setSelectedReduxAction(null);
1459
+ setSelectedCrash(null);
1460
+ }, 300);
1457
1461
  }
1458
1462
  function handleClearAll() {
1459
1463
  clearNetworkLogs();
@@ -1463,13 +1467,17 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1463
1467
  setCollapsedSections(new Set());
1464
1468
  setStatusFilters(new Set());
1465
1469
  setMethodFilters(new Set());
1470
+ setSearch('');
1466
1471
  prevLogIdsRef.current = new Set();
1467
1472
  logRouteMapRef.current = new Map();
1468
1473
  clearAnalyticsEvents();
1469
1474
  setAnalyticsEvents([]);
1475
+ setAnalyticsSearch('');
1470
1476
  prevEventIdsRef.current = new Set();
1471
1477
  clearConsoleLogs();
1472
1478
  setConsoleLogs([]);
1479
+ setLogFilters(new Set(['all']));
1480
+ setLogSearch('');
1473
1481
  }
1474
1482
  function handleDelete() {
1475
1483
  if (activeTab === 'logs') {
@@ -1583,7 +1591,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1583
1591
  return next;
1584
1592
  });
1585
1593
  }, []);
1586
- const contextValue = {
1594
+ const contextValue = useMemo(() => ({
1587
1595
  visible,
1588
1596
  setVisible,
1589
1597
  closeModal,
@@ -1750,7 +1758,113 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1750
1758
  setReduxAutoRefreshState,
1751
1759
  reduxExpandDepth,
1752
1760
  setReduxExpandDepth,
1753
- };
1761
+ }), [
1762
+ visible,
1763
+ closeModal,
1764
+ isReady,
1765
+ enabled,
1766
+ appIcon,
1767
+ environment,
1768
+ modalHeightPercent,
1769
+ modalAnimationType,
1770
+ hasNavigationContext,
1771
+ setNavState,
1772
+ activeTab,
1773
+ switchActiveTab,
1774
+ tabVisibility,
1775
+ toggleTabVisibility,
1776
+ lastReadApisCount,
1777
+ lastReadLogsCount,
1778
+ selected,
1779
+ selectedEvent,
1780
+ selectedLog,
1781
+ showHeaderInfo,
1782
+ settingsPage,
1783
+ updateAvailable,
1784
+ latestNpmVersion,
1785
+ clearAnim,
1786
+ activePulseAnim,
1787
+ unreadPulseAnim,
1788
+ runClearAllWithAnimation,
1789
+ useNativeFab,
1790
+ fabPan,
1791
+ fabPanResponder,
1792
+ pulseAnim,
1793
+ fabShineAnim,
1794
+ logs,
1795
+ filteredLogs,
1796
+ groupedData,
1797
+ search,
1798
+ searchScope,
1799
+ isRegexSearch,
1800
+ isCaseSensitive,
1801
+ quickFilter,
1802
+ statusFilters,
1803
+ methodFilters,
1804
+ availableMethods,
1805
+ sortOrder,
1806
+ selectedLogs,
1807
+ toggleSelect,
1808
+ minStart,
1809
+ totalRange,
1810
+ newLogIds,
1811
+ toggleSectionFilter,
1812
+ toggleSectionCollapse,
1813
+ handleDelete,
1814
+ isNetworkPaused,
1815
+ detailTitle,
1816
+ detailDisplayUrl,
1817
+ apiDetailActiveTab,
1818
+ detailSearch,
1819
+ reqExpanded,
1820
+ resExpanded,
1821
+ showReqDiff,
1822
+ showResDiff,
1823
+ prevRequestData,
1824
+ prevResponseData,
1825
+ consoleLogs,
1826
+ visibleConsoleLogs,
1827
+ filteredConsoleLogs,
1828
+ logSearch,
1829
+ logFilters,
1830
+ logCounts,
1831
+ logSortOrder,
1832
+ isConsolePaused,
1833
+ analyticsEvents,
1834
+ filteredAnalyticsEvents,
1835
+ analyticsSearch,
1836
+ analyticsFilters,
1837
+ isAnalyticsFilterApplied,
1838
+ resetAnalyticsFilters,
1839
+ newEventIds,
1840
+ isAnalyticsLayoutReady,
1841
+ analyticsHeaderExpanded,
1842
+ isAnalyticsPaused,
1843
+ reduxState,
1844
+ reduxLastActionMap,
1845
+ reduxSearch,
1846
+ selectedReduxSlice,
1847
+ selectedReduxAction,
1848
+ reduxActiveSubTab,
1849
+ crashRecords,
1850
+ selectedCrash,
1851
+ lastReadCrashesCount,
1852
+ maxCrashLogs,
1853
+ settingsActiveSubTab,
1854
+ defaultTab,
1855
+ isDark,
1856
+ showDuplicateLogs,
1857
+ showUpdateToast,
1858
+ showConsoleLevels,
1859
+ storage,
1860
+ maxNetworkLogs,
1861
+ maxConsoleLogs,
1862
+ maxAnalyticsEventsLimit,
1863
+ isAutoRamLimitEnabled,
1864
+ deviceFreeRamMb,
1865
+ reduxAutoRefresh,
1866
+ reduxExpandDepth,
1867
+ ]);
1754
1868
  return (<InspectorContext.Provider value={contextValue}>
1755
1869
  <MainScreen />
1756
1870
  </InspectorContext.Provider>);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-inapp-inspector",
3
- "version": "2.3.14",
3
+ "version": "2.3.15",
4
4
  "description": "The zero-config, all-in-one in-app debugger for React Native & Expo. Inspect Network (fetch/axios), Console logs, Stack Traces, Redux State, Firebase Analytics, and JS Bundle size directly on device.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,16 +23,16 @@ const AnimatedEntrance = React.memo(function AnimatedEntrance({
23
23
  }
24
24
 
25
25
  const progress = useRef(new Animated.Value(0)).current;
26
+ const initialIndex = useRef(index).current;
26
27
 
27
28
  useEffect(() => {
28
- progress.setValue(0);
29
29
  Animated.timing(progress, {
30
30
  toValue: 1,
31
31
  duration,
32
- delay: delay + Math.min(index, 12) * 18,
32
+ delay: delay + Math.min(initialIndex, 8) * 12,
33
33
  useNativeDriver: true,
34
34
  }).start();
35
- }, [delay, duration, index, progress]);
35
+ }, []);
36
36
 
37
37
  return (
38
38
  <Animated.View