react-native-inapp-inspector 2.0.0 → 2.0.1

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 (63) hide show
  1. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +10 -24
  2. package/dist/commonjs/components/ConsoleLogCard.js +5 -5
  3. package/dist/commonjs/components/EndOfListFooter.js +1 -1
  4. package/dist/commonjs/components/Inspector/AnalyticsTab.js +19 -71
  5. package/dist/commonjs/components/Inspector/BundleTab.js +670 -188
  6. package/dist/commonjs/components/Inspector/ConsoleTab.js +109 -98
  7. package/dist/commonjs/components/Inspector/CrashTab.js +2 -1
  8. package/dist/commonjs/components/Inspector/InspectorHeader.js +102 -19
  9. package/dist/commonjs/components/Inspector/MainScreen.js +147 -17
  10. package/dist/commonjs/components/Inspector/NetworkTab.js +104 -20
  11. package/dist/commonjs/components/Inspector/SettingsPanel.js +1111 -1385
  12. package/dist/commonjs/components/Inspector/TabBar.js +3 -4
  13. package/dist/commonjs/components/JsonViewer.js +9 -4
  14. package/dist/commonjs/components/LogCard.js +31 -1
  15. package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
  16. package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
  17. package/dist/commonjs/components/NetworkIcons.d.ts +2 -0
  18. package/dist/commonjs/components/NetworkIcons.js +10 -1
  19. package/dist/commonjs/components/Slider.d.ts +13 -0
  20. package/dist/commonjs/components/Slider.js +261 -0
  21. package/dist/commonjs/constants/version.d.ts +1 -1
  22. package/dist/commonjs/constants/version.js +1 -1
  23. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  24. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  25. package/dist/commonjs/helpers/index.d.ts +1 -0
  26. package/dist/commonjs/helpers/index.js +15 -0
  27. package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
  28. package/dist/commonjs/helpers/searchQueryParser.js +236 -0
  29. package/dist/commonjs/helpers/settingsStore.js +13 -13
  30. package/dist/commonjs/index.js +7 -20
  31. package/dist/commonjs/styles/index.js +35 -35
  32. package/dist/esm/components/ConsoleLogCard.js +5 -5
  33. package/dist/esm/components/EndOfListFooter.js +2 -2
  34. package/dist/esm/components/Inspector/AnalyticsTab.js +21 -73
  35. package/dist/esm/components/Inspector/BundleTab.js +670 -188
  36. package/dist/esm/components/Inspector/ConsoleTab.js +110 -99
  37. package/dist/esm/components/Inspector/CrashTab.js +2 -1
  38. package/dist/esm/components/Inspector/InspectorHeader.js +103 -20
  39. package/dist/esm/components/Inspector/MainScreen.js +115 -18
  40. package/dist/esm/components/Inspector/NetworkTab.js +105 -21
  41. package/dist/esm/components/Inspector/SettingsPanel.js +1114 -1388
  42. package/dist/esm/components/Inspector/TabBar.js +4 -5
  43. package/dist/esm/components/JsonViewer.js +9 -4
  44. package/dist/esm/components/LogCard.js +32 -2
  45. package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
  46. package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
  47. package/dist/esm/components/NetworkIcons.d.ts +2 -0
  48. package/dist/esm/components/NetworkIcons.js +7 -0
  49. package/dist/esm/components/Slider.d.ts +13 -0
  50. package/dist/esm/components/Slider.js +222 -0
  51. package/dist/esm/constants/version.d.ts +1 -1
  52. package/dist/esm/constants/version.js +1 -1
  53. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  54. package/dist/esm/customHooks/crashHandler.js +1 -1
  55. package/dist/esm/helpers/index.d.ts +1 -0
  56. package/dist/esm/helpers/index.js +1 -0
  57. package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
  58. package/dist/esm/helpers/searchQueryParser.js +233 -0
  59. package/dist/esm/helpers/settingsStore.js +13 -13
  60. package/dist/esm/index.js +8 -21
  61. package/dist/esm/styles/index.js +35 -35
  62. package/ios/NetworkInspectorModule.m +81 -41
  63. package/package.json +1 -1
