react-native-inapp-inspector 2.3.5 → 2.3.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 (226) hide show
  1. package/dist/commonjs/analytics.d.ts +0 -4
  2. package/dist/commonjs/analytics.js +0 -4
  3. package/dist/commonjs/bundle.d.ts +0 -4
  4. package/dist/commonjs/bundle.js +0 -4
  5. package/dist/commonjs/components/AnalyticsDetail.js +18 -27
  6. package/dist/commonjs/components/AnalyticsEventCard.js +9 -12
  7. package/dist/commonjs/components/AnalyticsGraph.js +10 -15
  8. package/dist/commonjs/components/AppHeaderLogo.js +0 -3
  9. package/dist/commonjs/components/BrandCircleIcon.js +15 -15
  10. package/dist/commonjs/components/BrandSquareIcon.js +20 -20
  11. package/dist/commonjs/components/CodeSnippet.js +6 -19
  12. package/dist/commonjs/components/ConsoleLogCard.js +0 -1
  13. package/dist/commonjs/components/CopyButton.js +0 -4
  14. package/dist/commonjs/components/DiffViewer.js +0 -2
  15. package/dist/commonjs/components/DomainHeader.js +0 -4
  16. package/dist/commonjs/components/EmptyState.js +0 -3
  17. package/dist/commonjs/components/ErrorBoundary.js +5 -10
  18. package/dist/commonjs/components/HeadersSection.js +0 -5
  19. package/dist/commonjs/components/HighlightText.js +1 -4
  20. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +11 -26
  21. package/dist/commonjs/components/Inspector/AnalyticsTab.js +34 -40
  22. package/dist/commonjs/components/Inspector/BundleTab.js +56 -84
  23. package/dist/commonjs/components/Inspector/ConsoleTab.js +7 -7
  24. package/dist/commonjs/components/Inspector/CrashDetail.js +18 -20
  25. package/dist/commonjs/components/Inspector/CrashFilterModal.js +0 -1
  26. package/dist/commonjs/components/Inspector/CrashTab.js +11 -20
  27. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +12 -24
  28. package/dist/commonjs/components/Inspector/FabLauncher.js +1 -1
  29. package/dist/commonjs/components/Inspector/InspectorContext.js +0 -2
  30. package/dist/commonjs/components/Inspector/InspectorHeader.js +7 -8
  31. package/dist/commonjs/components/Inspector/LogDetail.js +27 -29
  32. package/dist/commonjs/components/Inspector/MainScreen.js +9 -10
  33. package/dist/commonjs/components/Inspector/NetworkDetail.js +10 -11
  34. package/dist/commonjs/components/Inspector/NetworkTab.js +14 -14
  35. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +6 -9
  36. package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -43
  37. package/dist/commonjs/components/Inspector/ReduxDetail.js +18 -34
  38. package/dist/commonjs/components/Inspector/ReduxTab.js +11 -20
  39. package/dist/commonjs/components/Inspector/SettingsPanel.js +32 -36
  40. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +6 -6
  41. package/dist/commonjs/components/Inspector/StorageTab.js +14 -26
  42. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -6
  43. package/dist/commonjs/components/JsonViewer.js +3 -10
  44. package/dist/commonjs/components/LogCard.js +7 -7
  45. package/dist/commonjs/components/MetaAccordion.js +1 -7
  46. package/dist/commonjs/components/NetworkIcons.js +12 -16
  47. package/dist/commonjs/components/SectionHeader.js +0 -4
  48. package/dist/commonjs/components/SkeletonPlaceholder.js +6 -6
  49. package/dist/commonjs/components/Slider.js +6 -6
  50. package/dist/commonjs/components/SourcePageCard.js +0 -4
  51. package/dist/commonjs/components/TreeNode.js +0 -4
  52. package/dist/commonjs/console.d.ts +0 -4
  53. package/dist/commonjs/console.js +0 -4
  54. package/dist/commonjs/constants/index.js +6 -9
  55. package/dist/commonjs/constants/telemetryConfig.d.ts +7 -0
  56. package/dist/commonjs/constants/telemetryConfig.js +10 -0
  57. package/dist/commonjs/constants/version.d.ts +1 -1
  58. package/dist/commonjs/constants/version.js +1 -3
  59. package/dist/commonjs/crash.d.ts +0 -4
  60. package/dist/commonjs/crash.js +0 -4
  61. package/dist/commonjs/customHooks/analyticsLogger.d.ts +0 -7
  62. package/dist/commonjs/customHooks/analyticsLogger.js +3 -59
  63. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -9
  64. package/dist/commonjs/customHooks/bundleAnalyzer.js +3 -86
  65. package/dist/commonjs/customHooks/consoleLogger.js +0 -16
  66. package/dist/commonjs/customHooks/crashHandler.d.ts +0 -28
  67. package/dist/commonjs/customHooks/crashHandler.js +0 -55
  68. package/dist/commonjs/customHooks/logFilters.d.ts +0 -4
  69. package/dist/commonjs/customHooks/logFilters.js +0 -11
  70. package/dist/commonjs/customHooks/networkLogger.js +2 -13
  71. package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -27
  72. package/dist/commonjs/customHooks/performanceTracker.js +0 -31
  73. package/dist/commonjs/customHooks/reduxLogger.d.ts +0 -12
  74. package/dist/commonjs/customHooks/reduxLogger.js +0 -51
  75. package/dist/commonjs/customHooks/storageInspector.d.ts +0 -40
  76. package/dist/commonjs/customHooks/storageInspector.js +1 -56
  77. package/dist/commonjs/decorators/index.d.ts +0 -37
  78. package/dist/commonjs/decorators/index.js +0 -42
  79. package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +0 -10
  80. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +0 -26
  81. package/dist/commonjs/helpers/index.d.ts +0 -7
  82. package/dist/commonjs/helpers/index.js +1 -42
  83. package/dist/commonjs/helpers/memoryManager.d.ts +0 -11
  84. package/dist/commonjs/helpers/memoryManager.js +0 -13
  85. package/dist/commonjs/helpers/searchQueryParser.d.ts +0 -4
  86. package/dist/commonjs/helpers/searchQueryParser.js +0 -18
  87. package/dist/commonjs/helpers/settingsStore.js +0 -8
  88. package/dist/commonjs/helpers/telemetry.d.ts +2 -0
  89. package/dist/commonjs/helpers/telemetry.js +302 -0
  90. package/dist/commonjs/i18n/index.d.ts +0 -9
  91. package/dist/commonjs/i18n/index.js +0 -15
  92. package/dist/commonjs/index.js +15 -97
  93. package/dist/commonjs/native/NativeInspector.d.ts +0 -54
  94. package/dist/commonjs/native/NativeInspector.js +0 -56
  95. package/dist/commonjs/network.d.ts +0 -4
  96. package/dist/commonjs/network.js +0 -4
  97. package/dist/commonjs/performance.d.ts +0 -4
  98. package/dist/commonjs/performance.js +0 -4
  99. package/dist/commonjs/redux.d.ts +0 -4
  100. package/dist/commonjs/redux.js +0 -4
  101. package/dist/commonjs/storage.d.ts +0 -4
  102. package/dist/commonjs/storage.js +0 -4
  103. package/dist/commonjs/styles/AppColors.d.ts +0 -3
  104. package/dist/commonjs/styles/AppColors.js +15 -30
  105. package/dist/commonjs/styles/AppFonts.d.ts +0 -4
  106. package/dist/commonjs/styles/AppFonts.js +0 -4
  107. package/dist/commonjs/styles/common.js +0 -11
  108. package/dist/commonjs/styles/index.js +0 -8
  109. package/dist/commonjs/types/enums.js +0 -3
  110. package/dist/commonjs/types/interfaces.d.ts +3 -3
  111. package/dist/esm/analytics.d.ts +0 -4
  112. package/dist/esm/analytics.js +0 -4
  113. package/dist/esm/bundle.d.ts +0 -4
  114. package/dist/esm/bundle.js +0 -4
  115. package/dist/esm/components/AnalyticsDetail.js +18 -27
  116. package/dist/esm/components/AnalyticsEventCard.js +9 -12
  117. package/dist/esm/components/AnalyticsGraph.js +10 -15
  118. package/dist/esm/components/AppHeaderLogo.js +0 -3
  119. package/dist/esm/components/BrandCircleIcon.js +15 -15
  120. package/dist/esm/components/BrandSquareIcon.js +20 -20
  121. package/dist/esm/components/CodeSnippet.js +6 -19
  122. package/dist/esm/components/ConsoleLogCard.js +0 -1
  123. package/dist/esm/components/CopyButton.js +0 -4
  124. package/dist/esm/components/DiffViewer.js +0 -2
  125. package/dist/esm/components/DomainHeader.js +0 -4
  126. package/dist/esm/components/EmptyState.js +0 -3
  127. package/dist/esm/components/ErrorBoundary.js +5 -10
  128. package/dist/esm/components/HeadersSection.js +0 -5
  129. package/dist/esm/components/HighlightText.js +1 -4
  130. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +11 -26
  131. package/dist/esm/components/Inspector/AnalyticsTab.js +34 -40
  132. package/dist/esm/components/Inspector/BundleTab.js +56 -84
  133. package/dist/esm/components/Inspector/ConsoleTab.js +7 -7
  134. package/dist/esm/components/Inspector/CrashDetail.js +18 -20
  135. package/dist/esm/components/Inspector/CrashFilterModal.js +0 -1
  136. package/dist/esm/components/Inspector/CrashTab.js +11 -20
  137. package/dist/esm/components/Inspector/DeviceInfoTab.js +12 -24
  138. package/dist/esm/components/Inspector/FabLauncher.js +1 -1
  139. package/dist/esm/components/Inspector/InspectorContext.js +0 -2
  140. package/dist/esm/components/Inspector/InspectorHeader.js +7 -8
  141. package/dist/esm/components/Inspector/LogDetail.js +27 -29
  142. package/dist/esm/components/Inspector/MainScreen.js +9 -10
  143. package/dist/esm/components/Inspector/NetworkDetail.js +10 -11
  144. package/dist/esm/components/Inspector/NetworkTab.js +14 -14
  145. package/dist/esm/components/Inspector/NpmUpdateToast.js +6 -9
  146. package/dist/esm/components/Inspector/PerformanceTab.js +30 -43
  147. package/dist/esm/components/Inspector/ReduxDetail.js +18 -34
  148. package/dist/esm/components/Inspector/ReduxTab.js +11 -20
  149. package/dist/esm/components/Inspector/SettingsPanel.js +32 -36
  150. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +6 -6
  151. package/dist/esm/components/Inspector/StorageTab.js +14 -26
  152. package/dist/esm/components/Inspector/UpdateAvailableModal.js +5 -6
  153. package/dist/esm/components/JsonViewer.js +3 -10
  154. package/dist/esm/components/LogCard.js +7 -7
  155. package/dist/esm/components/MetaAccordion.js +1 -7
  156. package/dist/esm/components/NetworkIcons.js +12 -16
  157. package/dist/esm/components/SectionHeader.js +0 -4
  158. package/dist/esm/components/SkeletonPlaceholder.js +6 -6
  159. package/dist/esm/components/Slider.js +6 -6
  160. package/dist/esm/components/SourcePageCard.js +0 -4
  161. package/dist/esm/components/TreeNode.js +0 -4
  162. package/dist/esm/console.d.ts +0 -4
  163. package/dist/esm/console.js +0 -4
  164. package/dist/esm/constants/index.js +6 -9
  165. package/dist/esm/constants/telemetryConfig.d.ts +7 -0
  166. package/dist/esm/constants/telemetryConfig.js +7 -0
  167. package/dist/esm/constants/version.d.ts +1 -1
  168. package/dist/esm/constants/version.js +1 -3
  169. package/dist/esm/crash.d.ts +0 -4
  170. package/dist/esm/crash.js +0 -4
  171. package/dist/esm/customHooks/analyticsLogger.d.ts +0 -7
  172. package/dist/esm/customHooks/analyticsLogger.js +3 -59
  173. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -9
  174. package/dist/esm/customHooks/bundleAnalyzer.js +3 -86
  175. package/dist/esm/customHooks/consoleLogger.js +0 -16
  176. package/dist/esm/customHooks/crashHandler.d.ts +0 -28
  177. package/dist/esm/customHooks/crashHandler.js +0 -55
  178. package/dist/esm/customHooks/logFilters.d.ts +0 -4
  179. package/dist/esm/customHooks/logFilters.js +0 -11
  180. package/dist/esm/customHooks/networkLogger.js +2 -13
  181. package/dist/esm/customHooks/performanceTracker.d.ts +0 -27
  182. package/dist/esm/customHooks/performanceTracker.js +0 -31
  183. package/dist/esm/customHooks/reduxLogger.d.ts +0 -12
  184. package/dist/esm/customHooks/reduxLogger.js +0 -51
  185. package/dist/esm/customHooks/storageInspector.d.ts +0 -40
  186. package/dist/esm/customHooks/storageInspector.js +1 -56
  187. package/dist/esm/decorators/index.d.ts +0 -37
  188. package/dist/esm/decorators/index.js +0 -42
  189. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +0 -10
  190. package/dist/esm/helpers/gaAnalyticsRegistry.js +0 -26
  191. package/dist/esm/helpers/index.d.ts +0 -7
  192. package/dist/esm/helpers/index.js +1 -42
  193. package/dist/esm/helpers/memoryManager.d.ts +0 -11
  194. package/dist/esm/helpers/memoryManager.js +0 -13
  195. package/dist/esm/helpers/searchQueryParser.d.ts +0 -4
  196. package/dist/esm/helpers/searchQueryParser.js +0 -18
  197. package/dist/esm/helpers/settingsStore.js +0 -8
  198. package/dist/esm/helpers/telemetry.d.ts +2 -0
  199. package/dist/esm/helpers/telemetry.js +298 -0
  200. package/dist/esm/i18n/index.d.ts +0 -9
  201. package/dist/esm/i18n/index.js +0 -15
  202. package/dist/esm/index.js +15 -97
  203. package/dist/esm/native/NativeInspector.d.ts +0 -54
  204. package/dist/esm/native/NativeInspector.js +0 -56
  205. package/dist/esm/network.d.ts +0 -4
  206. package/dist/esm/network.js +0 -4
  207. package/dist/esm/performance.d.ts +0 -4
  208. package/dist/esm/performance.js +0 -4
  209. package/dist/esm/redux.d.ts +0 -4
  210. package/dist/esm/redux.js +0 -4
  211. package/dist/esm/storage.d.ts +0 -4
  212. package/dist/esm/storage.js +0 -4
  213. package/dist/esm/styles/AppColors.d.ts +0 -3
  214. package/dist/esm/styles/AppColors.js +15 -30
  215. package/dist/esm/styles/AppFonts.d.ts +0 -4
  216. package/dist/esm/styles/AppFonts.js +0 -4
  217. package/dist/esm/styles/common.js +0 -11
  218. package/dist/esm/styles/index.js +0 -8
  219. package/dist/esm/types/enums.js +0 -3
  220. package/dist/esm/types/interfaces.d.ts +3 -3
  221. package/package.json +2 -2
  222. package/src/constants/telemetryConfig.ts +16 -0
  223. package/src/constants/version.ts +1 -1
  224. package/src/helpers/telemetry.ts +341 -0
  225. package/src/index.tsx +15 -1
  226. package/src/types/interfaces.ts +3 -0
