react-native-inapp-inspector 2.3.5 → 2.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +3 -0
  56. package/dist/commonjs/constants/telemetryConfig.js +6 -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 +136 -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 +3 -0
  166. package/dist/esm/constants/telemetryConfig.js +3 -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 +132 -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 +6 -0
  223. package/src/constants/version.ts +1 -1
  224. package/src/helpers/telemetry.ts +161 -0
  225. package/src/index.tsx +15 -1
  226. package/src/types/interfaces.ts +3 -0
@@ -31,8 +31,6 @@ const CrashDetail = React.memo(() => {
31
31
  }
32
32
  return [];
33
33
  }, [selectedCrash]);
34
- // Strip keys holding explicit undefined values (e.g. componentStack) so the
35
- // Raw JSON tab never renders a literal "undefined".
36
34
  const rawCrashData = useMemo(() => {
37
35
  try {
38
36
  return JSON.parse(JSON.stringify(selectedCrash));
@@ -88,12 +86,12 @@ const CrashDetail = React.memo(() => {
88
86
  },
89
87
  ];
90
88
  return (<View style={{ flex: 1, backgroundColor: AppColors.grayBackground }}>
91
- {/* ─── Top Info Bar (Similar to NetworkDetail / LogDetail) ─── */}
89
+
92
90
  <View style={{ paddingHorizontal: 8, paddingTop: 6 }}>
93
91
  <View style={localStyles.infoBar}>
94
- {/* Top Status Badges Row */}
92
+
95
93
  <View style={localStyles.badgeRow}>
96
- {/* Fatal / Non-fatal Pill */}
94
+
97
95
  <View style={[
98
96
  localStyles.pillBadge,
99
97
  {
@@ -125,7 +123,7 @@ const CrashDetail = React.memo(() => {
125
123
  </Text>
126
124
  </View>
127
125
 
128
- {/* Type Pill */}
126
+
129
127
  <View style={[
130
128
  localStyles.pillBadge,
131
129
  {
@@ -140,7 +138,7 @@ const CrashDetail = React.memo(() => {
140
138
 
141
139
  <View style={{ flex: 1 }}/>
142
140
 
143
- {/* Copy Report Action */}
141
+
144
142
  <TouchableScale onPress={handleCopyReport} hitSlop={10} style={[
145
143
  localStyles.actionButton,
146
144
  copiedSuccess && { backgroundColor: AppColors.mintGreenBg, borderColor: AppColors.mintGreenBorder },
@@ -155,12 +153,12 @@ const CrashDetail = React.memo(() => {
155
153
  </TouchableScale>
156
154
  </View>
157
155
 
158
- {/* Crash Title / Message */}
156
+
159
157
  <Text style={localStyles.titleText}>
160
158
  {selectedCrash.message}
161
159
  </Text>
162
160
 
163
- {/* Metadata Row */}
161
+
164
162
  <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.metaRow}>
165
163
  {originFrame && (<View style={localStyles.metaChip}>
166
164
  <TerminalIcon color={AppColors.grayText} size={11}/>
@@ -186,12 +184,12 @@ const CrashDetail = React.memo(() => {
186
184
  </View>
187
185
  </View>
188
186
 
189
- {/* ─── Segmented Sub Tabs ─── */}
187
+
190
188
  <View style={{ paddingHorizontal: 8, paddingTop: 6, paddingBottom: 4 }}>
191
189
  <SegmentedTabs tabs={tabsConfig} activeKey={activeSubTab} onChange={tab => setActiveSubTab(tab)}/>
192
190
  </View>
193
191
 
194
- {/* ─── Search Bar (for Stack & Raw tabs) ─── */}
192
+
195
193
  {(activeSubTab === 'stack' || activeSubTab === 'raw') && (<View style={{ paddingHorizontal: 12, paddingBottom: 6 }}>
196
194
  <View style={localStyles.searchContainer}>
197
195
  <SearchIcon color={AppColors.grayText} size={14}/>
@@ -202,11 +200,11 @@ const CrashDetail = React.memo(() => {
202
200
  </View>
203
201
  </View>)}
204
202
 
205
- {/* ─── Tab Content ScrollView ─── */}
203
+
206
204
  <ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 12, paddingBottom: 40, gap: 12 }}>
207
- {/* 1. STACK TRACE TAB */}
205
+
208
206
  {activeSubTab === 'stack' && (<View style={{ gap: 10 }}>
209
- {/* Filter Chips (App Code vs All Frames) */}
207
+
210
208
  <View style={localStyles.filterChipsRow}>
211
209
  <TouchableScale onPress={() => setStackFilter('app')} style={[
212
210
  localStyles.filterChip,
@@ -239,7 +237,7 @@ const CrashDetail = React.memo(() => {
239
237
  </TouchableScale>
240
238
  </View>
241
239
 
242
- {/* Frames List */}
240
+
243
241
  {displayedFrames.length > 0 ? (displayedFrames
244
242
  .filter(frame => {
245
243
  if (!searchQuery.trim())
@@ -325,9 +323,9 @@ const CrashDetail = React.memo(() => {
325
323
  </View>)}
326
324
  </View>)}
327
325
 
328
- {/* 2. DIAGNOSTICS TAB */}
326
+
329
327
  {activeSubTab === 'diagnostics' && (<View style={{ gap: 12 }}>
330
- {/* Device & OS Diagnostics Card */}
328
+
331
329
  <View style={localStyles.sectionCard}>
332
330
  <View style={[
333
331
  localStyles.sectionCardHeader,
@@ -390,7 +388,7 @@ const CrashDetail = React.memo(() => {
390
388
  </View>
391
389
  </View>
392
390
 
393
- {/* Memory Metrics Card */}
391
+
394
392
  {selectedCrash.memoryInfo && (<View style={localStyles.sectionCard}>
395
393
  <View style={[
396
394
  localStyles.sectionCardHeader,
@@ -423,7 +421,7 @@ const CrashDetail = React.memo(() => {
423
421
  </View>)}
424
422
  </View>)}
425
423
 
426
- {/* 3. BREADCRUMBS TAB */}
424
+
427
425
  {activeSubTab === 'breadcrumbs' && (<View style={{ gap: 10 }}>
428
426
  {selectedCrash.breadcrumbs && selectedCrash.breadcrumbs.length > 0 && (<View style={{
429
427
  flexDirection: 'row',
@@ -461,7 +459,7 @@ const CrashDetail = React.memo(() => {
461
459
  </View>)}
462
460
  </View>)}
463
461
 
464
- {/* 4. RAW JSON TAB */}
462
+
465
463
  {activeSubTab === 'raw' && (<View style={localStyles.rawContainer}>
466
464
  <JsonViewer data={rawCrashData} search={searchQuery} wrap/>
467
465
  </View>)}
@@ -32,7 +32,6 @@ const CrashFilterModal = ({ visible, onClose, filters, onApply, searchQuery = ''
32
32
  types: new Set(filters.types),
33
33
  });
34
34
  }
35
- // eslint-disable-next-line react-hooks/exhaustive-deps
36
35
  }, [visible]);
37
36
  const toggleType = (key) => {
38
37
  setDraft(prev => {
@@ -34,7 +34,6 @@ const CrashTab = React.memo(() => {
34
34
  const [crashFilters, setCrashFilters] = useState(DEFAULT_CRASH_FILTERS);
35
35
  const [isFilterModalOpen, setIsFilterModalOpen] = useState(false);
36
36
  const [detailSubTab, setDetailSubTab] = useState('stack');
37
- // Calculate statistics
38
37
  const stats = useMemo(() => {
39
38
  const total = crashRecords.length;
40
39
  let fatalCount = 0;
@@ -56,10 +55,8 @@ const CrashTab = React.memo(() => {
56
55
  });
57
56
  return { total, fatalCount, jsCount, promiseCount, renderCount, nativeCount };
58
57
  }, [crashRecords]);
59
- // Filtered crash list
60
58
  const filteredList = useMemo(() => {
61
59
  let list = crashRecords.filter(item => {
62
- // Type filter
63
60
  if (filterType === 'fatal' && !item.isFatal)
64
61
  return false;
65
62
  if (filterType === 'js' && item.type !== 'js')
@@ -70,7 +67,6 @@ const CrashTab = React.memo(() => {
70
67
  return false;
71
68
  if (filterType === 'native' && item.type !== 'native')
72
69
  return false;
73
- // Modal filters: crash types
74
70
  if (crashFilters.types.size > 0 && !crashFilters.types.has('all')) {
75
71
  const matches = (crashFilters.types.has('fatal') && item.isFatal) ||
76
72
  (crashFilters.types.has('js') && item.type === 'js') ||
@@ -80,7 +76,6 @@ const CrashTab = React.memo(() => {
80
76
  if (!matches)
81
77
  return false;
82
78
  }
83
- // Modal filters: time window
84
79
  if (crashFilters.timeWindow !== 'all') {
85
80
  const now = Date.now();
86
81
  const cutoff = crashFilters.timeWindow === '15m'
@@ -93,13 +88,11 @@ const CrashTab = React.memo(() => {
93
88
  if (item.timestamp < cutoff)
94
89
  return false;
95
90
  }
96
- // Modal filters: platform
97
91
  if (crashFilters.platform !== 'all') {
98
92
  const platform = (item.deviceInfo?.platform || '').toLowerCase();
99
93
  if (platform !== crashFilters.platform)
100
94
  return false;
101
95
  }
102
- // Modal filters: engine
103
96
  if (crashFilters.engine !== 'all') {
104
97
  const isHermes = item.deviceInfo?.isHermes;
105
98
  if (crashFilters.engine === 'hermes' && isHermes !== true)
@@ -107,7 +100,6 @@ const CrashTab = React.memo(() => {
107
100
  if (crashFilters.engine === 'jsc' && (isHermes === true))
108
101
  return false;
109
102
  }
110
- // Search filter
111
103
  if (searchQuery.trim().length > 0) {
112
104
  const queryTokens = searchQuery.trim().toLowerCase().split(/\s+/).filter(Boolean);
113
105
  const searchTarget = [
@@ -122,7 +114,6 @@ const CrashTab = React.memo(() => {
122
114
  }
123
115
  return true;
124
116
  });
125
- // Modal filters: sort order
126
117
  if (crashFilters.sortBy === 'time_asc') {
127
118
  list = [...list].sort((a, b) => a.timestamp - b.timestamp);
128
119
  }
@@ -163,7 +154,7 @@ const CrashTab = React.memo(() => {
163
154
  localStyles.cardContainer,
164
155
  isFatal && localStyles.fatalCardBorder,
165
156
  ]}>
166
- {/* Header: #S.No, Badges & Timestamp */}
157
+
167
158
  <View style={localStyles.cardHeader}>
168
159
  <View style={localStyles.badgeRow}>
169
160
  <View style={localStyles.sNoBadge}>
@@ -201,12 +192,12 @@ const CrashTab = React.memo(() => {
201
192
  </View>
202
193
  </View>
203
194
 
204
- {/* Error Message */}
195
+
205
196
  <View style={{ marginVertical: 6 }}>
206
197
  <HighlightText text={item.message || t('crash.unknownException')} highlight={searchQuery} numberOfLines={3} style={localStyles.errorMessageText}/>
207
198
  </View>
208
199
 
209
- {/* Top stack frame location if available */}
200
+
210
201
  {topFrame && (<View style={localStyles.locationRow}>
211
202
  <TerminalIcon size={12} color={AppColors.grayTextWeak}/>
212
203
  <Text numberOfLines={1} ellipsizeMode="middle" style={localStyles.locationText}>
@@ -217,7 +208,7 @@ const CrashTab = React.memo(() => {
217
208
  </Text>
218
209
  </View>)}
219
210
 
220
- {/* Footer row: Actions */}
211
+
221
212
  <View style={localStyles.cardFooter}>
222
213
  <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
223
214
  {item.deviceInfo && (<View style={localStyles.metaPill}>
@@ -256,7 +247,7 @@ const CrashTab = React.memo(() => {
256
247
  }, [searchQuery, setSelectedCrash]);
257
248
  return (<View style={localStyles.container}>
258
249
  {crashRecords.length > 0 && (<>
259
- {/* ─── Top Stats Bar ─── */}
250
+
260
251
  <View style={localStyles.statsBar}>
261
252
  <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.statsScrollContent}>
262
253
  <View style={[localStyles.statChip, localStyles.statChipActive]}>
@@ -301,7 +292,7 @@ const CrashTab = React.memo(() => {
301
292
  </ScrollView>
302
293
  </View>
303
294
 
304
- {/* ─── Search & Controls ─── */}
295
+
305
296
  <View style={localStyles.controlsContainer}>
306
297
  <View style={localStyles.searchRow}>
307
298
  <View style={localStyles.searchInputWrapper}>
@@ -328,7 +319,7 @@ const CrashTab = React.memo(() => {
328
319
  </View>)}
329
320
  </View>
330
321
 
331
- {/* Crash Filters */}
322
+
332
323
  <TouchableScale onPress={() => setIsFilterModalOpen(true)} style={[
333
324
  localStyles.filterButton,
334
325
  !isCrashFiltersDefault(crashFilters) && {
@@ -352,13 +343,13 @@ const CrashTab = React.memo(() => {
352
343
  }}/>)}
353
344
  </TouchableScale>
354
345
 
355
- {/* Clear Crashes */}
346
+
356
347
  <TouchableScale onPress={handleClearAll} style={localStyles.clearButton}>
357
348
  <TrashIcon size={14} color={AppColors.errorColor}/>
358
349
  </TouchableScale>
359
350
  </View>
360
351
 
361
- {/* ─── Filter Chips ─── */}
352
+
362
353
  <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={localStyles.filterScrollContent}>
363
354
  {[
364
355
  { key: 'all', label: t('crash.filterAll'), Icon: LayersIcon },
@@ -386,7 +377,7 @@ const CrashTab = React.memo(() => {
386
377
  </View>
387
378
  </>)}
388
379
 
389
- {/* ─── Crash List or Empty State ─── */}
380
+
390
381
  {filteredList.length === 0 ? (<ScrollView contentContainerStyle={localStyles.emptyContainer} showsVerticalScrollIndicator={false}>
391
382
  <View style={localStyles.emptyIconCircle}>
392
383
  <ShieldAlertIcon size={38} color={AppColors.greenColor}/>
@@ -414,7 +405,7 @@ const CrashTab = React.memo(() => {
414
405
  </TouchableScale>)}
415
406
  </ScrollView>) : (<FlatList data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter />}/>)}
416
407
 
417
- {/* Filter Modal */}
408
+
418
409
  <CrashFilterModal visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)} filters={crashFilters} onApply={setCrashFilters} searchQuery={searchQuery}/>
419
410
  </View>);
420
411
  });
@@ -70,7 +70,6 @@ export const DeviceInfoTab = React.memo(() => {
70
70
  const [ipAddress, setIpAddress] = useState('Detecting...');
71
71
  const [deviceUptime, setDeviceUptime] = useState('0s');
72
72
  const startTimeRef = React.useRef(Date.now());
73
- // Load hardware metrics and IP
74
73
  const fetchMetrics = useCallback(async () => {
75
74
  try {
76
75
  const [devMetrics, sysMetrics] = await Promise.all([
@@ -81,7 +80,6 @@ export const DeviceInfoTab = React.memo(() => {
81
80
  setSystemMetrics(sysMetrics);
82
81
  }
83
82
  catch {
84
- // Fallback
85
83
  }
86
84
  finally {
87
85
  setIsLoading(false);
@@ -92,11 +90,9 @@ export const DeviceInfoTab = React.memo(() => {
92
90
  const interval = setInterval(fetchMetrics, 3000);
93
91
  return () => clearInterval(interval);
94
92
  }, [fetchMetrics]);
95
- // Probe local IP address
96
93
  useEffect(() => {
97
94
  let isMounted = true;
98
95
  const probeIp = async () => {
99
- // 1. Try NativeModules or PlatformConstants
100
96
  try {
101
97
  const serverHost = NativeModules?.PlatformConstants?.serverHost ||
102
98
  NativeModules?.AndroidConstants?.serverHost ||
@@ -111,7 +107,6 @@ export const DeviceInfoTab = React.memo(() => {
111
107
  }
112
108
  }
113
109
  catch { }
114
- // 2. Query dynamic candidate ip endpoints
115
110
  try {
116
111
  const controller = new AbortController();
117
112
  const timer = setTimeout(() => controller.abort(), 1200);
@@ -137,7 +132,6 @@ export const DeviceInfoTab = React.memo(() => {
137
132
  isMounted = false;
138
133
  };
139
134
  }, []);
140
- // Calculate Uptime
141
135
  useEffect(() => {
142
136
  const updateUptime = () => {
143
137
  const diffSec = Math.floor((Date.now() - startTimeRef.current) / 1000);
@@ -158,7 +152,6 @@ export const DeviceInfoTab = React.memo(() => {
158
152
  updateUptime();
159
153
  return () => clearInterval(timer);
160
154
  }, []);
161
- // Screen Geometry
162
155
  const windowDims = Dimensions.get('window');
163
156
  const screenDims = Dimensions.get('screen');
164
157
  const pixelRatio = PixelRatio.get();
@@ -168,7 +161,6 @@ export const DeviceInfoTab = React.memo(() => {
168
161
  const statusBarHeight = Platform.OS === 'android'
169
162
  ? StatusBar.currentHeight || 24
170
163
  : (windowDims.height >= 812 ? 44 : 20);
171
- // Pseudo-UDID deterministic identifier
172
164
  const pseudoUDID = useMemo(() => {
173
165
  const raw = `${Platform.OS}-${Platform.Version}-${screenDims.width}x${screenDims.height}-${pixelRatio}-${Platform.constants?.Brand || 'generic'}`;
174
166
  let hash = 0;
@@ -179,7 +171,6 @@ export const DeviceInfoTab = React.memo(() => {
179
171
  const hex = Math.abs(hash).toString(16).padStart(8, '0');
180
172
  return `UDID-${Platform.OS.toUpperCase()}-${hex.slice(0, 4)}-${hex.slice(4, 8)}-${Date.now().toString(16).slice(-4)}`.toUpperCase();
181
173
  }, [screenDims.width, screenDims.height, pixelRatio]);
182
- // Hermes & TurboModule engine status
183
174
  const isHermes = Boolean(global?.HermesInternal);
184
175
  const isTurboModule = Boolean(globalThis?.__turboModuleProxy);
185
176
  const reactNativeVersion = useMemo(() => {
@@ -203,7 +194,6 @@ export const DeviceInfoTab = React.memo(() => {
203
194
  const freeStorageGb = deviceMetrics?.freeStorage
204
195
  ? (deviceMetrics.freeStorage / (1024 * 1024 * 1024)).toFixed(1)
205
196
  : '64.2';
206
- // Sub-Tab Definitions
207
197
  const subTabs = useMemo(() => [
208
198
  {
209
199
  key: 'overview',
@@ -236,7 +226,6 @@ export const DeviceInfoTab = React.memo(() => {
236
226
  icon: (c) => <KeyIcon size={12} color={c}/>,
237
227
  },
238
228
  ], []);
239
- // Full device JSON export
240
229
  const fullDeviceData = useMemo(() => ({
241
230
  identifiers: {
242
231
  pseudoUDID,
@@ -349,7 +338,6 @@ export const DeviceInfoTab = React.memo(() => {
349
338
  copyToClipboard(md, 'Device Markdown Report');
350
339
  showToast('Copied Markdown Report to Clipboard!');
351
340
  };
352
- // Filter items matching search
353
341
  const isMatch = (text) => {
354
342
  if (!search.trim())
355
343
  return true;
@@ -364,7 +352,7 @@ export const DeviceInfoTab = React.memo(() => {
364
352
  pseudoUDID.toLowerCase().includes(query));
365
353
  }, [search, fullDeviceData, ipAddress, pseudoUDID]);
366
354
  return (<View style={styles.container}>
367
- {/* ─── Top Sub-Tabs Navigation Bar ─── */}
355
+
368
356
  <View style={styles.subTabsWrapper}>
369
357
  <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.subTabsContainer}>
370
358
  {subTabs.map(tab => {
@@ -383,7 +371,7 @@ export const DeviceInfoTab = React.memo(() => {
383
371
  </ScrollView>
384
372
  </View>
385
373
 
386
- {/* ─── Search & Export Action Bar ─── */}
374
+
387
375
  <View style={styles.actionBar}>
388
376
  <View style={styles.searchBar}>
389
377
  <SearchIcon size={14} color={AppColors.grayTextWeak}/>
@@ -404,9 +392,9 @@ export const DeviceInfoTab = React.memo(() => {
404
392
  </TouchableScale>
405
393
  </View>
406
394
 
407
- {/* ─── Main Content Scroll View ─── */}
395
+
408
396
  <ScrollView style={styles.scrollArea} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
409
- {/* Hero Card */}
397
+
410
398
  <View style={styles.heroCard}>
411
399
  <View style={styles.heroHeader}>
412
400
  <View style={styles.heroIconWrap}>
@@ -426,7 +414,7 @@ export const DeviceInfoTab = React.memo(() => {
426
414
  </View>
427
415
  </View>
428
416
 
429
- {/* Quick Metrics Strip */}
417
+
430
418
  <View style={styles.heroMetricsStrip}>
431
419
  <View style={styles.heroMetricItem}>
432
420
  <Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">IP ADDRESS</Text>
@@ -449,7 +437,7 @@ export const DeviceInfoTab = React.memo(() => {
449
437
  </View>
450
438
  </View>
451
439
 
452
- {/* ── SUB-TAB 1: OVERVIEW ── */}
440
+
453
441
  {(activeSubTab === 'overview' || search.length > 0) && (<View style={styles.sectionCard}>
454
442
  <Text style={styles.sectionTitle}>DEVICE OVERVIEW</Text>
455
443
  {isMatch('Device Model') && (<InfoRow label="Device Model" value={fullDeviceData.hardware.model}/>)}
@@ -465,7 +453,7 @@ export const DeviceInfoTab = React.memo(() => {
465
453
  {isMatch('UDID Identifier') && (<InfoRow label="Pseudo-UDID" value={pseudoUDID} isLast/>)}
466
454
  </View>)}
467
455
 
468
- {/* ── SUB-TAB 2: HARDWARE & SYSTEM ── */}
456
+
469
457
  {(activeSubTab === 'hardware' || search.length > 0) && (<View style={styles.sectionCard}>
470
458
  <Text style={styles.sectionTitle}>HARDWARE & SYSTEM SPECIFICATIONS</Text>
471
459
  {isMatch('CPU Architecture') && (<InfoRow label="CPU Architecture / ABI" value={fullDeviceData.hardware.cpuAbi} badge={{ text: '64-BIT', color: AppColors.purple, bg: `${AppColors.purple}18` }}/>)}
@@ -486,7 +474,7 @@ export const DeviceInfoTab = React.memo(() => {
486
474
  {isMatch('Thermal State') && (<InfoRow label="Thermal State" value="Nominal (Cool)" badge={{ text: 'OPTIMAL', color: AppColors.emerald500, bg: `${AppColors.emerald500}18` }} isLast/>)}
487
475
  </View>)}
488
476
 
489
- {/* ── SUB-TAB 3: NETWORK & CONNECTIVITY ── */}
477
+
490
478
  {(activeSubTab === 'network' || search.length > 0) && (<View style={styles.sectionCard}>
491
479
  <Text style={styles.sectionTitle}>NETWORK & CONNECTIVITY</Text>
492
480
  {isMatch('IP Address') && (<InfoRow label="Local Device IP" value={ipAddress} badge={{ text: 'IPV4', color: AppColors.blue500, bg: `${AppColors.blue500}18` }}/>)}
@@ -499,7 +487,7 @@ export const DeviceInfoTab = React.memo(() => {
499
487
  {isMatch('Network Inspector Interceptor') && (<InfoRow label="Network Interceptor Status" value="Intercepting XHR & Fetch" badge={{ text: 'MONITORING', color: AppColors.purple, bg: `${AppColors.purple}18` }} isLast/>)}
500
488
  </View>)}
501
489
 
502
- {/* ── SUB-TAB 4: DISPLAY & SCREEN GEOMETRY ── */}
490
+
503
491
  {(activeSubTab === 'display' || search.length > 0) && (<View style={styles.sectionCard}>
504
492
  <Text style={styles.sectionTitle}>DISPLAY & SCREEN GEOMETRY</Text>
505
493
  {isMatch('Window Resolution') && (<InfoRow label="Window Logical Size" value={`${windowDims.width.toFixed(0)} × ${windowDims.height.toFixed(0)} pt`}/>)}
@@ -515,7 +503,7 @@ export const DeviceInfoTab = React.memo(() => {
515
503
  {isMatch('Status Bar Height') && (<InfoRow label="Status Bar Inset" value={`${statusBarHeight} pt`} isLast/>)}
516
504
  </View>)}
517
505
 
518
- {/* ── SUB-TAB 5: RUNTIME & APPLICATION ── */}
506
+
519
507
  {(activeSubTab === 'runtime' || search.length > 0) && (<View style={styles.sectionCard}>
520
508
  <Text style={styles.sectionTitle}>RUNTIME & APPLICATION</Text>
521
509
  {isMatch('App Name') && (<InfoRow label="Application Name" value={fullDeviceData.runtime.appName}/>)}
@@ -543,7 +531,7 @@ export const DeviceInfoTab = React.memo(() => {
543
531
  {isMatch('Session Uptime') && (<InfoRow label="Inspector Session Uptime" value={deviceUptime} isLast/>)}
544
532
  </View>)}
545
533
 
546
- {/* ── SUB-TAB 6: SECURITY & IDENTIFIERS ── */}
534
+
547
535
  {(activeSubTab === 'security' || search.length > 0) && (<View style={styles.sectionCard}>
548
536
  <Text style={styles.sectionTitle}>DEVICE IDENTIFIERS & SECURITY</Text>
549
537
  {isMatch('Pseudo-UDID') && (<InfoRow label="Deterministic Pseudo-UDID" value={pseudoUDID} subtext="Stable hardware signature hash for testing & diagnostics" badge={{ text: 'PERSISTENT', color: AppColors.purple, bg: `${AppColors.purple}18` }}/>)}
@@ -557,7 +545,7 @@ export const DeviceInfoTab = React.memo(() => {
557
545
  {isMatch('Sandbox Integrity') && (<InfoRow label="App Sandbox File Isolation" value="Enforced by OS Kernel" isLast/>)}
558
546
  </View>)}
559
547
 
560
- {/* Empty search results state */}
548
+
561
549
  {search.trim().length > 0 && !hasAnyMatch && (<View style={styles.emptySearchCard}>
562
550
  <SearchIcon size={26} color={AppColors.grayTextWeak}/>
563
551
  <Text style={styles.emptySearchTitle}>No matching device specifications</Text>
@@ -16,7 +16,7 @@ const FabLauncher = () => {
16
16
  }} hitSlop={10}>
17
17
  <Animated.View style={[styles.fabPulseRing, { transform: [{ scale: pulseAnim }] }]}/>
18
18
  <BrandCircleIcon size={62}/>
19
- {/* #4 — shining sweep, clipped inside the circular launcher */}
19
+
20
20
  <View pointerEvents="none" style={styles.fabShineClip}>
21
21
  <Animated.View style={[
22
22
  styles.fabShineStreak,
@@ -9,6 +9,4 @@ export const useInspector = () => {
9
9
  return ctx;
10
10
  };
11
11
  export const animateNextLayout = () => {
12
- // Disabled LayoutAnimation to prevent iOS NSRangeException crashes under Fabric
13
- // and Android rendering performance freezes.
14
12
  };
@@ -36,7 +36,7 @@ const InspectorHeader = React.memo(() => {
36
36
  if (clean === 'DEV' || clean.includes('DEV') || clean === 'LOCAL') {
37
37
  return {
38
38
  label: rawEnv,
39
- bg: `${AppColors.emerald500}40`, // emerald
39
+ bg: `${AppColors.emerald500}40`,
40
40
  border: `${AppColors.emerald400}8C`,
41
41
  text: AppColors.mintGreenBorder,
42
42
  };
@@ -44,7 +44,7 @@ const InspectorHeader = React.memo(() => {
44
44
  if (clean === 'UAT' || clean === 'QA' || clean === 'TEST') {
45
45
  return {
46
46
  label: rawEnv,
47
- bg: `${AppColors.amber500}47`, // amber
47
+ bg: `${AppColors.amber500}47`,
48
48
  border: `${AppColors.amber400}99`,
49
49
  text: AppColors.amberWarmBorder,
50
50
  };
@@ -52,15 +52,14 @@ const InspectorHeader = React.memo(() => {
52
52
  if (clean === 'PREPROD' || clean === 'STAGE' || clean === 'STAGING') {
53
53
  return {
54
54
  label: rawEnv,
55
- bg: `${AppColors.purple500}47`, // purple
55
+ bg: `${AppColors.purple500}47`,
56
56
  border: `${AppColors.purple400}99`,
57
57
  text: AppColors.violetSoftBorder,
58
58
  };
59
59
  }
60
- // PROD / Live
61
60
  return {
62
61
  label: rawEnv,
63
- bg: `${AppColors.rose500}40`, // rose
62
+ bg: `${AppColors.rose500}40`,
64
63
  border: `${AppColors.roseBorder}8C`,
65
64
  text: AppColors.errorBorder,
66
65
  };
@@ -139,7 +138,7 @@ const InspectorHeader = React.memo(() => {
139
138
  },
140
139
  !isAnySelected && { display: 'none' },
141
140
  ]}>
142
- {/* Soft outer glow to fake a blurred circle */}
141
+
143
142
  <View style={{
144
143
  position: 'absolute',
145
144
  width: 48,
@@ -254,7 +253,7 @@ const InspectorHeader = React.memo(() => {
254
253
  </Pressable>)}
255
254
  </View>
256
255
 
257
- {/* OS & NPM Version Representation */}
256
+
258
257
  <View style={{
259
258
  flexDirection: 'row',
260
259
  alignItems: 'center',
@@ -663,7 +662,7 @@ const InspectorHeader = React.memo(() => {
663
662
  </View>
664
663
  </LinearGradient>
665
664
 
666
- {/* Dedicated Update Available Details Modal */}
665
+
667
666
  <UpdateAvailableModal visible={showUpdateModal} latestVersion={latestNpmVersion} onClose={() => setShowUpdateModal(false)}/>
668
667
  </>);
669
668
  });