@@ -645,7 +645,6 @@ class InAppInspectorFloatingView(
645
645
  private var touchDownY = 0f
646
646
  private var touchDownTime = 0L
647
647
  private var isDragging = false
648
- private val badgeView: android.view.View
649
648
 
650
649
  init {
651
650
  val density = context.resources.displayMetrics.density
@@ -823,28 +822,10 @@ class InAppInspectorFloatingView(
823
822
  isFocusable = false
824
823
  }
825
824
  addView(iconView, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
826
-
827
- // 3. Status Badge Dot (Top-Right)
828
- val badgeSize = (10f * density).toInt()
829
- badgeView = android.view.View(context).apply {
830
- val badgeDrawable = android.graphics.drawable.GradientDrawable().apply {
831
- shape = android.graphics.drawable.GradientDrawable.OVAL
832
- setColor(android.graphics.Color.parseColor("#22C55E"))
833
- setStroke((1.5f * density).toInt(), android.graphics.Color.parseColor("#0F172A"))
834
- }
835
- background = badgeDrawable
836
- visibility = GONE
837
- }
838
- val badgeParams = LayoutParams(badgeSize, badgeSize).apply {
839
- gravity = android.view.Gravity.TOP or android.view.Gravity.END
840
- topMargin = (4f * density).toInt()
841
- rightMargin = (4f * density).toInt()
842
- }
843
- addView(badgeView, badgeParams)
844
825
  }
845
826
 
846
827
  fun setBadgeVisible(visible: Boolean) {
847
- badgeView.visibility = if (visible) VISIBLE else GONE
828
+ // Active badge dot removed
848
829
  }
849
830
 
850
831
  override fun onTouchEvent(event: android.view.MotionEvent): Boolean {
@@ -867,7 +848,8 @@ class InAppInspectorFloatingView(
867
848
  val dx = event.rawX - touchDownX
868
849
  val dy = event.rawY - touchDownY
869
850
 
870
- if (!isDragging && Math.hypot(dx.toDouble(), dy.toDouble()) > 8 * density) {
851
+ val dist = Math.hypot(dx.toDouble(), dy.toDouble())
852
+ if (!isDragging && dist > 16 * density) {
871
853
  isDragging = true
872
854
  }
873
855
 
@@ -882,12 +864,12 @@ class InAppInspectorFloatingView(
882
864
  }
883
865
  return true
884
866
  }
885
- android.view.MotionEvent.ACTION_UP, android.view.MotionEvent.ACTION_CANCEL -> {
886
- animate().scaleX(1.0f).scaleY(1.0f).setDuration(120).start()
867
+ android.view.MotionEvent.ACTION_UP -> {
868
+ animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start()
887
869
  val elapsed = System.currentTimeMillis() - touchDownTime
888
870
  val totalDist = Math.hypot((event.rawX - touchDownX).toDouble(), (event.rawY - touchDownY).toDouble())
889
871
 
890
- if (!isDragging && totalDist < 12 * density && elapsed < 350) {
872
+ if (!isDragging && totalDist < 24 * density && elapsed < 850) {
891
873
  onTap()
892
874
  } else if (isDragging) {
893
875
  // Smooth native snap to nearest horizontal side
@@ -898,6 +880,10 @@ class InAppInspectorFloatingView(
898
880
  }
899
881
  return true
900
882
  }
883
+ android.view.MotionEvent.ACTION_CANCEL -> {
884
+ animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start()
885
+ return true
886
+ }
901
887
  }
902
888
  return super.onTouchEvent(event)
903
889
  }
@@ -10,8 +10,8 @@ const react_native_1 = require("react-native");
10
10
  const AppColors_1 = require("../styles/AppColors");
11
11
  const AppFonts_1 = require("../styles/AppFonts");
12
12
  const helpers_1 = require("../helpers");
13
- const HighlightText_1 = __importDefault(require("./HighlightText"));
14
13
  const CopyButton_1 = __importDefault(require("./CopyButton"));
14
+ const LogSyntaxHighlighter_1 = __importDefault(require("./LogSyntaxHighlighter"));
15
15
  const NetworkIcons_1 = require("./NetworkIcons");
16
16
  const InspectorContext_1 = require("./Inspector/InspectorContext");
17
17
  const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle, numberOfLines) => {
@@ -79,10 +79,10 @@ const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle,
79
79
  </react_native_1.View>);
80
80
  })}
81
81
  </react_native_1.View>
82
- <HighlightText_1.default text={remainingText} search={searchStr} style={textStyle} highlightStyle={highlightStyle} numberOfLines={numberOfLines} detectLinks={true}/>
82
+ <LogSyntaxHighlighter_1.default text={remainingText} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>
83
83
  </react_native_1.View>);