@@ -31,7 +31,6 @@ const SettingsPanel = () => {
31
31
  }, [modalHeightPercent]);
32
32
  const autoRamProfile = calculateRamBasedLimits(deviceFreeRamMb);
33
33
  const isPersistent = isPersistentStorageAvailable();
34
- // Safe Area & Status Bar Padding for All Device Form Factors
35
34
  const statusBarHeight = Platform.OS === 'android' ? StatusBar.currentHeight || 24 : 44;
36
35
  const headerTopPadding = modalHeightPercent >= 95 ? statusBarHeight : 0;
37
36
  const allModules = [
@@ -99,7 +98,6 @@ const SettingsPanel = () => {
99
98
  desc: 'AsyncStorage & MMKV key-value store viewer with full CRUD support',
100
99
  },
101
100
  ];
102
- // Staged selection state for checkboxes before clicking "Save Changes"
103
101
  const [stagedTabVisibility, setStagedTabVisibility] = useState(() => ({
104
102
  apis: true,
105
103
  logs: Boolean(tabVisibility?.logs),
@@ -111,7 +109,6 @@ const SettingsPanel = () => {
111
109
  device: Boolean(tabVisibility?.device),
112
110
  storage: Boolean(tabVisibility?.storage),
113
111
  }));
114
- // Synchronize staged state with tabVisibility when tabVisibility updates
115
112
  useEffect(() => {
116
113
  setStagedTabVisibility({
117
114
  apis: true,
@@ -148,7 +145,6 @@ const SettingsPanel = () => {
148
145
  animateNextLayout();
149
146
  setSettingsPage('main');
150
147
  };
151
- // Helper: settings row with icon + label + optional description
152
148
  const renderSettingRow = (opts) => {
153
149
  return (<View style={{
154
150
  paddingVertical: 12,
@@ -278,7 +274,7 @@ const SettingsPanel = () => {
278
274
  backgroundColor: AppColors.grayBackground,
279
275
  }}>
280
276
  <ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 14 }} showsVerticalScrollIndicator={false}>
281
- {/* Segmented Top Navigation Sub-Tabs */}
277
+
282
278
  <View style={{
283
279
  flexDirection: 'row',
284
280
  backgroundColor: AppColors.primaryLight,
@@ -383,7 +379,7 @@ const SettingsPanel = () => {
383
379
  </View>
384
380
 
385
381
  {settingsActiveSubTab === 'module' && (<View style={{ gap: 12 }}>
386
- {/* Individual Module Cards with Left Checkboxes */}
382
+
387
383
  <View style={{ gap: 10 }}>
388
384
  {allModules.map(moduleItem => {
389
385
  const isReduxAvail = isReduxConnected();
@@ -423,13 +419,13 @@ const SettingsPanel = () => {
423
419
  shadowRadius: 5,
424
420
  shadowOffset: { width: 0, height: 2 },
425
421
  }}>
426
- {/* Top Row: [Checkbox] -> [Icon Tile] -> [Title & Subtitle] */}
422
+
427
423
  <View style={{
428
424
  flexDirection: 'row',
429
425
  alignItems: 'flex-start',
430
426
  gap: 10,
431
427
  }}>
432
- {/* 1. Checkbox on the Left */}
428
+
433
429
  <TouchableScale accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Select ${moduleItem.label}`} accessibilityState={{
434
430
  checked: isChecked,
435
431
  disabled: isLocked,
@@ -469,7 +465,7 @@ const SettingsPanel = () => {
469
465
  </Svg>) : null}
470
466
  </TouchableScale>
471
467
 
472
- {/* 2. Middle Tap Zone: Icon + Title & Desc */}
468
+
473
469
  <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`${moduleItem.label} settings`} disabled={isUnavailable} onPress={() => {
474
470
  animateNextLayout();
475
471
  setSettingsPage(moduleItem.key);
@@ -479,7 +475,7 @@ const SettingsPanel = () => {
479
475
  alignItems: 'flex-start',
480
476
  gap: 10,
481
477
  }}>
482
- {/* Icon Tile */}
478
+
483
479
  <View style={{
484
480
  width: 36,
485
481
  height: 36,
@@ -528,7 +524,7 @@ const SettingsPanel = () => {
528
524
  : AppColors.grayTextWeak} size={16}/>)}
529
525
  </View>
530
526
 
531
- {/* Titles & Status Pill */}
527
+
532
528
  <View style={{ flex: 1, gap: 2 }}>
533
529
  <View style={{
534
530
  flexDirection: 'row',
@@ -547,7 +543,7 @@ const SettingsPanel = () => {
547
543
  {moduleItem.label}
548
544
  </Text>
549
545
 
550
- {/* Default Startup Tab Badge */}
546
+
551
547
  {moduleItem.key === defaultTab &&
552
548
  !isUnavailable && (<View style={{
553
549
  flexDirection: 'row',
@@ -577,7 +573,7 @@ const SettingsPanel = () => {
577
573
  </Text>
578
574
  </View>)}
579
575
 
580
- {/* Status Pill */}
576
+
581
577
  {moduleItem.key === 'apis' ? (<View style={{
582
578
  backgroundColor: `${AppColors.blue500}14`,
583
579
  borderRadius: 4,
@@ -664,7 +660,7 @@ const SettingsPanel = () => {
664
660
  </TouchableScale>
665
661
  </View>
666
662
 
667
- {/* Card Footer: Live Stats + Configure Button */}
663
+
668
664
  {!isUnavailable && (<View style={{
669
665
  flexDirection: 'row',
670
666
  alignItems: 'center',
@@ -673,7 +669,7 @@ const SettingsPanel = () => {
673
669
  borderTopWidth: 1,
674
670
  borderTopColor: AppColors.dividerColor,
675
671
  }}>
676
- {/* Live Info Pill */}
672
+
677
673
  <View style={{
678
674
  flexDirection: 'row',
679
675
  alignItems: 'center',
@@ -698,7 +694,7 @@ const SettingsPanel = () => {
698
694
  </Text>
699
695
  </View>
700
696
 
701
- {/* Sleek Configure Button */}
697
+
702
698
  <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`Configure ${moduleItem.label} settings`} onPress={() => {
703
699
  animateNextLayout();
704
700
  setSettingsPage(moduleItem.key);
@@ -731,7 +727,7 @@ const SettingsPanel = () => {
731
727
  </View>)}
732
728
 
733
729
  {settingsActiveSubTab === 'ui' && (<View style={{ gap: 14 }}>
734
- {/* Section 1: Appearance */}
730
+
735
731
  <View style={{
736
732
  backgroundColor: AppColors.primaryLight,
737
733
  borderRadius: 14,
@@ -822,7 +818,7 @@ const SettingsPanel = () => {
822
818
  </View>
823
819
  </View>
824
820
 
825
- {/* Section 2: Window & Layout */}
821
+
826
822
  <View style={{
827
823
  backgroundColor: AppColors.primaryLight,
828
824
  borderRadius: 14,
@@ -842,7 +838,7 @@ const SettingsPanel = () => {
842
838
  {t('settings.windowLayout')}
843
839
  </Text>
844
840
 
845
- {/* Modal Height */}
841
+
846
842
  <View style={{ gap: 8 }}>
847
843
  <View style={{
848
844
  flexDirection: 'row',
@@ -921,7 +917,7 @@ const SettingsPanel = () => {
921
917
 
922
918
  <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
923
919
 
924
- {/* Modal Animation */}
920
+
925
921
  <View style={{ gap: 8 }}>
926
922
  <View style={{
927
923
  flexDirection: 'row',
@@ -998,7 +994,7 @@ const SettingsPanel = () => {
998
994
  </View>
999
995
  </View>
1000
996
 
1001
- {/* Section 3: Default Startup Tab */}
997
+
1002
998
  <View style={{
1003
999
  backgroundColor: AppColors.primaryLight,
1004
1000
  borderRadius: 14,
@@ -1054,7 +1050,7 @@ const SettingsPanel = () => {
1054
1050
  </View>
1055
1051
  </View>
1056
1052
 
1057
- {/* Sleek Interactive Dropdown Picker */}
1053
+
1058
1054
  <View style={{ marginTop: 6, gap: 6 }}>
1059
1055
  <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`Default opening tab: ${allModules.find(m => m.key === defaultTab)?.label || 'APIs'}`} onPress={() => setIsDefaultTabDropdownOpen(prev => !prev)} style={{
1060
1056
  flexDirection: 'row',
@@ -1115,7 +1111,7 @@ const SettingsPanel = () => {
1115
1111
  </View>
1116
1112
  </TouchableScale>
1117
1113
 
1118
- {/* Dropdown Options List */}
1114
+
1119
1115
  {isDefaultTabDropdownOpen && (<View style={{
1120
1116
  backgroundColor: AppColors.primaryLight,
1121
1117
  borderRadius: 10,
@@ -1182,7 +1178,7 @@ const SettingsPanel = () => {
1182
1178
  </View>
1183
1179
  </View>
1184
1180
 
1185
- {/* Section 4: Notifications & Toasts */}
1181
+
1186
1182
  <View style={{
1187
1183
  backgroundColor: AppColors.primaryLight,
1188
1184
  borderRadius: 14,
@@ -1271,7 +1267,7 @@ const SettingsPanel = () => {
1271
1267
  </View>
1272
1268
  </View>
1273
1269
 
1274
- {/* Section 5: NPM Package & Updates */}
1270
+
1275
1271
  <View style={{
1276
1272
  backgroundColor: AppColors.primaryLight,
1277
1273
  borderRadius: 14,
@@ -1399,7 +1395,7 @@ const SettingsPanel = () => {
1399
1395
  </View>)}
1400
1396
 
1401
1397
  {settingsActiveSubTab === 'limits' && (<View style={{ gap: 14 }}>
1402
- {/* Section 1: Device RAM & Auto Profile */}
1398
+
1403
1399
  <View style={{
1404
1400
  backgroundColor: AppColors.primaryLight,
1405
1401
  borderRadius: 14,
@@ -1419,7 +1415,7 @@ const SettingsPanel = () => {
1419
1415
  DEVICE MEMORY & AUTO PROFILES
1420
1416
  </Text>
1421
1417
 
1422
- {/* Auto RAM Limit Toggle */}
1418
+
1423
1419
  <View style={{
1424
1420
  flexDirection: 'row',
1425
1421
  alignItems: 'center',
@@ -1490,7 +1486,7 @@ const SettingsPanel = () => {
1490
1486
 
1491
1487
  <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
1492
1488
 
1493
- {/* Device Free RAM Display */}
1489
+
1494
1490
  <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
1495
1491
  <View style={{
1496
1492
  width: 32,
@@ -1552,7 +1548,7 @@ const SettingsPanel = () => {
1552
1548
  </View>
1553
1549
  </View>
1554
1550
 
1555
- {/* Profile Overview */}
1551
+
1556
1552
  <View style={{
1557
1553
  marginTop: 4,
1558
1554
  paddingTop: 8,
@@ -1655,7 +1651,7 @@ const SettingsPanel = () => {
1655
1651
  </View>
1656
1652
  </View>
1657
1653
 
1658
- {/* Section 2: Memory-Safe OS Pruning Shield */}
1654
+
1659
1655
  <View style={{
1660
1656
  backgroundColor: AppColors.primaryLight,
1661
1657
  borderRadius: 14,
@@ -1723,7 +1719,7 @@ const SettingsPanel = () => {
1723
1719
 
1724
1720
  <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
1725
1721
 
1726
- {/* Instant Prune Button */}
1722
+
1727
1723
  <View style={{
1728
1724
  flexDirection: 'row',
1729
1725
  alignItems: 'center',
@@ -1774,7 +1770,7 @@ const SettingsPanel = () => {
1774
1770
  <View style={{ height: 48 }}/>
1775
1771
  </ScrollView>
1776
1772
 
1777
- {/* Bottom Sticky Action Bar for Save Changes */}
1773
+
1778
1774
  {settingsActiveSubTab === 'module' && (<View style={{
1779
1775
  paddingHorizontal: 16,
1780
1776
  paddingTop: 12,
@@ -1996,7 +1992,7 @@ const SettingsPanel = () => {
1996
1992
  })}
1997
1993
  </View>
1998
1994
 
1999
- {/* Log Deduplication Card */}
1995
+
2000
1996
  <View style={{
2001
1997
  backgroundColor: AppColors.primaryLight,
2002
1998
  borderRadius: 14,
@@ -2016,7 +2012,7 @@ const SettingsPanel = () => {
2016
2012
  {t('settings.logFiltersDeduplication')}
2017
2013
  </Text>
2018
2014
 
2019
- {/* Show Duplicate Logs */}
2015
+
2020
2016
  <View style={{
2021
2017
  flexDirection: 'row',
2022
2018
  alignItems: 'center',
@@ -2555,7 +2551,7 @@ const SettingsPanel = () => {
2555
2551
  flex: 1,
2556
2552
  backgroundColor: AppColors.grayBackground,
2557
2553
  }}>
2558
- {/* ─── Persistent Main Settings (Retains 100% scroll position) ─── */}
2554
+
2559
2555
  <View style={[
2560
2556
  StyleSheet.absoluteFill,
2561
2557
  settingsPage !== 'main' && { pointerEvents: 'none' },
@@ -2563,7 +2559,7 @@ const SettingsPanel = () => {
2563
2559
  {renderMainSettingsContent()}
2564
2560
  </View>
2565
2561
 
2566
- {/* ─── Sub-module Settings Overlay (Smooth Animated Slide) ─── */}
2562
+
2567
2563
  {settingsPage !== 'main' && (<Animated.View style={[
2568
2564
  StyleSheet.absoluteFill,
2569
2565
  {
@@ -20,7 +20,7 @@ export const SkeletonPlaceholder = React.memo(function SkeletonPlaceholder({ car
20
20
  return () => animation.stop();
21
21
  }, [shimmerAnim]);
22
22
  return (<View style={skeletonStyles.container}>
23
- {/* ─── Search & Scope Toolbar Skeleton ─── */}
23
+
24
24
  <View style={skeletonStyles.toolbarSkeleton}>
25
25
  <Animated.View style={[
26
26
  skeletonStyles.searchBarSkeleton,
@@ -32,7 +32,7 @@ export const SkeletonPlaceholder = React.memo(function SkeletonPlaceholder({ car
32
32
  </View>
33
33
  </View>
34
34
 
35
- {/* ─── Quick Filter Chips Skeleton Strip ─── */}
35
+
36
36
  <View style={skeletonStyles.chipStripSkeleton}>
37
37
  <Animated.View style={[skeletonStyles.chipSkeleton, { width: 48, opacity: shimmerAnim }]}/>
38
38
  <Animated.View style={[skeletonStyles.chipSkeleton, { width: 68, opacity: shimmerAnim }]}/>
@@ -40,9 +40,9 @@ export const SkeletonPlaceholder = React.memo(function SkeletonPlaceholder({ car
40
40
  <Animated.View style={[skeletonStyles.chipSkeleton, { width: 58, opacity: shimmerAnim }]}/>
41
41
  </View>
42
42
 
43
- {/* ─── List Cards Skeleton ─── */}
43
+
44
44
  {Array.from({ length: cardCount }).map((_, i) => (<Animated.View key={`skeleton_card_${i}`} style={[skeletonStyles.cardSkeleton, { opacity: shimmerAnim }]}>
45
- {/* Top row: Status pill + Method + Time */}
45
+
46
46
  <View style={skeletonStyles.cardTopRow}>
47
47
  <View style={skeletonStyles.badgeGroup}>
48
48
  <View style={skeletonStyles.statusBadgeSkeleton}/>
@@ -51,11 +51,11 @@ export const SkeletonPlaceholder = React.memo(function SkeletonPlaceholder({ car
51
51
  <View style={skeletonStyles.timeSkeleton}/>
52
52
  </View>
53
53
 
54
- {/* Middle row: URL lines */}
54
+
55
55
  <View style={skeletonStyles.urlLineLong}/>
56
56
  <View style={skeletonStyles.urlLineShort}/>
57
57
 
58
- {/* Bottom row: Latency & Size */}
58
+
59
59
  <View style={skeletonStyles.cardBottomRow}>
60
60
  <View style={skeletonStyles.metaPillSkeleton}/>
61
61
  <View style={skeletonStyles.metaPillSkeleton}/>
@@ -28,7 +28,6 @@ const StorageEntryCard = React.memo(function StorageEntryCard({ entry, isExpande
28
28
  ? `${entry.byteSize} B`
29
29
  : `${(entry.byteSize / 1024).toFixed(1)} KB`;
30
30
  }, [entry.byteSize]);
31
- // Lazy compute displayed value to avoid layout thrashing on large JSON strings
32
31
  const displayValue = useMemo(() => {
33
32
  if (!isExpanded) {
34
33
  if (entry.value.length > 250) {
@@ -48,7 +47,7 @@ const StorageEntryCard = React.memo(function StorageEntryCard({ entry, isExpande
48
47
  return entry.value;
49
48
  }, [isExpanded, entry.value, entry.type, entry.parsedValue]);
50
49
  return (<View style={styles.entryCard}>
51
- {/* Entry Header: Key name, Type Badge, Size, Actions */}
50
+
52
51
  <View style={styles.entryHeader}>
53
52
  <View style={{ flex: 1, marginRight: 8 }}>
54
53
  <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
@@ -67,7 +66,7 @@ const StorageEntryCard = React.memo(function StorageEntryCard({ entry, isExpande
67
66
  </View>
68
67
  </View>
69
68
 
70
- {/* Actions: Copy, Edit, Delete */}
69
+
71
70
  <View style={styles.entryActions}>
72
71
  <TouchableScale hitSlop={6} onPress={() => onCopy(entry)} style={styles.entryActionBtn}>
73
72
  <CopyIcon size={12} color={AppColors.grayText}/>
@@ -83,7 +82,7 @@ const StorageEntryCard = React.memo(function StorageEntryCard({ entry, isExpande
83
82
  </View>
84
83
  </View>
85
84
 
86
- {/* Entry Value Preview / Viewer */}
85
+
87
86
  <TouchableScale onPress={() => onToggleExpand(entry.key)} style={styles.valuePreviewBox}>
88
87
  <Text style={styles.valuePreviewText} numberOfLines={isExpanded ? undefined : 3} selectable={isExpanded}>
89
88
  {displayValue}
@@ -102,7 +101,6 @@ export const StorageTab = React.memo(() => {
102
101
  const [isLoading, setIsLoading] = useState(true);
103
102
  const [search, setSearch] = useState('');
104
103
  const [expandedKeys, setExpandedKeys] = useState({});
105
- // Modal State for Create / Edit
106
104
  const [modalVisible, setModalVisible] = useState(false);
107
105
  const [modalMode, setModalMode] = useState('create');
108
106
  const [editKeyName, setEditKeyName] = useState('');
@@ -110,7 +108,6 @@ export const StorageTab = React.memo(() => {
110
108
  const [editType, setEditType] = useState('string');
111
109
  const [jsonError, setJsonError] = useState(null);
112
110
  const mmkvInstanceIds = useMemo(() => getRegisteredMMKVInstanceIds(), []);
113
- // Fetch entries
114
111
  const loadEntries = useCallback(async () => {
115
112
  setIsLoading(true);
116
113
  try {
@@ -129,11 +126,9 @@ export const StorageTab = React.memo(() => {
129
126
  const unsubscribe = subscribeToStorageChanges(loadEntries);
130
127
  return unsubscribe;
131
128
  }, [loadEntries]);
132
- // Toggle JSON accordion
133
129
  const toggleExpand = (key) => {
134
130
  setExpandedKeys(prev => ({ ...prev, [key]: !prev[key] }));
135
131
  };
136
- // Open Create Modal
137
132
  const handleOpenCreate = () => {
138
133
  setModalMode('create');
139
134
  setEditKeyName('');
@@ -142,7 +137,6 @@ export const StorageTab = React.memo(() => {
142
137
  setJsonError(null);
143
138
  setModalVisible(true);
144
139
  };
145
- // Open Edit Modal
146
140
  const handleOpenEdit = (entry) => {
147
141
  setModalMode('edit');
148
142
  setEditKeyName(entry.key);
@@ -151,7 +145,6 @@ export const StorageTab = React.memo(() => {
151
145
  setJsonError(null);
152
146
  setModalVisible(true);
153
147
  };
154
- // Delete single key
155
148
  const handleDeleteKey = (key) => {
156
149
  Alert.alert('Delete Storage Key', `Are you sure you want to permanently delete "${key}" from ${activeDriver === 'asyncStorage' ? 'AsyncStorage' : 'MMKV'}?`, [
157
150
  { text: 'Cancel', style: 'cancel' },
@@ -171,7 +164,6 @@ export const StorageTab = React.memo(() => {
171
164
  },
172
165
  ]);
173
166
  };
174
- // Clear all keys
175
167
  const handleClearAll = () => {
176
168
  Alert.alert('Wipe All Storage Keys', `Are you sure you want to clear all ${entries.length} keys in ${activeDriver === 'asyncStorage' ? 'AsyncStorage' : 'MMKV'}? This cannot be undone.`, [
177
169
  { text: 'Cancel', style: 'cancel' },
@@ -188,7 +180,6 @@ export const StorageTab = React.memo(() => {
188
180
  },
189
181
  ]);
190
182
  };
191
- // Save Modal (Create / Update)
192
183
  const handleSaveModal = async () => {
193
184
  if (!editKeyName.trim()) {
194
185
  showToast('Key name cannot be empty');
@@ -197,7 +188,6 @@ export const StorageTab = React.memo(() => {
197
188
  let finalVal = editValue;
198
189
  if (editType === 'json') {
199
190
  try {
200
- // Validate JSON
201
191
  const parsed = JSON.parse(editValue);
202
192
  finalVal = JSON.stringify(parsed);
203
193
  }
@@ -222,7 +212,6 @@ export const StorageTab = React.memo(() => {
222
212
  showToast('Error saving storage key');
223
213
  }
224
214
  };
225
- // Format / Beautify JSON in modal
226
215
  const handleBeautifyJson = () => {
227
216
  try {
228
217
  const parsed = JSON.parse(editValue);
@@ -235,7 +224,6 @@ export const StorageTab = React.memo(() => {
235
224
  setJsonError('Cannot format: invalid JSON syntax');
236
225
  }
237
226
  };
238
- // Filter entries
239
227
  const filteredEntries = useMemo(() => {
240
228
  if (!search.trim())
241
229
  return entries;
@@ -261,7 +249,7 @@ export const StorageTab = React.memo(() => {
261
249
  ? isAsyncStorageConnected()
262
250
  : isMMKVConnected();
263
251
  return (<View style={styles.container}>
264
- {/* ── Driver Sub-Tabs ── */}
252
+
265
253
  <View style={styles.driverTabsWrapper}>
266
254
  <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.driverTabsContainer}>
267
255
  <TouchableScale onPress={() => setActiveDriver('asyncStorage')} style={[
@@ -300,7 +288,7 @@ export const StorageTab = React.memo(() => {
300
288
  </View>)}
301
289
  </TouchableScale>
302
290
 
303
- {/* MMKV Named Instance Dropdown/Pills */}
291
+
304
292
  {activeDriver === 'mmkv' && mmkvInstanceIds.length > 1 && (<View style={{ flexDirection: 'row', alignItems: 'center', gap: 4, marginLeft: 6 }}>
305
293
  {mmkvInstanceIds.map(id => (<TouchableScale key={id} onPress={() => setActiveMMKVId(id)} style={[
306
294
  styles.instancePill,
@@ -317,7 +305,7 @@ export const StorageTab = React.memo(() => {
317
305
  </ScrollView>
318
306
  </View>
319
307
 
320
- {/* ── Search & Actions Bar ── */}
308
+
321
309
  <View style={styles.actionBar}>
322
310
  <View style={styles.searchBar}>
323
311
  <SearchIcon size={14} color={AppColors.grayTextWeak}/>
@@ -343,7 +331,7 @@ export const StorageTab = React.memo(() => {
343
331
  </View>)}
344
332
  </View>
345
333
 
346
- {/* Action Buttons: Add Key & Refresh */}
334
+
347
335
  <TouchableScale onPress={handleOpenCreate} style={styles.addKeyBtn} hitSlop={6}>
348
336
  <PlusIcon size={13} color={AppColors.white}/>
349
337
  <Text style={styles.addKeyBtnText}>Add</Text>
@@ -358,7 +346,7 @@ export const StorageTab = React.memo(() => {
358
346
  </TouchableScale>)}
359
347
  </View>
360
348
 
361
- {/* ── Stats Strip ── */}
349
+
362
350
  <View style={styles.statsStrip}>
363
351
  <Text style={styles.statsText}>
364
352
  {filteredEntries.length} of {entries.length} Keys • {formattedTotalSize}
@@ -368,7 +356,7 @@ export const StorageTab = React.memo(() => {
368
356
  </Text>
369
357
  </View>
370
358
 
371
- {/* ── Storage Entries List ── */}
359
+
372
360
  {isLoading ? (<View style={styles.loadingContainer}>
373
361
  <ActivityIndicator size="small" color={AppColors.purple}/>
374
362
  <Text style={styles.loadingText}>Loading storage entries...</Text>
@@ -386,7 +374,7 @@ export const StorageTab = React.memo(() => {
386
374
  </Text>
387
375
  </View>} ListFooterComponent={<View style={{ height: 60 }}/>}/>)}
388
376
 
389
- {/* ── Create / Edit Key Modal ── */}
377
+
390
378
  <Modal visible={modalVisible} transparent animationType="fade" onRequestClose={() => setModalVisible(false)}>
391
379
  <View style={styles.modalOverlay}>
392
380
  <View style={styles.modalCard}>
@@ -399,7 +387,7 @@ export const StorageTab = React.memo(() => {
399
387
  </TouchableScale>
400
388
  </View>
401
389
 
402
- {/* Key Name Input */}
390
+
403
391
  <View style={styles.inputGroup}>
404
392
  <Text style={styles.inputLabel}>KEY NAME</Text>
405
393
  <TextInput value={editKeyName} onChangeText={setEditKeyName} placeholder="e.g. user_session, auth_token" placeholderTextColor={AppColors.grayTextWeak} editable={modalMode === 'create'} style={[
@@ -408,7 +396,7 @@ export const StorageTab = React.memo(() => {
408
396
  ]} autoCapitalize="none"/>
409
397
  </View>
410
398
 
411
- {/* Type Selector Strip */}
399
+
412
400
  <View style={styles.inputGroup}>
413
401
  <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 4 }}>
414
402
  <Text style={styles.inputLabel}>VALUE TYPE</Text>
@@ -437,7 +425,7 @@ export const StorageTab = React.memo(() => {
437
425
  </View>
438
426
  </View>
439
427
 
440
- {/* Value Input */}
428
+
441
429
  <View style={styles.inputGroup}>
442
430
  <Text style={styles.inputLabel}>VALUE CONTENT</Text>
443
431
  <TextInput value={editValue} onChangeText={v => {
@@ -454,7 +442,7 @@ export const StorageTab = React.memo(() => {
454
442
  {jsonError && (<Text style={styles.errorText}>⚠️ {jsonError}</Text>)}
455
443
  </View>
456
444
 
457
- {/* Modal Actions */}
445
+
458
446
  <View style={styles.modalActions}>
459
447
  <TouchableScale onPress={() => setModalVisible(false)} style={styles.cancelBtn}>
460
448
  <Text style={styles.cancelBtnText}>Cancel</Text>
@@ -6,7 +6,6 @@ import { NpmIcon } from '../NetworkIcons';
6
6
  import { LIB_VERSION } from '../../constants';
7
7
  import { copyToClipboard } from '../../helpers';
8
8
  import { showToast } from '../../helpers/toast';
9
- // ─── Crisp SVG Icons ─────────────────────────────────────────────────────────
10
9
  const CopySvg = ({ size = 14, color = '#64748B' }) => (<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
11
10
  <Path d="M8 4v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2h-8a2 2 0 0 0-2 2z" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
12
11
  <Path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
@@ -90,12 +89,12 @@ export const UpdateAvailableModal = ({ visible, latestVersion, onClose, }) => {
90
89
  transform: [{ scale: scaleAnim }],
91
90
  },
92
91
  ]}>
93
- {/* Top-Right Dismiss Button */}
92
+
94
93
  <TouchableOpacity style={styles.topCloseButton} onPress={handleClose} hitSlop={10} activeOpacity={0.7}>
95
94
  <CloseSvg size={13} color="#64748B"/>
96
95
  </TouchableOpacity>
97
96
 
98
- {/* Header section with brand square icon & sparkle */}
97
+
99
98
  <View style={styles.headerSection}>
100
99
  <View style={styles.iconHaloRing}>
101
100
  <BrandSquareIcon size={52}/>
@@ -110,7 +109,7 @@ export const UpdateAvailableModal = ({ visible, latestVersion, onClose, }) => {
110
109
  </Text>
111
110
  </View>
112
111
 
113
- {/* Version Comparison Card */}
112
+
114
113
  <View style={styles.versionComparisonCard}>
115
114
  <View style={styles.versionColumn}>
116
115
  <Text style={styles.versionLabel}>INSTALLED</Text>
@@ -132,7 +131,7 @@ export const UpdateAvailableModal = ({ visible, latestVersion, onClose, }) => {
132
131
  </View>
133
132
  </View>
134
133
 
135
- {/* Quick Install Snippet Box */}
134
+
136
135
  <View style={styles.codeSnippetBox}>
137
136
  <View style={styles.codeSnippetHeader}>
138
137
  <Text style={styles.codeSnippetLabel}>UPGRADE COMMAND</Text>
@@ -152,7 +151,7 @@ export const UpdateAvailableModal = ({ visible, latestVersion, onClose, }) => {
152
151
  </TouchableOpacity>
153
152
  </View>
154
153
 
155
- {/* Action Buttons */}
154
+
156
155
  <View style={styles.buttonRow}>
157
156
  <TouchableOpacity style={styles.secondaryButton} onPress={handleClose} activeOpacity={0.7}>
158
157
  <Text style={styles.secondaryButtonText}>Later</Text>