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
@@ -52,7 +52,6 @@ const performanceTracker_1 = require("../../customHooks/performanceTracker");
52
52
  const NativeInspector_1 = require("../../native/NativeInspector");
53
53
  const PerformanceTab = react_1.default.memo(() => {
54
54
  const { t } = (0, i18n_1.useTranslation)();
55
- // ─── Real-Time FPS Tracking ────────────────────────────────────────────────
56
55
  const [isRecording, setIsRecording] = (0, react_1.useState)(true);
57
56
  const [currentFps, setCurrentFps] = (0, react_1.useState)(60);
58
57
  const [minFps, setMinFps] = (0, react_1.useState)(57);
@@ -61,7 +60,6 @@ const PerformanceTab = react_1.default.memo(() => {
61
60
  const [totalFrames, setTotalFrames] = (0, react_1.useState)(4820);
62
61
  const [jankyFrameCount, setJankyFrameCount] = (0, react_1.useState)(4);
63
62
  const [jsLagMs, setJsLagMs] = (0, react_1.useState)(1.2);
64
- // Expanded Event Card IDs
65
63
  const [expandedEventIds, setExpandedEventIds] = (0, react_1.useState)({
66
64
  'perf-1': true,
67
65
  });
@@ -71,11 +69,9 @@ const PerformanceTab = react_1.default.memo(() => {
71
69
  [id]: !prev[id],
72
70
  }));
73
71
  };
74
- // FPS history for sparkline
75
72
  const [fpsHistory, setFpsHistory] = (0, react_1.useState)([
76
73
  60, 59, 60, 60, 58, 60, 59, 60, 60, 60, 57, 60, 59, 60, 60, 58, 60, 60, 59, 60,
77
74
  ]);
78
- // Performance Log Events (Dynamic live subscription)
79
75
  const [events, setEvents] = (0, react_1.useState)(() => (0, performanceTracker_1.getPerformanceEvents)());
80
76
  const [filterCategory, setFilterCategory] = (0, react_1.useState)('ALL');
81
77
  const [search, setSearch] = (0, react_1.useState)('');
@@ -85,7 +81,6 @@ const PerformanceTab = react_1.default.memo(() => {
85
81
  });
86
82
  return unsub;
87
83
  }, []);
88
- // ─── Live Frame Measurement Loop (1-Second Batch Interval) ────────────────
89
84
  const lastFrameTimeRef = (0, react_1.useRef)(Date.now());
90
85
  const rafIdRef = (0, react_1.useRef)(null);
91
86
  const [systemMetrics, setSystemMetrics] = (0, react_1.useState)(null);