84
84
  }
85
- return (<HighlightText_1.default text={message} search={searchStr} style={textStyle} highlightStyle={highlightStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
85
+ return (<LogSyntaxHighlighter_1.default text={message} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
86
86
  };
87
87
  exports.ConsoleLogCard = react_1.default.memo(function ConsoleLogCard({ item, searchStr = '', }) {
88
88
  const { setSelectedLog } = (0, InspectorContext_1.useInspector)();
@@ -240,10 +240,10 @@ exports.ConsoleLogCard = react_1.default.memo(function ConsoleLogCard({ item, se
240
240
  {jsonContent ? (<>
241
241
  {jsonContent.header ? (getLogMessageWithBadges(jsonContent.header, searchStr, [styles.messageText, { color: AppColors_1.AppColors.primaryBlack }], styles.highlight, 2)) : null}
242
242
  {jsonPreview && (<react_native_1.View style={styles.jsonPreviewContainer}>
243
- <HighlightText_1.default text={jsonPreview.text} search={searchStr} style={[
243
+ <LogSyntaxHighlighter_1.default text={jsonPreview.text} search={searchStr} style={[
244
244
  styles.jsonPreviewText,
245
245
  { color: AppColors_1.AppColors.primaryBlack },
246
- ]} highlightStyle={styles.highlight} detectLinks={false} numberOfLines={5}/>
246
+ ]} detectLinks={false} numberOfLines={5}/>
247
247
  </react_native_1.View>)}
248
248
  </>) : (getLogMessageWithBadges(item.message, searchStr, [styles.messageText, { color: AppColors_1.AppColors.primaryBlack }], styles.highlight, 3))}
249
249
  </react_native_1.View>
@@ -33,7 +33,7 @@ const styles = react_native_1.StyleSheet.create({
33
33
  justifyContent: 'center',
34
34
  paddingHorizontal: 16,
35
35
  paddingTop: 16,
36
- paddingBottom: 28,
36
+ paddingBottom: react_native_1.Platform.OS === 'ios' ? 44 : 32,
37
37
  gap: 8,
38
38
  },
39
39
  dividerLine: {
@@ -40,7 +40,6 @@ const react_1 = __importStar(require("react"));
40
40
  const react_native_1 = require("react-native");
41
41
  const InspectorContext_1 = require("./InspectorContext");
42
42
  const AnalyticsEventCard_1 = __importDefault(require("../AnalyticsEventCard"));
43
- const AnalyticsDetail_1 = __importDefault(require("../AnalyticsDetail"));
44
43
  const AnalyticsFilterModal_1 = __importDefault(require("./AnalyticsFilterModal"));
45
44
  const EndOfListFooter_1 = __importDefault(require("../EndOfListFooter"));
46
45
  const styles_1 = __importDefault(require("../../styles"));
@@ -161,16 +160,25 @@ const AnalyticsHeader = react_1.default.memo(() => {
161
160
  return { ...prev, categories: nextCategories };
162
161
  });
163
162
  };
164
- // 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (-30m / 30s to NOW)
163
+ // 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (60s live rolling stream)
165
164
  const BUCKET_COUNT = 12;
166
165
  const chartHeight = 64;
167
166
  const svgWidth = 320;
168
167
  const [selectedBucketIdx, setSelectedBucketIdx] = (0, react_1.useState)(null);
168
+ const [liveTick, setLiveTick] = (0, react_1.useState)(0);
169
+ (0, react_1.useEffect)(() => {
170
+ if (!isTrackingEnabled)
171
+ return;
172
+ const interval = setInterval(() => {
173
+ setLiveTick(t => (t + 1) % 100000);
174
+ }, 1000);
175
+ return () => clearInterval(interval);
176
+ }, [isTrackingEnabled]);
169
177
  const histogramData = (0, react_1.useMemo)(() => {
170
178
  const buckets = [];
171
179
  const now = Date.now();
172
- const windowMs = 60000; // 60s window
173
- const bucketDuration = windowMs / BUCKET_COUNT;
180
+ const windowMs = 60000; // 60s live rolling window
181
+ const bucketDuration = windowMs / BUCKET_COUNT; // 5s per bucket
174
182
  for (let i = 0; i < BUCKET_COUNT; i++) {
175
183
  const bucketAgeSec = Math.round(((BUCKET_COUNT - 1 - i) * bucketDuration) / 1000);
176
184
  buckets.push({
@@ -235,7 +243,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
235
243
  peakVal,
236
244
  eventRate,
237
245
  };
238
- }, [filteredAnalyticsEvents, chartHeight, svgWidth, t]);
246
+ }, [filteredAnalyticsEvents, chartHeight, svgWidth, liveTick, t]);
239
247
  const selectedBucket = selectedBucketIdx != null ? histogramData.buckets[selectedBucketIdx] : null;
240
248
  return (<react_native_1.View style={styles_1.default.analyticsHeaderCard}>
241
249
  {/* ── 1. Top Header Row (GA4 Style) ─────────────────────────────────── */}
@@ -307,7 +315,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
307
315
  }}/>)}
308
316
  </react_native_1.View>
309
317
 
310
- {/* Multi-Select Category Buttons with Checkboxes */}
318
+ {/* Multi-Select Category Buttons */}
311
319
  <react_native_1.View style={{
312
320
  flexDirection: 'row',
313
321
  flexWrap: 'wrap',
@@ -336,18 +344,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
336
344
  elevation: 2,
337
345
  },
338
346
  ]}>
339
- <react_native_1.View style={{
340
- width: 12,
341
- height: 12,
342
- borderRadius: 3,
343
- borderWidth: 1.2,
344
- borderColor: isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo400,
345
- backgroundColor: isAllSelected ? AppColors_1.AppColors.white : 'transparent',
346
- alignItems: 'center',
347
- justifyContent: 'center',
348
- }}>
349
- {isAllSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.indigo600Alt} size={8}/>}
350
- </react_native_1.View>
351
347
  <NetworkIcons_1.LayersIcon color={isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo600Alt} size={11}/>
352
348
  <react_native_1.Text style={{
353
349
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -383,18 +379,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
383
379
  elevation: 2,
384
380
  },
385
381
  ]}>
386
- <react_native_1.View style={{
387
- width: 12,
388
- height: 12,
389
- borderRadius: 3,
390
- borderWidth: 1.2,
391
- borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber500,
392
- backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
393
- alignItems: 'center',
394
- justifyContent: 'center',
395
- }}>
396
- {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.amber600} size={8}/>}
397
- </react_native_1.View>
398
382
  <NetworkIcons_1.CartIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber700} size={11}/>
