react-native-inapp-inspector 1.1.2 → 1.1.4
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 +30 -0
- package/dist/commonjs/components/ConsoleLogCard.js +18 -0
- package/dist/commonjs/components/LogCard.js +19 -2
- package/dist/commonjs/components/NetworkIcons.d.ts +9 -2
- package/dist/commonjs/components/NetworkIcons.js +59 -3
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/reduxLogger.d.ts +21 -7
- package/dist/commonjs/customHooks/reduxLogger.js +147 -48
- package/dist/commonjs/customHooks/webViewLogger.js +13 -8
- package/dist/commonjs/helpers/settingsStore.d.ts +28 -0
- package/dist/commonjs/helpers/settingsStore.js +92 -0
- package/dist/commonjs/index.d.ts +1 -1
- package/dist/commonjs/index.js +893 -185
- package/dist/commonjs/styles/index.d.ts +17 -1
- package/dist/commonjs/styles/index.js +25 -3
- package/dist/commonjs/types/index.d.ts +4 -0
- package/dist/esm/components/ConsoleLogCard.js +18 -0
- package/dist/esm/components/LogCard.js +19 -2
- package/dist/esm/components/NetworkIcons.d.ts +9 -2
- package/dist/esm/components/NetworkIcons.js +51 -2
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/reduxLogger.d.ts +21 -7
- package/dist/esm/customHooks/reduxLogger.js +145 -47
- package/dist/esm/customHooks/webViewLogger.js +13 -8
- package/dist/esm/helpers/settingsStore.d.ts +28 -0
- package/dist/esm/helpers/settingsStore.js +84 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +892 -187
- package/dist/esm/styles/index.d.ts +17 -1
- package/dist/esm/styles/index.js +25 -3
- package/dist/esm/types/index.d.ts +4 -0
- package/example/ios/example.xcodeproj/project.pbxproj +0 -8
- package/example/package-lock.json +75 -33
- package/example/package.json +1 -1
- package/package.json +1 -1
package/dist/commonjs/index.js
CHANGED
|
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.subscribeReduxState = exports.getReduxState = exports.connectReduxStore = exports.ErrorBoundary = exports.subscribeWebView = exports.clearWebViewData = exports.getWebViewHtmlUrl = exports.getWebViewJs = exports.getWebViewCss = exports.getWebViewHtml = exports.getWebViewNavHistory = exports.getWebViewLogs = exports.WebView = exports.clearAnalyticsEvents = exports.subscribeAnalyticsEvents = exports.logAnalyticsEvent = exports.setupAnalyticsLogger = exports.subscribeConsoleLogs = exports.clearConsoleLogs = exports.setupConsoleLogger = exports.addAxiosInterceptors = exports.subscribeNetworkLogs = exports.clearNetworkLogs = exports.setupNetworkLogger = void 0;
|
|
39
|
+
exports.clearActionHistory = exports.getActionHistory = exports.subscribeReduxState = exports.getReduxState = exports.inspectorReduxMiddleware = exports.connectReduxStore = exports.ErrorBoundary = exports.subscribeWebView = exports.clearWebViewData = exports.getWebViewHtmlUrl = exports.getWebViewJs = exports.getWebViewCss = exports.getWebViewHtml = exports.getWebViewNavHistory = exports.getWebViewLogs = exports.WebView = exports.clearAnalyticsEvents = exports.subscribeAnalyticsEvents = exports.logAnalyticsEvent = exports.setupAnalyticsLogger = exports.subscribeConsoleLogs = exports.clearConsoleLogs = exports.setupConsoleLogger = exports.addAxiosInterceptors = exports.subscribeNetworkLogs = exports.clearNetworkLogs = exports.setupNetworkLogger = void 0;
|
|
40
40
|
const react_1 = __importStar(require("react"));
|
|
41
41
|
const react_native_1 = require("react-native");
|
|
42
42
|
const react_native_svg_1 = __importStar(require("react-native-svg"));
|
|
@@ -62,6 +62,8 @@ const CodeSnippet_1 = __importDefault(require("./components/CodeSnippet"));
|
|
|
62
62
|
const AnimatedEntrance_1 = __importDefault(require("./components/AnimatedEntrance"));
|
|
63
63
|
// Helpers
|
|
64
64
|
const helpers_1 = require("./helpers");
|
|
65
|
+
// #5 — settings persistence
|
|
66
|
+
const settingsStore_1 = require("./helpers/settingsStore");
|
|
65
67
|
// Assets
|
|
66
68
|
const NetworkIcons_1 = require("./components/NetworkIcons");
|
|
67
69
|
const ErrorBoundary_1 = __importDefault(require("./components/ErrorBoundary"));
|
|
@@ -150,7 +152,9 @@ const NavigationTracker = ({ onStateChange }) => {
|
|
|
150
152
|
const animateNextLayout = () => {
|
|
151
153
|
react_native_1.LayoutAnimation.configureNext(react_native_1.LayoutAnimation.Presets.easeInEaseOut);
|
|
152
154
|
};
|
|
153
|
-
const NetworkInspector = ({ enabled = true, }) => {
|
|
155
|
+
const NetworkInspector = ({ enabled = true, storage, }) => {
|
|
156
|
+
// Set custom storage synchronously during render phase
|
|
157
|
+
(0, settingsStore_1.setCustomStorage)(storage || null);
|
|
154
158
|
const [isDark, setIsDark] = (0, react_1.useState)(false);
|
|
155
159
|
const [reduxState, setReduxState] = (0, react_1.useState)(null);
|
|
156
160
|
// Action timeline + per-reducer last action are kept in component state so the
|
|
@@ -232,11 +236,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
232
236
|
const visibleConsoleLogs = (0, react_1.useMemo)(() => {
|
|
233
237
|
const filtered = consoleLogs.filter(log => {
|
|
234
238
|
const type = log.type;
|
|
235
|
-
if (type === 'info' && !showConsoleLevels
|
|
239
|
+
if (type === 'info' && !showConsoleLevels?.info)
|
|
236
240
|
return false;
|
|
237
|
-
if (type === 'warn' && !showConsoleLevels
|
|
241
|
+
if (type === 'warn' && !showConsoleLevels?.warn)
|
|
238
242
|
return false;
|
|
239
|
-
if (type === 'error' && !showConsoleLevels
|
|
243
|
+
if (type === 'error' && !showConsoleLevels?.error)
|
|
240
244
|
return false;
|
|
241
245
|
const message = log.message || '';
|
|
242
246
|
const allPrefixes = [
|
|
@@ -266,9 +270,9 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
266
270
|
insights: true,
|
|
267
271
|
apis: true,
|
|
268
272
|
logs: true,
|
|
269
|
-
analytics:
|
|
270
|
-
webview:
|
|
271
|
-
redux:
|
|
273
|
+
analytics: false,
|
|
274
|
+
webview: false,
|
|
275
|
+
redux: false,
|
|
272
276
|
});
|
|
273
277
|
const [maxNetworkLogs, setMaxNetworkLogs] = (0, react_1.useState)(100);
|
|
274
278
|
const [webViewCaptureCssJs, setWebViewCaptureCssJs] = (0, react_1.useState)(true);
|
|
@@ -276,6 +280,168 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
276
280
|
const [reduxExpandDepth, setReduxExpandDepth] = (0, react_1.useState)(1);
|
|
277
281
|
const [slowRequestThreshold, setSlowRequestThreshold] = (0, react_1.useState)(1000);
|
|
278
282
|
const [insightsShowConsoleAlerts, setInsightsShowConsoleAlerts] = (0, react_1.useState)(true);
|
|
283
|
+
// #6 — tab the inspector opens on. Shown with a DEFAULT badge in Settings.
|
|
284
|
+
const [defaultTab, setDefaultTab] = (0, react_1.useState)('apis');
|
|
285
|
+
const [showDuplicateLogs, setShowDuplicateLogs] = (0, react_1.useState)(false);
|
|
286
|
+
const resetToDefaults = async () => {
|
|
287
|
+
await (0, settingsStore_1.clearPersistedSettings)();
|
|
288
|
+
setIsDark(false);
|
|
289
|
+
(0, styles_1.toggleGlobalTheme)(false);
|
|
290
|
+
setModalHeightPercent(90);
|
|
291
|
+
setTabVisibility({
|
|
292
|
+
insights: true,
|
|
293
|
+
apis: true,
|
|
294
|
+
logs: true,
|
|
295
|
+
analytics: false,
|
|
296
|
+
webview: false,
|
|
297
|
+
redux: false,
|
|
298
|
+
});
|
|
299
|
+
setDefaultTab('apis');
|
|
300
|
+
setMaxNetworkLogs(100);
|
|
301
|
+
setMaxConsoleLogs(200);
|
|
302
|
+
setShowConsoleLevels({
|
|
303
|
+
info: true,
|
|
304
|
+
warn: true,
|
|
305
|
+
error: true,
|
|
306
|
+
});
|
|
307
|
+
setWebViewCaptureCssJs(true);
|
|
308
|
+
setReduxAutoRefreshState(true);
|
|
309
|
+
setReduxExpandDepth(1);
|
|
310
|
+
setSlowRequestThreshold(1000);
|
|
311
|
+
setInsightsShowConsoleAlerts(true);
|
|
312
|
+
setShowDuplicateLogs(false);
|
|
313
|
+
react_native_1.Alert.alert('Settings Reset', 'All settings have been reset to default values.');
|
|
314
|
+
};
|
|
315
|
+
// #5 — hydrate persisted settings once, then auto-save on any change.
|
|
316
|
+
const settingsHydratedRef = (0, react_1.useRef)(false);
|
|
317
|
+
(0, react_1.useEffect)(() => {
|
|
318
|
+
let cancelled = false;
|
|
319
|
+
(0, settingsStore_1.loadSettings)().then(saved => {
|
|
320
|
+
if (cancelled)
|
|
321
|
+
return;
|
|
322
|
+
if (saved.isDark != null) {
|
|
323
|
+
setIsDark(saved.isDark);
|
|
324
|
+
(0, styles_1.toggleGlobalTheme)(saved.isDark);
|
|
325
|
+
}
|
|
326
|
+
if (saved.modalHeightPercent != null)
|
|
327
|
+
setModalHeightPercent(saved.modalHeightPercent);
|
|
328
|
+
if (saved.tabVisibility)
|
|
329
|
+
setTabVisibility(prev => ({
|
|
330
|
+
...prev,
|
|
331
|
+
...saved.tabVisibility,
|
|
332
|
+
apis: true, // APIs is always required
|
|
333
|
+
}));
|
|
334
|
+
if (saved.defaultTab)
|
|
335
|
+
setDefaultTab(saved.defaultTab);
|
|
336
|
+
if (saved.maxNetworkLogs != null)
|
|
337
|
+
setMaxNetworkLogs(saved.maxNetworkLogs);
|
|
338
|
+
if (saved.maxConsoleLogs != null)
|
|
339
|
+
setMaxConsoleLogs(saved.maxConsoleLogs);
|
|
340
|
+
if (saved.showConsoleLevels)
|
|
341
|
+
setShowConsoleLevels(saved.showConsoleLevels);
|
|
342
|
+
if (saved.webViewCaptureCssJs != null)
|
|
343
|
+
setWebViewCaptureCssJs(saved.webViewCaptureCssJs);
|
|
344
|
+
if (saved.reduxAutoRefresh != null)
|
|
345
|
+
setReduxAutoRefreshState(saved.reduxAutoRefresh);
|
|
346
|
+
if (saved.reduxExpandDepth != null)
|
|
347
|
+
setReduxExpandDepth(saved.reduxExpandDepth);
|
|
348
|
+
if (saved.slowRequestThreshold != null)
|
|
349
|
+
setSlowRequestThreshold(saved.slowRequestThreshold);
|
|
350
|
+
if (saved.insightsShowConsoleAlerts != null)
|
|
351
|
+
setInsightsShowConsoleAlerts(saved.insightsShowConsoleAlerts);
|
|
352
|
+
if (saved.showDuplicateLogs != null)
|
|
353
|
+
setShowDuplicateLogs(saved.showDuplicateLogs);
|
|
354
|
+
if (saved.defaultTab) {
|
|
355
|
+
const dt = saved.defaultTab;
|
|
356
|
+
const vis = {
|
|
357
|
+
...{
|
|
358
|
+
insights: true,
|
|
359
|
+
apis: true,
|
|
360
|
+
logs: true,
|
|
361
|
+
analytics: false,
|
|
362
|
+
webview: false,
|
|
363
|
+
redux: false,
|
|
364
|
+
},
|
|
365
|
+
...(saved.tabVisibility || {}),
|
|
366
|
+
apis: true,
|
|
367
|
+
};
|
|
368
|
+
setActiveTab(vis[dt] ? dt : 'apis');
|
|
369
|
+
}
|
|
370
|
+
settingsHydratedRef.current = true;
|
|
371
|
+
});
|
|
372
|
+
return () => {
|
|
373
|
+
cancelled = true;
|
|
374
|
+
};
|
|
375
|
+
}, []);
|
|
376
|
+
(0, react_1.useEffect)(() => {
|
|
377
|
+
if (!settingsHydratedRef.current)
|
|
378
|
+
return;
|
|
379
|
+
(0, settingsStore_1.saveSettings)({
|
|
380
|
+
isDark,
|
|
381
|
+
modalHeightPercent,
|
|
382
|
+
tabVisibility,
|
|
383
|
+
defaultTab,
|
|
384
|
+
maxNetworkLogs,
|
|
385
|
+
maxConsoleLogs,
|
|
386
|
+
showConsoleLevels,
|
|
387
|
+
webViewCaptureCssJs,
|
|
388
|
+
reduxAutoRefresh,
|
|
389
|
+
reduxExpandDepth,
|
|
390
|
+
slowRequestThreshold,
|
|
391
|
+
insightsShowConsoleAlerts,
|
|
392
|
+
showDuplicateLogs,
|
|
393
|
+
});
|
|
394
|
+
}, [
|
|
395
|
+
isDark,
|
|
396
|
+
modalHeightPercent,
|
|
397
|
+
tabVisibility,
|
|
398
|
+
defaultTab,
|
|
399
|
+
maxNetworkLogs,
|
|
400
|
+
maxConsoleLogs,
|
|
401
|
+
showConsoleLevels,
|
|
402
|
+
webViewCaptureCssJs,
|
|
403
|
+
reduxAutoRefresh,
|
|
404
|
+
reduxExpandDepth,
|
|
405
|
+
slowRequestThreshold,
|
|
406
|
+
insightsShowConsoleAlerts,
|
|
407
|
+
showDuplicateLogs,
|
|
408
|
+
]);
|
|
409
|
+
// #1 — check NPM for a newer published version; surfaces an animated dot
|
|
410
|
+
// in the header next to the npm chip when an update is available.
|
|
411
|
+
const [latestNpmVersion, setLatestNpmVersion] = (0, react_1.useState)(null);
|
|
412
|
+
const updateAvailable = (0, react_1.useMemo)(() => {
|
|
413
|
+
if (!latestNpmVersion)
|
|
414
|
+
return false;
|
|
415
|
+
const parse = (v) => v
|
|
416
|
+
.replace(/^v/, '')
|
|
417
|
+
.split('.')
|
|
418
|
+
.map(n => parseInt(n, 10) || 0);
|
|
419
|
+
const cur = parse(constants_1.LIB_VERSION);
|
|
420
|
+
const latest = parse(latestNpmVersion);
|
|
421
|
+
for (let i = 0; i < 3; i++) {
|
|
422
|
+
if ((latest[i] || 0) > (cur[i] || 0))
|
|
423
|
+
return true;
|
|
424
|
+
if ((latest[i] || 0) < (cur[i] || 0))
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
return false;
|
|
428
|
+
}, [latestNpmVersion]);
|
|
429
|
+
(0, react_1.useEffect)(() => {
|
|
430
|
+
let cancelled = false;
|
|
431
|
+
fetch('https://registry.npmjs.org/react-native-inapp-inspector/latest')
|
|
432
|
+
.then(res => (res.ok ? res.json() : null))
|
|
433
|
+
.then(data => {
|
|
434
|
+
if (!cancelled && data && typeof data.version === 'string') {
|
|
435
|
+
setLatestNpmVersion(data.version);
|
|
436
|
+
}
|
|
437
|
+
})
|
|
438
|
+
.catch(() => {
|
|
439
|
+
// Offline / blocked — silently skip the update check.
|
|
440
|
+
});
|
|
441
|
+
return () => {
|
|
442
|
+
cancelled = true;
|
|
443
|
+
};
|
|
444
|
+
}, []);
|
|
279
445
|
(0, react_1.useEffect)(() => {
|
|
280
446
|
(0, reduxLogger_1.setReduxAutoRefresh)(reduxAutoRefresh);
|
|
281
447
|
}, [reduxAutoRefresh]);
|
|
@@ -289,6 +455,10 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
289
455
|
animateNextLayout();
|
|
290
456
|
setActiveTab('apis');
|
|
291
457
|
}
|
|
458
|
+
// #6 — a hidden module can't be the default landing tab.
|
|
459
|
+
if (!nextVal && defaultTab === key) {
|
|
460
|
+
setDefaultTab('apis');
|
|
461
|
+
}
|
|
292
462
|
return newVisibility;
|
|
293
463
|
});
|
|
294
464
|
};
|
|
@@ -370,6 +540,8 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
370
540
|
const badgeAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
|
|
371
541
|
const activePulseAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0.4)).current;
|
|
372
542
|
const unreadPulseAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
|
|
543
|
+
// #4 — diagonal light streak sweeping across the floating launcher
|
|
544
|
+
const fabShineAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0)).current;
|
|
373
545
|
// #11 — header "clear all" icon spin/scale animation
|
|
374
546
|
const clearAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0)).current;
|
|
375
547
|
// #4 — draggable floating launcher (drag anywhere on screen)
|
|
@@ -412,9 +584,9 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
412
584
|
fabDraggedRef.current = false;
|
|
413
585
|
},
|
|
414
586
|
})).current;
|
|
415
|
-
// #
|
|
587
|
+
// #2 — scroll-to-top button for the main APIs list, always visible at the
|
|
588
|
+
// bottom right of the list.
|
|
416
589
|
const apisListRef = (0, react_1.useRef)(null);
|
|
417
|
-
const [showScrollTop, setShowScrollTop] = (0, react_1.useState)(false);
|
|
418
590
|
const runClearAllWithAnimation = (0, react_1.useCallback)(() => {
|
|
419
591
|
react_native_1.Animated.sequence([
|
|
420
592
|
react_native_1.Animated.timing(clearAnim, {
|
|
@@ -451,6 +623,24 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
451
623
|
loop.start();
|
|
452
624
|
return () => loop.stop();
|
|
453
625
|
}, [pulseAnim]);
|
|
626
|
+
// #4 — sweep the shine streak across the launcher, pause, repeat.
|
|
627
|
+
(0, react_1.useEffect)(() => {
|
|
628
|
+
const loop = react_native_1.Animated.loop(react_native_1.Animated.sequence([
|
|
629
|
+
react_native_1.Animated.timing(fabShineAnim, {
|
|
630
|
+
toValue: 1,
|
|
631
|
+
duration: 1100,
|
|
632
|
+
useNativeDriver: true,
|
|
633
|
+
}),
|
|
634
|
+
react_native_1.Animated.delay(1600),
|
|
635
|
+
react_native_1.Animated.timing(fabShineAnim, {
|
|
636
|
+
toValue: 0,
|
|
637
|
+
duration: 0,
|
|
638
|
+
useNativeDriver: true,
|
|
639
|
+
}),
|
|
640
|
+
]));
|
|
641
|
+
loop.start();
|
|
642
|
+
return () => loop.stop();
|
|
643
|
+
}, [fabShineAnim]);
|
|
454
644
|
(0, react_1.useEffect)(() => {
|
|
455
645
|
const loop = react_native_1.Animated.loop(react_native_1.Animated.sequence([
|
|
456
646
|
react_native_1.Animated.timing(activePulseAnim, {
|
|
@@ -494,6 +684,16 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
494
684
|
}).start();
|
|
495
685
|
}
|
|
496
686
|
}, [newLogIds]);
|
|
687
|
+
// #6 — every time the inspector is opened, land on the chosen default tab.
|
|
688
|
+
(0, react_1.useEffect)(() => {
|
|
689
|
+
if (visible) {
|
|
690
|
+
const target = defaultTab === 'apis' || tabVisibility?.[defaultTab]
|
|
691
|
+
? defaultTab
|
|
692
|
+
: 'apis';
|
|
693
|
+
setActiveTab(target);
|
|
694
|
+
}
|
|
695
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
696
|
+
}, [visible]);
|
|
497
697
|
(0, react_1.useEffect)(() => {
|
|
498
698
|
if (visible) {
|
|
499
699
|
const task = react_native_1.InteractionManager.runAfterInteractions(() => {
|
|
@@ -647,8 +847,38 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
647
847
|
if (sortOrder === 'oldest') {
|
|
648
848
|
result = [...result].reverse();
|
|
649
849
|
}
|
|
850
|
+
// #9 — collapse consecutive identical requests (same method + url +
|
|
851
|
+
// status) into one row carrying a ×N counter, unless the user opted in
|
|
852
|
+
// to seeing every duplicate via Settings → "Show Duplicate Logs".
|
|
853
|
+
if (!showDuplicateLogs) {
|
|
854
|
+
const collapsed = [];
|
|
855
|
+
for (const log of result) {
|
|
856
|
+
const last = collapsed[collapsed.length - 1];
|
|
857
|
+
if (last &&
|
|
858
|
+
last.method === log.method &&
|
|
859
|
+
last.url === log.url &&
|
|
860
|
+
last.status === log.status) {
|
|
861
|
+
collapsed[collapsed.length - 1] = {
|
|
862
|
+
...last,
|
|
863
|
+
duplicateCount: (last.duplicateCount || 1) + 1,
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
else {
|
|
867
|
+
collapsed.push({ ...log, duplicateCount: 1 });
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
result = collapsed;
|
|
871
|
+
}
|
|
650
872
|
return result.slice(0, maxNetworkLogs);
|
|
651
|
-
}, [
|
|
873
|
+
}, [
|
|
874
|
+
logs,
|
|
875
|
+
search,
|
|
876
|
+
statusFilters,
|
|
877
|
+
methodFilters,
|
|
878
|
+
sortOrder,
|
|
879
|
+
maxNetworkLogs,
|
|
880
|
+
showDuplicateLogs,
|
|
881
|
+
]);
|
|
652
882
|
const availableMethods = (0, react_1.useMemo)(() => {
|
|
653
883
|
const methods = new Set();
|
|
654
884
|
logs.forEach(log => {
|
|
@@ -858,8 +1088,35 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
858
1088
|
result = [...result].sort((a, b) => logSortOrder === 'newest'
|
|
859
1089
|
? b.timestamp - a.timestamp
|
|
860
1090
|
: a.timestamp - b.timestamp);
|
|
1091
|
+
// #9 — collapse consecutive identical messages into one row with a ×N
|
|
1092
|
+
// counter unless duplicates are explicitly enabled in Settings.
|
|
1093
|
+
if (!showDuplicateLogs) {
|
|
1094
|
+
const collapsed = [];
|
|
1095
|
+
for (const log of result) {
|
|
1096
|
+
const last = collapsed[collapsed.length - 1];
|
|
1097
|
+
if (last &&
|
|
1098
|
+
last.type === log.type &&
|
|
1099
|
+
last.sourceMethod === log.sourceMethod &&
|
|
1100
|
+
last.message === log.message) {
|
|
1101
|
+
collapsed[collapsed.length - 1] = {
|
|
1102
|
+
...last,
|
|
1103
|
+
duplicateCount: (last.duplicateCount || 1) + 1,
|
|
1104
|
+
};
|
|
1105
|
+
}
|
|
1106
|
+
else {
|
|
1107
|
+
collapsed.push({ ...log, duplicateCount: 1 });
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
result = collapsed;
|
|
1111
|
+
}
|
|
861
1112
|
return result;
|
|
862
|
-
}, [
|
|
1113
|
+
}, [
|
|
1114
|
+
visibleConsoleLogs,
|
|
1115
|
+
logFilters,
|
|
1116
|
+
logSearch,
|
|
1117
|
+
logSortOrder,
|
|
1118
|
+
showDuplicateLogs,
|
|
1119
|
+
]);
|
|
863
1120
|
const filteredWebViewLogs = (0, react_1.useMemo)(() => {
|
|
864
1121
|
let result = webViewLogs;
|
|
865
1122
|
if (webViewSearch) {
|
|
@@ -1008,7 +1265,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1008
1265
|
else {
|
|
1009
1266
|
react_native_1.Alert.alert('Clear Logs', 'Are you sure you want to clear all network logs?', [
|
|
1010
1267
|
{ text: 'Cancel', style: 'cancel' },
|
|
1011
|
-
{
|
|
1268
|
+
{
|
|
1269
|
+
text: 'Clear All',
|
|
1270
|
+
onPress: clearNetworkOnly,
|
|
1271
|
+
style: 'destructive',
|
|
1272
|
+
},
|
|
1012
1273
|
]);
|
|
1013
1274
|
}
|
|
1014
1275
|
}
|
|
@@ -1096,7 +1357,8 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1096
1357
|
return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
|
|
1097
1358
|
{/* Settings Header with back button */}
|
|
1098
1359
|
<react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, '#6B4EFF']} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles_1.default.headerGradient}>
|
|
1099
|
-
<react_native_1.
|
|
1360
|
+
<react_native_1.SafeAreaView style={{ width: '100%' }}>
|
|
1361
|
+
<react_native_1.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
|
|
1100
1362
|
<TouchableScale_1.default onPress={() => {
|
|
1101
1363
|
animateNextLayout();
|
|
1102
1364
|
setSettingsPage(null);
|
|
@@ -1144,7 +1406,8 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1144
1406
|
</react_native_1.Text>
|
|
1145
1407
|
</react_native_1.View>
|
|
1146
1408
|
</react_native_1.View>
|
|
1147
|
-
</
|
|
1409
|
+
</react_native_1.SafeAreaView>
|
|
1410
|
+
</react_native_linear_gradient_1.default>
|
|
1148
1411
|
|
|
1149
1412
|
<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
|
|
1150
1413
|
{/* Tab list */}
|
|
@@ -1189,7 +1452,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1189
1452
|
</react_native_1.View>
|
|
1190
1453
|
|
|
1191
1454
|
{settingsTabs.map((tab, idx) => {
|
|
1192
|
-
const isVisible = tab.key === 'apis' || tabVisibility[tab.key];
|
|
1455
|
+
const isVisible = tab.key === 'apis' || tabVisibility?.[tab.key];
|
|
1193
1456
|
const isLast = idx === settingsTabs.length - 1;
|
|
1194
1457
|
const isLocked = tab.key === 'apis';
|
|
1195
1458
|
return (<react_native_1.View key={tab.key} style={{
|
|
@@ -1252,7 +1515,8 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1252
1515
|
}}>
|
|
1253
1516
|
{tab.label}
|
|
1254
1517
|
</react_native_1.Text>
|
|
1255
|
-
{
|
|
1518
|
+
{/* #6 — badge marks the configured default tab */}
|
|
1519
|
+
{tab.key === defaultTab && (<react_native_1.View style={{
|
|
1256
1520
|
flexDirection: 'row',
|
|
1257
1521
|
alignItems: 'center',
|
|
1258
1522
|
backgroundColor: 'rgba(104,75,155,0.08)',
|
|
@@ -1520,73 +1784,316 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1520
1784
|
})}
|
|
1521
1785
|
</react_native_1.View>
|
|
1522
1786
|
</react_native_1.View>
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
borderRadius: 10,
|
|
1545
|
-
backgroundColor: AppColors_1.AppColors.purpleShade50,
|
|
1546
|
-
borderWidth: 1,
|
|
1547
|
-
borderColor: 'rgba(104,75,155,0.2)',
|
|
1548
|
-
alignItems: 'center',
|
|
1549
|
-
justifyContent: 'center',
|
|
1550
|
-
}}>
|
|
1551
|
-
<NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.purple} size={16}/>
|
|
1552
|
-
</TouchableScale_1.default>
|
|
1553
|
-
{icon && (<react_native_1.View style={{
|
|
1554
|
-
width: 36,
|
|
1555
|
-
height: 36,
|
|
1556
|
-
borderRadius: 10,
|
|
1787
|
+
|
|
1788
|
+
{/* Divider */}
|
|
1789
|
+
<react_native_1.View style={{
|
|
1790
|
+
height: 1,
|
|
1791
|
+
backgroundColor: AppColors_1.AppColors.dividerColor,
|
|
1792
|
+
}}/>
|
|
1793
|
+
|
|
1794
|
+
{/* #6 — Default Tab */}
|
|
1795
|
+
<react_native_1.View style={{
|
|
1796
|
+
paddingVertical: 12,
|
|
1797
|
+
paddingHorizontal: 14,
|
|
1798
|
+
}}>
|
|
1799
|
+
<react_native_1.View style={{
|
|
1800
|
+
flexDirection: 'row',
|
|
1801
|
+
alignItems: 'center',
|
|
1802
|
+
gap: 8,
|
|
1803
|
+
}}>
|
|
1804
|
+
<react_native_1.View style={{
|
|
1805
|
+
width: 20,
|
|
1806
|
+
height: 20,
|
|
1807
|
+
borderRadius: 6,
|
|
1557
1808
|
backgroundColor: AppColors_1.AppColors.purpleShade50,
|
|
1558
1809
|
borderWidth: 1,
|
|
1559
1810
|
borderColor: 'rgba(104,75,155,0.2)',
|
|
1560
1811
|
alignItems: 'center',
|
|
1561
1812
|
justifyContent: 'center',
|
|
1562
1813
|
}}>
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1814
|
+
<NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={11}/>
|
|
1815
|
+
</react_native_1.View>
|
|
1816
|
+
<react_native_1.View style={{ flex: 1 }}>
|
|
1817
|
+
<react_native_1.Text style={{
|
|
1818
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
1819
|
+
fontSize: 13,
|
|
1820
|
+
color: AppColors_1.AppColors.primaryBlack,
|
|
1821
|
+
}}>
|
|
1822
|
+
Default Tab
|
|
1823
|
+
</react_native_1.Text>
|
|
1824
|
+
<react_native_1.Text style={{
|
|
1825
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
1826
|
+
fontSize: 11,
|
|
1827
|
+
color: AppColors_1.AppColors.grayText,
|
|
1828
|
+
marginTop: 1,
|
|
1829
|
+
}}>
|
|
1830
|
+
Tab shown when the inspector opens
|
|
1831
|
+
</react_native_1.Text>
|
|
1832
|
+
</react_native_1.View>
|
|
1833
|
+
</react_native_1.View>
|
|
1834
|
+
|
|
1835
|
+
{/* Grid of Default Tab Cards */}
|
|
1836
|
+
<react_native_1.View style={{
|
|
1837
|
+
flexDirection: 'row',
|
|
1838
|
+
flexWrap: 'wrap',
|
|
1839
|
+
gap: 8,
|
|
1840
|
+
marginTop: 12,
|
|
1841
|
+
}}>
|
|
1842
|
+
{settingsTabs
|
|
1843
|
+
.filter(tab => tab.key === 'apis' || tabVisibility?.[tab.key])
|
|
1844
|
+
.map(tab => {
|
|
1845
|
+
const isActive = defaultTab === tab.key;
|
|
1846
|
+
return (<TouchableScale_1.default key={tab.key} onPress={() => setDefaultTab(tab.key)} style={{
|
|
1847
|
+
flexDirection: 'row',
|
|
1848
|
+
alignItems: 'center',
|
|
1849
|
+
gap: 8,
|
|
1850
|
+
paddingVertical: 10,
|
|
1851
|
+
paddingHorizontal: 12,
|
|
1852
|
+
borderRadius: 10,
|
|
1853
|
+
borderWidth: 1.5,
|
|
1854
|
+
borderColor: isActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayBorderSecondary,
|
|
1855
|
+
backgroundColor: isActive ? 'rgba(104,75,155,0.06)' : AppColors_1.AppColors.primaryLight,
|
|
1856
|
+
minWidth: '47%',
|
|
1857
|
+
flex: 1,
|
|
1858
|
+
}}>
|
|
1859
|
+
<react_native_1.View style={{
|
|
1860
|
+
width: 22,
|
|
1861
|
+
height: 22,
|
|
1862
|
+
borderRadius: 6,
|
|
1863
|
+
backgroundColor: isActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.purpleShade50,
|
|
1864
|
+
alignItems: 'center',
|
|
1865
|
+
justifyContent: 'center',
|
|
1866
|
+
}}>
|
|
1867
|
+
{tab.icon === 'insights' && (<NetworkIcons_1.InsightsIcon color={isActive ? '#FFFFFF' : AppColors_1.AppColors.purple} size={11}/>)}
|
|
1868
|
+
{tab.icon === 'apis' && (<NetworkIcons_1.SignalIcon color={isActive ? '#FFFFFF' : AppColors_1.AppColors.purple} size={11}/>)}
|
|
1869
|
+
{tab.icon === 'logs' && (<NetworkIcons_1.TerminalIcon color={isActive ? '#FFFFFF' : AppColors_1.AppColors.purple} size={11}/>)}
|
|
1870
|
+
{tab.icon === 'analytics' && (<NetworkIcons_1.AnalyticsIcon color={isActive ? '#FFFFFF' : AppColors_1.AppColors.purple} size={11}/>)}
|
|
1871
|
+
{tab.icon === 'webview' && (<NetworkIcons_1.GlobeIcon color={isActive ? '#FFFFFF' : AppColors_1.AppColors.purple} size={11}/>)}
|
|
1872
|
+
{tab.icon === 'redux' && (<NetworkIcons_1.TerminalIcon color={isActive ? '#FFFFFF' : AppColors_1.AppColors.purple} size={11}/>)}
|
|
1873
|
+
</react_native_1.View>
|
|
1874
|
+
<react_native_1.Text style={{
|
|
1875
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
1876
|
+
fontSize: 13,
|
|
1877
|
+
color: isActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.primaryBlack,
|
|
1878
|
+
flex: 1,
|
|
1879
|
+
}}>
|
|
1880
|
+
{tab.label}
|
|
1881
|
+
</react_native_1.Text>
|
|
1882
|
+
{isActive && (<react_native_1.View style={{
|
|
1883
|
+
width: 14,
|
|
1884
|
+
height: 14,
|
|
1885
|
+
borderRadius: 7,
|
|
1886
|
+
backgroundColor: AppColors_1.AppColors.purple,
|
|
1887
|
+
alignItems: 'center',
|
|
1888
|
+
justifyContent: 'center',
|
|
1889
|
+
}}>
|
|
1890
|
+
<NetworkIcons_1.CheckIcon size={8} color="#FFFFFF"/>
|
|
1891
|
+
</react_native_1.View>)}
|
|
1892
|
+
</TouchableScale_1.default>);
|
|
1893
|
+
})}
|
|
1894
|
+
</react_native_1.View>
|
|
1895
|
+
</react_native_1.View>
|
|
1896
|
+
|
|
1897
|
+
{/* Divider */}
|
|
1898
|
+
<react_native_1.View style={{
|
|
1899
|
+
height: 1,
|
|
1900
|
+
backgroundColor: AppColors_1.AppColors.dividerColor,
|
|
1901
|
+
}}/>
|
|
1902
|
+
|
|
1903
|
+
{/* #9 — Show Duplicate Logs */}
|
|
1904
|
+
<react_native_1.View style={{
|
|
1905
|
+
flexDirection: 'row',
|
|
1906
|
+
alignItems: 'center',
|
|
1907
|
+
paddingVertical: 12,
|
|
1908
|
+
paddingHorizontal: 14,
|
|
1909
|
+
gap: 12,
|
|
1910
|
+
}}>
|
|
1911
|
+
<react_native_1.View style={{
|
|
1912
|
+
flex: 1,
|
|
1913
|
+
flexDirection: 'row',
|
|
1914
|
+
alignItems: 'center',
|
|
1915
|
+
gap: 8,
|
|
1916
|
+
}}>
|
|
1917
|
+
<react_native_1.View style={{
|
|
1918
|
+
width: 20,
|
|
1919
|
+
height: 20,
|
|
1920
|
+
borderRadius: 6,
|
|
1921
|
+
backgroundColor: AppColors_1.AppColors.purpleShade50,
|
|
1922
|
+
borderWidth: 1,
|
|
1923
|
+
borderColor: 'rgba(104,75,155,0.2)',
|
|
1924
|
+
alignItems: 'center',
|
|
1925
|
+
justifyContent: 'center',
|
|
1926
|
+
}}>
|
|
1927
|
+
<NetworkIcons_1.EyeIcon color={AppColors_1.AppColors.purple} size={11}/>
|
|
1928
|
+
</react_native_1.View>
|
|
1929
|
+
<react_native_1.View style={{ flex: 1 }}>
|
|
1930
|
+
<react_native_1.Text style={{
|
|
1931
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
1932
|
+
fontSize: 13,
|
|
1933
|
+
color: AppColors_1.AppColors.primaryBlack,
|
|
1934
|
+
}}>
|
|
1935
|
+
Show Duplicate Logs
|
|
1936
|
+
</react_native_1.Text>
|
|
1937
|
+
<react_native_1.Text style={{
|
|
1938
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
1939
|
+
fontSize: 11,
|
|
1940
|
+
color: AppColors_1.AppColors.grayText,
|
|
1941
|
+
marginTop: 1,
|
|
1942
|
+
}}>
|
|
1943
|
+
Off: repeated identical entries collapse into one row
|
|
1944
|
+
with a ×N count
|
|
1945
|
+
</react_native_1.Text>
|
|
1946
|
+
</react_native_1.View>
|
|
1947
|
+
</react_native_1.View>
|
|
1948
|
+
|
|
1949
|
+
{/* Toggle Switch */}
|
|
1950
|
+
<TouchableScale_1.default onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
|
|
1951
|
+
width: 38,
|
|
1952
|
+
height: 22,
|
|
1953
|
+
borderRadius: 11,
|
|
1954
|
+
backgroundColor: showDuplicateLogs
|
|
1955
|
+
? AppColors_1.AppColors.purple
|
|
1956
|
+
: AppColors_1.AppColors.grayBorderSecondary,
|
|
1957
|
+
padding: 2,
|
|
1958
|
+
justifyContent: 'center',
|
|
1959
|
+
alignItems: showDuplicateLogs ? 'flex-end' : 'flex-start',
|
|
1960
|
+
}}>
|
|
1961
|
+
<react_native_1.View style={{
|
|
1962
|
+
width: 18,
|
|
1963
|
+
height: 18,
|
|
1964
|
+
borderRadius: 9,
|
|
1965
|
+
backgroundColor: '#FFFFFF',
|
|
1966
|
+
shadowColor: '#000',
|
|
1967
|
+
shadowOpacity: 0.15,
|
|
1968
|
+
shadowRadius: 1.5,
|
|
1969
|
+
shadowOffset: { width: 0, height: 1 },
|
|
1970
|
+
}}/>
|
|
1971
|
+
</TouchableScale_1.default>
|
|
1972
|
+
</react_native_1.View>
|
|
1973
|
+
|
|
1974
|
+
{/* Divider */}
|
|
1975
|
+
<react_native_1.View style={{
|
|
1976
|
+
height: 1,
|
|
1977
|
+
backgroundColor: AppColors_1.AppColors.dividerColor,
|
|
1978
|
+
}}/>
|
|
1979
|
+
|
|
1980
|
+
{/* Reset Settings */}
|
|
1981
|
+
<react_native_1.View style={{
|
|
1982
|
+
flexDirection: 'row',
|
|
1983
|
+
alignItems: 'center',
|
|
1984
|
+
paddingVertical: 12,
|
|
1985
|
+
paddingHorizontal: 14,
|
|
1986
|
+
gap: 12,
|
|
1987
|
+
}}>
|
|
1988
|
+
<react_native_1.View style={{
|
|
1989
|
+
flex: 1,
|
|
1990
|
+
flexDirection: 'row',
|
|
1991
|
+
alignItems: 'center',
|
|
1992
|
+
gap: 8,
|
|
1993
|
+
}}>
|
|
1994
|
+
<react_native_1.View style={{
|
|
1995
|
+
width: 20,
|
|
1996
|
+
height: 20,
|
|
1997
|
+
borderRadius: 6,
|
|
1998
|
+
backgroundColor: 'rgba(239,68,68,0.08)',
|
|
1999
|
+
borderWidth: 1,
|
|
2000
|
+
borderColor: 'rgba(239,68,68,0.2)',
|
|
2001
|
+
alignItems: 'center',
|
|
2002
|
+
justifyContent: 'center',
|
|
2003
|
+
}}>
|
|
2004
|
+
<NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={11}/>
|
|
2005
|
+
</react_native_1.View>
|
|
2006
|
+
<react_native_1.View style={{ flex: 1 }}>
|
|
2007
|
+
<react_native_1.Text style={{
|
|
2008
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2009
|
+
fontSize: 13,
|
|
2010
|
+
color: AppColors_1.AppColors.primaryBlack,
|
|
2011
|
+
}}>
|
|
2012
|
+
Reset Settings
|
|
2013
|
+
</react_native_1.Text>
|
|
2014
|
+
<react_native_1.Text style={{
|
|
2015
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
2016
|
+
fontSize: 11,
|
|
2017
|
+
color: AppColors_1.AppColors.grayText,
|
|
2018
|
+
marginTop: 1,
|
|
2019
|
+
}}>
|
|
2020
|
+
Wipe custom configurations and load package defaults
|
|
2021
|
+
</react_native_1.Text>
|
|
2022
|
+
</react_native_1.View>
|
|
2023
|
+
</react_native_1.View>
|
|
2024
|
+
|
|
2025
|
+
<TouchableScale_1.default onPress={resetToDefaults} style={{
|
|
1575
2026
|
paddingHorizontal: 10,
|
|
1576
2027
|
paddingVertical: 5,
|
|
1577
|
-
borderRadius:
|
|
2028
|
+
borderRadius: 7,
|
|
2029
|
+
backgroundColor: 'rgba(255,46,87,0.08)',
|
|
1578
2030
|
borderWidth: 1,
|
|
1579
|
-
borderColor: 'rgba(
|
|
2031
|
+
borderColor: 'rgba(255,46,87,0.2)',
|
|
1580
2032
|
}}>
|
|
1581
|
-
|
|
2033
|
+
<react_native_1.Text style={{
|
|
1582
2034
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
1583
2035
|
fontSize: 11,
|
|
1584
|
-
color: AppColors_1.AppColors.
|
|
2036
|
+
color: AppColors_1.AppColors.errorColor,
|
|
1585
2037
|
}}>
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
2038
|
+
Reset
|
|
2039
|
+
</react_native_1.Text>
|
|
2040
|
+
</TouchableScale_1.default>
|
|
2041
|
+
</react_native_1.View>
|
|
2042
|
+
</react_native_1.View>
|
|
2043
|
+
</react_native_1.View>
|
|
2044
|
+
|
|
2045
|
+
{/* Storage Status */}
|
|
2046
|
+
<react_native_1.View style={{
|
|
2047
|
+
backgroundColor: (0, settingsStore_1.isPersistentStorageAvailable)()
|
|
2048
|
+
? 'rgba(74,222,128,0.08)'
|
|
2049
|
+
: 'rgba(234,179,8,0.08)',
|
|
2050
|
+
borderRadius: 12,
|
|
2051
|
+
borderWidth: 1,
|
|
2052
|
+
borderColor: (0, settingsStore_1.isPersistentStorageAvailable)()
|
|
2053
|
+
? 'rgba(74,222,128,0.2)'
|
|
2054
|
+
: 'rgba(234,179,8,0.2)',
|
|
2055
|
+
padding: 12,
|
|
2056
|
+
marginTop: 16,
|
|
2057
|
+
flexDirection: 'row',
|
|
2058
|
+
alignItems: 'center',
|
|
2059
|
+
gap: 10,
|
|
2060
|
+
}}>
|
|
2061
|
+
<react_native_1.View style={{
|
|
2062
|
+
width: 8,
|
|
2063
|
+
height: 8,
|
|
2064
|
+
borderRadius: 4,
|
|
2065
|
+
backgroundColor: (0, settingsStore_1.isPersistentStorageAvailable)() ? '#22C55E' : '#EAB308',
|
|
2066
|
+
}}/>
|
|
2067
|
+
<react_native_1.View style={{ flex: 1 }}>
|
|
2068
|
+
<react_native_1.Text style={{
|
|
2069
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2070
|
+
fontSize: 12,
|
|
2071
|
+
color: (0, settingsStore_1.isPersistentStorageAvailable)() ? '#15803D' : '#854D0E',
|
|
2072
|
+
}}>
|
|
2073
|
+
{(0, settingsStore_1.isPersistentStorageAvailable)()
|
|
2074
|
+
? `Storage: Persistent (${storage ? 'Custom' : 'iOS Settings'})`
|
|
2075
|
+
: 'Storage: Temporary (In-Memory)'}
|
|
2076
|
+
</react_native_1.Text>
|
|
2077
|
+
<react_native_1.Text style={{
|
|
2078
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
2079
|
+
fontSize: 10.5,
|
|
2080
|
+
color: (0, settingsStore_1.isPersistentStorageAvailable)() ? '#166534' : '#854D0E',
|
|
2081
|
+
marginTop: 2,
|
|
2082
|
+
opacity: 0.8,
|
|
2083
|
+
}}>
|
|
2084
|
+
{(0, settingsStore_1.isPersistentStorageAvailable)()
|
|
2085
|
+
? 'Your settings are saved across app restarts.'
|
|
2086
|
+
: 'Settings reset when closed. To persist settings, pass a storage object to <NetworkInspector storage={...} />.'}
|
|
2087
|
+
</react_native_1.Text>
|
|
2088
|
+
</react_native_1.View>
|
|
2089
|
+
</react_native_1.View>
|
|
2090
|
+
</react_native_1.ScrollView>
|
|
2091
|
+
</react_native_1.View>);
|
|
2092
|
+
}
|
|
2093
|
+
const goBackToMain = () => {
|
|
2094
|
+
animateNextLayout();
|
|
2095
|
+
setSettingsPage('main');
|
|
2096
|
+
};
|
|
1590
2097
|
// Helper: settings row with icon + label + optional description
|
|
1591
2098
|
const renderSettingRow = (opts) => (<react_native_1.View style={{
|
|
1592
2099
|
paddingVertical: 12,
|
|
@@ -1666,9 +2173,15 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1666
2173
|
})}
|
|
1667
2174
|
</react_native_1.View>)}
|
|
1668
2175
|
</react_native_1.View>);
|
|
2176
|
+
let content = null;
|
|
2177
|
+
let title = '';
|
|
2178
|
+
let icon = null;
|
|
2179
|
+
let rightInfo = '';
|
|
1669
2180
|
if (settingsPage === 'apis') {
|
|
1670
|
-
|
|
1671
|
-
|
|
2181
|
+
title = 'APIs Settings';
|
|
2182
|
+
icon = <NetworkIcons_1.SignalIcon color="#FFFFFF" size={16}/>;
|
|
2183
|
+
rightInfo = `Total: ${logs.length}`;
|
|
2184
|
+
content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
|
|
1672
2185
|
<react_native_1.View style={{
|
|
1673
2186
|
backgroundColor: AppColors_1.AppColors.primaryLight,
|
|
1674
2187
|
padding: 16,
|
|
@@ -1728,9 +2241,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1728
2241
|
</react_native_1.View>
|
|
1729
2242
|
</react_native_1.ScrollView>);
|
|
1730
2243
|
}
|
|
1731
|
-
if (settingsPage === 'logs') {
|
|
1732
|
-
|
|
1733
|
-
|
|
2244
|
+
else if (settingsPage === 'logs') {
|
|
2245
|
+
title = 'Logs Settings';
|
|
2246
|
+
icon = <NetworkIcons_1.TerminalIcon color="#FFFFFF" size={16}/>;
|
|
2247
|
+
rightInfo = `Total: ${consoleLogs.length}`;
|
|
2248
|
+
content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
|
|
1734
2249
|
<react_native_1.View style={{
|
|
1735
2250
|
backgroundColor: AppColors_1.AppColors.primaryLight,
|
|
1736
2251
|
padding: 16,
|
|
@@ -1759,7 +2274,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1759
2274
|
Log Levels
|
|
1760
2275
|
</react_native_1.Text>
|
|
1761
2276
|
{['info', 'warn', 'error'].map((level, li) => {
|
|
1762
|
-
const isLvlActive = showConsoleLevels[level];
|
|
2277
|
+
const isLvlActive = showConsoleLevels?.[level];
|
|
1763
2278
|
const levelColor = level === 'error'
|
|
1764
2279
|
? AppColors_1.AppColors.errorColor
|
|
1765
2280
|
: level === 'warn'
|
|
@@ -1840,9 +2355,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1840
2355
|
</react_native_1.View>
|
|
1841
2356
|
</react_native_1.ScrollView>);
|
|
1842
2357
|
}
|
|
1843
|
-
if (settingsPage === 'analytics') {
|
|
1844
|
-
|
|
1845
|
-
|
|
2358
|
+
else if (settingsPage === 'analytics') {
|
|
2359
|
+
title = 'Analytics Settings';
|
|
2360
|
+
icon = <NetworkIcons_1.AnalyticsIcon color="#FFFFFF" size={16}/>;
|
|
2361
|
+
rightInfo = `Events: ${analyticsEvents.length}`;
|
|
2362
|
+
content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
|
|
1846
2363
|
<react_native_1.View style={{
|
|
1847
2364
|
backgroundColor: AppColors_1.AppColors.primaryLight,
|
|
1848
2365
|
padding: 16,
|
|
@@ -1896,9 +2413,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1896
2413
|
</react_native_1.View>
|
|
1897
2414
|
</react_native_1.ScrollView>);
|
|
1898
2415
|
}
|
|
1899
|
-
if (settingsPage === 'webview') {
|
|
1900
|
-
|
|
1901
|
-
|
|
2416
|
+
else if (settingsPage === 'webview') {
|
|
2417
|
+
title = 'WebView Settings';
|
|
2418
|
+
icon = <NetworkIcons_1.GlobeIcon color="#FFFFFF" size={16}/>;
|
|
2419
|
+
rightInfo = `History: ${webViewNavHistory.length}`;
|
|
2420
|
+
content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
|
|
1902
2421
|
<react_native_1.View style={{
|
|
1903
2422
|
backgroundColor: AppColors_1.AppColors.primaryLight,
|
|
1904
2423
|
padding: 16,
|
|
@@ -1968,9 +2487,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
1968
2487
|
</react_native_1.View>
|
|
1969
2488
|
</react_native_1.ScrollView>);
|
|
1970
2489
|
}
|
|
1971
|
-
if (settingsPage === 'redux') {
|
|
1972
|
-
|
|
1973
|
-
|
|
2490
|
+
else if (settingsPage === 'redux') {
|
|
2491
|
+
title = 'Redux Settings';
|
|
2492
|
+
icon = <NetworkIcons_1.TerminalIcon color="#FFFFFF" size={16}/>;
|
|
2493
|
+
rightInfo = `Reducers: ${Object.keys(reduxState || {}).length}`;
|
|
2494
|
+
content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
|
|
1974
2495
|
<react_native_1.View style={{
|
|
1975
2496
|
backgroundColor: AppColors_1.AppColors.primaryLight,
|
|
1976
2497
|
padding: 16,
|
|
@@ -2054,53 +2575,108 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2054
2575
|
</react_native_1.View>
|
|
2055
2576
|
</react_native_1.ScrollView>);
|
|
2056
2577
|
}
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2578
|
+
else {
|
|
2579
|
+
title = 'Insights Settings';
|
|
2580
|
+
icon = <NetworkIcons_1.InsightsIcon color="#FFFFFF" size={16}/>;
|
|
2581
|
+
content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
|
|
2582
|
+
<react_native_1.View style={{
|
|
2583
|
+
backgroundColor: AppColors_1.AppColors.primaryLight,
|
|
2584
|
+
padding: 16,
|
|
2585
|
+
borderRadius: 12,
|
|
2586
|
+
borderWidth: 1,
|
|
2587
|
+
borderColor: AppColors_1.AppColors.grayBorderSecondary,
|
|
2588
|
+
gap: 4,
|
|
2589
|
+
}}>
|
|
2590
|
+
{renderSettingRow({
|
|
2591
|
+
icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
|
|
2592
|
+
label: 'Slow Latency Warning',
|
|
2593
|
+
description: 'Alert threshold for slow API request duration',
|
|
2594
|
+
picker: {
|
|
2595
|
+
options: [500, 1000, 2000],
|
|
2596
|
+
selectedValue: slowRequestThreshold,
|
|
2597
|
+
onSelect: setSlowRequestThreshold,
|
|
2598
|
+
},
|
|
2599
|
+
})}
|
|
2600
|
+
<react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
|
|
2601
|
+
{renderSettingRow({
|
|
2602
|
+
icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
|
|
2603
|
+
label: 'Show Console Alerts',
|
|
2604
|
+
description: 'Flags critical warnings or crash events on dashboard',
|
|
2605
|
+
isLast: true,
|
|
2606
|
+
onPress: () => setInsightsShowConsoleAlerts(prev => !prev),
|
|
2607
|
+
right: (<react_native_1.View style={{
|
|
2608
|
+
width: 22,
|
|
2609
|
+
height: 22,
|
|
2610
|
+
borderRadius: 6,
|
|
2611
|
+
borderWidth: 2,
|
|
2612
|
+
borderColor: insightsShowConsoleAlerts
|
|
2613
|
+
? AppColors_1.AppColors.purple
|
|
2614
|
+
: AppColors_1.AppColors.grayTextWeak,
|
|
2615
|
+
backgroundColor: insightsShowConsoleAlerts
|
|
2616
|
+
? 'rgba(104, 75, 155, 0.1)'
|
|
2617
|
+
: 'transparent',
|
|
2618
|
+
alignItems: 'center',
|
|
2619
|
+
justifyContent: 'center',
|
|
2620
|
+
}}>
|
|
2621
|
+
{insightsShowConsoleAlerts && (<NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.purple}/>)}
|
|
2622
|
+
</react_native_1.View>),
|
|
2623
|
+
})}
|
|
2624
|
+
</react_native_1.View>
|
|
2625
|
+
</react_native_1.ScrollView>);
|
|
2626
|
+
}
|
|
2627
|
+
return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
|
|
2628
|
+
<react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, '#6B4EFF']} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles_1.default.headerGradient}>
|
|
2629
|
+
<react_native_1.SafeAreaView style={{ width: '100%' }}>
|
|
2630
|
+
<react_native_1.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
|
|
2631
|
+
<TouchableScale_1.default onPress={goBackToMain} hitSlop={12} style={{
|
|
2632
|
+
padding: 8,
|
|
2633
|
+
borderRadius: 10,
|
|
2634
|
+
backgroundColor: 'rgba(255, 255, 255, 0.15)',
|
|
2064
2635
|
borderWidth: 1,
|
|
2065
|
-
borderColor:
|
|
2066
|
-
gap: 4,
|
|
2636
|
+
borderColor: 'rgba(255, 255, 255, 0.08)',
|
|
2067
2637
|
}}>
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2638
|
+
<NetworkIcons_1.WhiteBackNavigation color="#FFFFFF" size={16}/>
|
|
2639
|
+
</TouchableScale_1.default>
|
|
2640
|
+
{icon && (<react_native_1.View style={{
|
|
2641
|
+
width: 30,
|
|
2642
|
+
height: 30,
|
|
2643
|
+
borderRadius: 8,
|
|
2644
|
+
backgroundColor: 'rgba(255, 255, 255, 0.15)',
|
|
2645
|
+
alignItems: 'center',
|
|
2646
|
+
justifyContent: 'center',
|
|
2647
|
+
}}>
|
|
2648
|
+
{icon}
|
|
2649
|
+
</react_native_1.View>)}
|
|
2650
|
+
<react_native_1.View style={{ flex: 1 }}>
|
|
2651
|
+
<react_native_1.Text style={{
|
|
2652
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2653
|
+
fontSize: 17,
|
|
2654
|
+
color: '#FFFFFF',
|
|
2655
|
+
}}>
|
|
2656
|
+
{title}
|
|
2657
|
+
</react_native_1.Text>
|
|
2658
|
+
</react_native_1.View>
|
|
2659
|
+
{rightInfo ? (<react_native_1.View style={{
|
|
2660
|
+
backgroundColor: 'rgba(255, 255, 255, 0.15)',
|
|
2661
|
+
paddingHorizontal: 8,
|
|
2662
|
+
paddingVertical: 4,
|
|
2663
|
+
borderRadius: 8,
|
|
2664
|
+
borderWidth: 1,
|
|
2665
|
+
borderColor: 'rgba(255, 255, 255, 0.1)',
|
|
2666
|
+
}}>
|
|
2667
|
+
<react_native_1.Text style={{
|
|
2668
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
2669
|
+
fontSize: 11,
|
|
2670
|
+
color: '#FFFFFF',
|
|
2671
|
+
}}>
|
|
2672
|
+
{rightInfo}
|
|
2673
|
+
</react_native_1.Text>
|
|
2674
|
+
</react_native_1.View>) : null}
|
|
2675
|
+
</react_native_1.View>
|
|
2676
|
+
</react_native_1.SafeAreaView>
|
|
2677
|
+
</react_native_linear_gradient_1.default>
|
|
2678
|
+
{content}
|
|
2679
|
+
</react_native_1.View>);
|
|
2104
2680
|
};
|
|
2105
2681
|
const renderInsightsDashboard = () => {
|
|
2106
2682
|
const apiTotal = logs.length;
|
|
@@ -2136,11 +2712,11 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2136
2712
|
const totalSignals = apiTotal + logTotal + analyticsTotal + webviewTotal;
|
|
2137
2713
|
const totalIssues = apiErrors + logErrors;
|
|
2138
2714
|
const activeModules = [
|
|
2139
|
-
tabVisibility
|
|
2140
|
-
tabVisibility
|
|
2141
|
-
tabVisibility
|
|
2142
|
-
tabVisibility
|
|
2143
|
-
tabVisibility
|
|
2715
|
+
tabVisibility?.apis,
|
|
2716
|
+
tabVisibility?.logs,
|
|
2717
|
+
tabVisibility?.analytics,
|
|
2718
|
+
tabVisibility?.webview,
|
|
2719
|
+
tabVisibility?.redux,
|
|
2144
2720
|
].filter(Boolean).length;
|
|
2145
2721
|
// Composite health score: success rate penalised by error volume and slow requests.
|
|
2146
2722
|
const healthScore = totalSignals === 0
|
|
@@ -2307,7 +2883,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2307
2883
|
</react_native_1.View>
|
|
2308
2884
|
|
|
2309
2885
|
{/* Module 1: APIs */}
|
|
2310
|
-
{tabVisibility
|
|
2886
|
+
{tabVisibility?.apis && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('apis')}>
|
|
2311
2887
|
<react_native_1.View style={styles_1.default.dashboardModuleHeader}>
|
|
2312
2888
|
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
2313
2889
|
<NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={18}/>
|
|
@@ -2414,7 +2990,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2414
2990
|
</react_native_1.View>)}
|
|
2415
2991
|
</react_native_1.View>
|
|
2416
2992
|
</TouchableScale_1.default>)}
|
|
2417
|
-
{tabVisibility
|
|
2993
|
+
{tabVisibility?.logs && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('logs')}>
|
|
2418
2994
|
<react_native_1.View style={styles_1.default.dashboardModuleHeader}>
|
|
2419
2995
|
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
2420
2996
|
<NetworkIcons_1.TerminalIcon color="#0D9488" size={18}/>
|
|
@@ -2455,7 +3031,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2455
3031
|
</TouchableScale_1.default>)}
|
|
2456
3032
|
|
|
2457
3033
|
{/* Module 3: Analytics */}
|
|
2458
|
-
{tabVisibility
|
|
3034
|
+
{tabVisibility?.analytics && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('analytics')}>
|
|
2459
3035
|
<react_native_1.View style={styles_1.default.dashboardModuleHeader}>
|
|
2460
3036
|
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
2461
3037
|
<NetworkIcons_1.AnalyticsIcon color="#EA580C" size={18}/>
|
|
@@ -2492,7 +3068,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2492
3068
|
</TouchableScale_1.default>)}
|
|
2493
3069
|
|
|
2494
3070
|
{/* Module 4: WebView */}
|
|
2495
|
-
{tabVisibility
|
|
3071
|
+
{tabVisibility?.webview && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('webview')}>
|
|
2496
3072
|
<react_native_1.View style={styles_1.default.dashboardModuleHeader}>
|
|
2497
3073
|
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
2498
3074
|
<NetworkIcons_1.GlobeIcon color="#2563EB" size={18}/>
|
|
@@ -2525,7 +3101,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2525
3101
|
</TouchableScale_1.default>)}
|
|
2526
3102
|
|
|
2527
3103
|
{/* Module 5: Redux Store */}
|
|
2528
|
-
{tabVisibility
|
|
3104
|
+
{tabVisibility?.redux && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('redux')}>
|
|
2529
3105
|
<react_native_1.View style={styles_1.default.dashboardModuleHeader}>
|
|
2530
3106
|
<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
2531
3107
|
<NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={18}/>
|
|
@@ -2790,6 +3366,29 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2790
3366
|
}} hitSlop={10}>
|
|
2791
3367
|
<react_native_1.Animated.View style={[styles_1.default.fabPulseRing, { transform: [{ scale: pulseAnim }] }]}/>
|
|
2792
3368
|
<NetworkIcons_1.BrandCircleIcon size={62}/>
|
|
3369
|
+
{/* #4 — shining sweep, clipped inside the circular launcher */}
|
|
3370
|
+
<react_native_1.View pointerEvents="none" style={styles_1.default.fabShineClip}>
|
|
3371
|
+
<react_native_1.Animated.View style={[
|
|
3372
|
+
styles_1.default.fabShineStreak,
|
|
3373
|
+
{
|
|
3374
|
+
transform: [
|
|
3375
|
+
{
|
|
3376
|
+
translateX: fabShineAnim.interpolate({
|
|
3377
|
+
inputRange: [0, 1],
|
|
3378
|
+
outputRange: [-48, 96],
|
|
3379
|
+
}),
|
|
3380
|
+
},
|
|
3381
|
+
{ rotate: '25deg' },
|
|
3382
|
+
],
|
|
3383
|
+
},
|
|
3384
|
+
]}>
|
|
3385
|
+
<react_native_linear_gradient_1.default colors={[
|
|
3386
|
+
'rgba(255,255,255,0)',
|
|
3387
|
+
'rgba(255,255,255,0.55)',
|
|
3388
|
+
'rgba(255,255,255,0)',
|
|
3389
|
+
]} start={{ x: 0, y: 0.5 }} end={{ x: 1, y: 0.5 }} style={{ flex: 1 }}/>
|
|
3390
|
+
</react_native_1.Animated.View>
|
|
3391
|
+
</react_native_1.View>
|
|
2793
3392
|
{(logs.length > 0 || analyticsEvents.length > 0) && (<react_native_1.Animated.View style={[
|
|
2794
3393
|
styles_1.default.fabBadge,
|
|
2795
3394
|
hasErrors ? styles_1.default.fabBadgeError : styles_1.default.fabBadgeNormal,
|
|
@@ -2815,7 +3414,8 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2815
3414
|
<react_native_1.StatusBar translucent backgroundColor="transparent" barStyle="light-content"/>
|
|
2816
3415
|
|
|
2817
3416
|
<react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, '#6B4EFF']} style={styles_1.default.headerGradient}>
|
|
2818
|
-
<react_native_1.
|
|
3417
|
+
<react_native_1.SafeAreaView style={{ width: '100%' }}>
|
|
3418
|
+
<react_native_1.View style={styles_1.default.header}>
|
|
2819
3419
|
<react_native_1.View style={[
|
|
2820
3420
|
styles_1.default.headerLeft,
|
|
2821
3421
|
{
|
|
@@ -2962,6 +3562,29 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
2962
3562
|
</react_native_1.Text>
|
|
2963
3563
|
</react_native_1.View>
|
|
2964
3564
|
</react_native_1.View>
|
|
3565
|
+
|
|
3566
|
+
{/* #1 — pulsing dot when a newer version is on NPM */}
|
|
3567
|
+
{updateAvailable && (<react_native_1.Pressable hitSlop={10} onPress={() => react_native_1.Alert.alert('Update Available', `react-native-inapp-inspector v${latestNpmVersion} is available on NPM (installed: v${constants_1.LIB_VERSION}).`, [
|
|
3568
|
+
{ text: 'Later', style: 'cancel' },
|
|
3569
|
+
{
|
|
3570
|
+
text: 'View on NPM',
|
|
3571
|
+
onPress: () => react_native_1.Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { }),
|
|
3572
|
+
},
|
|
3573
|
+
])} style={{
|
|
3574
|
+
alignItems: 'center',
|
|
3575
|
+
justifyContent: 'center',
|
|
3576
|
+
}}>
|
|
3577
|
+
<react_native_1.Animated.View style={{
|
|
3578
|
+
width: 8,
|
|
3579
|
+
height: 8,
|
|
3580
|
+
borderRadius: 4,
|
|
3581
|
+
backgroundColor: '#4ADE80',
|
|
3582
|
+
borderWidth: 1,
|
|
3583
|
+
borderColor: 'rgba(255,255,255,0.9)',
|
|
3584
|
+
opacity: activePulseAnim,
|
|
3585
|
+
transform: [{ scale: unreadPulseAnim }],
|
|
3586
|
+
}}/>
|
|
3587
|
+
</react_native_1.Pressable>)}
|
|
2965
3588
|
</react_native_1.View>
|
|
2966
3589
|
</react_native_1.View>
|
|
2967
3590
|
</react_native_1.View>) : null}
|
|
@@ -3110,7 +3733,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3110
3733
|
},
|
|
3111
3734
|
],
|
|
3112
3735
|
}}>
|
|
3113
|
-
<NetworkIcons_1.
|
|
3736
|
+
<NetworkIcons_1.WipeIcon color="#FFFFFF" size={16}/>
|
|
3114
3737
|
</react_native_1.Animated.View>
|
|
3115
3738
|
</TouchableScale_1.default>)}
|
|
3116
3739
|
|
|
@@ -3129,7 +3752,8 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3129
3752
|
</TouchableScale_1.default>
|
|
3130
3753
|
</react_native_1.View>
|
|
3131
3754
|
</react_native_1.View>
|
|
3132
|
-
</
|
|
3755
|
+
</react_native_1.SafeAreaView>
|
|
3756
|
+
</react_native_linear_gradient_1.default>
|
|
3133
3757
|
|
|
3134
3758
|
{/* ─── Horizontal Scrollable Tab Bar inside Content ─── */}
|
|
3135
3759
|
{selected == null &&
|
|
@@ -3174,7 +3798,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3174
3798
|
icon: 'redux',
|
|
3175
3799
|
},
|
|
3176
3800
|
]
|
|
3177
|
-
.filter(tab => tabVisibility[tab.key])
|
|
3801
|
+
.filter(tab => tabVisibility?.[tab.key])
|
|
3178
3802
|
.map(tab => {
|
|
3179
3803
|
const isActive = activeTab === tab.key;
|
|
3180
3804
|
const iconColor = isActive
|
|
@@ -3290,7 +3914,16 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3290
3914
|
animateNextLayout();
|
|
3291
3915
|
setAnalyticsSubTab('ga_events');
|
|
3292
3916
|
}}>
|
|
3293
|
-
<react_native_1.
|
|
3917
|
+
<react_native_1.View style={{
|
|
3918
|
+
flexDirection: 'row',
|
|
3919
|
+
alignItems: 'center',
|
|
3920
|
+
gap: 6,
|
|
3921
|
+
}}>
|
|
3922
|
+
{/* #7 */}
|
|
3923
|
+
<NetworkIcons_1.AnalyticsIcon size={13} color={analyticsSubTab === 'ga_events'
|
|
3924
|
+
? AppColors_1.AppColors.purple
|
|
3925
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
3926
|
+
<react_native_1.Text style={[
|
|
3294
3927
|
{
|
|
3295
3928
|
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
3296
3929
|
fontSize: 13,
|
|
@@ -3301,12 +3934,13 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3301
3934
|
color: AppColors_1.AppColors.purple,
|
|
3302
3935
|
},
|
|
3303
3936
|
]}>
|
|
3304
|
-
|
|
3305
|
-
|
|
3937
|
+
GA Events (
|
|
3938
|
+
{analyticsSearch
|
|
3306
3939
|
? filteredAnalyticsEvents.length
|
|
3307
3940
|
: analyticsEvents.length}
|
|
3308
|
-
|
|
3309
|
-
|
|
3941
|
+
)
|
|
3942
|
+
</react_native_1.Text>
|
|
3943
|
+
</react_native_1.View>
|
|
3310
3944
|
</react_native_1.Pressable>
|
|
3311
3945
|
<react_native_1.Pressable style={[
|
|
3312
3946
|
{
|
|
@@ -3327,7 +3961,16 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3327
3961
|
animateNextLayout();
|
|
3328
3962
|
setAnalyticsSubTab('top_events');
|
|
3329
3963
|
}}>
|
|
3330
|
-
<react_native_1.
|
|
3964
|
+
<react_native_1.View style={{
|
|
3965
|
+
flexDirection: 'row',
|
|
3966
|
+
alignItems: 'center',
|
|
3967
|
+
gap: 6,
|
|
3968
|
+
}}>
|
|
3969
|
+
{/* #7 */}
|
|
3970
|
+
<NetworkIcons_1.TrendingUpIcon size={13} color={analyticsSubTab === 'top_events'
|
|
3971
|
+
? AppColors_1.AppColors.purple
|
|
3972
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
3973
|
+
<react_native_1.Text style={[
|
|
3331
3974
|
{
|
|
3332
3975
|
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
3333
3976
|
fontSize: 13,
|
|
@@ -3338,8 +3981,9 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3338
3981
|
color: AppColors_1.AppColors.purple,
|
|
3339
3982
|
},
|
|
3340
3983
|
]}>
|
|
3341
|
-
|
|
3342
|
-
|
|
3984
|
+
Top Events ({topEventsArray.length})
|
|
3985
|
+
</react_native_1.Text>
|
|
3986
|
+
</react_native_1.View>
|
|
3343
3987
|
</react_native_1.Pressable>
|
|
3344
3988
|
</react_native_1.View>
|
|
3345
3989
|
</react_native_1.View>)}
|
|
@@ -3449,7 +4093,7 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3449
4093
|
flexGrow: 1,
|
|
3450
4094
|
},
|
|
3451
4095
|
]} keyboardShouldPersistTaps="handled"/>)) : activeTab === 'apis' && selected == null ? (<react_native_1.View style={{ flex: 1 }}>
|
|
3452
|
-
<react_native_1.FlatList ref={apisListRef}
|
|
4096
|
+
<react_native_1.FlatList ref={apisListRef} data={groupedData} keyExtractor={item => item?.id?.toString()} renderItem={renderItem} initialNumToRender={10} maxToRenderPerBatch={10} windowSize={5} removeClippedSubviews={true} ListHeaderComponent={<react_native_1.View style={{ marginTop: 8 }}>
|
|
3453
4097
|
<react_native_1.View style={styles_1.default.toolbarRow}>
|
|
3454
4098
|
<react_native_1.View style={styles_1.default.searchContainer}>
|
|
3455
4099
|
<NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={16}/>
|
|
@@ -3600,17 +4244,17 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3600
4244
|
styles_1.default.listContent,
|
|
3601
4245
|
filteredLogs.length === 0 && { flexGrow: 1 },
|
|
3602
4246
|
]} keyboardShouldPersistTaps="handled"/>
|
|
3603
|
-
{
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3611
|
-
|
|
3612
|
-
|
|
3613
|
-
|
|
4247
|
+
{/* #2 — always-visible scroll-to-top, bottom right */}
|
|
4248
|
+
<TouchableScale_1.default onPress={() => {
|
|
4249
|
+
apisListRef.current?.scrollToOffset({
|
|
4250
|
+
offset: 0,
|
|
4251
|
+
animated: true,
|
|
4252
|
+
});
|
|
4253
|
+
}} hitSlop={10} style={styles_1.default.scrollTopBtn}>
|
|
4254
|
+
<react_native_1.View style={{ transform: [{ rotate: '180deg' }] }}>
|
|
4255
|
+
<NetworkIcons_1.ChevronIcon color="#FFFFFF" size={18}/>
|
|
4256
|
+
</react_native_1.View>
|
|
4257
|
+
</TouchableScale_1.default>
|
|
3614
4258
|
</react_native_1.View>) : activeTab === 'logs' ? (<react_native_1.View style={{ flex: 1 }}>
|
|
3615
4259
|
<react_native_1.View style={{
|
|
3616
4260
|
backgroundColor: '#FFFFFF',
|
|
@@ -3659,15 +4303,25 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3659
4303
|
backgroundColor: '#F4EBFF',
|
|
3660
4304
|
},
|
|
3661
4305
|
]}>
|
|
3662
|
-
|
|
4306
|
+
{/* #7 */}
|
|
4307
|
+
<react_native_1.View style={{
|
|
4308
|
+
flexDirection: 'row',
|
|
4309
|
+
alignItems: 'center',
|
|
4310
|
+
gap: 5,
|
|
4311
|
+
}}>
|
|
4312
|
+
<NetworkIcons_1.LayersIcon size={12} color={active
|
|
4313
|
+
? AppColors_1.AppColors.purpleShade700
|
|
4314
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
4315
|
+
<react_native_1.Text numberOfLines={1} style={[
|
|
3663
4316
|
styles_1.default.statusFilterText,
|
|
3664
4317
|
active && {
|
|
3665
4318
|
color: AppColors_1.AppColors.purpleShade700,
|
|
3666
4319
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
3667
4320
|
},
|
|
3668
4321
|
]}>
|
|
3669
|
-
|
|
3670
|
-
|
|
4322
|
+
All ({logCounts.all})
|
|
4323
|
+
</react_native_1.Text>
|
|
4324
|
+
</react_native_1.View>
|
|
3671
4325
|
</react_native_1.View>
|
|
3672
4326
|
</TouchableScale_1.default>);
|
|
3673
4327
|
})()}
|
|
@@ -3693,15 +4347,25 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3693
4347
|
backgroundColor: '#F1F5F9',
|
|
3694
4348
|
},
|
|
3695
4349
|
]}>
|
|
3696
|
-
|
|
4350
|
+
{/* #7 */}
|
|
4351
|
+
<react_native_1.View style={{
|
|
4352
|
+
flexDirection: 'row',
|
|
4353
|
+
alignItems: 'center',
|
|
4354
|
+
gap: 5,
|
|
4355
|
+
}}>
|
|
4356
|
+
<NetworkIcons_1.UserIcon size={12} color={active
|
|
4357
|
+
? '#334155'
|
|
4358
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
4359
|
+
<react_native_1.Text numberOfLines={1} style={[
|
|
3697
4360
|
styles_1.default.statusFilterText,
|
|
3698
4361
|
active && {
|
|
3699
4362
|
color: '#334155',
|
|
3700
4363
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
3701
4364
|
},
|
|
3702
4365
|
]}>
|
|
3703
|
-
|
|
3704
|
-
|
|
4366
|
+
User Log ({logCounts['user-log']})
|
|
4367
|
+
</react_native_1.Text>
|
|
4368
|
+
</react_native_1.View>
|
|
3705
4369
|
</react_native_1.View>
|
|
3706
4370
|
</TouchableScale_1.default>);
|
|
3707
4371
|
})()}
|
|
@@ -3727,15 +4391,25 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3727
4391
|
backgroundColor: AppColors_1.AppColors.purpleShade50,
|
|
3728
4392
|
},
|
|
3729
4393
|
]}>
|
|
3730
|
-
|
|
4394
|
+
{/* #7 */}
|
|
4395
|
+
<react_native_1.View style={{
|
|
4396
|
+
flexDirection: 'row',
|
|
4397
|
+
alignItems: 'center',
|
|
4398
|
+
gap: 5,
|
|
4399
|
+
}}>
|
|
4400
|
+
<NetworkIcons_1.InfoCircleIcon size={12} color={active
|
|
4401
|
+
? AppColors_1.AppColors.purple
|
|
4402
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
4403
|
+
<react_native_1.Text numberOfLines={1} style={[
|
|
3731
4404
|
styles_1.default.statusFilterText,
|
|
3732
4405
|
active && {
|
|
3733
4406
|
color: AppColors_1.AppColors.purple,
|
|
3734
4407
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
3735
4408
|
},
|
|
3736
4409
|
]}>
|
|
3737
|
-
|
|
3738
|
-
|
|
4410
|
+
Info ({logCounts.info})
|
|
4411
|
+
</react_native_1.Text>
|
|
4412
|
+
</react_native_1.View>
|
|
3739
4413
|
</react_native_1.View>
|
|
3740
4414
|
</TouchableScale_1.default>);
|
|
3741
4415
|
})()}
|
|
@@ -3761,7 +4435,17 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3761
4435
|
backgroundColor: '#FFFDF6',
|
|
3762
4436
|
},
|
|
3763
4437
|
]}>
|
|
3764
|
-
|
|
4438
|
+
{/* #7 */}
|
|
4439
|
+
<react_native_1.View style={{
|
|
4440
|
+
flexDirection: 'row',
|
|
4441
|
+
alignItems: 'center',
|
|
4442
|
+
gap: 5,
|
|
4443
|
+
}}>
|
|
4444
|
+
<NetworkIcons_1.WarningTriangleIcon size={12} color={active
|
|
4445
|
+
? AppColors_1.AppColors.darkOrange ||
|
|
4446
|
+
AppColors_1.AppColors.lightOrange
|
|
4447
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
4448
|
+
<react_native_1.Text numberOfLines={1} style={[
|
|
3765
4449
|
styles_1.default.statusFilterText,
|
|
3766
4450
|
active && {
|
|
3767
4451
|
color: AppColors_1.AppColors.darkOrange ||
|
|
@@ -3769,8 +4453,9 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3769
4453
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
3770
4454
|
},
|
|
3771
4455
|
]}>
|
|
3772
|
-
|
|
3773
|
-
|
|
4456
|
+
Warning ({logCounts.warn})
|
|
4457
|
+
</react_native_1.Text>
|
|
4458
|
+
</react_native_1.View>
|
|
3774
4459
|
</react_native_1.View>
|
|
3775
4460
|
</TouchableScale_1.default>);
|
|
3776
4461
|
})()}
|
|
@@ -3796,15 +4481,25 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3796
4481
|
backgroundColor: '#FFF5F6',
|
|
3797
4482
|
},
|
|
3798
4483
|
]}>
|
|
3799
|
-
|
|
4484
|
+
{/* #7 */}
|
|
4485
|
+
<react_native_1.View style={{
|
|
4486
|
+
flexDirection: 'row',
|
|
4487
|
+
alignItems: 'center',
|
|
4488
|
+
gap: 5,
|
|
4489
|
+
}}>
|
|
4490
|
+
<NetworkIcons_1.ErrorCircleIcon size={12} color={active
|
|
4491
|
+
? AppColors_1.AppColors.errorColor
|
|
4492
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
4493
|
+
<react_native_1.Text numberOfLines={1} style={[
|
|
3800
4494
|
styles_1.default.statusFilterText,
|
|
3801
4495
|
active && {
|
|
3802
4496
|
color: AppColors_1.AppColors.errorColor,
|
|
3803
4497
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
3804
4498
|
},
|
|
3805
4499
|
]}>
|
|
3806
|
-
|
|
3807
|
-
|
|
4500
|
+
Error ({logCounts.error})
|
|
4501
|
+
</react_native_1.Text>
|
|
4502
|
+
</react_native_1.View>
|
|
3808
4503
|
</react_native_1.View>
|
|
3809
4504
|
</TouchableScale_1.default>);
|
|
3810
4505
|
})()}
|
|
@@ -3830,15 +4525,25 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
3830
4525
|
backgroundColor: `${AppColors_1.AppColors.skyBlue}15`,
|
|
3831
4526
|
},
|
|
3832
4527
|
]}>
|
|
3833
|
-
|
|
4528
|
+
{/* #7 */}
|
|
4529
|
+
<react_native_1.View style={{
|
|
4530
|
+
flexDirection: 'row',
|
|
4531
|
+
alignItems: 'center',
|
|
4532
|
+
gap: 5,
|
|
4533
|
+
}}>
|
|
4534
|
+
<NetworkIcons_1.AnalyticsIcon size={12} color={active
|
|
4535
|
+
? AppColors_1.AppColors.skyBlue
|
|
4536
|
+
: AppColors_1.AppColors.grayTextStrong}/>
|
|
4537
|
+
<react_native_1.Text numberOfLines={1} style={[
|
|
3834
4538
|
styles_1.default.statusFilterText,
|
|
3835
4539
|
active && {
|
|
3836
4540
|
color: AppColors_1.AppColors.skyBlue,
|
|
3837
4541
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
3838
4542
|
},
|
|
3839
4543
|
]}>
|
|
3840
|
-
|
|
3841
|
-
|
|
4544
|
+
Analytics ({logCounts.analytics})
|
|
4545
|
+
</react_native_1.Text>
|
|
4546
|
+
</react_native_1.View>
|
|
3842
4547
|
</react_native_1.View>
|
|
3843
4548
|
</TouchableScale_1.default>);
|
|
3844
4549
|
})()}
|
|
@@ -4595,13 +5300,13 @@ const NetworkInspector = ({ enabled = true, }) => {
|
|
|
4595
5300
|
<react_native_1.View style={[
|
|
4596
5301
|
styles_1.default.methodBadge,
|
|
4597
5302
|
{
|
|
4598
|
-
backgroundColor:
|
|
5303
|
+
backgroundColor: constants_1.METHOD_COLORS[selected.method] ?? constants_1.METHOD_COLORS.ALL,
|
|
4599
5304
|
},
|
|
4600
5305
|
]}>
|
|
4601
5306
|
<react_native_1.Text style={[
|
|
4602
5307
|
styles_1.default.methodBadgeText,
|
|
4603
5308
|
{
|
|
4604
|
-
color:
|
|
5309
|
+
color: '#FFFFFF',
|
|
4605
5310
|
},
|
|
4606
5311
|
]}>
|
|
4607
5312
|
{selected.method}
|
|
@@ -4934,5 +5639,8 @@ var ErrorBoundary_2 = require("./components/ErrorBoundary");
|
|
|
4934
5639
|
Object.defineProperty(exports, "ErrorBoundary", { enumerable: true, get: function () { return __importDefault(ErrorBoundary_2).default; } });
|
|
4935
5640
|
var reduxLogger_2 = require("./customHooks/reduxLogger");
|
|
4936
5641
|
Object.defineProperty(exports, "connectReduxStore", { enumerable: true, get: function () { return reduxLogger_2.connectReduxStore; } });
|
|
5642
|
+
Object.defineProperty(exports, "inspectorReduxMiddleware", { enumerable: true, get: function () { return reduxLogger_2.inspectorReduxMiddleware; } });
|
|
4937
5643
|
Object.defineProperty(exports, "getReduxState", { enumerable: true, get: function () { return reduxLogger_2.getReduxState; } });
|
|
4938
5644
|
Object.defineProperty(exports, "subscribeReduxState", { enumerable: true, get: function () { return reduxLogger_2.subscribeReduxState; } });
|
|
5645
|
+
Object.defineProperty(exports, "getActionHistory", { enumerable: true, get: function () { return reduxLogger_2.getActionHistory; } });
|
|
5646
|
+
Object.defineProperty(exports, "clearActionHistory", { enumerable: true, get: function () { return reduxLogger_2.clearActionHistory; } });
|