react-native-inapp-inspector 2.0.5 → 2.0.6

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 (77) 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/InspectorHeader.js +28 -25
  7. package/dist/commonjs/components/Inspector/MainScreen.js +15 -2
  8. package/dist/commonjs/components/Inspector/NetworkDetail.js +15 -0
  9. package/dist/commonjs/components/Inspector/PerformanceHud.d.ts +7 -0
  10. package/dist/commonjs/components/Inspector/PerformanceHud.js +210 -0
  11. package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -18
  12. package/dist/commonjs/components/Inspector/RequestReplayModal.d.ts +9 -0
  13. package/dist/commonjs/components/Inspector/RequestReplayModal.js +792 -0
  14. package/dist/commonjs/components/Inspector/RequestReplayView.d.ts +8 -0
  15. package/dist/commonjs/components/Inspector/RequestReplayView.js +871 -0
  16. package/dist/commonjs/components/Inspector/SettingsPanel.js +326 -15
  17. package/dist/commonjs/components/Inspector/StorageTab.d.ts +3 -0
  18. package/dist/commonjs/components/Inspector/StorageTab.js +610 -0
  19. package/dist/commonjs/components/Inspector/TabBar.js +23 -2
  20. package/dist/commonjs/components/NetworkIcons.d.ts +12 -0
  21. package/dist/commonjs/components/NetworkIcons.js +72 -3
  22. package/dist/commonjs/constants/version.d.ts +1 -1
  23. package/dist/commonjs/constants/version.js +1 -1
  24. package/dist/commonjs/customHooks/storageInspector.d.ts +13 -0
  25. package/dist/commonjs/customHooks/storageInspector.js +179 -0
  26. package/dist/commonjs/helpers/deviceInfo.d.ts +4 -0
  27. package/dist/commonjs/helpers/deviceInfo.js +94 -0
  28. package/dist/commonjs/helpers/index.d.ts +2 -0
  29. package/dist/commonjs/helpers/index.js +12 -1
  30. package/dist/commonjs/helpers/packageAuditor.d.ts +5 -0
  31. package/dist/commonjs/helpers/packageAuditor.js +182 -0
  32. package/dist/commonjs/i18n/locales/en.json +3 -2
  33. package/dist/commonjs/index.d.ts +1 -0
  34. package/dist/commonjs/index.js +113 -9
  35. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  36. package/dist/commonjs/types/enums.d.ts +7 -0
  37. package/dist/commonjs/types/enums.js +7 -0
  38. package/dist/commonjs/types/interfaces.d.ts +73 -0
  39. package/dist/esm/components/Inspector/AuditTab.d.ts +3 -0
  40. package/dist/esm/components/Inspector/AuditTab.js +702 -0
  41. package/dist/esm/components/Inspector/DeviceTab.d.ts +3 -0
  42. package/dist/esm/components/Inspector/DeviceTab.js +678 -0
  43. package/dist/esm/components/Inspector/InspectorHeader.js +28 -25
  44. package/dist/esm/components/Inspector/MainScreen.js +15 -2
  45. package/dist/esm/components/Inspector/NetworkDetail.js +16 -1
  46. package/dist/esm/components/Inspector/PerformanceHud.d.ts +7 -0
  47. package/dist/esm/components/Inspector/PerformanceHud.js +170 -0
  48. package/dist/esm/components/Inspector/PerformanceTab.js +31 -19
  49. package/dist/esm/components/Inspector/RequestReplayModal.d.ts +9 -0
  50. package/dist/esm/components/Inspector/RequestReplayModal.js +752 -0
  51. package/dist/esm/components/Inspector/RequestReplayView.d.ts +8 -0
  52. package/dist/esm/components/Inspector/RequestReplayView.js +831 -0
  53. package/dist/esm/components/Inspector/SettingsPanel.js +327 -16
  54. package/dist/esm/components/Inspector/StorageTab.d.ts +3 -0
  55. package/dist/esm/components/Inspector/StorageTab.js +571 -0
  56. package/dist/esm/components/Inspector/TabBar.js +24 -3
  57. package/dist/esm/components/NetworkIcons.d.ts +12 -0
  58. package/dist/esm/components/NetworkIcons.js +57 -0
  59. package/dist/esm/constants/version.d.ts +1 -1
  60. package/dist/esm/constants/version.js +1 -1
  61. package/dist/esm/customHooks/storageInspector.d.ts +13 -0
  62. package/dist/esm/customHooks/storageInspector.js +170 -0
  63. package/dist/esm/helpers/deviceInfo.d.ts +4 -0
  64. package/dist/esm/helpers/deviceInfo.js +89 -0
  65. package/dist/esm/helpers/index.d.ts +2 -0
  66. package/dist/esm/helpers/index.js +10 -0
  67. package/dist/esm/helpers/packageAuditor.d.ts +5 -0
  68. package/dist/esm/helpers/packageAuditor.js +173 -0
  69. package/dist/esm/i18n/locales/en.json +3 -2
  70. package/dist/esm/index.d.ts +1 -0
  71. package/dist/esm/index.js +109 -8
  72. package/dist/esm/native/NativeInspector.d.ts +1 -0
  73. package/dist/esm/types/enums.d.ts +7 -0
  74. package/dist/esm/types/enums.js +7 -0
  75. package/dist/esm/types/interfaces.d.ts +73 -0
  76. package/ios/NetworkInspectorModule.mm +12 -5
  77. package/package.json +4 -1