399
383
  <react_native_1.Text style={{
400
384
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -430,18 +414,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
430
414
  elevation: 2,
431
415
  },
432
416
  ]}>
433
- <react_native_1.View style={{
434
- width: 12,
435
- height: 12,
436
- borderRadius: 3,
437
- borderWidth: 1.2,
438
- borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky400,
439
- backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
440
- alignItems: 'center',
441
- justifyContent: 'center',
442
- }}>
443
- {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.sky600} size={8}/>}
444
- </react_native_1.View>
445
417
  <NetworkIcons_1.GlobeIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky600} size={11}/>
446
418
  <react_native_1.Text style={{
447
419
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -477,18 +449,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
477
449
  elevation: 2,
478
450
  },
479
451
  ]}>
480
- <react_native_1.View style={{
481
- width: 12,
482
- height: 12,
483
- borderRadius: 3,
484
- borderWidth: 1.2,
485
- borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple400,
486
- backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
487
- alignItems: 'center',
488
- justifyContent: 'center',
489
- }}>
490
- {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.violet600} size={8}/>}
491
- </react_native_1.View>
492
452
  <NetworkIcons_1.BoltIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>
493
453
  <react_native_1.Text style={{
494
454
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -524,18 +484,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
524
484
  elevation: 2,
525
485
  },
526
486
  ]}>
