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.
Files changed (37) hide show
  1. package/README.md +30 -0
  2. package/dist/commonjs/components/ConsoleLogCard.js +18 -0
  3. package/dist/commonjs/components/LogCard.js +19 -2
  4. package/dist/commonjs/components/NetworkIcons.d.ts +9 -2
  5. package/dist/commonjs/components/NetworkIcons.js +59 -3
  6. package/dist/commonjs/constants/version.d.ts +1 -1
  7. package/dist/commonjs/constants/version.js +1 -1
  8. package/dist/commonjs/customHooks/reduxLogger.d.ts +21 -7
  9. package/dist/commonjs/customHooks/reduxLogger.js +147 -48
  10. package/dist/commonjs/customHooks/webViewLogger.js +13 -8
  11. package/dist/commonjs/helpers/settingsStore.d.ts +28 -0
  12. package/dist/commonjs/helpers/settingsStore.js +92 -0
  13. package/dist/commonjs/index.d.ts +1 -1
  14. package/dist/commonjs/index.js +893 -185
  15. package/dist/commonjs/styles/index.d.ts +17 -1
  16. package/dist/commonjs/styles/index.js +25 -3
  17. package/dist/commonjs/types/index.d.ts +4 -0
  18. package/dist/esm/components/ConsoleLogCard.js +18 -0
  19. package/dist/esm/components/LogCard.js +19 -2
  20. package/dist/esm/components/NetworkIcons.d.ts +9 -2
  21. package/dist/esm/components/NetworkIcons.js +51 -2
  22. package/dist/esm/constants/version.d.ts +1 -1
  23. package/dist/esm/constants/version.js +1 -1
  24. package/dist/esm/customHooks/reduxLogger.d.ts +21 -7
  25. package/dist/esm/customHooks/reduxLogger.js +145 -47
  26. package/dist/esm/customHooks/webViewLogger.js +13 -8
  27. package/dist/esm/helpers/settingsStore.d.ts +28 -0
  28. package/dist/esm/helpers/settingsStore.js +84 -0
  29. package/dist/esm/index.d.ts +1 -1
  30. package/dist/esm/index.js +892 -187
  31. package/dist/esm/styles/index.d.ts +17 -1
  32. package/dist/esm/styles/index.js +25 -3
  33. package/dist/esm/types/index.d.ts +4 -0
  34. package/example/ios/example.xcodeproj/project.pbxproj +0 -8
  35. package/example/package-lock.json +75 -33
  36. package/example/package.json +1 -1
  37. package/package.json +1 -1
@@ -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.info)
239
+ if (type === 'info' && !showConsoleLevels?.info)
236
240
  return false;
237
- if (type === 'warn' && !showConsoleLevels.warn)
241
+ if (type === 'warn' && !showConsoleLevels?.warn)
238
242
  return false;
