react-native-inapp-inspector 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  2. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  3. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  4. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  6. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  7. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  8. package/android/.gradle/8.9/gc.properties +0 -0
  9. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  10. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  11. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  12. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  13. package/android/.gradle/9.2.0/gc.properties +0 -0
  14. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  15. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  16. package/android/.gradle/vcs-1/gc.properties +0 -0
  17. package/android/build/reports/problems/problems-report.html +659 -0
  18. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +11 -0
  19. package/dist/commonjs/components/Inspector/AuditTab.d.ts +3 -0
  20. package/dist/commonjs/components/Inspector/AuditTab.js +741 -0
  21. package/dist/commonjs/components/Inspector/DeviceTab.d.ts +3 -0
  22. package/dist/commonjs/components/Inspector/DeviceTab.js +717 -0
  23. package/dist/commonjs/components/Inspector/InspectorHeader.js +115 -75
  24. package/dist/commonjs/components/Inspector/MainScreen.js +16 -2
  25. package/dist/commonjs/components/Inspector/NetworkDetail.js +15 -0
  26. package/dist/commonjs/components/Inspector/NetworkTab.js +317 -12
  27. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +88 -39
  28. package/dist/commonjs/components/Inspector/PerformanceHud.d.ts +7 -0
  29. package/dist/commonjs/components/Inspector/PerformanceHud.js +210 -0
  30. package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -18
  31. package/dist/commonjs/components/Inspector/RequestReplayModal.d.ts +9 -0
  32. package/dist/commonjs/components/Inspector/RequestReplayModal.js +792 -0
  33. package/dist/commonjs/components/Inspector/RequestReplayView.d.ts +8 -0
  34. package/dist/commonjs/components/Inspector/RequestReplayView.js +871 -0
  35. package/dist/commonjs/components/Inspector/SettingsPanel.js +847 -370
  36. package/dist/commonjs/components/Inspector/StorageTab.d.ts +3 -0
  37. package/dist/commonjs/components/Inspector/StorageTab.js +610 -0
  38. package/dist/commonjs/components/Inspector/TabBar.js +23 -2
  39. package/dist/commonjs/components/Inspector/UpdateAvailableModal.d.ts +8 -0
  40. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +469 -0
  41. package/dist/commonjs/components/NetworkIcons.d.ts +12 -0
  42. package/dist/commonjs/components/NetworkIcons.js +72 -3
  43. package/dist/commonjs/constants/version.d.ts +1 -1
  44. package/dist/commonjs/constants/version.js +1 -1
  45. package/dist/commonjs/customHooks/storageInspector.d.ts +13 -0
  46. package/dist/commonjs/customHooks/storageInspector.js +179 -0
  47. package/dist/commonjs/helpers/deviceInfo.d.ts +4 -0
  48. package/dist/commonjs/helpers/deviceInfo.js +94 -0
  49. package/dist/commonjs/helpers/index.d.ts +2 -0
  50. package/dist/commonjs/helpers/index.js +12 -1
  51. package/dist/commonjs/helpers/packageAuditor.d.ts +5 -0
  52. package/dist/commonjs/helpers/packageAuditor.js +182 -0
  53. package/dist/commonjs/helpers/searchQueryParser.d.ts +8 -3
  54. package/dist/commonjs/helpers/searchQueryParser.js +85 -31
  55. package/dist/commonjs/helpers/telemetry.js +4 -4
  56. package/dist/commonjs/i18n/locales/en.json +3 -2
  57. package/dist/commonjs/index.d.ts +1 -0
  58. package/dist/commonjs/index.js +171 -16
  59. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  60. package/dist/commonjs/types/enums.d.ts +7 -0
  61. package/dist/commonjs/types/enums.js +7 -0
  62. package/dist/commonjs/types/interfaces.d.ts +82 -0
  63. package/dist/esm/components/Inspector/AuditTab.d.ts +3 -0
  64. package/dist/esm/components/Inspector/AuditTab.js +702 -0
  65. package/dist/esm/components/Inspector/DeviceTab.d.ts +3 -0
  66. package/dist/esm/components/Inspector/DeviceTab.js +678 -0
  67. package/dist/esm/components/Inspector/InspectorHeader.js +115 -75
  68. package/dist/esm/components/Inspector/MainScreen.js +16 -2
  69. package/dist/esm/components/Inspector/NetworkDetail.js +16 -1
  70. package/dist/esm/components/Inspector/NetworkTab.js +317 -12
  71. package/dist/esm/components/Inspector/NpmUpdateToast.js +88 -39
  72. package/dist/esm/components/Inspector/PerformanceHud.d.ts +7 -0
  73. package/dist/esm/components/Inspector/PerformanceHud.js +170 -0
  74. package/dist/esm/components/Inspector/PerformanceTab.js +31 -19
  75. package/dist/esm/components/Inspector/RequestReplayModal.d.ts +9 -0
  76. package/dist/esm/components/Inspector/RequestReplayModal.js +752 -0
  77. package/dist/esm/components/Inspector/RequestReplayView.d.ts +8 -0
  78. package/dist/esm/components/Inspector/RequestReplayView.js +831 -0
  79. package/dist/esm/components/Inspector/SettingsPanel.js +848 -371
  80. package/dist/esm/components/Inspector/StorageTab.d.ts +3 -0
  81. package/dist/esm/components/Inspector/StorageTab.js +571 -0
  82. package/dist/esm/components/Inspector/TabBar.js +24 -3
  83. package/dist/esm/components/Inspector/UpdateAvailableModal.d.ts +8 -0
  84. package/dist/esm/components/Inspector/UpdateAvailableModal.js +432 -0
  85. package/dist/esm/components/NetworkIcons.d.ts +12 -0
  86. package/dist/esm/components/NetworkIcons.js +57 -0
  87. package/dist/esm/constants/version.d.ts +1 -1
  88. package/dist/esm/constants/version.js +1 -1
  89. package/dist/esm/customHooks/storageInspector.d.ts +13 -0
  90. package/dist/esm/customHooks/storageInspector.js +170 -0
  91. package/dist/esm/helpers/deviceInfo.d.ts +4 -0
  92. package/dist/esm/helpers/deviceInfo.js +89 -0
  93. package/dist/esm/helpers/index.d.ts +2 -0
  94. package/dist/esm/helpers/index.js +10 -0
  95. package/dist/esm/helpers/packageAuditor.d.ts +5 -0
  96. package/dist/esm/helpers/packageAuditor.js +173 -0
  97. package/dist/esm/helpers/searchQueryParser.d.ts +8 -3
  98. package/dist/esm/helpers/searchQueryParser.js +85 -31
  99. package/dist/esm/helpers/telemetry.js +4 -4
  100. package/dist/esm/i18n/locales/en.json +3 -2
  101. package/dist/esm/index.d.ts +1 -0
  102. package/dist/esm/index.js +167 -15
  103. package/dist/esm/native/NativeInspector.d.ts +1 -0
  104. package/dist/esm/types/enums.d.ts +7 -0
  105. package/dist/esm/types/enums.js +7 -0
  106. package/dist/esm/types/interfaces.d.ts +82 -0
  107. package/ios/NetworkInspectorModule.mm +12 -5
  108. package/package.json +4 -1