@@ -18,13 +18,13 @@ import { isReduxConnected } from '../../customHooks/reduxLogger';
18
18
  import { isAnalyticsConnected } from '../../customHooks/analyticsLogger';
19
19
  import { useTranslation } from '../../i18n';
20
20
  import { getTelemetryConsentStatus, setTelemetryConsent, sendSessionTelemetryPing, } from '../../helpers/telemetry';
21
- import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, NpmIcon, } from '../NetworkIcons';
21
+ import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, NpmIcon, DatabaseIcon, DevicePhoneIcon, ShieldCheckIcon, CpuIcon, } from '../NetworkIcons';
22
22
  import { LIB_VERSION } from '../../constants';
23
23
  import { copyToClipboard } from '../../helpers';
24
24
  import { showToast } from '../../helpers/toast';
25
25
  const SettingsPanel = () => {
26
26
  const { t } = useTranslation();
27
- 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, } = useInspector();
27
+ 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, } = useInspector();
28
28
  const [stagedHeight, setStagedHeight] = useState(modalHeightPercent);
29
29
  const [telemetryConsent, setTelemetryConsentState] = useState(true);
30
30
  useEffect(() => {
@@ -63,6 +63,27 @@ const SettingsPanel = () => {
63
63
  icon: 'logs',
64
64
  desc: 'Terminal console logs, warnings, errors & stack traces',
65
65
  },
66
+ {
67
+ key: 'storage',
68
+ label: 'Storage (AsyncStorage)',
69
+ category: 'core',
70
+ icon: 'storage',
71
+ desc: 'Browse, edit, create and delete local key-value storage & JSON',
72
+ },
73
+ {
74
+ key: 'device',
75
+ label: 'Device & System Info',
76
+ category: 'diagnostic',
77
+ icon: 'device',
78
+ desc: 'Hermes runtime, Fabric New Arch, screen metrics & build info',
79
+ },
80
+ {
81
+ key: 'audit',
82
+ label: 'Code Quality & Package Audit',
83
+ category: 'diagnostic',
84
+ icon: 'audit',
85
+ desc: 'Audit dependencies, peer conflicts, TS schema errors & React Native anti-patterns',
86
+ },
66
87
  {
67
88
  key: 'performance',
68
89
  label: 'Performance Tracker',
@@ -105,6 +126,9 @@ const SettingsPanel = () => {
105
126
  logs: Boolean(tabVisibility?.logs),
106
127
  analytics: Boolean(tabVisibility?.analytics),
107
128
  redux: Boolean(tabVisibility?.redux),
129
+ storage: Boolean(tabVisibility?.storage),
130
+ device: Boolean(tabVisibility?.device),
131
+ audit: Boolean(tabVisibility?.audit),
108
132
  bundle: Boolean(tabVisibility?.bundle),
109
133
  performance: Boolean(tabVisibility?.performance),
110
134
  crash: Boolean(tabVisibility?.crash),
@@ -116,6 +140,9 @@ const SettingsPanel = () => {
116
140
  logs: Boolean(tabVisibility?.logs),
117
141
  analytics: Boolean(tabVisibility?.analytics),
118
142
  redux: Boolean(tabVisibility?.redux),
143
+ storage: Boolean(tabVisibility?.storage),
144
+ device: Boolean(tabVisibility?.device),
145
+ audit: Boolean(tabVisibility?.audit),
119
146
  bundle: Boolean(tabVisibility?.bundle),
120
147
  performance: Boolean(tabVisibility?.performance),
121
148
  crash: Boolean(tabVisibility?.crash),
@@ -287,16 +314,17 @@ const SettingsPanel = () => {
287
314
  shadowRadius: 4,
288
315
  shadowOffset: { width: 0, height: 2 },
289
316
  }}>
317
+ {/* Tab 1: Modules & Tabs */}
290
318
  <TouchableScale accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.modulesAndTools')} accessibilityState={{ selected: settingsActiveSubTab === 'module' }} onPress={() => {
291
319
  animateNextLayout();
292
320
  setSettingsActiveSubTab('module');
293
321
  }} style={{
294
322
  flex: 1,
295
- paddingVertical: 9,
323
+ paddingVertical: 8,
296
324
  flexDirection: 'row',
297
325
  alignItems: 'center',
298
326
  justifyContent: 'center',
299
- gap: 6,
327
+ gap: 5,
300
328
  borderRadius: 9,
301
329
  backgroundColor: settingsActiveSubTab === 'module'
302
330
  ? AppColors.purple
@@ -304,11 +332,11 @@ const SettingsPanel = () => {
304
332
  }}>
305
333
  <LayersIcon color={settingsActiveSubTab === 'module'
306
334
  ? AppColors.white
307
- : AppColors.grayText} size={13}/>
335
+ : AppColors.grayText} size={12.5}/>
308
336
  <Text style={{
309
337
  fontFamily: AppFonts.interBold,
310
- fontSize: 12.5,
311
- lineHeight: 16,
338
+ fontSize: 11.5,
339
+ lineHeight: 15,
312
340
  color: settingsActiveSubTab === 'module'
313
341
  ? AppColors.white
314
342
  : AppColors.grayText,
@@ -317,16 +345,48 @@ const SettingsPanel = () => {
317
345
  </Text>
318
346
  </TouchableScale>
319
347
 
348
+ {/* Tab 2: RAM & Limits */}
349
+ <TouchableScale accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.ramLimits')} accessibilityState={{ selected: settingsActiveSubTab === 'limits' }} onPress={() => {
350
+ animateNextLayout();
351
+ setSettingsActiveSubTab('limits');
352
+ }} style={{
353
+ flex: 1,
354
+ paddingVertical: 8,
355
+ flexDirection: 'row',
356
+ alignItems: 'center',
357
+ justifyContent: 'center',
358
+ gap: 5,
359
+ borderRadius: 9,
360
+ backgroundColor: settingsActiveSubTab === 'limits'
361
+ ? AppColors.purple
362
+ : 'transparent',
363
+ }}>
364
+ <CpuIcon color={settingsActiveSubTab === 'limits'
365
+ ? AppColors.white
366
+ : AppColors.grayText} size={12.5}/>
367
+ <Text style={{
368
+ fontFamily: AppFonts.interBold,
369
+ fontSize: 11.5,
370
+ lineHeight: 15,
371
+ color: settingsActiveSubTab === 'limits'
372
+ ? AppColors.white
373
+ : AppColors.grayText,
374
+ }}>
375
+ {t('settings.ramLimits')}
376
+ </Text>
377
+ </TouchableScale>
378
+
379
+ {/* Tab 3: UI & Appearance */}
320
380
  <TouchableScale accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.uiPreferences')} accessibilityState={{ selected: settingsActiveSubTab === 'ui' }} onPress={() => {
321
381
  animateNextLayout();
322
382
  setSettingsActiveSubTab('ui');
323
383
  }} style={{
324
384
  flex: 1,
325
- paddingVertical: 9,
385
+ paddingVertical: 8,
326
386
  flexDirection: 'row',
327
387
  alignItems: 'center',
328
388
  justifyContent: 'center',
329
- gap: 6,
389
+ gap: 5,
330
390
  borderRadius: 9,
331
391
  backgroundColor: settingsActiveSubTab === 'ui'
332
392
  ? AppColors.purple
@@ -334,11 +394,11 @@ const SettingsPanel = () => {
334
394
  }}>
335
395
  <ScreenIcon color={settingsActiveSubTab === 'ui'
336
396
  ? AppColors.white
337
- : AppColors.grayText} size={13}/>
397
+ : AppColors.grayText} size={12.5}/>
338
398
  <Text style={{
339
399
  fontFamily: AppFonts.interBold,
340
- fontSize: 12.5,
341
- lineHeight: 16,
400
+ fontSize: 11.5,
401
+ lineHeight: 15,
342
402
  color: settingsActiveSubTab === 'ui'
343
403
  ? AppColors.white
344
404
  : AppColors.grayText,
@@ -348,7 +408,7 @@ const SettingsPanel = () => {
348
408
  </TouchableScale>
349
409
  </View>
350
410
 
351
- {settingsActiveSubTab === 'module' ? (<View style={{ gap: 12 }}>
411
+ {settingsActiveSubTab === 'module' && (<View style={{ gap: 12 }}>
352
412
  {/* Individual Module Cards with Left Checkboxes */}
353
413
  <View style={{ gap: 10 }}>
354
414
  {allModules.map(moduleItem => {
@@ -483,6 +543,15 @@ const SettingsPanel = () => {
483
543
  {moduleItem.icon === 'analytics' && (<AnalyticsIcon color={isChecked
484
544
  ? AppColors.purple
485
545
  : AppColors.grayTextWeak} size={16}/>)}
546
+ {moduleItem.icon === 'storage' && (<DatabaseIcon color={isChecked
547
+ ? AppColors.purple
548
+ : AppColors.grayTextWeak} size={16}/>)}
549
+ {moduleItem.icon === 'device' && (<DevicePhoneIcon color={isChecked
550
+ ? AppColors.purple
551
+ : AppColors.grayTextWeak} size={16}/>)}
552
+ {moduleItem.icon === 'audit' && (<ShieldCheckIcon color={isChecked
553
+ ? AppColors.purple
554
+ : AppColors.grayTextWeak} size={16}/>)}
486
555
  {moduleItem.icon === 'redux' && (<ReduxIcon color={isChecked
487
556
  ? AppColors.purple
488
557
  : AppColors.grayTextWeak} size={16}/>)}
@@ -688,8 +757,11 @@ const SettingsPanel = () => {
688
757
  </View>);
689
758
  })}
690
759
  </View>
760
+ </View>)}
691
761
 
692
- {/* Section 3.5: RAM-Based Auto Limits */}
762
+ {/* ─── TAB 2: RAM & RESOURCE LIMITS ──────────────────────────────────── */}
763
+ {settingsActiveSubTab === 'limits' && (<View style={{ gap: 14 }}>
764
+ {/* Section 1: RAM-Based Auto Limits */}
693
765
  <View style={{
694
766
  backgroundColor: AppColors.primaryLight,
695
767
  borderRadius: 14,
@@ -706,7 +778,7 @@ const SettingsPanel = () => {
706
778
  color: AppColors.grayTextWeak,
707
779
  letterSpacing: 0.8,
708
780
  }}>
709
- RAM-Based Auto Limits
781
+ RAM-BASED AUTO TUNING
710
782
  </Text>
711
783
 
712
784
  {/* Auto RAM Limit Toggle */}
@@ -911,8 +983,247 @@ const SettingsPanel = () => {
911
983
  </View>))}
912
984
  </View>
913
985
  </View>)}
986
+
987
+ <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
988
+
989
+ {/* Floating Mini Performance HUD Toggle */}
990
+ {renderSettingRow({
991
+ icon: <PerformanceIcon color={AppColors.purple} size={16}/>,
992
+ label: 'Show Mini Performance HUD Overlay',
993
+ description: 'Floating on-screen real-time FPS and Memory/Heap widget',
994
+ right: (<TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle mini performance HUD overlay" accessibilityState={{ checked: isPerformanceHudEnabled }} onPress={() => setIsPerformanceHudEnabled(prev => !prev)} style={{
995
+ width: 42,
996
+ height: 24,
997
+ borderRadius: 12,
998
+ backgroundColor: isPerformanceHudEnabled
999
+ ? AppColors.purple
1000
+ : AppColors.grayBorderSecondary,
1001
+ padding: 2,
1002
+ justifyContent: 'center',
1003
+ alignItems: isPerformanceHudEnabled
1004
+ ? 'flex-end'
1005
+ : 'flex-start',
1006
+ }}>
1007
+ <View style={{
1008
+ width: 20,
1009
+ height: 20,
1010
+ borderRadius: 10,
1011
+ backgroundColor: AppColors.white,
1012
+ shadowColor: AppColors.black,
1013
+ shadowOpacity: 0.18,
1014
+ shadowRadius: 2,
1015
+ shadowOffset: { width: 0, height: 1 },
1016
+ }}/>
1017
+ </TouchableScale>),
1018
+ isLast: true,
1019
+ })}
1020
+ </View>
1021
+
1022
+ {/* Section 2: Fine-Tuned Resource Limits */}
1023
+ <View style={{
1024
+ backgroundColor: AppColors.primaryLight,
1025
+ borderRadius: 14,
1026
+ borderWidth: 1,
1027
+ borderColor: AppColors.grayBorderSecondary,
1028
+ overflow: 'hidden',
1029
+ padding: 14,
1030
+ gap: 12,
1031
+ }}>
1032
+ <Text style={{
1033
+ fontFamily: AppFonts.interBold,
1034
+ fontSize: 11,
1035
+ lineHeight: 14,
1036
+ color: AppColors.grayTextWeak,
1037
+ letterSpacing: 0.8,
1038
+ }}>
1039
+ MANUAL RESOURCE THRESHOLDS
1040
+ </Text>
1041
+
1042
+ {renderSettingRow({
1043
+ icon: <SignalIcon color={AppColors.purple} size={16}/>,
1044
+ label: 'Max Network / API Logs',
1045
+ description: 'Maximum in-memory API requests tracked before rotation',
1046
+ numericInput: {
1047
+ value: maxNetworkLogs,
1048
+ onChange: setMaxNetworkLogs,
1049
+ min: 10,
1050
+ max: 100,
1051
+ placeholder: '10 - 100',
1052
+ },
1053
+ })}
1054
+
1055
+ {renderSettingRow({
1056
+ icon: <TerminalIcon color={AppColors.purple} size={16}/>,
1057
+ label: 'Max Console Logs',
1058
+ description: 'Maximum log entries kept across info/warn/error streams',
1059
+ numericInput: {
1060
+ value: maxConsoleLogs,
1061
+ onChange: setMaxConsoleLogs,
1062
+ min: 20,
1063
+ max: 300,
1064
+ placeholder: '20 - 300',
1065
+ },
1066
+ })}
1067
+
1068
+ {renderSettingRow({
1069
+ icon: <AnalyticsIcon color={AppColors.purple} size={16}/>,
1070
+ label: 'Max Analytics Events',
1071
+ description: 'Capacity for captured analytics payloads & telemetry pings',
1072
+ numericInput: {
1073
+ value: maxAnalyticsEventsLimit,
1074
+ onChange: setMaxAnalyticsEventsLimit,
1075
+ min: 20,
1076
+ max: 200,
1077
+ placeholder: '20 - 200',
1078
+ },
1079
+ })}
1080
+
1081
+ {renderSettingRow({
1082
+ icon: <CrashIcon color={AppColors.errorColor} size={16}/>,
1083
+ label: 'Max Crash Records',
1084
+ description: 'Stored fatal exceptions and crash diagnostics logs',
1085
+ numericInput: {
1086
+ value: maxCrashLogs,
1087
+ onChange: setMaxCrashLogs,
1088
+ min: 5,
1089
+ max: 50,
1090
+ placeholder: '5 - 50',
1091
+ },
1092
+ isLast: true,
1093
+ })}
914
1094
  </View>
915
- </View>) : (<View style={{ gap: 14 }}>
1095
+
1096
+ {/* Section 3: Storage & Cache Cleansing */}
1097
+ <View style={{
1098
+ backgroundColor: AppColors.primaryLight,
1099
+ borderRadius: 14,
1100
+ borderWidth: 1,
1101
+ borderColor: AppColors.grayBorderSecondary,
1102
+ overflow: 'hidden',
1103
+ padding: 14,
1104
+ gap: 12,
1105
+ }}>
1106
+ <Text style={{
1107
+ fontFamily: AppFonts.interBold,
1108
+ fontSize: 11,
1109
+ lineHeight: 14,
1110
+ color: AppColors.grayTextWeak,
1111
+ letterSpacing: 0.8,
1112
+ }}>
1113
+ STORAGE & CACHE CLEANSING
1114
+ </Text>
1115
+
1116
+ {renderSettingRow({
1117
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1118
+ label: 'Clear All Network Logs',
1119
+ description: `${logs.length} requests in memory`,
1120
+ onPress: () => {
1121
+ clearNetworkLogs();
1122
+ setSelected(null);
1123
+ Alert.alert(t('common.success'), 'Network logs cleared successfully.');
1124
+ },
1125
+ right: (<View style={{
1126
+ paddingHorizontal: 10,
1127
+ paddingVertical: 4,
1128
+ borderRadius: 6,
1129
+ backgroundColor: `${AppColors.errorColor}14`,
1130
+ borderWidth: 1,
1131
+ borderColor: `${AppColors.errorColor}33`,
1132
+ }}>
1133
+ <Text style={{
1134
+ fontFamily: AppFonts.interBold,
1135
+ fontSize: 11,
1136
+ color: AppColors.errorColor,
1137
+ }}>
1138
+ Clear ({logs.length})
1139
+ </Text>
1140
+ </View>),
1141
+ })}
1142
+
1143
+ {renderSettingRow({
1144
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1145
+ label: 'Clear All Console Logs',
1146
+ description: `${consoleLogs.length} logs in memory`,
1147
+ onPress: () => {
1148
+ clearConsoleLogs();
1149
+ Alert.alert(t('common.success'), 'Console logs cleared successfully.');
1150
+ },
1151
+ right: (<View style={{
1152
+ paddingHorizontal: 10,
1153
+ paddingVertical: 4,
1154
+ borderRadius: 6,
1155
+ backgroundColor: `${AppColors.errorColor}14`,
1156
+ borderWidth: 1,
1157
+ borderColor: `${AppColors.errorColor}33`,
1158
+ }}>
1159
+ <Text style={{
1160
+ fontFamily: AppFonts.interBold,
1161
+ fontSize: 11,
1162
+ color: AppColors.errorColor,
1163
+ }}>
1164
+ Clear ({consoleLogs.length})
1165
+ </Text>
1166
+ </View>),
1167
+ })}
1168
+
1169
+ {renderSettingRow({
1170
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1171
+ label: 'Clear Analytics Events',
1172
+ description: `${analyticsEvents.length} events recorded`,
1173
+ onPress: () => {
1174
+ clearAnalyticsEvents();
1175
+ setSelectedEvent(null);
1176
+ Alert.alert(t('common.success'), 'Analytics events cleared successfully.');
1177
+ },
1178
+ right: (<View style={{
1179
+ paddingHorizontal: 10,
1180
+ paddingVertical: 4,
1181
+ borderRadius: 6,
1182
+ backgroundColor: `${AppColors.errorColor}14`,
1183
+ borderWidth: 1,
1184
+ borderColor: `${AppColors.errorColor}33`,
1185
+ }}>
1186
+ <Text style={{
1187
+ fontFamily: AppFonts.interBold,
1188
+ fontSize: 11,
1189
+ color: AppColors.errorColor,
1190
+ }}>
1191
+ Clear ({analyticsEvents.length})
1192
+ </Text>
1193
+ </View>),
1194
+ })}
1195
+
1196
+ {renderSettingRow({
1197
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1198
+ label: 'Clear Crash Logs',
1199
+ description: `${crashRecords.length} crash dumps recorded`,
1200
+ onPress: () => {
1201
+ clearCrashRecords();
1202
+ Alert.alert(t('common.success'), 'Crash records cleared successfully.');
1203
+ },
1204
+ isLast: true,
1205
+ right: (<View style={{
1206
+ paddingHorizontal: 10,
1207
+ paddingVertical: 4,
1208
+ borderRadius: 6,
1209
+ backgroundColor: `${AppColors.errorColor}14`,
1210
+ borderWidth: 1,
1211
+ borderColor: `${AppColors.errorColor}33`,
1212
+ }}>
1213
+ <Text style={{
1214
+ fontFamily: AppFonts.interBold,
1215
+ fontSize: 11,
1216
+ color: AppColors.errorColor,
1217
+ }}>
1218
+ Clear ({crashRecords.length})
1219
+ </Text>
1220
+ </View>),
1221
+ })}
1222
+ </View>
1223
+ </View>)}
1224
+
1225
+ {/* ─── TAB 3: UI & APPEARANCE ────────────────────────────────────────── */}
1226
+ {settingsActiveSubTab === 'ui' && (<View style={{ gap: 14 }}>
916
1227
  {/* Section 1: Appearance */}
917
1228
  <View style={{
918
1229
  backgroundColor: 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;