239
- if (type === 'error' && !showConsoleLevels.error)
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: true,
270
- webview: true,
271
- redux: true,
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
- // #10 — scroll-to-top affordance for the main APIs list
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
- }, [logs, search, statusFilters, methodFilters, sortOrder, maxNetworkLogs]);
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
- }, [visibleConsoleLogs, logFilters, logSearch, logSortOrder]);
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
- { text: 'Clear All', onPress: clearNetworkOnly, style: 'destructive' },
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.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
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
- </react_native_linear_gradient_1.default>
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
- {isLocked && (<react_native_1.View style={{
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
- </react_native_1.View>
1524
- </react_native_1.View>
1525
- </react_native_1.ScrollView>
1526
- </react_native_1.View>);
1527
- }
1528
- const goBackToMain = () => {
1529
- animateNextLayout();
1530
- setSettingsPage('main');
1531
- };
1532
- const renderSubHeader = (title, icon, rightInfo) => (<react_native_1.View style={{
1533
- flexDirection: 'row',
1534
- alignItems: 'center',
1535
- gap: 12,
1536
- paddingBottom: 16,
1537
- borderBottomWidth: 1,
1538
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1539
- marginBottom: 16,
1540
- }}>
1541
- <TouchableScale_1.default onPress={goBackToMain} style={{
1542
- width: 36,
1543
- height: 36,
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
- {icon}
1564
- </react_native_1.View>)}
1565
- <react_native_1.Text style={{
1566
- fontFamily: AppFonts_1.AppFonts.interBold,
1567
- fontSize: 18,
1568
- color: AppColors_1.AppColors.primaryBlack,
1569
- flex: 1,
1570
- }}>
1571
- {title}
1572
- </react_native_1.Text>
1573
- {rightInfo ? (<react_native_1.View style={{
1574
- backgroundColor: 'rgba(104,75,155,0.08)',
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: 8,
2028
+ borderRadius: 7,
2029
+ backgroundColor: 'rgba(255,46,87,0.08)',
1578
2030
  borderWidth: 1,
1579
- borderColor: 'rgba(104,75,155,0.15)',
2031
+ borderColor: 'rgba(255,46,87,0.2)',
1580
2032
  }}>
1581
- <react_native_1.Text style={{
2033
+ <react_native_1.Text style={{
1582
2034
  fontFamily: AppFonts_1.AppFonts.interBold,
1583
2035
  fontSize: 11,
1584
- color: AppColors_1.AppColors.purple,
2036
+ color: AppColors_1.AppColors.errorColor,
1585
2037
  }}>
1586
- {rightInfo}
1587
- </react_native_1.Text>
1588
- </react_native_1.View>) : null}
1589
- </react_native_1.View>);
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
- return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1671
- {renderSubHeader('APIs Settings', <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>, `Total: ${logs.length}`)}
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
- return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1733
- {renderSubHeader('Logs Settings', <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>, `Total: ${consoleLogs.length}`)}
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
- return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1845
- {renderSubHeader('Analytics Settings', <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>, `Events: ${analyticsEvents.length}`)}
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
- return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1901
- {renderSubHeader('WebView Settings', <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={16}/>, `History: ${webViewNavHistory.length}`)}
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
- return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1973
- {renderSubHeader('Redux Settings', <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>, `Reducers: ${Object.keys(reduxState || {}).length}`)}
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
- // Default return page is Insights settings
2058
- return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
2059
- {renderSubHeader('Insights Settings', <NetworkIcons_1.InsightsIcon color={AppColors_1.AppColors.purple} size={16}/>)}
2060
- <react_native_1.View style={{
2061
- backgroundColor: AppColors_1.AppColors.primaryLight,
2062
- padding: 16,
2063
- borderRadius: 12,
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: AppColors_1.AppColors.grayBorderSecondary,
2066
- gap: 4,
2636
+ borderColor: 'rgba(255, 255, 255, 0.08)',
2067
2637
  }}>
2068
- {renderSettingRow({
2069
- icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
2070
- label: 'Slow Latency Warning',
2071
- description: 'Alert threshold for slow API request duration',
2072
- picker: {
2073
- options: [500, 1000, 2000],
2074
- selectedValue: slowRequestThreshold,
2075
- onSelect: setSlowRequestThreshold,
2076
- },
2077
- })}
2078
- <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
2079
- {renderSettingRow({
2080
- icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
2081
- label: 'Show Console Alerts',
2082
- description: 'Flags critical warnings or crash events on dashboard',
2083
- isLast: true,
2084
- onPress: () => setInsightsShowConsoleAlerts(prev => !prev),
2085
- right: (<react_native_1.View style={{
2086
- width: 22,
2087
- height: 22,
2088
- borderRadius: 6,
2089
- borderWidth: 2,
2090
- borderColor: insightsShowConsoleAlerts
2091
- ? AppColors_1.AppColors.purple
2092
- : AppColors_1.AppColors.grayTextWeak,
2093
- backgroundColor: insightsShowConsoleAlerts
2094
- ? 'rgba(104, 75, 155, 0.1)'
2095
- : 'transparent',
2096
- alignItems: 'center',
2097
- justifyContent: 'center',
2098
- }}>
2099
- {insightsShowConsoleAlerts && (<NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.purple}/>)}
2100
- </react_native_1.View>),
2101
- })}
2102
- </react_native_1.View>
2103
- </react_native_1.ScrollView>);
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.apis,
2140
- tabVisibility.logs,
2141
- tabVisibility.analytics,
2142
- tabVisibility.webview,
2143
- tabVisibility.redux,
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.apis && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('apis')}>
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.logs && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('logs')}>
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.analytics && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('analytics')}>
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.webview && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('webview')}>
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.redux && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => switchActiveTab('redux')}>
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.View style={styles_1.default.header}>
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.TrashIcon color="#FFFFFF" size={15}/>
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
- </react_native_linear_gradient_1.default>
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.Text style={[
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
- GA Events (
3305
- {analyticsSearch
3937
+ GA Events (
3938
+ {analyticsSearch
3306
3939
  ? filteredAnalyticsEvents.length
3307
3940
  : analyticsEvents.length}
3308
- )
3309
- </react_native_1.Text>
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.Text style={[
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
- Top Events ({topEventsArray.length})
3342
- </react_native_1.Text>
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} onScroll={e => setShowScrollTop(e.nativeEvent.contentOffset.y > 320)} scrollEventThrottle={16} 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 }}>
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
- {showScrollTop && (<TouchableScale_1.default onPress={() => {
3604
- apisListRef.current?.scrollToOffset({
3605
- offset: 0,
3606
- animated: true,
3607
- });
3608
- setShowScrollTop(false);
3609
- }} hitSlop={10} style={styles_1.default.scrollTopBtn}>
3610
- <react_native_1.View style={{ transform: [{ rotate: '180deg' }] }}>
3611
- <NetworkIcons_1.ChevronIcon color="#FFFFFF" size={18}/>
3612
- </react_native_1.View>
3613
- </TouchableScale_1.default>)}
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
- <react_native_1.Text numberOfLines={1} style={[
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
- All ({logCounts.all})
3670
- </react_native_1.Text>
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
- <react_native_1.Text numberOfLines={1} style={[
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
- User Log ({logCounts['user-log']})
3704
- </react_native_1.Text>
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
- <react_native_1.Text numberOfLines={1} style={[
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
- Info ({logCounts.info})
3738
- </react_native_1.Text>
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
- <react_native_1.Text numberOfLines={1} style={[
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
- Warning ({logCounts.warn})
3773
- </react_native_1.Text>
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
- <react_native_1.Text numberOfLines={1} style={[
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
- Error ({logCounts.error})
3807
- </react_native_1.Text>
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
- <react_native_1.Text numberOfLines={1} style={[
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
- Analytics ({logCounts.analytics})
3841
- </react_native_1.Text>
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: `${constants_1.METHOD_COLORS[selected.method] ?? constants_1.METHOD_COLORS.ALL}15`,
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: constants_1.METHOD_COLORS[selected.method] ?? constants_1.METHOD_COLORS.ALL,
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; } });