react-native-inapp-inspector 2.3.4 → 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 (229) 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 +168 -9
  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.d.ts +0 -1
  93. package/dist/commonjs/index.js +18 -102
  94. package/dist/commonjs/native/NativeInspector.d.ts +0 -54
  95. package/dist/commonjs/native/NativeInspector.js +0 -56
  96. package/dist/commonjs/network.d.ts +0 -4
  97. package/dist/commonjs/network.js +0 -4
  98. package/dist/commonjs/performance.d.ts +0 -4
  99. package/dist/commonjs/performance.js +0 -4
  100. package/dist/commonjs/redux.d.ts +0 -4
  101. package/dist/commonjs/redux.js +0 -4
  102. package/dist/commonjs/storage.d.ts +0 -4
  103. package/dist/commonjs/storage.js +0 -4
  104. package/dist/commonjs/styles/AppColors.d.ts +0 -3
  105. package/dist/commonjs/styles/AppColors.js +15 -30
  106. package/dist/commonjs/styles/AppFonts.d.ts +0 -4
  107. package/dist/commonjs/styles/AppFonts.js +0 -4
  108. package/dist/commonjs/styles/common.js +0 -11
  109. package/dist/commonjs/styles/index.js +0 -8
  110. package/dist/commonjs/types/enums.js +0 -3
  111. package/dist/commonjs/types/interfaces.d.ts +3 -3
  112. package/dist/esm/analytics.d.ts +0 -4
  113. package/dist/esm/analytics.js +0 -4
  114. package/dist/esm/bundle.d.ts +0 -4
  115. package/dist/esm/bundle.js +0 -4
  116. package/dist/esm/components/AnalyticsDetail.js +18 -27
  117. package/dist/esm/components/AnalyticsEventCard.js +9 -12
  118. package/dist/esm/components/AnalyticsGraph.js +10 -15
  119. package/dist/esm/components/AppHeaderLogo.js +0 -3
  120. package/dist/esm/components/BrandCircleIcon.js +15 -15
  121. package/dist/esm/components/BrandSquareIcon.js +20 -20
  122. package/dist/esm/components/CodeSnippet.js +6 -19
  123. package/dist/esm/components/ConsoleLogCard.js +0 -1
  124. package/dist/esm/components/CopyButton.js +0 -4
  125. package/dist/esm/components/DiffViewer.js +0 -2
  126. package/dist/esm/components/DomainHeader.js +0 -4
  127. package/dist/esm/components/EmptyState.js +0 -3
  128. package/dist/esm/components/ErrorBoundary.js +5 -10
  129. package/dist/esm/components/HeadersSection.js +0 -5
  130. package/dist/esm/components/HighlightText.js +1 -4
  131. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +11 -26
  132. package/dist/esm/components/Inspector/AnalyticsTab.js +34 -40
  133. package/dist/esm/components/Inspector/BundleTab.js +56 -84
  134. package/dist/esm/components/Inspector/ConsoleTab.js +7 -7
  135. package/dist/esm/components/Inspector/CrashDetail.js +18 -20
  136. package/dist/esm/components/Inspector/CrashFilterModal.js +0 -1
  137. package/dist/esm/components/Inspector/CrashTab.js +11 -20
  138. package/dist/esm/components/Inspector/DeviceInfoTab.js +12 -24
  139. package/dist/esm/components/Inspector/FabLauncher.js +1 -1
  140. package/dist/esm/components/Inspector/InspectorContext.js +0 -2
  141. package/dist/esm/components/Inspector/InspectorHeader.js +7 -8
  142. package/dist/esm/components/Inspector/LogDetail.js +27 -29
  143. package/dist/esm/components/Inspector/MainScreen.js +168 -9
  144. package/dist/esm/components/Inspector/NetworkDetail.js +10 -11
  145. package/dist/esm/components/Inspector/NetworkTab.js +14 -14
  146. package/dist/esm/components/Inspector/NpmUpdateToast.js +6 -9
  147. package/dist/esm/components/Inspector/PerformanceTab.js +30 -43
  148. package/dist/esm/components/Inspector/ReduxDetail.js +18 -34
  149. package/dist/esm/components/Inspector/ReduxTab.js +11 -20
  150. package/dist/esm/components/Inspector/SettingsPanel.js +32 -36
  151. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +6 -6
  152. package/dist/esm/components/Inspector/StorageTab.js +14 -26
  153. package/dist/esm/components/Inspector/UpdateAvailableModal.js +5 -6
  154. package/dist/esm/components/JsonViewer.js +3 -10
  155. package/dist/esm/components/LogCard.js +7 -7
  156. package/dist/esm/components/MetaAccordion.js +1 -7
  157. package/dist/esm/components/NetworkIcons.js +12 -16
  158. package/dist/esm/components/SectionHeader.js +0 -4
  159. package/dist/esm/components/SkeletonPlaceholder.js +6 -6
  160. package/dist/esm/components/Slider.js +6 -6
  161. package/dist/esm/components/SourcePageCard.js +0 -4
  162. package/dist/esm/components/TreeNode.js +0 -4
  163. package/dist/esm/console.d.ts +0 -4
  164. package/dist/esm/console.js +0 -4
  165. package/dist/esm/constants/index.js +6 -9
  166. package/dist/esm/constants/telemetryConfig.d.ts +7 -0
  167. package/dist/esm/constants/telemetryConfig.js +7 -0
  168. package/dist/esm/constants/version.d.ts +1 -1
  169. package/dist/esm/constants/version.js +1 -3
  170. package/dist/esm/crash.d.ts +0 -4
  171. package/dist/esm/crash.js +0 -4
  172. package/dist/esm/customHooks/analyticsLogger.d.ts +0 -7
  173. package/dist/esm/customHooks/analyticsLogger.js +3 -59
  174. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -9
  175. package/dist/esm/customHooks/bundleAnalyzer.js +3 -86
  176. package/dist/esm/customHooks/consoleLogger.js +0 -16
  177. package/dist/esm/customHooks/crashHandler.d.ts +0 -28
  178. package/dist/esm/customHooks/crashHandler.js +0 -55
  179. package/dist/esm/customHooks/logFilters.d.ts +0 -4
  180. package/dist/esm/customHooks/logFilters.js +0 -11
  181. package/dist/esm/customHooks/networkLogger.js +2 -13
  182. package/dist/esm/customHooks/performanceTracker.d.ts +0 -27
  183. package/dist/esm/customHooks/performanceTracker.js +0 -31
  184. package/dist/esm/customHooks/reduxLogger.d.ts +0 -12
  185. package/dist/esm/customHooks/reduxLogger.js +0 -51
  186. package/dist/esm/customHooks/storageInspector.d.ts +0 -40
  187. package/dist/esm/customHooks/storageInspector.js +1 -56
  188. package/dist/esm/decorators/index.d.ts +0 -37
  189. package/dist/esm/decorators/index.js +0 -42
  190. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +0 -10
  191. package/dist/esm/helpers/gaAnalyticsRegistry.js +0 -26
  192. package/dist/esm/helpers/index.d.ts +0 -7
  193. package/dist/esm/helpers/index.js +1 -42
  194. package/dist/esm/helpers/memoryManager.d.ts +0 -11
  195. package/dist/esm/helpers/memoryManager.js +0 -13
  196. package/dist/esm/helpers/searchQueryParser.d.ts +0 -4
  197. package/dist/esm/helpers/searchQueryParser.js +0 -18
  198. package/dist/esm/helpers/settingsStore.js +0 -8
  199. package/dist/esm/helpers/telemetry.d.ts +2 -0
  200. package/dist/esm/helpers/telemetry.js +298 -0
  201. package/dist/esm/i18n/index.d.ts +0 -9
  202. package/dist/esm/i18n/index.js +0 -15
  203. package/dist/esm/index.d.ts +0 -1
  204. package/dist/esm/index.js +15 -98
  205. package/dist/esm/native/NativeInspector.d.ts +0 -54
  206. package/dist/esm/native/NativeInspector.js +0 -56
  207. package/dist/esm/network.d.ts +0 -4
  208. package/dist/esm/network.js +0 -4
  209. package/dist/esm/performance.d.ts +0 -4
  210. package/dist/esm/performance.js +0 -4
  211. package/dist/esm/redux.d.ts +0 -4
  212. package/dist/esm/redux.js +0 -4
  213. package/dist/esm/storage.d.ts +0 -4
  214. package/dist/esm/storage.js +0 -4
  215. package/dist/esm/styles/AppColors.d.ts +0 -3
  216. package/dist/esm/styles/AppColors.js +15 -30
  217. package/dist/esm/styles/AppFonts.d.ts +0 -4
  218. package/dist/esm/styles/AppFonts.js +0 -4
  219. package/dist/esm/styles/common.js +0 -11
  220. package/dist/esm/styles/index.js +0 -8
  221. package/dist/esm/types/enums.js +0 -3
  222. package/dist/esm/types/interfaces.d.ts +3 -3
  223. package/package.json +2 -2
  224. package/src/components/Inspector/MainScreen.tsx +188 -2
  225. package/src/constants/telemetryConfig.ts +16 -0
  226. package/src/constants/version.ts +1 -1
  227. package/src/helpers/telemetry.ts +341 -0
  228. package/src/index.tsx +15 -2
  229. package/src/types/interfaces.ts +3 -0