527
- <react_native_1.View style={{
528
- width: 12,
529
- height: 12,
530
- borderRadius: 3,
531
- borderWidth: 1.2,
532
- borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.pink400,
533
- backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
534
- alignItems: 'center',
535
- justifyContent: 'center',
536
- }}>
537
- {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.pink600} size={8}/>}
538
- </react_native_1.View>
539
487
  <NetworkIcons_1.SparkleIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.brandPurple} size={11}/>
540
488
  <react_native_1.Text style={{
541
489
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -731,7 +679,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
731
679
  </react_native_1.View>
732
680
  </react_native_1.View>)}
733
681
 
734
- {/* Timeline Axis Labels */}
682
+ {/* Timeline Axis Labels (60s Realtime Rolling Stream) */}
735
683
  <react_native_1.View style={{
736
684
  flexDirection: 'row',
737
685
  justifyContent: 'space-between',
@@ -743,21 +691,21 @@ const AnalyticsHeader = react_1.default.memo(() => {
743
691
  fontSize: 8.5,
744
692
  color: AppColors_1.AppColors.grayTextWeak,
745
693
  }}>
746
- {t('analytics.time30mAgo')}
694
+ -60s
747
695
  </react_native_1.Text>
748
696
  <react_native_1.Text style={{
749
697
  fontFamily: AppFonts_1.AppFonts.interMedium,
750
698
  fontSize: 8.5,
751
699
  color: AppColors_1.AppColors.grayTextWeak,
752
700
  }}>
753
- {t('analytics.time20mAgo')}
701
+ -40s
754
702
  </react_native_1.Text>
755
703
  <react_native_1.Text style={{
756
704
  fontFamily: AppFonts_1.AppFonts.interMedium,
757
705
  fontSize: 8.5,
758
706
  color: AppColors_1.AppColors.grayTextWeak,
759
707
  }}>
760
- {t('analytics.time10mAgo')}
708
+ -20s
761
709
  </react_native_1.Text>
762
710
  <react_native_1.Text style={{
763
711
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -997,7 +945,7 @@ const AnalyticsTab = react_1.default.memo(() => {
997
945
  <AnalyticsFilterModal_1.default visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)}/>
998
946
 
999
947
  <react_native_1.View style={{ flex: 1 }} onLayout={() => setIsAnalyticsLayoutReady(true)}>
1000
- {selectedEvent != null ? (<AnalyticsDetail_1.default event={selectedEvent}/>) : isAnalyticsLayoutReady ? (<react_native_1.FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<react_native_1.View style={styles_1.default.emptyContainer}>
948
+ {isAnalyticsLayoutReady ? (<react_native_1.FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<react_native_1.View style={styles_1.default.emptyContainer}>
1001
949
  <react_native_1.View style={styles_1.default.emptyIconWrap}>
1002
950
  <NetworkIcons_1.EmptyRadarIcon color={AppColors_1.AppColors.purple} size={32}/>
1003
951
  </react_native_1.View>