react-native-inapp-inspector 2.0.5 → 2.0.7

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 (85) hide show
  1. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +11 -0
  2. package/dist/commonjs/components/Inspector/AuditTab.d.ts +3 -0
  3. package/dist/commonjs/components/Inspector/AuditTab.js +741 -0
  4. package/dist/commonjs/components/Inspector/DeviceTab.d.ts +3 -0
  5. package/dist/commonjs/components/Inspector/DeviceTab.js +717 -0
  6. package/dist/commonjs/components/Inspector/FirstTimeWalkthroughModal.d.ts +7 -0
  7. package/dist/commonjs/components/Inspector/FirstTimeWalkthroughModal.js +600 -0
  8. package/dist/commonjs/components/Inspector/InspectorHeader.js +28 -25
  9. package/dist/commonjs/components/Inspector/MainScreen.js +19 -2
  10. package/dist/commonjs/components/Inspector/NetworkDetail.js +15 -0
  11. package/dist/commonjs/components/Inspector/PerformanceHud.d.ts +7 -0
  12. package/dist/commonjs/components/Inspector/PerformanceHud.js +210 -0
  13. package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -18
  14. package/dist/commonjs/components/Inspector/RequestReplayModal.d.ts +9 -0
  15. package/dist/commonjs/components/Inspector/RequestReplayModal.js +792 -0
  16. package/dist/commonjs/components/Inspector/RequestReplayView.d.ts +8 -0
  17. package/dist/commonjs/components/Inspector/RequestReplayView.js +871 -0
  18. package/dist/commonjs/components/Inspector/SettingsPanel.js +448 -49
  19. package/dist/commonjs/components/Inspector/StorageTab.d.ts +3 -0
  20. package/dist/commonjs/components/Inspector/StorageTab.js +610 -0
  21. package/dist/commonjs/components/Inspector/TabBar.js +23 -2
  22. package/dist/commonjs/components/NetworkIcons.d.ts +12 -0
  23. package/dist/commonjs/components/NetworkIcons.js +72 -3
  24. package/dist/commonjs/constants/version.d.ts +1 -1
  25. package/dist/commonjs/constants/version.js +1 -1
  26. package/dist/commonjs/customHooks/storageInspector.d.ts +13 -0
  27. package/dist/commonjs/customHooks/storageInspector.js +179 -0
  28. package/dist/commonjs/helpers/deviceInfo.d.ts +4 -0
  29. package/dist/commonjs/helpers/deviceInfo.js +94 -0
  30. package/dist/commonjs/helpers/index.d.ts +2 -0
  31. package/dist/commonjs/helpers/index.js +12 -1
  32. package/dist/commonjs/helpers/packageAuditor.d.ts +5 -0
  33. package/dist/commonjs/helpers/packageAuditor.js +182 -0
  34. package/dist/commonjs/helpers/settingsStore.d.ts +1 -1
  35. package/dist/commonjs/helpers/settingsStore.js +4 -2
  36. package/dist/commonjs/i18n/locales/en.json +3 -2
  37. package/dist/commonjs/index.d.ts +1 -0
  38. package/dist/commonjs/index.js +127 -9
  39. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  40. package/dist/commonjs/types/enums.d.ts +7 -0
  41. package/dist/commonjs/types/enums.js +7 -0
  42. package/dist/commonjs/types/interfaces.d.ts +77 -0
  43. package/dist/esm/components/Inspector/AuditTab.d.ts +3 -0
  44. package/dist/esm/components/Inspector/AuditTab.js +702 -0
  45. package/dist/esm/components/Inspector/DeviceTab.d.ts +3 -0
  46. package/dist/esm/components/Inspector/DeviceTab.js +678 -0
  47. package/dist/esm/components/Inspector/FirstTimeWalkthroughModal.d.ts +7 -0
  48. package/dist/esm/components/Inspector/FirstTimeWalkthroughModal.js +560 -0
  49. package/dist/esm/components/Inspector/InspectorHeader.js +28 -25
  50. package/dist/esm/components/Inspector/MainScreen.js +19 -2
  51. package/dist/esm/components/Inspector/NetworkDetail.js +16 -1
  52. package/dist/esm/components/Inspector/PerformanceHud.d.ts +7 -0
  53. package/dist/esm/components/Inspector/PerformanceHud.js +170 -0
  54. package/dist/esm/components/Inspector/PerformanceTab.js +31 -19
  55. package/dist/esm/components/Inspector/RequestReplayModal.d.ts +9 -0
  56. package/dist/esm/components/Inspector/RequestReplayModal.js +752 -0
  57. package/dist/esm/components/Inspector/RequestReplayView.d.ts +8 -0
  58. package/dist/esm/components/Inspector/RequestReplayView.js +831 -0
  59. package/dist/esm/components/Inspector/SettingsPanel.js +449 -50
  60. package/dist/esm/components/Inspector/StorageTab.d.ts +3 -0
  61. package/dist/esm/components/Inspector/StorageTab.js +571 -0
  62. package/dist/esm/components/Inspector/TabBar.js +24 -3
  63. package/dist/esm/components/NetworkIcons.d.ts +12 -0
  64. package/dist/esm/components/NetworkIcons.js +57 -0
  65. package/dist/esm/constants/version.d.ts +1 -1
  66. package/dist/esm/constants/version.js +1 -1
  67. package/dist/esm/customHooks/storageInspector.d.ts +13 -0
  68. package/dist/esm/customHooks/storageInspector.js +170 -0
  69. package/dist/esm/helpers/deviceInfo.d.ts +4 -0
  70. package/dist/esm/helpers/deviceInfo.js +89 -0
  71. package/dist/esm/helpers/index.d.ts +2 -0
  72. package/dist/esm/helpers/index.js +10 -0
  73. package/dist/esm/helpers/packageAuditor.d.ts +5 -0
  74. package/dist/esm/helpers/packageAuditor.js +173 -0
  75. package/dist/esm/helpers/settingsStore.d.ts +1 -1
  76. package/dist/esm/helpers/settingsStore.js +4 -2
  77. package/dist/esm/i18n/locales/en.json +3 -2
  78. package/dist/esm/index.d.ts +1 -0
  79. package/dist/esm/index.js +123 -8
  80. package/dist/esm/native/NativeInspector.d.ts +1 -0
  81. package/dist/esm/types/enums.d.ts +7 -0
  82. package/dist/esm/types/enums.js +7 -0
  83. package/dist/esm/types/interfaces.d.ts +77 -0
  84. package/ios/NetworkInspectorModule.mm +12 -5
  85. package/package.json +4 -1