@@ -60,9 +60,7 @@ const getOriginBadge = (originType) => {
60
60
  const ReduxTab = React.memo(() => {
61
61
  const { t } = useTranslation();
62
62
  const { reduxState, reduxLastActionMap, reduxSearch, setReduxSearch, setSelectedReduxSlice, } = useInspector();
63
- // Sort mode: 'latest' (newest updated first) vs 'alpha' (A-Z)
64
63
  const [sortMode, setSortMode] = useState('latest');
65
- // Pause / Live Auto-Refresh State
66
64
  const [isReduxPaused, setIsReduxPaused] = useState(!getReduxAutoRefresh());
67
65
  const handleTogglePause = useCallback(() => {
68
66
  setIsReduxPaused(prev => {
@@ -71,15 +69,12 @@ const ReduxTab = React.memo(() => {
71
69
  return next;
72
70
  });
73
71
  }, []);
74
- // Total state size calculation
75
72
  const totalStateSize = useMemo(() => {
76
73
  return getSize(reduxState);
77
74
  }, [reduxState]);
78
- // Fetch full action history for timeline counts
79
75
  const allActions = useMemo(() => {
80
76
  return getActionHistory();
81
77
  }, [reduxLastActionMap]);
82
- // Compute slice items with exact timestamps & rich details
83
78
  const sliceItems = useMemo(() => {
84
79
  if (!reduxState || typeof reduxState !== 'object')
85
80
  return [];
@@ -102,7 +97,6 @@ const ReduxTab = React.memo(() => {
102
97
  keysCount = 1;
103
98
  typeLabel = typeof sliceVal;
104
99
  }
105
- // Determine state status
106
100
  let status = 'live';
107
101
  let statusMessage;
108
102
  if (isObject) {
@@ -127,7 +121,6 @@ const ReduxTab = React.memo(() => {
127
121
  }
128
122
  const lastActionRaw = reduxLastActionMap[key];
129
123
  const updatedAt = lastActionRaw?.updatedAt || 0;
130
- // Count actions affecting this slice in timeline
131
124
  const timelineCount = allActions.filter(action => {
132
125
  if (!action.affectedSlices || action.affectedSlices.length === 0)
133
126
  return true;
@@ -173,7 +166,6 @@ const ReduxTab = React.memo(() => {
173
166
  };
174
167
  });
175
168
  }, [reduxState, reduxLastActionMap, allActions]);
176
- // Filter & Sort slices: by default, the most recently updated item is at the FIRST position
177
169
  const filteredSlices = useMemo(() => {
178
170
  let list = sliceItems;
179
171
  if (reduxSearch && reduxSearch.trim().length > 0) {
@@ -194,7 +186,6 @@ const ReduxTab = React.memo(() => {
194
186
  }
195
187
  return [...list].sort((a, b) => {
196
188
  if (sortMode === 'latest') {
197
- // Most recently updated item first
198
189
  if (b.updatedAt !== a.updatedAt) {
199
190
  return b.updatedAt - a.updatedAt;
200
191
  }
@@ -220,7 +211,7 @@ const ReduxTab = React.memo(() => {
220
211
  reduxTabStyles.card,
221
212
  isRecentlyUpdated && reduxTabStyles.cardRecentlyUpdated,
222
213
  ]}>
223
- {/* Top row: Badge + Slice Name + Status + Timestamp + Chevron */}
214
+
224
215
  <View style={reduxTabStyles.cardHeader}>
225
216
  <View style={reduxTabStyles.sliceBadge}>
226
217
  <Text style={reduxTabStyles.sliceBadgeText}>SLICE</Text>
@@ -228,7 +219,7 @@ const ReduxTab = React.memo(() => {
228
219
 
229
220
  <HighlightText text={item.name} search={reduxSearch} style={reduxTabStyles.sliceName} highlightStyle={reduxTabStyles.highlight}/>
230
221
 
231
- {/* Status Badge */}
222
+
232
223
  {item.status === 'loading' ? (<View style={reduxTabStyles.loadingPill}>
233
224
  <LoadingSpinnerIcon color={AppColors.amber800Warm} size={10}/>
234
225
  <Text style={reduxTabStyles.loadingPillText}>Loading</Text>
@@ -252,7 +243,7 @@ const ReduxTab = React.memo(() => {
252
243
  <ForwardChevronIcon color={AppColors.grayTextWeak} size={13}/>
253
244
  </View>
254
245
 
255
- {/* Middle row: Stats pills */}
246
+
256
247
  <View style={reduxTabStyles.statsRow}>
257
248
  <View style={reduxTabStyles.pill}>
258
249
  <LayersIcon color={AppColors.grayTextWeak} size={11}/>
@@ -268,13 +259,13 @@ const ReduxTab = React.memo(() => {
268
259
  </View>)}
269
260
  </View>
270
261
 
271
- {/* Bottom row: Last Dispatched Action with Origin & Trigger Line */}
262
+
272
263
  {item.lastAction && (<View style={reduxTabStyles.lastActionRow}>
273
264
  <View style={{ flexDirection: 'row', alignItems: 'center', gap: 5, flex: 1, minWidth: 0, flexWrap: 'wrap' }}>
274
265
  <BoltIcon color={AppColors.brandPurple} size={12}/>
275
266
  <Text style={reduxTabStyles.lastActionLabel}>{t('redux.last', 'Last')}:</Text>
276
267
 
277
- {/* Origin Badge */}
268
+
278
269
  {item.lastAction.originType && (() => {
279
270
  const origin = getOriginBadge(item.lastAction.originType);
280
271
  return (<View style={{
@@ -302,7 +293,7 @@ const ReduxTab = React.memo(() => {
302
293
 
303
294
  <HighlightText text={item.lastAction.type} search={reduxSearch} style={reduxTabStyles.lastActionValue} highlightStyle={reduxTabStyles.highlight} numberOfLines={1}/>
304
295
 
305
- {/* Triggered from file preview */}
296
+
306
297
  {item.lastAction.callerFile && (<Pressable onPress={() => openInVSCode(item.lastAction.callerFile, item.lastAction.callerLine, item.lastAction.callerCol)} hitSlop={6} style={{
307
298
  flexDirection: 'row',
308
299
  alignItems: 'center',
@@ -344,7 +335,7 @@ const ReduxTab = React.memo(() => {
344
335
  </View>);
345
336
  }
346
337
  return (<View style={{ flex: 1, backgroundColor: AppColors.grayBackground }}>
347
- {/* ─── Top Stats Overview Card ─── */}
338
+
348
339
  <View style={reduxTabStyles.overviewCard}>
349
340
  <View style={reduxTabStyles.statCol}>
350
341
  <Text style={reduxTabStyles.statHeading}>ACTIVE SLICES</Text>
@@ -390,7 +381,7 @@ const ReduxTab = React.memo(() => {
390
381
  </View>
391
382
  </View>
392
383
 
393
- {/* ─── Search & Sort Bar ─── */}
384
+
394
385
  <View style={reduxTabStyles.toolbarContainer}>
395
386
  <View style={reduxTabStyles.searchRow}>
396
387
  <View style={styles.searchContainer}>
@@ -417,7 +408,7 @@ const ReduxTab = React.memo(() => {
417
408
  </View>)}
418
409
  </View>
419
410
 
420
- {/* Pause / Resume Live Updates Button */}
411
+
421
412
  <TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={isReduxPaused
422
413
  ? 'Resume live Redux updates'
423
414
  : 'Pause live Redux updates'} accessibilityHint="Toggles automatic recording of Redux state updates" style={[
@@ -432,7 +423,7 @@ const ReduxTab = React.memo(() => {
432
423
  : AppColors.grayTextStrong} size={16}/>
433
424
  </TouchableOpacity>
434
425
 
435
- {/* Sort Button */}
426
+
436
427
  <TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={`Sort order: ${sortMode === 'latest'
437
428
  ? 'Recently updated first'
438
429
  : 'Alphabetical A to Z'}`} accessibilityHint="Switches sorting between recently updated and alphabetical" style={[
@@ -461,7 +452,7 @@ const ReduxTab = React.memo(() => {
461
452
  </View>
462
453
  </View>
463
454
 
464
- {/* ─── FlatList of Slices ─── */}
455
+
465
456
  <FlatList data={filteredSlices} keyExtractor={item => item.id} renderItem={renderSliceItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<EmptyState isSearch={reduxSearch.length > 0}/>} ListFooterComponent={filteredSlices.length > 0 ? (<EndOfListFooter count={filteredSlices.length} label="slices"/>) : null} contentContainerStyle={[
466
457
  reduxTabStyles.listContent,
467
458
  filteredSlices.length === 0 && { flexGrow: 1 },
@@ -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}/>