@@ -49,9 +49,11 @@ const constants_1 = require("../../constants");
49
49
  const constants_2 = require("../../constants");
50
50
  const helpers_1 = require("../../helpers");
51
51
  const telemetry_1 = require("../../helpers/telemetry");
52
+ const UpdateAvailableModal_1 = require("./UpdateAvailableModal");
52
53
  const NetworkIcons_1 = require("../NetworkIcons");
53
54
  const InspectorHeader = react_1.default.memo(() => {
54
- const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, settingsPage, setSettingsPage, resetToDefaults, closeModal, detailTitle, activeTab, environment, visible, selectedCrash, setSelectedCrash, } = (0, InspectorContext_1.useInspector)();
55
+ const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, settingsPage, setSettingsPage, resetToDefaults, closeModal, detailTitle, activeTab, environment, visible, selectedCrash, setSelectedCrash, deviceInfo, } = (0, InspectorContext_1.useInspector)();
56
+ const [showUpdateModal, setShowUpdateModal] = react_1.default.useState(false);
55
57
  const [isTelemetryActive, setIsTelemetryActive] = react_1.default.useState(false);
56
58
  const telemetryPulseAnim = react_1.default.useRef(new react_native_1.Animated.Value(1)).current;
57
59
  react_1.default.useEffect(() => {
@@ -115,7 +117,8 @@ const InspectorHeader = react_1.default.memo(() => {
115
117
  const isDetailView = (activeTab === 'apis' && selected != null) ||
116
118
  (activeTab === 'analytics' && selectedEvent != null) ||
117
119
  (activeTab === 'logs' && selectedLog != null) ||
118
- (activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null)) ||
120
+ (activeTab === 'redux' &&
121
+ (selectedReduxSlice != null || selectedReduxAction != null)) ||
119
122
  (activeTab === 'crash' && selectedCrash != null);
120
123
  const isSettingsView = settingsPage !== null;
121
124
  const isAnySelected = isDetailView || isSettingsView;
@@ -140,7 +143,8 @@ const InspectorHeader = react_1.default.memo(() => {
140
143
  }
141
144
  }, [settingsPage]);
142
145
  const headerTopPadding = react_native_1.Platform.OS === 'ios' && modalHeightPercent >= 95 ? 44 : 0;
143
- return (<react_native_linear_gradient_1.default colors={['#4F46E5', '#7C3AED']} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={styles_1.default.headerGradient}>
146
+ return (<>
147
+ <react_native_linear_gradient_1.default colors={['#4F46E5', '#7C3AED']} start={{ x: 0, y: 0 }} end={{ x: 1, y: 1 }} style={styles_1.default.headerGradient}>
144
148
  <react_native_1.View style={{ paddingTop: headerTopPadding, width: '100%' }}>
145
149
  <react_native_1.View style={styles_1.default.header}>
146
150
  <react_native_1.View style={[
@@ -241,7 +245,12 @@ const InspectorHeader = react_1.default.memo(() => {
241
245
  }}>
242
246
  <AppHeaderLogo_1.default size={46} customIcon={appIcon}/>
243
247
  <react_native_1.View style={{ gap: 2.5, flex: 1, minWidth: 0 }}>
244
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, minWidth: 0 }}>
248
+ <react_native_1.View style={{
249
+ flexDirection: 'row',
250
+ alignItems: 'center',
251
+ gap: 6,
252
+ minWidth: 0,
253
+ }}>
245
254
  <react_native_1.Text style={[styles_1.default.headerTitle, { flexShrink: 1 }]} numberOfLines={1} ellipsizeMode="tail">
246
255
  {(0, helpers_1.getAppName)()}
247
256
  </react_native_1.Text>
@@ -255,93 +264,117 @@ const InspectorHeader = react_1.default.memo(() => {
255
264
  marginBottom: 0,
256
265
  },
257
266
  ]}>
258
- <react_native_1.Text style={[
259
- styles_1.default.envBadgeText,
260
- { color: envConfig.text },
261
- ]}>
267
+ <react_native_1.Text style={[styles_1.default.envBadgeText, { color: envConfig.text }]}>
262
268
  {envConfig.label}
263
269
  </react_native_1.Text>
264
270
  </react_native_1.View>
265
- {updateAvailable && (<react_native_1.Pressable hitSlop={10} onPress={() => react_native_1.Alert.alert('Update Available', `react-native-inapp-inspector v${latestNpmVersion} is available on NPM (installed: v${constants_2.LIB_VERSION}).`, [
266
- { text: 'Later', style: 'cancel' },
267
- {
268
- text: 'View on NPM',
269
- onPress: () => react_native_1.Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { }),
270
- },
271
- ])} style={{
271
+ {updateAvailable && (<react_native_1.Pressable hitSlop={10} onPress={() => setShowUpdateModal(true)} style={{
272
+ flexDirection: 'row',
272
273
  alignItems: 'center',
273
- justifyContent: 'center',
274
+ backgroundColor: '#F59E0B',
275
+ borderRadius: 5,
276
+ paddingHorizontal: 5.5,
277
+ paddingVertical: 1.5,
278
+ gap: 3.5,
279
+ shadowColor: '#F59E0B',
280
+ shadowOffset: { width: 0, height: 1.5 },
281
+ shadowOpacity: 0.35,
282
+ shadowRadius: 3,
283
+ elevation: 3,
274
284
  flexShrink: 0,
275
285
  }}>
276
286
  <react_native_1.Animated.View style={{
277
- width: 8,
278
- height: 8,
279
- borderRadius: 4,
280
- backgroundColor: AppColors_1.AppColors.liveGreen,
281
- borderWidth: 1,
282
- borderColor: `${AppColors_1.AppColors.white}E6`,
287
+ width: 5,
288
+ height: 5,
289
+ borderRadius: 2.5,
290
+ backgroundColor: '#FFFFFF',
283
291
  opacity: activePulseAnim,
284
292
  transform: [{ scale: unreadPulseAnim }],
285
293
  }}/>
294
+ <react_native_1.Text style={{
295
+ fontFamily: AppFonts_1.AppFonts.interBold,
296
+ fontSize: 9,
297
+ color: '#FFFFFF',
298
+ letterSpacing: 0.3,
299
+ }}>
300
+ UPDATE ⚡
301
+ </react_native_1.Text>
286
302
  </react_native_1.Pressable>)}
287
303
  </react_native_1.View>
288
304
 
289
- {/* OS & NPM Version Representation */}
305
+ {/* OS & NPM Version Common Chip Bar */}
290
306
  <react_native_1.View style={{
291
307
  flexDirection: 'row',
292
308
  alignItems: 'center',
293
309
  gap: 5,
294
310
  minWidth: 0,
295
311
  }}>
312
+ {/* Unified Platform & Build Chip */}
296
313
  <react_native_1.View style={{
297
314
  flexDirection: 'row',
298
315
  alignItems: 'center',
299
- backgroundColor: `${AppColors_1.AppColors.white}1F`,
300
- borderRadius: 5,
301
- paddingHorizontal: 6,
302
- paddingVertical: 2,
303
- gap: 4,
316
+ backgroundColor: 'rgba(255, 255, 255, 0.16)',
317
+ borderRadius: 6,
318
+ paddingHorizontal: 6.5,
319
+ paddingVertical: 2.5,
320
+ gap: 4.5,
304
321
  borderWidth: 1,
305
- borderColor: `${AppColors_1.AppColors.white}2E`,
322
+ borderColor: 'rgba(255, 255, 255, 0.28)',
306
323
  flexShrink: 0,
307
324
  }}>
308
- {react_native_1.Platform.OS === 'ios' ? (<NetworkIcons_1.AppleIcon color={`${AppColors_1.AppColors.white}E6`} size={10}/>) : (<NetworkIcons_1.AndroidIcon color={`${AppColors_1.AppColors.white}E6`} size={10}/>)}
325
+ {react_native_1.Platform.OS === 'ios' ? (<NetworkIcons_1.AppleIcon color="#FFFFFF" size={10.5}/>) : (<NetworkIcons_1.AndroidIcon color="#FFFFFF" size={10.5}/>)}
309
326
  <react_native_1.Text style={{
310
- fontFamily: AppFonts_1.AppFonts.interMedium,
327
+ fontFamily: AppFonts_1.AppFonts.interBold,
311
328
  fontSize: 9.5,
312
- color: `${AppColors_1.AppColors.white}EB`,
329
+ color: '#FFFFFF',
313
330
  letterSpacing: 0.1,
314
331
  }} numberOfLines={1}>
315
332
  {react_native_1.Platform.OS === 'ios'
316
- ? `iOS ${react_native_1.Platform.Version}`
317
- : `Android ${react_native_1.Platform.Version}`}
333
+ ? `iOS ${String(deviceInfo?.osVersion || react_native_1.Platform.Version).replace(/^(ios\s*)+/i, '').trim()}${deviceInfo?.buildNumber || deviceInfo?.appVersion
334
+ ? ` (${deviceInfo.buildNumber || deviceInfo.appVersion})`
335
+ : ''}`
336
+ : `Android ${String(deviceInfo?.osVersion || react_native_1.Platform.Version).replace(/^(android\s*)+/i, '').trim()}${deviceInfo?.buildNumber || deviceInfo?.appVersion
337
+ ? ` (${deviceInfo.buildNumber || deviceInfo.appVersion})`
338
+ : ''}`}
318
339
  </react_native_1.Text>
319
340
  </react_native_1.View>
320
341
 
321
- <react_native_1.Pressable onPress={() => react_native_1.Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { })} style={{
322
- backgroundColor: '#FFFFFF',
323
- borderRadius: 5,
324
- paddingHorizontal: 6,
325
- paddingVertical: 2,
342
+ {/* Unified NPM Version Chip */}
343
+ <react_native_1.Pressable onPress={() => {
344
+ if (updateAvailable) {
345
+ setShowUpdateModal(true);
346
+ }
347
+ else {
348
+ react_native_1.Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { });
349
+ }
350
+ }} style={{
351
+ backgroundColor: 'rgba(255, 255, 255, 0.16)',
352
+ borderRadius: 6,
353
+ paddingHorizontal: 6.5,
354
+ paddingVertical: 2.5,
326
355
  flexDirection: 'row',
327
356
  alignItems: 'center',
328
357
  gap: 4,
358
+ borderWidth: 1,
359
+ borderColor: 'rgba(255, 255, 255, 0.28)',
329
360
  flexShrink: 0,
330
- shadowColor: '#000000',
331
- shadowOffset: { width: 0, height: 1 },
332
- shadowOpacity: 0.15,
333
- shadowRadius: 2,
334
- elevation: 2,
335
361
  }}>
336
- <NetworkIcons_1.NpmIcon size={11} color="#CB3837"/>
362
+ <NetworkIcons_1.NpmIcon size={11} color="#FF6B6B"/>
337
363
  <react_native_1.Text style={{
338
364
  fontFamily: AppFonts_1.AppFonts.interBold,
339
365
  fontSize: 9.5,
340
- color: '#CB3837',
341
- letterSpacing: 0.2,
366
+ color: '#FFFFFF',
367
+ letterSpacing: 0.15,
342
368
  }} numberOfLines={1}>
343
369
  v{constants_2.LIB_VERSION}
344
370
  </react_native_1.Text>
371
+ {updateAvailable && (<react_native_1.Text style={{
372
+ fontFamily: AppFonts_1.AppFonts.interBold,
373
+ fontSize: 9,
374
+ color: '#F59E0B',
375
+ }}>
376
+
377
+ </react_native_1.Text>)}
345
378
  </react_native_1.Pressable>
346
379
 
347
380
  {isTelemetryActive && (<react_native_1.Pressable onPress={() => react_native_1.Alert.alert('Anonymous Telemetry Active', 'Anonymous diagnostics (such as React Native version, JavaScript engine, and device model) are currently enabled to help improve library tooling.\n\nNo user data or network payloads are captured. You can toggle this anytime in Settings.', [{ text: 'Got it' }])} style={{
@@ -482,9 +515,7 @@ const InspectorHeader = react_1.default.memo(() => {
482
515
  },
483
516
  ]}>
484
517
  <react_native_1.Text style={styles_1.default.headerMethodText}>
485
- {selectedEvent.source === 'firebase'
486
- ? 'FB'
487
- : 'MAN'}
518
+ {selectedEvent.source === 'firebase' ? 'FB' : 'MAN'}
488
519
  </react_native_1.Text>
489
520
  </react_native_1.View>
490
521
  <react_native_1.Text style={styles_1.default.headerDetailTitle} numberOfLines={1} ellipsizeMode="middle">
@@ -527,9 +558,7 @@ const InspectorHeader = react_1.default.memo(() => {
527
558
  </react_native_1.View>
528
559
  <react_native_1.Text style={styles_1.default.headerDetailTitle} numberOfLines={1} ellipsizeMode="middle">
529
560
  console.
530
- {(selectedLog.sourceMethod) ||
531
- selectedLog.type ||
532
- 'log'}
561
+ {selectedLog.sourceMethod || selectedLog.type || 'log'}
533
562
  </react_native_1.Text>
534
563
  </react_native_1.View>
535
564
  <react_native_1.View style={styles_1.default.headerDetailSubRow}>
@@ -542,10 +571,10 @@ const InspectorHeader = react_1.default.memo(() => {
542
571
  borderRadius: 20,
543
572
  backgroundColor: `${AppColors_1.AppColors.white}29`,
544
573
  }}>
545
- <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.white} size={11}/>
546
- <react_native_1.Text style={styles_1.default.headerSubTitle}>
547
- {(0, helpers_1.formatTime)(selectedLog.timestamp)}
548
- </react_native_1.Text>
574
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.white} size={11}/>
575
+ <react_native_1.Text style={styles_1.default.headerSubTitle}>
576
+ {(0, helpers_1.formatTime)(selectedLog.timestamp)}
577
+ </react_native_1.Text>
549
578
  </react_native_1.View>
550
579
  </react_native_1.View>
551
580
  </react_native_1.View>) : activeTab === 'redux' && selectedReduxSlice != null ? ((() => {
@@ -565,9 +594,7 @@ const InspectorHeader = react_1.default.memo(() => {
565
594
  backgroundColor: `${AppColors_1.AppColors.purple}4D`,
566
595
  },
567
596
  ]}>
568
- <react_native_1.Text style={styles_1.default.headerMethodText}>
569
- SLICE
570
- </react_native_1.Text>
597
+ <react_native_1.Text style={styles_1.default.headerMethodText}>SLICE</react_native_1.Text>
571
598
  </react_native_1.View>
572
599
  <react_native_1.Text style={styles_1.default.headerDetailTitle} numberOfLines={1} ellipsizeMode="middle">
573
600
  {selectedReduxSlice}
@@ -578,20 +605,26 @@ const InspectorHeader = react_1.default.memo(() => {
578
605
  styles_1.default.headerStatusDot,
579
606
  { backgroundColor: AppColors_1.AppColors.liveGreen },
580
607
  ]}/>
581
- <react_native_1.Text style={styles_1.default.headerSubTitle}>
582
- Live
608
+ <react_native_1.Text style={styles_1.default.headerSubTitle}>Live</react_native_1.Text>
609
+ <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>
610
+
583
611
  </react_native_1.Text>
584
- <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>•</react_native_1.Text>
585
612
  <react_native_1.Text style={styles_1.default.headerSubTitle}>
586
613
  {keyCount} keys
587
614
  </react_native_1.Text>
588
- <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>•</react_native_1.Text>
589
- <react_native_1.Text style={styles_1.default.headerSubTitle}>
590
- {sliceSize}
615
+ <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>
616
+
591
617
  </react_native_1.Text>
618
+ <react_native_1.Text style={styles_1.default.headerSubTitle}>{sliceSize}</react_native_1.Text>
592
619
  {lastAction?.timestamp && (<>
593
- <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>•</react_native_1.Text>
594
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3 }}>
620
+ <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>
621
+
622
+ </react_native_1.Text>
623
+ <react_native_1.View style={{
624
+ flexDirection: 'row',
625
+ alignItems: 'center',
626
+ gap: 3,
627
+ }}>
595
628
  <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.white} size={10}/>
596
629
  <react_native_1.Text style={styles_1.default.headerSubTitle}>
597
630
  {lastAction.timestamp}
@@ -608,9 +641,7 @@ const InspectorHeader = react_1.default.memo(() => {
608
641
  backgroundColor: `${AppColors_1.AppColors.brandPurple}4D`,
609
642
  },
610
643
  ]}>
611
- <react_native_1.Text style={styles_1.default.headerMethodText}>
612
- ACTION
613
- </react_native_1.Text>
644
+ <react_native_1.Text style={styles_1.default.headerMethodText}>ACTION</react_native_1.Text>
614
645
  </react_native_1.View>
615
646
  <react_native_1.Text style={styles_1.default.headerDetailTitle} numberOfLines={1} ellipsizeMode="middle">
616
647
  {selectedReduxAction.type}
@@ -636,7 +667,9 @@ const InspectorHeader = react_1.default.memo(() => {
636
667
  },
637
668
  ]}>
638
669
  <react_native_1.Text style={styles_1.default.headerMethodText}>
639
- {selectedCrash.isFatal ? 'FATAL' : selectedCrash.type.toUpperCase()}
670
+ {selectedCrash.isFatal
671
+ ? 'FATAL'
672
+ : selectedCrash.type.toUpperCase()}
640
673
  </react_native_1.Text>
641
674
  </react_native_1.View>
642
675
  <react_native_1.Text style={styles_1.default.headerDetailTitle} numberOfLines={1} ellipsizeMode="middle">
@@ -653,10 +686,13 @@ const InspectorHeader = react_1.default.memo(() => {
653
686
  },
654
687
  ]}/>
655
688
  <react_native_1.Text style={styles_1.default.headerSubTitle}>
656
- {selectedCrash.timeStr || new Date(selectedCrash.timestamp).toLocaleTimeString()}
689
+ {selectedCrash.timeStr ||
690
+ new Date(selectedCrash.timestamp).toLocaleTimeString()}
657
691
  </react_native_1.Text>
658
692
  {selectedCrash.deviceInfo?.platform && (<>
659
- <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>•</react_native_1.Text>
693
+ <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>
694
+
695
+ </react_native_1.Text>
660
696
  <react_native_1.Text style={styles_1.default.headerSubTitle}>
661
697
  {selectedCrash.deviceInfo.platform.toUpperCase()}
662
698
  </react_native_1.Text>
@@ -728,6 +764,10 @@ const InspectorHeader = react_1.default.memo(() => {
728
764
  </react_native_1.View>
729
765
  </react_native_1.View>
730
766
  </react_native_1.View>
731
- </react_native_linear_gradient_1.default>);
767
+ </react_native_linear_gradient_1.default>
768
+
769
+ {/* Dedicated Update Available Details Modal */}
770
+ <UpdateAvailableModal_1.UpdateAvailableModal visible={showUpdateModal} latestVersion={latestNpmVersion} onClose={() => setShowUpdateModal(false)}/>
771
+ </>);
732
772
  });
733
773
  exports.default = InspectorHeader;
@@ -55,6 +55,9 @@ const BundleTab_1 = __importDefault(require("./BundleTab"));
55
55
  const PerformanceTab_1 = __importDefault(require("./PerformanceTab"));
56
56
  const CrashTab_1 = __importDefault(require("./CrashTab"));
57
57
  const CrashDetail_1 = __importDefault(require("./CrashDetail"));
58
+ const StorageTab_1 = __importDefault(require("./StorageTab"));
59
+ const DeviceTab_1 = __importDefault(require("./DeviceTab"));
60
+ const AuditTab_1 = __importDefault(require("./AuditTab"));
58
61
  const SettingsPanel_1 = __importDefault(require("./SettingsPanel"));
59
62
  const TelemetryConsentModal_1 = __importDefault(require("./TelemetryConsentModal"));
60
63
  const NpmUpdateToast_1 = __importDefault(require("./NpmUpdateToast"));
@@ -62,8 +65,9 @@ const Toast_1 = __importDefault(require("../Toast"));
62
65
  const styles_1 = __importDefault(require("../../styles"));
63
66
  const AppColors_1 = require("../../styles/AppColors");
64
67
  const NavigationTracker_1 = __importDefault(require("./NavigationTracker"));
68
+ const PerformanceHud_1 = __importDefault(require("./PerformanceHud"));
65
69
  const MainScreen = () => {
66
- const { visible, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
70
+ const { visible, setVisible, switchActiveTab, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, isPerformanceHudEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
67
71
  const isDetailActive = (activeTab === 'apis' && selected != null) ||
68
72
  (activeTab === 'analytics' && selectedEvent != null) ||
69
73
  (activeTab === 'logs' && selectedLog != null) ||
@@ -104,9 +108,16 @@ const MainScreen = () => {
104
108
  }).start();
105
109
  }, [activeTab]);
106
110
  return (<>
107
- {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') &&
111
+ <react_native_1.View pointerEvents="box-none" style={react_native_1.StyleSheet.absoluteFillObject}>
112
+ {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') &&
108
113
  isEnabled &&
114
+ !visible &&
109
115
  !useNativeFab && <FabLauncher_1.default />}
116
+ {isEnabled && !visible && isPerformanceHudEnabled && (<PerformanceHud_1.default visible={true} onPress={() => {
117
+ setVisible(true);
118
+ switchActiveTab('performance');
119
+ }}/>)}
120
+ </react_native_1.View>
110
121
  <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent statusBarTranslucent={true}>
111
122
  {visible && (<ErrorBoundary_1.default onClose={closeModal}>
112
123
  <react_native_1.View style={styles_1.default.modalBackdrop}>
@@ -150,6 +161,9 @@ const MainScreen = () => {
150
161
  {activeTab === 'logs' && <ConsoleTab_1.default />}
151
162
  {activeTab === 'analytics' && <AnalyticsTab_1.default />}
152
163
  {activeTab === 'redux' && <ReduxTab_1.default />}
164
+ {activeTab === 'storage' && <StorageTab_1.default />}
165
+ {activeTab === 'device' && <DeviceTab_1.default />}
166
+ {activeTab === 'audit' && <AuditTab_1.default />}
153
167
  {activeTab === 'bundle' && <BundleTab_1.default />}
154
168
  {activeTab === 'performance' && <PerformanceTab_1.default />}
155
169
  {activeTab === 'crash' && <CrashTab_1.default />}
@@ -22,8 +22,10 @@ const AppFonts_1 = require("../../styles/AppFonts");
22
22
  const constants_1 = require("../../constants");
23
23
  const helpers_1 = require("../../helpers");
24
24
  const NetworkIcons_1 = require("../NetworkIcons");
25
+ const RequestReplayView_1 = __importDefault(require("./RequestReplayView"));
25
26
  const NetworkDetail = react_1.default.memo(() => {
26
27
  const { t } = (0, i18n_1.useTranslation)();
28
+ const [isReplayScreenActive, setIsReplayScreenActive] = react_1.default.useState(false);
27
29
  const { selected, detailDisplayUrl, apiDetailActiveTab, setApiDetailActiveTab, detailSearch, setDetailSearch, reqExpanded, setReqExpanded, resExpanded, setResExpanded, showReqDiff, setShowReqDiff, showResDiff, setShowResDiff, prevRequestData, prevResponseData, logRouteMapRef, } = (0, InspectorContext_1.useInspector)();
28
30
  const handleOpenUrl = () => {
29
31
  react_native_1.Alert.alert(t('common.openInBrowser') || 'Open in Browser', `${t('common.openInBrowserPrompt') || 'Are you sure you want to open this URL in your external browser?'}\n\n${detailDisplayUrl}`, [
@@ -47,6 +49,9 @@ const NetworkDetail = react_1.default.memo(() => {
47
49
  };
48
50
  if (!selected)
49
51
  return null;
52
+ if (isReplayScreenActive) {
53
+ return (<RequestReplayView_1.default request={selected} onBack={() => setIsReplayScreenActive(false)}/>);
54
+ }
50
55
  return (<react_native_1.View style={{ flex: 1 }}>
51
56
  {/* Non-scrollable details header */}
52
57
  <react_native_1.View style={{ paddingHorizontal: 6, paddingTop: 4 }}>
@@ -252,6 +257,16 @@ const NetworkDetail = react_1.default.memo(() => {
252
257
  </react_native_1.View>
253
258
 
254
259
  <react_native_1.View style={styles_1.default.detailInfoRight}>
260
+ <TouchableScale_1.default style={[
261
+ styles_1.default.iconSquareBtn,
262
+ {
263
+ backgroundColor: `${AppColors_1.AppColors.purple}15`,
264
+ borderColor: `${AppColors_1.AppColors.purple}30`,
265
+ borderWidth: 1,
266
+ },
267
+ ]} onPress={() => setIsReplayScreenActive(true)} accessible={true} accessibilityRole="button" accessibilityLabel="Edit & Resend Request" hitSlop={12}>
268
+ <NetworkIcons_1.ReplayIcon color={AppColors_1.AppColors.purple} size={14}/>
269
+ </TouchableScale_1.default>
255
270
  <TouchableScale_1.default style={[styles_1.default.iconSquareBtn, { backgroundColor: `${AppColors_1.AppColors.sky600}15` }]} onPress={handleOpenUrl} hitSlop={12}>
256
271
  <NetworkIcons_1.ExternalLinkIcon color={AppColors_1.AppColors.sky600} size={14}/>
257
272
  </TouchableScale_1.default>