@@ -62,7 +62,7 @@ const helpers_1 = require("../../helpers");
62
62
  const toast_1 = require("../../helpers/toast");
63
63
  const SettingsPanel = () => {
64
64
  const { t } = (0, i18n_1.useTranslation)();
65
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, updateAvailable, latestNpmVersion, } = (0, InspectorContext_1.useInspector)();
65
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, isPerformanceHudEnabled, setIsPerformanceHudEnabled, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, updateAvailable, latestNpmVersion, openWalkthrough, deviceInfo, auditReport, storageEntries, } = (0, InspectorContext_1.useInspector)();
66
66
  const [stagedHeight, setStagedHeight] = (0, react_1.useState)(modalHeightPercent);
67
67
  const [telemetryConsent, setTelemetryConsentState] = (0, react_1.useState)(true);
68
68
  (0, react_1.useEffect)(() => {
@@ -101,6 +101,27 @@ const SettingsPanel = () => {
101
101
  icon: 'logs',
102
102
  desc: 'Terminal console logs, warnings, errors & stack traces',
103
103
  },
104
+ {
105
+ key: 'storage',
106
+ label: 'Storage (AsyncStorage)',
107
+ category: 'core',
108
+ icon: 'storage',
109
+ desc: 'Browse, edit, create and delete local key-value storage & JSON',
110
+ },
111
+ {
112
+ key: 'device',
113
+ label: 'Device & System Info',
114
+ category: 'diagnostic',
115
+ icon: 'device',
116
+ desc: 'Hermes runtime, Fabric New Arch, screen metrics & build info',
117
+ },
118
+ {
119
+ key: 'audit',
120
+ label: 'Code Quality & Package Audit',
121
+ category: 'diagnostic',
122
+ icon: 'audit',
123
+ desc: 'Audit dependencies, peer conflicts, TS schema errors & React Native anti-patterns',
124
+ },
104
125
  {
105
126
  key: 'performance',
106
127
  label: 'Performance Tracker',
@@ -143,6 +164,9 @@ const SettingsPanel = () => {
143
164
  logs: Boolean(tabVisibility?.logs),
144
165
  analytics: Boolean(tabVisibility?.analytics),
145
166
  redux: Boolean(tabVisibility?.redux),
167
+ storage: Boolean(tabVisibility?.storage),
168
+ device: Boolean(tabVisibility?.device),
169
+ audit: Boolean(tabVisibility?.audit),
146
170
  bundle: Boolean(tabVisibility?.bundle),
147
171
  performance: Boolean(tabVisibility?.performance),
148
172
  crash: Boolean(tabVisibility?.crash),
@@ -154,6 +178,9 @@ const SettingsPanel = () => {
154
178
  logs: Boolean(tabVisibility?.logs),
155
179
  analytics: Boolean(tabVisibility?.analytics),
156
180
  redux: Boolean(tabVisibility?.redux),
181
+ storage: Boolean(tabVisibility?.storage),
182
+ device: Boolean(tabVisibility?.device),
183
+ audit: Boolean(tabVisibility?.audit),
157
184
  bundle: Boolean(tabVisibility?.bundle),
158
185
  performance: Boolean(tabVisibility?.performance),
159
186
  crash: Boolean(tabVisibility?.crash),
@@ -325,16 +352,17 @@ const SettingsPanel = () => {
325
352
  shadowRadius: 4,
326
353
  shadowOffset: { width: 0, height: 2 },
327
354
  }}>
355
+ {/* Tab 1: Modules & Tabs */}
328
356
  <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.modulesAndTools')} accessibilityState={{ selected: settingsActiveSubTab === 'module' }} onPress={() => {
329
357
  (0, InspectorContext_1.animateNextLayout)();
330
358
  setSettingsActiveSubTab('module');
331
359
  }} style={{
332
360
  flex: 1,
333
- paddingVertical: 9,
361
+ paddingVertical: 8,
334
362
  flexDirection: 'row',
335
363
  alignItems: 'center',
336
364
  justifyContent: 'center',
337
- gap: 6,
365
+ gap: 5,
338
366
  borderRadius: 9,
339
367
  backgroundColor: settingsActiveSubTab === 'module'
340
368
  ? AppColors_1.AppColors.purple
@@ -342,11 +370,11 @@ const SettingsPanel = () => {
342
370
  }}>
343
371
  <NetworkIcons_1.LayersIcon color={settingsActiveSubTab === 'module'
344
372
  ? AppColors_1.AppColors.white
345
- : AppColors_1.AppColors.grayText} size={13}/>
373
+ : AppColors_1.AppColors.grayText} size={12.5}/>
346
374
  <react_native_1.Text style={{
347
375
  fontFamily: AppFonts_1.AppFonts.interBold,
348
- fontSize: 12.5,
349
- lineHeight: 16,
376
+ fontSize: 11.5,
377
+ lineHeight: 15,
350
378
  color: settingsActiveSubTab === 'module'
351
379
  ? AppColors_1.AppColors.white
352
380
  : AppColors_1.AppColors.grayText,
@@ -355,16 +383,48 @@ const SettingsPanel = () => {
355
383
  </react_native_1.Text>
356
384
  </TouchableScale_1.default>
357
385
 
386
+ {/* Tab 2: RAM & Limits */}
387
+ <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.ramLimits')} accessibilityState={{ selected: settingsActiveSubTab === 'limits' }} onPress={() => {
388
+ (0, InspectorContext_1.animateNextLayout)();
389
+ setSettingsActiveSubTab('limits');
390
+ }} style={{
391
+ flex: 1,
392
+ paddingVertical: 8,
393
+ flexDirection: 'row',
394
+ alignItems: 'center',
395
+ justifyContent: 'center',
396
+ gap: 5,
397
+ borderRadius: 9,
398
+ backgroundColor: settingsActiveSubTab === 'limits'
399
+ ? AppColors_1.AppColors.purple
400
+ : 'transparent',
401
+ }}>
402
+ <NetworkIcons_1.CpuIcon color={settingsActiveSubTab === 'limits'
403
+ ? AppColors_1.AppColors.white
404
+ : AppColors_1.AppColors.grayText} size={12.5}/>
405
+ <react_native_1.Text style={{
406
+ fontFamily: AppFonts_1.AppFonts.interBold,
407
+ fontSize: 11.5,
408
+ lineHeight: 15,
409
+ color: settingsActiveSubTab === 'limits'
410
+ ? AppColors_1.AppColors.white
411
+ : AppColors_1.AppColors.grayText,
412
+ }}>
413
+ {t('settings.ramLimits')}
414
+ </react_native_1.Text>
415
+ </TouchableScale_1.default>
416
+
417
+ {/* Tab 3: UI & Appearance */}
358
418
  <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.uiPreferences')} accessibilityState={{ selected: settingsActiveSubTab === 'ui' }} onPress={() => {
359
419
  (0, InspectorContext_1.animateNextLayout)();
360
420
  setSettingsActiveSubTab('ui');
361
421
  }} style={{
362
422
  flex: 1,
363
- paddingVertical: 9,
423
+ paddingVertical: 8,
364
424
  flexDirection: 'row',
365
425
  alignItems: 'center',
366
426
  justifyContent: 'center',
367
- gap: 6,
427
+ gap: 5,
368
428
  borderRadius: 9,
369
429
  backgroundColor: settingsActiveSubTab === 'ui'
370
430
  ? AppColors_1.AppColors.purple
@@ -372,11 +432,11 @@ const SettingsPanel = () => {
372
432
  }}>
373
433
  <NetworkIcons_1.ScreenIcon color={settingsActiveSubTab === 'ui'
374
434
  ? AppColors_1.AppColors.white
375
- : AppColors_1.AppColors.grayText} size={13}/>
435
+ : AppColors_1.AppColors.grayText} size={12.5}/>
376
436
  <react_native_1.Text style={{
377
437
  fontFamily: AppFonts_1.AppFonts.interBold,
378
- fontSize: 12.5,
379
- lineHeight: 16,
438
+ fontSize: 11.5,
439
+ lineHeight: 15,
380
440
  color: settingsActiveSubTab === 'ui'
381
441
  ? AppColors_1.AppColors.white
382
442
  : AppColors_1.AppColors.grayText,
@@ -386,7 +446,7 @@ const SettingsPanel = () => {
386
446
  </TouchableScale_1.default>
387
447
  </react_native_1.View>
388
448
 
389
- {settingsActiveSubTab === 'module' ? (<react_native_1.View style={{ gap: 12 }}>
449
+ {settingsActiveSubTab === 'module' && (<react_native_1.View style={{ gap: 12 }}>
390
450
  {/* Individual Module Cards with Left Checkboxes */}
391
451
  <react_native_1.View style={{ gap: 10 }}>
392
452
  {allModules.map(moduleItem => {
@@ -402,17 +462,23 @@ const SettingsPanel = () => {
402
462
  ? `${logs.length} requests • Limit: ${maxNetworkLogs}`
403
463
  : moduleItem.key === 'logs'
404
464
  ? `${consoleLogs.length} logs • Limit: ${maxConsoleLogs}`
405
- : moduleItem.key === 'performance'
406
- ? '60 FPS TargetMemory Telemetry'
407
- : moduleItem.key === 'bundle'
408
- ? 'Metro Packager Dependency Map'
409
- : moduleItem.key === 'crash'
410
- ? `${crashRecords?.length || 0} crashes recorded Crash Guard`
411
- : moduleItem.key === 'analytics'
412
- ? `${analyticsEvents.length} events logged`
413
- : moduleItem.key === 'redux'
414
- ? `${Object.keys(reduxState || {}).length} slices Depth: ${reduxExpandDepth}`
415
- : '';
465
+ : moduleItem.key === 'storage'
466
+ ? `${storageEntries?.length || 0} keys AsyncStorage/MMKV`
467
+ : moduleItem.key === 'device'
468
+ ? `${deviceInfo?.platform ? deviceInfo.platform.toUpperCase() : 'Device'}Hermes ${deviceInfo?.isHermes ? 'Enabled' : 'Off'}`
469
+ : moduleItem.key === 'audit'
470
+ ? `${auditReport?.score != null ? `${auditReport.score}/100 ScoreQuality Audit` : 'Package & Health Audit'}`
471
+ : moduleItem.key === 'performance'
472
+ ? '60 FPS Target • Memory Telemetry'
473
+ : moduleItem.key === 'bundle'
474
+ ? 'Metro PackagerDependency Map'
475
+ : moduleItem.key === 'crash'
476
+ ? `${crashRecords?.length || 0} crashes recorded • Crash Guard`
477
+ : moduleItem.key === 'analytics'
478
+ ? `${analyticsEvents.length} events logged`
479
+ : moduleItem.key === 'redux'
480
+ ? `${Object.keys(reduxState || {}).length} slices • Depth: ${reduxExpandDepth}`
481
+ : '';
416
482
  return (<react_native_1.View key={moduleItem.key} style={{
417
483
  backgroundColor: AppColors_1.AppColors.primaryLight,
418
484
  borderRadius: 14,
@@ -521,6 +587,15 @@ const SettingsPanel = () => {
521
587
  {moduleItem.icon === 'analytics' && (<NetworkIcons_1.AnalyticsIcon color={isChecked
522
588
  ? AppColors_1.AppColors.purple
523
589
  : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
590
+ {moduleItem.icon === 'storage' && (<NetworkIcons_1.DatabaseIcon color={isChecked
591
+ ? AppColors_1.AppColors.purple
592
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
593
+ {moduleItem.icon === 'device' && (<NetworkIcons_1.DevicePhoneIcon color={isChecked
594
+ ? AppColors_1.AppColors.purple
595
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
596
+ {moduleItem.icon === 'audit' && (<NetworkIcons_1.ShieldCheckIcon color={isChecked
597
+ ? AppColors_1.AppColors.purple
598
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
524
599
  {moduleItem.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={isChecked
525
600
  ? AppColors_1.AppColors.purple
526
601
  : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
@@ -672,29 +747,29 @@ const SettingsPanel = () => {
672
747
  borderTopColor: AppColors_1.AppColors.dividerColor,
673
748
  }}>
674
749
  {/* Live Info Pill */}
675
- <react_native_1.View style={{
676
- flexDirection: 'row',
677
- alignItems: 'center',
678
- gap: 6,
679
- flex: 1,
680
- }}>
681
- <react_native_1.View style={{
682
- width: 6,
683
- height: 6,
684
- borderRadius: 3,
685
- backgroundColor: isChecked
686
- ? AppColors_1.AppColors.liveGreen
687
- : AppColors_1.AppColors.grayTextWeak,
688
- }}/>
689
- <react_native_1.Text style={{
690
- fontFamily: AppFonts_1.AppFonts.interMedium,
691
- fontSize: 11,
692
- color: AppColors_1.AppColors.grayText,
693
- lineHeight: 14,
694
- }}>
695
- {liveStats}
696
- </react_native_1.Text>
697
- </react_native_1.View>
750
+ {Boolean(liveStats) ? (<react_native_1.View style={{
751
+ flexDirection: 'row',
752
+ alignItems: 'center',
753
+ gap: 6,
754
+ flex: 1,
755
+ }}>
756
+ <react_native_1.View style={{
757
+ width: 6,
758
+ height: 6,
759
+ borderRadius: 3,
760
+ backgroundColor: isChecked
761
+ ? AppColors_1.AppColors.liveGreen
762
+ : AppColors_1.AppColors.grayTextWeak,
763
+ }}/>
764
+ <react_native_1.Text style={{
765
+ fontFamily: AppFonts_1.AppFonts.interMedium,
766
+ fontSize: 11,
767
+ color: AppColors_1.AppColors.grayText,
768
+ lineHeight: 14,
769
+ }}>
770
+ {liveStats}
771
+ </react_native_1.Text>
772
+ </react_native_1.View>) : (<react_native_1.View style={{ flex: 1 }}/>)}
698
773
 
699
774
  {/* Sleek Configure Button */}
700
775
  <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Configure ${moduleItem.label} settings`} onPress={() => {
@@ -726,8 +801,11 @@ const SettingsPanel = () => {
726
801
  </react_native_1.View>);
727
802
  })}
728
803
  </react_native_1.View>
804
+ </react_native_1.View>)}
729
805
 
730
- {/* Section 3.5: RAM-Based Auto Limits */}
806
+ {/* ─── TAB 2: RAM & RESOURCE LIMITS ──────────────────────────────────── */}
807
+ {settingsActiveSubTab === 'limits' && (<react_native_1.View style={{ gap: 14 }}>
808
+ {/* Section 1: RAM-Based Auto Limits */}
731
809
  <react_native_1.View style={{
732
810
  backgroundColor: AppColors_1.AppColors.primaryLight,
733
811
  borderRadius: 14,
@@ -744,7 +822,7 @@ const SettingsPanel = () => {
744
822
  color: AppColors_1.AppColors.grayTextWeak,
745
823
  letterSpacing: 0.8,
746
824
  }}>
747
- RAM-Based Auto Limits
825
+ RAM-BASED AUTO TUNING
748
826
  </react_native_1.Text>
749
827
 
750
828
  {/* Auto RAM Limit Toggle */}
@@ -949,8 +1027,329 @@ const SettingsPanel = () => {
949
1027
  </react_native_1.View>))}
950
1028
  </react_native_1.View>
951
1029
  </react_native_1.View>)}
1030
+
1031
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1032
+
1033
+ {/* Floating Mini Performance HUD Toggle */}
1034
+ {renderSettingRow({
1035
+ icon: <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={16}/>,
1036
+ label: 'Show Mini Performance HUD Overlay',
1037
+ description: 'Floating on-screen real-time FPS and Memory/Heap widget',
1038
+ right: (<TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle mini performance HUD overlay" accessibilityState={{ checked: isPerformanceHudEnabled }} onPress={() => setIsPerformanceHudEnabled(prev => !prev)} style={{
1039
+ width: 42,
1040
+ height: 24,
1041
+ borderRadius: 12,
1042
+ backgroundColor: isPerformanceHudEnabled
1043
+ ? AppColors_1.AppColors.purple
1044
+ : AppColors_1.AppColors.grayBorderSecondary,
1045
+ padding: 2,
1046
+ justifyContent: 'center',
1047
+ alignItems: isPerformanceHudEnabled
1048
+ ? 'flex-end'
1049
+ : 'flex-start',
1050
+ }}>
1051
+ <react_native_1.View style={{
1052
+ width: 20,
1053
+ height: 20,
1054
+ borderRadius: 10,
1055
+ backgroundColor: AppColors_1.AppColors.white,
1056
+ shadowColor: AppColors_1.AppColors.black,
1057
+ shadowOpacity: 0.18,
1058
+ shadowRadius: 2,
1059
+ shadowOffset: { width: 0, height: 1 },
1060
+ }}/>
1061
+ </TouchableScale_1.default>),
1062
+ isLast: true,
1063
+ })}
1064
+ </react_native_1.View>
1065
+
1066
+ {/* Section 2: Fine-Tuned Resource Limits */}
1067
+ <react_native_1.View style={{
1068
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1069
+ borderRadius: 14,
1070
+ borderWidth: 1,
1071
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1072
+ overflow: 'hidden',
1073
+ padding: 14,
1074
+ gap: 12,
1075
+ }}>
1076
+ <react_native_1.Text style={{
1077
+ fontFamily: AppFonts_1.AppFonts.interBold,
1078
+ fontSize: 11,
1079
+ lineHeight: 14,
1080
+ color: AppColors_1.AppColors.grayTextWeak,
1081
+ letterSpacing: 0.8,
1082
+ }}>
1083
+ MANUAL RESOURCE THRESHOLDS
1084
+ </react_native_1.Text>
1085
+
1086
+ {renderSettingRow({
1087
+ icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1088
+ label: 'Max Network / API Logs',
1089
+ description: 'Maximum in-memory API requests tracked before rotation',
1090
+ numericInput: {
1091
+ value: maxNetworkLogs,
1092
+ onChange: setMaxNetworkLogs,
1093
+ min: 10,
1094
+ max: 100,
1095
+ placeholder: '10 - 100',
1096
+ },
1097
+ })}
1098
+
1099
+ {renderSettingRow({
1100
+ icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1101
+ label: 'Max Console Logs',
1102
+ description: 'Maximum log entries kept across info/warn/error streams',
1103
+ numericInput: {
1104
+ value: maxConsoleLogs,
1105
+ onChange: setMaxConsoleLogs,
1106
+ min: 20,
1107
+ max: 300,
1108
+ placeholder: '20 - 300',
1109
+ },
1110
+ })}
1111
+
1112
+ {renderSettingRow({
1113
+ icon: <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>,
1114
+ label: 'Max Analytics Events',
1115
+ description: 'Capacity for captured analytics payloads & telemetry pings',
1116
+ numericInput: {
1117
+ value: maxAnalyticsEventsLimit,
1118
+ onChange: setMaxAnalyticsEventsLimit,
1119
+ min: 20,
1120
+ max: 200,
1121
+ placeholder: '20 - 200',
1122
+ },
1123
+ })}
1124
+
1125
+ {renderSettingRow({
1126
+ icon: <NetworkIcons_1.CrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1127
+ label: 'Max Crash Records',
1128
+ description: 'Stored fatal exceptions and crash diagnostics logs',
1129
+ numericInput: {
1130
+ value: maxCrashLogs,
1131
+ onChange: setMaxCrashLogs,
1132
+ min: 5,
1133
+ max: 50,
1134
+ placeholder: '5 - 50',
1135
+ },
1136
+ isLast: true,
1137
+ })}
1138
+ </react_native_1.View>
1139
+
1140
+ {/* Section 3: Storage & Cache Cleansing */}
1141
+ <react_native_1.View style={{
1142
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1143
+ borderRadius: 14,
1144
+ borderWidth: 1,
1145
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1146
+ overflow: 'hidden',
1147
+ padding: 14,
1148
+ gap: 12,
1149
+ }}>
1150
+ <react_native_1.Text style={{
1151
+ fontFamily: AppFonts_1.AppFonts.interBold,
1152
+ fontSize: 11,
1153
+ lineHeight: 14,
1154
+ color: AppColors_1.AppColors.grayTextWeak,
1155
+ letterSpacing: 0.8,
1156
+ }}>
1157
+ STORAGE & CACHE CLEANSING
1158
+ </react_native_1.Text>
1159
+
1160
+ {renderSettingRow({
1161
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1162
+ label: 'Clear All Network Logs',
1163
+ description: `${logs.length} requests in memory`,
1164
+ onPress: () => {
1165
+ (0, networkLogger_1.clearNetworkLogs)();
1166
+ setSelected(null);
1167
+ react_native_1.Alert.alert(t('common.success'), 'Network logs cleared successfully.');
1168
+ },
1169
+ right: (<react_native_1.View style={{
1170
+ paddingHorizontal: 10,
1171
+ paddingVertical: 4,
1172
+ borderRadius: 6,
1173
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1174
+ borderWidth: 1,
1175
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
1176
+ }}>
1177
+ <react_native_1.Text style={{
1178
+ fontFamily: AppFonts_1.AppFonts.interBold,
1179
+ fontSize: 11,
1180
+ color: AppColors_1.AppColors.errorColor,
1181
+ }}>
1182
+ Clear ({logs.length})
1183
+ </react_native_1.Text>
1184
+ </react_native_1.View>),
1185
+ })}
1186
+
1187
+ {renderSettingRow({
1188
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1189
+ label: 'Clear All Console Logs',
1190
+ description: `${consoleLogs.length} logs in memory`,
1191
+ onPress: () => {
1192
+ (0, consoleLogger_1.clearConsoleLogs)();
1193
+ react_native_1.Alert.alert(t('common.success'), 'Console logs cleared successfully.');
1194
+ },
1195
+ right: (<react_native_1.View style={{
1196
+ paddingHorizontal: 10,
1197
+ paddingVertical: 4,
1198
+ borderRadius: 6,
1199
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1200
+ borderWidth: 1,
1201
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
1202
+ }}>
1203
+ <react_native_1.Text style={{
1204
+ fontFamily: AppFonts_1.AppFonts.interBold,
1205
+ fontSize: 11,
1206
+ color: AppColors_1.AppColors.errorColor,
1207
+ }}>
1208
+ Clear ({consoleLogs.length})
1209
+ </react_native_1.Text>
1210
+ </react_native_1.View>),
1211
+ })}
1212
+
1213
+ {renderSettingRow({
1214
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1215
+ label: 'Clear Analytics Events',
1216
+ description: `${analyticsEvents.length} events recorded`,
1217
+ onPress: () => {
1218
+ (0, analyticsLogger_1.clearAnalyticsEvents)();
1219
+ setSelectedEvent(null);
1220
+ react_native_1.Alert.alert(t('common.success'), 'Analytics events cleared successfully.');
1221
+ },
1222
+ right: (<react_native_1.View style={{
1223
+ paddingHorizontal: 10,
1224
+ paddingVertical: 4,
1225
+ borderRadius: 6,
1226
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1227
+ borderWidth: 1,
1228
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
1229
+ }}>
1230
+ <react_native_1.Text style={{
1231
+ fontFamily: AppFonts_1.AppFonts.interBold,
1232
+ fontSize: 11,
1233
+ color: AppColors_1.AppColors.errorColor,
1234
+ }}>
1235
+ Clear ({analyticsEvents.length})
1236
+ </react_native_1.Text>
1237
+ </react_native_1.View>),
1238
+ })}
1239
+
1240
+ {renderSettingRow({
1241
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1242
+ label: 'Clear Crash Logs',
1243
+ description: `${crashRecords.length} crash dumps recorded`,
1244
+ onPress: () => {
1245
+ (0, crashHandler_1.clearCrashRecords)();
1246
+ react_native_1.Alert.alert(t('common.success'), 'Crash records cleared successfully.');
1247
+ },
1248
+ isLast: true,
1249
+ right: (<react_native_1.View style={{
1250
+ paddingHorizontal: 10,
1251
+ paddingVertical: 4,
1252
+ borderRadius: 6,
1253
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1254
+ borderWidth: 1,
1255
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
1256
+ }}>
1257
+ <react_native_1.Text style={{
1258
+ fontFamily: AppFonts_1.AppFonts.interBold,
1259
+ fontSize: 11,
1260
+ color: AppColors_1.AppColors.errorColor,
1261
+ }}>
1262
+ Clear ({crashRecords.length})
1263
+ </react_native_1.Text>
1264
+ </react_native_1.View>),
1265
+ })}
952
1266
  </react_native_1.View>
953
- </react_native_1.View>) : (<react_native_1.View style={{ gap: 14 }}>
1267
+ </react_native_1.View>)}
1268
+
1269
+ {/* ─── TAB 3: UI & APPEARANCE ────────────────────────────────────────── */}
1270
+ {settingsActiveSubTab === 'ui' && (<react_native_1.View style={{ gap: 14 }}>
1271
+ {/* Section 0: Interactive Walkthrough Tour */}
1272
+ <react_native_1.View style={{
1273
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1274
+ borderRadius: 14,
1275
+ borderWidth: 1,
1276
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1277
+ overflow: 'hidden',
1278
+ padding: 14,
1279
+ gap: 12,
1280
+ }}>
1281
+ <react_native_1.Text style={{
1282
+ fontFamily: AppFonts_1.AppFonts.interBold,
1283
+ fontSize: 11,
1284
+ lineHeight: 14,
1285
+ color: AppColors_1.AppColors.grayTextWeak,
1286
+ letterSpacing: 0.8,
1287
+ }}>
1288
+ ONBOARDING & GUIDE
1289
+ </react_native_1.Text>
1290
+
1291
+ <react_native_1.View style={{
1292
+ flexDirection: 'row',
1293
+ alignItems: 'center',
1294
+ justifyContent: 'space-between',
1295
+ gap: 10,
1296
+ }}>
1297
+ <react_native_1.View style={{
1298
+ flexDirection: 'row',
1299
+ alignItems: 'center',
1300
+ gap: 10,
1301
+ flex: 1,
1302
+ }}>
1303
+ <react_native_1.View style={{
1304
+ width: 34,
1305
+ height: 34,
1306
+ borderRadius: 9,
1307
+ backgroundColor: `${AppColors_1.AppColors.purple}16`,
1308
+ alignItems: 'center',
1309
+ justifyContent: 'center',
1310
+ }}>
1311
+ <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={16}/>
1312
+ </react_native_1.View>
1313
+ <react_native_1.View style={{ flex: 1 }}>
1314
+ <react_native_1.Text style={{
1315
+ fontFamily: AppFonts_1.AppFonts.interBold,
1316
+ fontSize: 13.5,
1317
+ lineHeight: 18,
1318
+ color: AppColors_1.AppColors.primaryBlack,
1319
+ }}>
1320
+ First-Time Walkthrough
1321
+ </react_native_1.Text>
1322
+ <react_native_1.Text style={{
1323
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1324
+ fontSize: 11.5,
1325
+ color: AppColors_1.AppColors.grayTextWeak,
1326
+ marginTop: 1,
1327
+ lineHeight: 16,
1328
+ }}>
1329
+ Explore features, gestures & developer tools
1330
+ </react_native_1.Text>
1331
+ </react_native_1.View>
1332
+ </react_native_1.View>
1333
+
1334
+ <TouchableScale_1.default style={{
1335
+ backgroundColor: `${AppColors_1.AppColors.purple}14`,
1336
+ borderColor: `${AppColors_1.AppColors.purple}30`,
1337
+ borderWidth: 1,
1338
+ paddingHorizontal: 12,
1339
+ paddingVertical: 7,
1340
+ borderRadius: 8,
1341
+ }} onPress={openWalkthrough} hitSlop={8}>
1342
+ <react_native_1.Text style={{
1343
+ fontFamily: AppFonts_1.AppFonts.interBold,
1344
+ fontSize: 12,
1345
+ color: AppColors_1.AppColors.purple,
1346
+ }}>
1347
+ Start Tour →
1348
+ </react_native_1.Text>
1349
+ </TouchableScale_1.default>
1350
+ </react_native_1.View>
1351
+ </react_native_1.View>
1352
+
954
1353
  {/* Section 1: Appearance */}
955
1354
  <react_native_1.View style={{
956
1355
  backgroundColor: AppColors_1.AppColors.primaryLight,
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const StorageTab: React.MemoExoticComponent<() => React.JSX.Element>;
3
+ export default StorageTab;