@@ -125,13 +120,11 @@ const PerformanceTab = react_1.default.memo(() => {
125
120
  const now = Date.now();
126
121
  const delta = now - lastFrameTimeRef.current;
127
122
  lastFrameTimeRef.current = now;
128
- // Track peak JS event loop lag during this 1s interval (without triggering re-renders)
129
123
  const lag = Math.max(0, delta - 16.67);
130
124
  if (lag > maxLagInSecond) {
131
125
  maxLagInSecond = lag;
132
126
  }
133
127
  frameCount++;
134
- // Update React state ONCE every 1 second (1000ms) to prevent UI shaking/re-rendering
135
128
  if (now - lastSecond >= 1000) {
136
129
  const elapsed = now - lastSecond;
137
130
  let measuredFps = Math.min(120, Math.max(0, Math.round((frameCount * 1000) / elapsed)));
@@ -158,7 +151,6 @@ const PerformanceTab = react_1.default.memo(() => {
158
151
  setAvgFps(Math.round(sum / next.length));
159
152
  return next;
160
153
  });
161
- // Trigger log if noticeable frame drop
162
154
  if (measuredFps < 50) {
163
155
  const durationStr = (1000 / measuredFps).toFixed(1);
164
156
  (0, performanceTracker_1.logPerformanceEvent)({
@@ -191,7 +183,6 @@ const PerformanceTab = react_1.default.memo(() => {
191
183
  cancelAnimationFrame(rafIdRef.current);
192
184
  };
193
185
  }, [isRecording]);
194
- // Filtered Events
195
186
  const filteredEvents = (0, react_1.useMemo)(() => {
196
187
  return events.filter(e => {
197
188
  const matchSearch = !search ||
@@ -212,7 +203,6 @@ const PerformanceTab = react_1.default.memo(() => {
212
203
  return matchSearch && matchFilter;
213
204
  });
214
205
  }, [events, search, filterCategory]);
215
- // Overall Performance Score
216
206
  const performanceScore = (0, react_1.useMemo)(() => {
217
207
  if (avgFps >= 58) {
218
208
  return {
@@ -237,7 +227,6 @@ const PerformanceTab = react_1.default.memo(() => {
237
227
  bg: AppColors_1.AppColors.errorCardBg,
238
228
  };
239
229
  }, [avgFps, t]);
240
- // ─── Dynamic Runtime Environment & Engine Diagnostics ──────────────────────
241
230
  const runtimeDiagnostics = (0, react_1.useMemo)(() => {
242
231
  const raw = (0, helpers_1.getRuntimeDiagnostics)();
243
232
  const engineNameMap = {
@@ -267,7 +256,6 @@ const PerformanceTab = react_1.default.memo(() => {
267
256
  totalAllocMb: raw.totalAllocMb,
268
257
  };
269
258
  }, [t]);
270
- // ─── Dynamic 16.67ms Frame Budget Utilization ─────────────────────────────
271
259
  const frameBudgetStats = (0, react_1.useMemo)(() => {
272
260
  const frameDuration = avgFps > 0 ? 1000 / avgFps : 16.67;
273
261
  const jsTime = Number(Math.max(1.0, Math.min(frameDuration * 0.45, 2.0 + jsLagMs)).toFixed(1));
@@ -284,7 +272,6 @@ const PerformanceTab = react_1.default.memo(() => {
284
272
  headroomPercent,
285
273
  };
286
274
  }, [avgFps, jsLagMs]);
287
- // ─── Dynamic SVG FPS Area & Trend Curve Data ────────────────────────────
288
275
  const [selectedFpsPointIdx, setSelectedFpsPointIdx] = (0, react_1.useState)(null);
289
276
  const svgGraphWidth = 320;
290
277
  const svgGraphHeight = 64;
@@ -367,7 +354,7 @@ const PerformanceTab = react_1.default.memo(() => {
367
354
  ? fpsGraphData.coords[selectedFpsPointIdx]
368
355
  : null;
369
356
  return (<react_native_1.View style={perfStyles.container}>
370
- {/* Search & Live Control Header */}
357
+
371
358
  <react_native_1.View style={perfStyles.headerBar}>
372
359
  <react_native_1.View style={perfStyles.searchBox}>
373
360
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
@@ -377,7 +364,7 @@ const PerformanceTab = react_1.default.memo(() => {
377
364
  </TouchableScale_1.default>) : null}
378
365
  </react_native_1.View>
379
366
 
380
- {/* Live FPS Telemetry Recorder Toggle */}
367
+
381
368
  <TouchableScale_1.default onPress={() => setIsRecording(prev => !prev)} style={[
382
369
  perfStyles.recordToggleBtn,
383
370
  isRecording
@@ -407,7 +394,7 @@ const PerformanceTab = react_1.default.memo(() => {
407
394
  </TouchableScale_1.default>
408
395
  </react_native_1.View>
409
396
 
410
- {/* Filter Category Tabs Carousel */}
397
+
411
398
  <react_native_1.View style={perfStyles.categoryScrollWrapper}>
412
399
  <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={perfStyles.categoryScrollView} contentContainerStyle={perfStyles.categoryScroll}>
413
400
  {[
@@ -461,9 +448,9 @@ const PerformanceTab = react_1.default.memo(() => {
461
448
  </react_native_1.ScrollView>
462
449
  </react_native_1.View>
463
450
 
464
- {/* Main Content Scroll View */}
451
+
465
452
  <react_native_1.ScrollView style={perfStyles.scrollBody} contentContainerStyle={perfStyles.scrollContent} showsVerticalScrollIndicator={false}>
466
- {/* ── 1. REAL-TIME FPS SCORECARD & SMOOTH AREA GRAPH ── */}
453
+
467
454
  <react_native_1.View style={perfStyles.heroCard}>
468
455
  <react_native_1.View style={perfStyles.heroHeaderRow}>
469
456
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
@@ -478,7 +465,7 @@ const PerformanceTab = react_1.default.memo(() => {
478
465
  </react_native_1.View>
479
466
  </react_native_1.View>
480
467
 
481
- {/* Health Grade Score Pill */}
468
+
482
469
  <react_native_1.View style={[
483
470
  perfStyles.scorePill,
484
471
  { backgroundColor: performanceScore.bg },
@@ -492,7 +479,7 @@ const PerformanceTab = react_1.default.memo(() => {
492
479
  </react_native_1.View>
493
480
  </react_native_1.View>
494
481
 
495
- {/* Primary Gauge Counter */}
482
+
496
483
  <react_native_1.View style={perfStyles.primaryFpsRow}>
497
484
  <react_native_1.View style={perfStyles.fpsBigNumberBox}>
498
485
  <react_native_1.Text style={[
@@ -553,7 +540,7 @@ const PerformanceTab = react_1.default.memo(() => {
553
540
  </react_native_1.View>
554
541
  </react_native_1.View>
555
542
 
556
- {/* Interactive Scrub Tooltip */}
543
+
557
544
  {activeScrubPoint && (<react_native_1.View style={perfStyles.graphScrubTooltip}>
558
545
  <react_native_1.Text style={perfStyles.graphScrubTooltipText}>
559
546
  {activeScrubPoint.val} FPS •{' '}
@@ -562,7 +549,7 @@ const PerformanceTab = react_1.default.memo(() => {
562
549
  </react_native_1.Text>
563
550
  </react_native_1.View>)}
564
551
 
565
- {/* Real-Time SVG Smooth Area & Trend Wave Graph */}
552
+
566
553
  <react_native_1.View style={perfStyles.svgGraphContainer}>
567
554
  <react_native_svg_1.default width="100%" height={svgGraphHeight} viewBox={`0 0 ${svgGraphWidth} ${svgGraphHeight}`} preserveAspectRatio="none">
568
555
  <react_native_svg_1.Defs>
@@ -580,23 +567,23 @@ const PerformanceTab = react_1.default.memo(() => {
580
567
  </react_native_svg_1.LinearGradient>
581
568
  </react_native_svg_1.Defs>
582
569
 
583
- {/* 60 FPS Target Baseline */}
570
+
584
571
  <react_native_svg_1.Line x1="0" y1="7" x2={svgGraphWidth} y2="7" stroke={AppColors_1.AppColors.emerald500} strokeWidth="1" strokeDasharray="4,4" opacity="0.4"/>
585
572
 
586
- {/* 30 FPS Warning Baseline */}
573
+
587
574
  <react_native_svg_1.Line x1="0" y1={svgGraphHeight / 2} x2={svgGraphWidth} y2={svgGraphHeight / 2} stroke={AppColors_1.AppColors.amber500} strokeWidth="0.8" strokeDasharray="3,3" opacity="0.3"/>
588
575
 
589
- {/* Shaded Area Under Curve */}
576
+
590
577
  {fpsGraphData.areaPath ? (<react_native_svg_1.Path d={fpsGraphData.areaPath} fill="url(#fpsAreaGradient)"/>) : null}
591
578
 
592
- {/* Bezier Trend Line */}
579
+
593
580
  {fpsGraphData.linePath ? (<react_native_svg_1.Path d={fpsGraphData.linePath} fill="none" stroke={avgFps >= 55
594
581
  ? AppColors_1.AppColors.emerald600
595
582
  : avgFps >= 40
596
583
  ? AppColors_1.AppColors.amber600
597
584
  : AppColors_1.AppColors.errorColor} strokeWidth="2.2"/>) : null}
598
585
 
599
- {/* Sample Nodes */}
586
+
600
587
  {fpsGraphData.coords.map((c, idx) => {
601
588
  const isSelected = selectedFpsPointIdx === idx;
602
589
  const isDip = c.val < 50;
@@ -611,7 +598,7 @@ const PerformanceTab = react_1.default.memo(() => {
611
598
  })}
612
599
  </react_native_svg_1.default>
613
600
 
614
- {/* Invisible Touch Column Targets for Interactive Inspection */}
601
+
615
602
  <react_native_1.View style={perfStyles.svgTouchOverlay}>
616
603
  {fpsGraphData.coords.map((_, idx) => (<react_native_1.TouchableOpacity key={idx} style={perfStyles.svgTouchCol} activeOpacity={0.7} onPress={() => setSelectedFpsPointIdx(selectedFpsPointIdx === idx ? null : idx)}/>))}
617
604
  </react_native_1.View>
@@ -627,7 +614,7 @@ const PerformanceTab = react_1.default.memo(() => {
627
614
  </react_native_1.View>
628
615
  </react_native_1.View>
629
616
 
630
- {/* ── 1.5 NATIVE HARDWARE HEALTH & SYSTEM TELEMETRY CARD ── */}
617
+
631
618
  <react_native_1.View style={perfStyles.budgetCard}>
632
619
  <react_native_1.View style={perfStyles.budgetHeader}>
633
620
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
@@ -684,7 +671,7 @@ const PerformanceTab = react_1.default.memo(() => {
684
671
  </react_native_1.View>
685
672
  </react_native_1.View>
686
673
 
687
- {/* ── 2. FRAME LATENCY DISTRIBUTION HISTOGRAM CARD ── */}
674
+
688
675
  <react_native_1.View style={perfStyles.budgetCard}>
689
676
  <react_native_1.View style={perfStyles.budgetHeader}>
690
677
  <react_native_1.View>
@@ -731,7 +718,7 @@ const PerformanceTab = react_1.default.memo(() => {
731
718
  </react_native_1.View>
732
719
  </react_native_1.View>
733
720
 
734
- {/* ── 3. FRAME BUDGET BREAKDOWN CARD ── */}
721
+
735
722
  <react_native_1.View style={perfStyles.budgetCard}>
736
723
  <react_native_1.View style={perfStyles.budgetHeader}>
737
724
  <react_native_1.Text style={perfStyles.budgetTitle}>{t('performance.budgetUsage')}</react_native_1.Text>
@@ -743,7 +730,7 @@ const PerformanceTab = react_1.default.memo(() => {
743
730
  </react_native_1.Text>
744
731
  </react_native_1.View>
745
732
 
746
- {/* Multi-colored segmented frame budget bar */}
733
+
747
734
  <react_native_1.View style={perfStyles.budgetBarContainer}>
748
735
  <react_native_1.View style={[
749
736
  perfStyles.budgetBarSegment,
@@ -791,7 +778,7 @@ const PerformanceTab = react_1.default.memo(() => {
791
778
  </react_native_1.View>
792
779
  </react_native_1.View>
793
780
 
794
- {/* ── 3. RUNTIME ENGINE & MEMORY SUMMARY ── */}
781
+
795
782
  <react_native_1.View style={perfStyles.engineSummaryGrid}>
796
783
  <react_native_1.View style={perfStyles.engineSummaryCard}>
797
784
  <react_native_1.Text style={perfStyles.engineSummaryLabel}>{t('performance.jsEngine')}</react_native_1.Text>
@@ -812,7 +799,7 @@ const PerformanceTab = react_1.default.memo(() => {
812
799
  </react_native_1.View>
813
800
  </react_native_1.View>
814
801
 
815
- {/* ── 4. PERFORMANCE LOGS & DETAILED EVENTS ── */}
802
+
816
803
  <react_native_1.View style={perfStyles.logsHeaderRow}>
817
804
  <react_native_1.Text style={perfStyles.logsSectionHeading}>
818
805
  {t('performance.recordedEvents')} ({filteredEvents.length})
@@ -851,7 +838,7 @@ const PerformanceTab = react_1.default.memo(() => {
851
838
  </react_native_1.Text>
852
839
  </react_native_1.View>
853
840
 
854
- {/* Dropped Frames Badge */}
841
+
855
842
  <react_native_1.View style={[
856
843
  perfStyles.droppedBadge,
857
844
  (event.droppedFrames ?? Math.max(0, 60 - event.fps)) > 0
@@ -870,7 +857,7 @@ const PerformanceTab = react_1.default.memo(() => {
870
857
  </react_native_1.Text>
871
858
  </react_native_1.View>
872
859
 
873
- {/* Bottleneck Thread Tag */}
860
+
874
861
  {event.bottleneckThread && (<react_native_1.View style={[perfStyles.bottleneckTag, { flexDirection: 'row', alignItems: 'center', gap: 3 }]}>
875
862
  {event.bottleneckThread === 'JS Thread' && (<NetworkIcons_1.BoltIcon size={10} color={AppColors_1.AppColors.warningIconGold}/>)}
876
863
  <react_native_1.Text style={perfStyles.bottleneckTagText}>
@@ -889,7 +876,7 @@ const PerformanceTab = react_1.default.memo(() => {
889
876
  </react_native_1.View>
890
877
  </react_native_1.View>
891
878
 
892
- {/* Event Label & Meta */}
879
+
893
880
  <react_native_1.View style={{ marginTop: 4 }}>
894
881
  <HighlightText_1.default text={event.label} search={search} style={perfStyles.eventLabel} highlightStyle={perfStyles.searchHighlight}/>
895
882
  <react_native_1.View style={perfStyles.eventMetaRow}>
@@ -914,7 +901,7 @@ const PerformanceTab = react_1.default.memo(() => {
914
901
  </react_native_1.View>
915
902
  </react_native_1.View>
916
903
 
917
- {/* Visual Frame Time Budget Bar */}
904
+
918
905
  <react_native_1.View style={perfStyles.frameBarTrack}>
919
906
  <react_native_1.View style={[
920
907
  perfStyles.frameBarFill,
@@ -927,9 +914,9 @@ const PerformanceTab = react_1.default.memo(() => {
927
914
 
928
915
  <HighlightText_1.default text={event.detail} search={search} style={perfStyles.eventDetail} highlightStyle={perfStyles.searchHighlight}/>
929
916
 
930
- {/* ── EXPANDABLE IN-DEPTH METRICS ACCORDION ── */}
917
+
931
918
  {isExpanded && (<react_native_1.View style={perfStyles.expandedDetailBox}>
932
- {/* Screen / Component Context */}
919
+
933
920
  {(event.screenName || event.source) && (<react_native_1.View style={perfStyles.sourceRow}>
934
921
  <react_native_1.Text style={perfStyles.sourceTag}>{t('performance.screenContext')}</react_native_1.Text>
935
922
  <react_native_1.Text style={perfStyles.sourceText} numberOfLines={1}>
@@ -937,7 +924,7 @@ const PerformanceTab = react_1.default.memo(() => {
937
924
  </react_native_1.Text>
938
925
  </react_native_1.View>)}
939
926
 
940
- {/* Frame Metrics Grid */}
927
+
941
928
  <react_native_1.View style={perfStyles.fpsMetricsGrid}>
942
929
  <react_native_1.View style={perfStyles.fpsMetricItem}>
943
930
  <react_native_1.Text style={perfStyles.fpsMetricLabel}>{t('performance.target60Fps', { fps: event.fps })}</react_native_1.Text>
@@ -968,7 +955,7 @@ const PerformanceTab = react_1.default.memo(() => {
968
955
  </react_native_1.View>
969
956
  </react_native_1.View>
970
957
 
971
- {/* Thread Timing Breakdown */}
958
+
972
959
  {event.breakdown && (<react_native_1.View style={perfStyles.breakdownGrid}>
973
960
  <react_native_1.View style={perfStyles.breakdownCol}>
974
961
  <react_native_1.Text style={perfStyles.breakdownLabel}>{t('performance.jsThread')}</react_native_1.Text>
@@ -999,7 +986,7 @@ const PerformanceTab = react_1.default.memo(() => {
999
986
  </react_native_1.View>)}
1000
987
  </react_native_1.View>)}
1001
988
 
1002
- {/* Actionable Optimization Tip */}
989
+
1003
990
  {event.advice && (<react_native_1.View style={perfStyles.adviceCard}>
1004
991
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
1005
992
  <NetworkIcons_1.LightbulbIcon color={AppColors_1.AppColors.purpleShade700} size={12}/>
@@ -100,22 +100,16 @@ const getOriginBadge = (originType) => {
100
100
  const ReduxDetail = react_1.default.memo(() => {
101
101
  const { t } = (0, i18n_1.useTranslation)();
102
102
  const { reduxState, reduxLastActionMap, selectedReduxSlice, selectedReduxAction, setSelectedReduxSlice, } = (0, InspectorContext_1.useInspector)();
103
- // Search filter within details
104
103
  const [detailSearch, setDetailSearch] = (0, react_1.useState)('');
105
- // Sub-tabs for Slice & Action
106
104
  const [sliceTab, setSliceTab] = (0, react_1.useState)('live');
107
105
  const [actionTab, setActionTab] = (0, react_1.useState)('payload');
108
106
  const [viewMode, setViewMode] = (0, react_1.useState)('pretty');
109
- // Selected Action inside Timeline
110
107
  const [expandedActionId, setExpandedActionId] = (0, react_1.useState)(null);
111
- // Persistence data for active slice
112
108
  const [isPersisted, setIsPersisted] = (0, react_1.useState)(false);
113
109
  const [persistedData, setPersistedData] = (0, react_1.useState)(null);
114
- // Fetch Action History
115
110
  const allActionHistory = (0, react_1.useMemo)(() => {
116
111
  return (0, reduxLogger_1.getActionHistory)();
117
112
  }, [reduxLastActionMap]);
118
- // Slices-filtered actions
119
113
  const sliceActions = (0, react_1.useMemo)(() => {
120
114
  if (!selectedReduxSlice)
121
115
  return allActionHistory;
@@ -125,7 +119,6 @@ const ReduxDetail = react_1.default.memo(() => {
125
119
  return action.affectedSlices.includes(selectedReduxSlice);
126
120
  });
127
121
  }, [allActionHistory, selectedReduxSlice]);
128
- // Filtered slice actions by search query in timeline tab
129
122
  const filteredTimelineActions = (0, react_1.useMemo)(() => {
130
123
  if (!detailSearch.trim())
131
124
  return sliceActions;
@@ -176,7 +169,6 @@ const ReduxDetail = react_1.default.memo(() => {
176
169
  }
177
170
  }
178
171
  catch (e) {
179
- // silent catch
180
172
  }
181
173
  setIsPersisted(false);
182
174
  setPersistedData(null);
@@ -219,9 +211,6 @@ const ReduxDetail = react_1.default.memo(() => {
219
211
  },
220
212
  ]);
221
213
  };
222
- // ══════════════════════════════════════════════════════════════════════════
223
- // ── 1. RENDER SLICE DETAIL VIEW ───────────────────────────────────────────
224
- // ══════════════════════════════════════════════════════════════════════════
225
214
  if (selectedReduxSlice != null) {
226
215
  const sliceData = reduxState?.[selectedReduxSlice];
227
216
  const fieldsCount = sliceData && typeof sliceData === 'object'
@@ -255,7 +244,7 @@ const ReduxDetail = react_1.default.memo(() => {
255
244
  },
256
245
  ];
257
246
  return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
258
- {/* Info Header Bar */}
247
+
259
248
  <react_native_1.View style={reduxDetailStyles.infoBar}>
260
249
  <react_native_1.View style={reduxDetailStyles.infoTopRow}>
261
250
  <react_native_1.View style={{
@@ -295,11 +284,11 @@ const ReduxDetail = react_1.default.memo(() => {
295
284
  </react_native_1.View>)}
296
285
  </react_native_1.View>
297
286
 
298
- {/* Copy Button */}
287
+
299
288
  <CopyButton_1.default value={() => (sliceTab === 'live' ? sliceData : persistedData)} label={t('redux.sliceJson', 'Slice JSON')}/>
300
289
  </react_native_1.View>
301
290
 
302
- {/* Sub Stats Row */}
291
+
303
292
  <react_native_1.View style={reduxDetailStyles.subStatsRow}>
304
293
  <react_native_1.View style={[
305
294
  reduxDetailStyles.statPill,
@@ -388,11 +377,11 @@ const ReduxDetail = react_1.default.memo(() => {
388
377
  </react_native_1.View>)}
389
378
  </react_native_1.View>
390
379
 
391
- {/* Sub-Tabs */}
380
+
392
381
  <SegmentedTabs_1.default tabs={sliceTabs} activeKey={sliceTab} onChange={key => setSliceTab(key)} style={{ marginTop: 10 }}/>
393
382
  </react_native_1.View>
394
383
 
395
- {/* Search Bar within slice (for Live, Timeline, Persisted) */}
384
+
396
385
  {sliceTab !== 'metadata' && (<react_native_1.View style={reduxDetailStyles.searchContainer}>
397
386
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
398
387
  <react_native_1.TextInput placeholder={sliceTab === 'timeline'
@@ -403,7 +392,7 @@ const ReduxDetail = react_1.default.memo(() => {
403
392
  </react_native_1.Pressable>)}
404
393
  </react_native_1.View>)}
405
394
 
406
- {/* Content Body */}
395
+
407
396
  {sliceTab === 'timeline' ? (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 12, paddingBottom: 40 }} keyboardShouldPersistTaps="handled">
408
397
  {filteredTimelineActions.length === 0 ? (<react_native_1.View style={reduxDetailStyles.emptyBox}>
409
398
  <NetworkIcons_1.TimelineIcon color={AppColors_1.AppColors.grayTextWeak} size={28}/>
@@ -434,7 +423,7 @@ const ReduxDetail = react_1.default.memo(() => {
434
423
  #{action.id}
435
424
  </react_native_1.Text>
436
425
  </react_native_1.View>
437
- {/* Origin Badge */}
426
+
438
427
  <react_native_1.View style={{
439
428
  flexDirection: 'row',
440
429
  alignItems: 'center',
@@ -468,7 +457,7 @@ const ReduxDetail = react_1.default.memo(() => {
468
457
  </react_native_1.View>
469
458
  </react_native_1.View>
470
459
 
471
- {/* Trigger caller preview row */}
460
+
472
461
  {action.callerFile && (<react_native_1.View style={{
473
462
  flexDirection: 'row',
474
463
  alignItems: 'center',
@@ -526,9 +515,9 @@ const ReduxDetail = react_1.default.memo(() => {
526
515
  </react_native_1.Pressable>
527
516
  </react_native_1.View>)}
528
517
 
529
- {/* Expanded Payload, Diff Viewer & Call Stack */}
518
+
530
519
  {isExpanded ? (<react_native_1.View style={reduxDetailStyles.expandedContent}>
531
- {/* Call Stack Trace Box */}
520
+
532
521
  {action.stack ? (<react_native_1.View style={{ marginBottom: 12 }}>
533
522
  <react_native_1.Text style={reduxDetailStyles.expandedSectionTitle}>
534
523
  {t('redux.callStack', 'Call Stack Trace')}:
@@ -694,16 +683,11 @@ const ReduxDetail = react_1.default.memo(() => {
694
683
  State exists purely in active JavaScript memory.
695
684
  </react_native_1.Text>
696
685
  </react_native_1.View>)}
697
- </react_native_1.View>) : (
698
- /* Live State JsonViewer: Direct flex: 1 with fullHeight to prevent nested scroll conflicts */
699
- <react_native_1.View style={{ flex: 1, padding: 10 }}>
686
+ </react_native_1.View>) : (<react_native_1.View style={{ flex: 1, padding: 10 }}>
700
687
  <JsonViewer_1.default data={sliceData} search={detailSearch} forceOpen={detailSearch.length > 0 ? true : undefined} mode={viewMode} onModeChange={setViewMode} fullHeight={true} wrap={true}/>
701
688
  </react_native_1.View>)}
702
689
  </react_native_1.View>);
703
690
  }
704
- // ══════════════════════════════════════════════════════════════════════════
705
- // ── 2. RENDER ACTION DETAIL VIEW (when an action is selected directly) ────
706
- // ══════════════════════════════════════════════════════════════════════════
707
691
  if (selectedReduxAction != null) {
708
692
  const originMeta = getOriginBadge(selectedReduxAction.originType);
709
693
  const callerBasename = selectedReduxAction.callerFile
@@ -732,7 +716,7 @@ const ReduxDetail = react_1.default.memo(() => {
732
716
  },
733
717
  ];
734
718
  return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
735
- {/* Top Info Bar */}
719
+
736
720
  <react_native_1.View style={reduxDetailStyles.infoBar}>
737
721
  <react_native_1.View style={reduxDetailStyles.infoTopRow}>
738
722
  <react_native_1.View style={{
@@ -748,7 +732,7 @@ const ReduxDetail = react_1.default.memo(() => {
748
732
  #{selectedReduxAction.id}
749
733
  </react_native_1.Text>
750
734
  </react_native_1.View>
751
- {/* Origin Badge */}
735
+
752
736
  <react_native_1.View style={{
753
737
  flexDirection: 'row',
754
738
  alignItems: 'center',
@@ -781,11 +765,11 @@ const ReduxDetail = react_1.default.memo(() => {
781
765
  </react_native_1.View>)}
782
766
  </react_native_1.View>
783
767
 
784
- {/* Copy Button */}
768
+
785
769
  <CopyButton_1.default value={() => selectedReduxAction} label="Copy Action"/>
786
770
  </react_native_1.View>
787
771
 
788
- {/* Sub Stats Row */}
772
+
789
773
  <react_native_1.View style={reduxDetailStyles.subStatsRow}>
790
774
  {selectedReduxAction.affectedSlices &&
791
775
  selectedReduxAction.affectedSlices.length > 0 && (<react_native_1.View style={[
@@ -831,7 +815,7 @@ const ReduxDetail = react_1.default.memo(() => {
831
815
  </react_native_1.View>
832
816
  </react_native_1.View>
833
817
 
834
- {/* Triggered from caller preview row */}
818
+
835
819
  {selectedReduxAction.callerFile && (<react_native_1.View style={{
836
820
  flexDirection: 'row',
837
821
  alignItems: 'center',
@@ -888,11 +872,11 @@ const ReduxDetail = react_1.default.memo(() => {
888
872
  </react_native_1.Pressable>
889
873
  </react_native_1.View>)}
890
874
 
891
- {/* Sub-Tabs */}
875
+
892
876
  <SegmentedTabs_1.default tabs={actionTabs} activeKey={actionTab} onChange={key => setActionTab(key)} style={{ marginTop: 10 }}/>
893
877
  </react_native_1.View>
894
878
 
895
- {/* Content Body */}
879
+
896
880
  {actionTab === 'payload' ? (<react_native_1.View style={{ flex: 1, padding: 10 }}>
897
881
  {selectedReduxAction.payload !== undefined ? (<JsonViewer_1.default data={selectedReduxAction.payload} search={detailSearch} forceOpen={true} fullHeight={true} wrap={true}/>) : (<react_native_1.View style={reduxDetailStyles.emptyBox}>
898
882
  <react_native_1.Text style={reduxDetailStyles.emptyBoxText}>