react-native-inapp-inspector 2.0.0 → 2.0.2

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 (95) hide show
  1. package/README.md +10 -0
  2. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  3. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  4. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  5. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  6. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  7. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  8. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  9. package/android/.gradle/8.9/gc.properties +0 -0
  10. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  11. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  12. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  13. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  14. package/android/.gradle/9.2.0/gc.properties +0 -0
  15. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  16. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  17. package/android/.gradle/vcs-1/gc.properties +0 -0
  18. package/android/build/reports/problems/problems-report.html +659 -0
  19. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +33 -24
  20. package/dist/commonjs/components/ConsoleLogCard.js +5 -5
  21. package/dist/commonjs/components/EndOfListFooter.js +1 -1
  22. package/dist/commonjs/components/Inspector/AnalyticsTab.js +19 -71
  23. package/dist/commonjs/components/Inspector/BundleTab.js +670 -188
  24. package/dist/commonjs/components/Inspector/ConsoleTab.js +109 -98
  25. package/dist/commonjs/components/Inspector/CrashTab.js +2 -1
  26. package/dist/commonjs/components/Inspector/InspectorHeader.js +102 -19
  27. package/dist/commonjs/components/Inspector/MainScreen.js +151 -17
  28. package/dist/commonjs/components/Inspector/NetworkTab.js +104 -20
  29. package/dist/commonjs/components/Inspector/SettingsPanel.js +1111 -1385
  30. package/dist/commonjs/components/Inspector/TabBar.js +3 -4
  31. package/dist/commonjs/components/Inspector/TelemetryConsentModal.d.ts +3 -0
  32. package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +212 -0
  33. package/dist/commonjs/components/JsonViewer.js +9 -4
  34. package/dist/commonjs/components/LogCard.js +31 -1
  35. package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
  36. package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
  37. package/dist/commonjs/components/NetworkIcons.d.ts +2 -0
  38. package/dist/commonjs/components/NetworkIcons.js +10 -1
  39. package/dist/commonjs/components/Slider.d.ts +13 -0
  40. package/dist/commonjs/components/Slider.js +261 -0
  41. package/dist/commonjs/constants/version.d.ts +1 -1
  42. package/dist/commonjs/constants/version.js +1 -1
  43. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  44. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  45. package/dist/commonjs/helpers/index.d.ts +2 -0
  46. package/dist/commonjs/helpers/index.js +16 -0
  47. package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
  48. package/dist/commonjs/helpers/searchQueryParser.js +236 -0
  49. package/dist/commonjs/helpers/settingsStore.js +13 -13
  50. package/dist/commonjs/helpers/telemetry.d.ts +99 -0
  51. package/dist/commonjs/helpers/telemetry.js +398 -0
  52. package/dist/commonjs/index.d.ts +2 -0
  53. package/dist/commonjs/index.js +30 -21
  54. package/dist/commonjs/native/NativeInspector.d.ts +5 -0
  55. package/dist/commonjs/native/NativeInspector.js +3 -2
  56. package/dist/commonjs/styles/index.js +35 -35
  57. package/dist/esm/components/ConsoleLogCard.js +5 -5
  58. package/dist/esm/components/EndOfListFooter.js +2 -2
  59. package/dist/esm/components/Inspector/AnalyticsTab.js +21 -73
  60. package/dist/esm/components/Inspector/BundleTab.js +670 -188
  61. package/dist/esm/components/Inspector/ConsoleTab.js +110 -99
  62. package/dist/esm/components/Inspector/CrashTab.js +2 -1
  63. package/dist/esm/components/Inspector/InspectorHeader.js +103 -20
  64. package/dist/esm/components/Inspector/MainScreen.js +119 -18
  65. package/dist/esm/components/Inspector/NetworkTab.js +105 -21
  66. package/dist/esm/components/Inspector/SettingsPanel.js +1114 -1388
  67. package/dist/esm/components/Inspector/TabBar.js +4 -5
  68. package/dist/esm/components/Inspector/TelemetryConsentModal.d.ts +3 -0
  69. package/dist/esm/components/Inspector/TelemetryConsentModal.js +175 -0
  70. package/dist/esm/components/JsonViewer.js +9 -4
  71. package/dist/esm/components/LogCard.js +32 -2
  72. package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
  73. package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
  74. package/dist/esm/components/NetworkIcons.d.ts +2 -0
  75. package/dist/esm/components/NetworkIcons.js +7 -0
  76. package/dist/esm/components/Slider.d.ts +13 -0
  77. package/dist/esm/components/Slider.js +222 -0
  78. package/dist/esm/constants/version.d.ts +1 -1
  79. package/dist/esm/constants/version.js +1 -1
  80. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  81. package/dist/esm/customHooks/crashHandler.js +1 -1
  82. package/dist/esm/helpers/index.d.ts +2 -0
  83. package/dist/esm/helpers/index.js +2 -0
  84. package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
  85. package/dist/esm/helpers/searchQueryParser.js +233 -0
  86. package/dist/esm/helpers/settingsStore.js +13 -13
  87. package/dist/esm/helpers/telemetry.d.ts +99 -0
  88. package/dist/esm/helpers/telemetry.js +380 -0
  89. package/dist/esm/index.d.ts +2 -0
  90. package/dist/esm/index.js +20 -21
  91. package/dist/esm/native/NativeInspector.d.ts +5 -0
  92. package/dist/esm/native/NativeInspector.js +3 -2
  93. package/dist/esm/styles/index.js +35 -35
  94. package/ios/{NetworkInspectorModule.m → NetworkInspectorModule.mm} +193 -97
  95. package/package.json +2 -2
@@ -43,10 +43,10 @@ const getRawStyles = (colors) => ({
43
43
  header: {
44
44
  flexDirection: 'row',
45
45
  alignItems: 'center',
46
- paddingHorizontal: 12,
47
- paddingVertical: 10,
46
+ paddingHorizontal: 10,
47
+ paddingVertical: 8,
48
48
  zIndex: 10,
49
- minHeight: 56,
49
+ minHeight: 52,
50
50
  shadowColor: colors.black,
51
51
  shadowOffset: { width: 0, height: 2 },
52
52
  shadowOpacity: 0.08,
@@ -70,7 +70,7 @@ const getRawStyles = (colors) => ({
70
70
  flexDirection: 'row',
71
71
  alignItems: 'center',
72
72
  justifyContent: 'flex-end',
73
- gap: 6,
73
+ gap: 5,
74
74
  },
75
75
  headerTitle: {
76
76
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -172,7 +172,7 @@ const getRawStyles = (colors) => ({
172
172
  fontSize: 12,
173
173
  letterSpacing: 0.2,
174
174
  },
175
- listContent: { paddingBottom: 12 },
175
+ listContent: { paddingBottom: react_native_1.Platform.OS === 'ios' ? 44 : 32 },
176
176
  // #2 — scroll-to-top button, always shown at the bottom right.
177
177
  scrollTopBtn: {
178
178
  position: 'absolute',
@@ -193,9 +193,9 @@ const getRawStyles = (colors) => ({
193
193
  },
194
194
  detailScroll: { flex: 1 },
195
195
  closeButtonSquare: {
196
- width: 32,
197
- height: 32,
198
- borderRadius: 8,
196
+ width: 30,
197
+ height: 30,
198
+ borderRadius: 7,
199
199
  backgroundColor: `${colors.white}2B`,
200
200
  alignItems: 'center',
201
201
  justifyContent: 'center',
@@ -414,12 +414,12 @@ const getRawStyles = (colors) => ({
414
414
  },
415
415
  clearBtn: { padding: 4 },
416
416
  domainHeaderCard: {
417
- marginHorizontal: 12,
418
- marginTop: 12,
417
+ marginHorizontal: 8,
418
+ marginTop: 10,
419
419
  marginBottom: 4,
420
- paddingHorizontal: 12,
421
- paddingVertical: 8,
422
- borderRadius: 10,
420
+ paddingHorizontal: 8,
421
+ paddingVertical: 7,
422
+ borderRadius: 9,
423
423
  backgroundColor: colors.grayBackground,
424
424
  borderWidth: 1,
425
425
  borderColor: colors.grayBorderSecondary,
@@ -441,18 +441,18 @@ const getRawStyles = (colors) => ({
441
441
  flex: 1,
442
442
  minWidth: 0,
443
443
  marginRight: 6,
444
- gap: 8,
444
+ gap: 6,
445
445
  },
446
446
  domainIconWrap: {
447
- width: 26,
448
- height: 26,
449
- borderRadius: 6,
447
+ width: 22,
448
+ height: 22,
449
+ borderRadius: 5,
450
450
  alignItems: 'center',
451
451
  justifyContent: 'center',
452
452
  },
453
453
  domainTitleText: {
454
454
  fontFamily: AppFonts_1.AppFonts.interBold,
455
- fontSize: 13.5,
455
+ fontSize: 13,
456
456
  fontWeight: '700',
457
457
  color: colors.primaryBlack,
458
458
  textTransform: 'capitalize',
@@ -514,23 +514,23 @@ const getRawStyles = (colors) => ({
514
514
  flexDirection: 'row',
515
515
  alignItems: 'center',
516
516
  gap: 3,
517
- paddingHorizontal: 6,
518
- paddingVertical: 3,
519
- borderRadius: 6,
517
+ paddingHorizontal: 5,
518
+ paddingVertical: 2.5,
519
+ borderRadius: 5,
520
520
  borderWidth: 1,
521
521
  borderColor: colors.grayBorderSecondary,
522
522
  backgroundColor: colors.primaryLight,
523
523
  },
524
524
  domainStatText: {
525
525
  fontFamily: AppFonts_1.AppFonts.interBold,
526
- fontSize: 10,
526
+ fontSize: 9.5,
527
527
  },
528
528
  treeNodeRow: {
529
529
  flexDirection: 'row',
530
530
  alignItems: 'stretch',
531
- marginHorizontal: 12,
532
- paddingRight: 8,
533
- paddingLeft: 4,
531
+ marginHorizontal: 8,
532
+ paddingRight: 4,
533
+ paddingLeft: 0,
534
534
  backgroundColor: colors.grayBackground,
535
535
  borderLeftWidth: 1,
536
536
  borderRightWidth: 1,
@@ -544,14 +544,14 @@ const getRawStyles = (colors) => ({
544
544
  paddingBottom: 6,
545
545
  },
546
546
  treeLines: {
547
- width: 28,
547
+ width: 14,
548
548
  position: 'relative',
549
549
  },
550
550
  modernTreeLine: {
551
551
  position: 'absolute',
552
- left: 14,
552
+ left: 7,
553
553
  top: 0,
554
- width: 14,
554
+ width: 7,
555
555
  height: '100%',
556
556
  borderLeftWidth: 1.5,
557
557
  opacity: 0.5,
@@ -559,19 +559,19 @@ const getRawStyles = (colors) => ({
559
559
  modernTreeLineLast: {
560
560
  height: '50%',
561
561
  borderBottomWidth: 1.5,
562
- borderBottomLeftRadius: 10,
562
+ borderBottomLeftRadius: 8,
563
563
  },
564
564
  modernTreeBranch: {
565
565
  position: 'absolute',
566
- left: 14,
566
+ left: 7,
567
567
  top: '50%',
568
- width: 14,
568
+ width: 7,
569
569
  borderTopWidth: 1.5,
570
570
  opacity: 0.5,
571
571
  },
572
572
  treeCardWrapper: {
573
573
  flex: 1,
574
- paddingVertical: 3.5,
574
+ paddingVertical: 3,
575
575
  },
576
576
  card: {
577
577
  marginHorizontal: 0,
@@ -611,10 +611,10 @@ const getRawStyles = (colors) => ({
611
611
  gap: 5,
612
612
  },
613
613
  smallCheckbox: {
614
- width: 13,
615
- height: 13,
614
+ width: 15,
615
+ height: 15,
616
616
  borderRadius: 4,
617
- borderWidth: 1.5,
617
+ borderWidth: 1.8,
618
618
  borderColor: colors.grayTextWeak,
619
619
  alignItems: 'center',
620
620
  justifyContent: 'center',
@@ -4,8 +4,8 @@ import { Pressable, StyleSheet, Text, View, } from 'react-native';
4
4
  import { AppColors } from '../styles/AppColors';
5
5
  import { AppFonts } from '../styles/AppFonts';
6
6
  import { formatTime, getJsonContent, getJsonPreviewText, parseStackLine, openInVSCode, } from '../helpers';
7
- import HighlightText from './HighlightText';
8
7
  import CopyButton from './CopyButton';
8
+ import LogSyntaxHighlighter from './LogSyntaxHighlighter';
9
9
  import { ChevronIcon, ExternalLinkIcon, FlaskIcon, ZapIcon, GlobeIcon, DiceIcon, AtomIcon, BarChartIcon, KeyIcon, SmartphoneIcon, AlertTriangleIcon, BugIcon, TagIcon, } from './NetworkIcons';
10
10
  import { useInspector } from './Inspector/InspectorContext';
11
11
  const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle, numberOfLines) => {
@@ -73,10 +73,10 @@ const getLogMessageWithBadges = (message, searchStr, textStyle, highlightStyle,
73
73
  </View>);
74
74
  })}
75
75
  </View>
76
- <HighlightText text={remainingText} search={searchStr} style={textStyle} highlightStyle={highlightStyle} numberOfLines={numberOfLines} detectLinks={true}/>
76
+ <LogSyntaxHighlighter text={remainingText} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>
77
77
  </View>);
78
78
  }
79
- return (<HighlightText text={message} search={searchStr} style={textStyle} highlightStyle={highlightStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
79
+ return (<LogSyntaxHighlighter text={message} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
80
80
  };
81
81
  export const ConsoleLogCard = React.memo(function ConsoleLogCard({ item, searchStr = '', }) {
82
82
  const { setSelectedLog } = useInspector();
@@ -234,10 +234,10 @@ export const ConsoleLogCard = React.memo(function ConsoleLogCard({ item, searchS
234
234
  {jsonContent ? (<>
235
235
  {jsonContent.header ? (getLogMessageWithBadges(jsonContent.header, searchStr, [styles.messageText, { color: AppColors.primaryBlack }], styles.highlight, 2)) : null}
236
236
  {jsonPreview && (<View style={styles.jsonPreviewContainer}>
237
- <HighlightText text={jsonPreview.text} search={searchStr} style={[
237
+ <LogSyntaxHighlighter text={jsonPreview.text} search={searchStr} style={[
238
238
  styles.jsonPreviewText,
239
239
  { color: AppColors.primaryBlack },
240
- ]} highlightStyle={styles.highlight} detectLinks={false} numberOfLines={5}/>
240
+ ]} detectLinks={false} numberOfLines={5}/>
241
241
  </View>)}
242
242
  </>) : (getLogMessageWithBadges(item.message, searchStr, [styles.messageText, { color: AppColors.primaryBlack }], styles.highlight, 3))}
243
243
  </View>
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { StyleSheet, Text, View } from 'react-native';
2
+ import { Platform, StyleSheet, Text, View } from 'react-native';
3
3
  import { AppColors } from '../styles/AppColors';
4
4
  import { AppFonts } from '../styles/AppFonts';
5
5
  import { CheckIcon } from './NetworkIcons';
@@ -27,7 +27,7 @@ const styles = StyleSheet.create({
27
27
  justifyContent: 'center',
28
28
  paddingHorizontal: 16,
29
29
  paddingTop: 16,
30
- paddingBottom: 28,
30
+ paddingBottom: Platform.OS === 'ios' ? 44 : 32,
31
31
  gap: 8,
32
32
  },
33
33
  dividerLine: {
@@ -1,8 +1,7 @@
1
- import React, { useCallback, useState, useMemo } from 'react';
1
+ import React, { useCallback, useState, useMemo, useEffect } from 'react';
2
2
  import { FlatList, Pressable, Text, TextInput, TouchableOpacity, View, } from 'react-native';
3
3
  import { animateNextLayout, useInspector } from './InspectorContext';
4
4
  import AnalyticsEventCard from '../AnalyticsEventCard';
5
- import AnalyticsDetail from '../AnalyticsDetail';
6
5
  import AnalyticsFilterModal from './AnalyticsFilterModal';
7
6
  import EndOfListFooter from '../EndOfListFooter';
8
7
  import styles from '../../styles';
@@ -13,7 +12,7 @@ import Svg, { Path, Rect, Line, Circle, G, Defs, LinearGradient as SvgLinearGrad
13
12
  import TouchableScale from '../TouchableScale';
14
13
  import { getCurrentUserId, getCurrentUserProperties, getDefaultEventParameters, getCollectionEnabled, } from '../../customHooks/analyticsLogger';
15
14
  import { getEventCategory, } from '../../helpers';
16
- import { LayersIcon, CheckIcon, SearchIcon, ClearIcon, TrashIcon, EmptyRadarIcon, HeaderPauseIcon, FilterIcon, CartIcon, GlobeIcon, BoltIcon, SparkleIcon, PinIcon, MoneyIcon, } from '../NetworkIcons';
15
+ import { LayersIcon, SearchIcon, ClearIcon, TrashIcon, EmptyRadarIcon, HeaderPauseIcon, FilterIcon, CartIcon, GlobeIcon, BoltIcon, SparkleIcon, PinIcon, MoneyIcon, } from '../NetworkIcons';
17
16
  const AnalyticsHeader = React.memo(() => {
18
17
  const { t } = useTranslation();
19
18
  const { analyticsEvents, filteredAnalyticsEvents, analyticsFilters, setAnalyticsFilters, analyticsHeaderExpanded, setAnalyticsHeaderExpanded, } = useInspector();
@@ -123,16 +122,25 @@ const AnalyticsHeader = React.memo(() => {
123
122
  return { ...prev, categories: nextCategories };
124
123
  });
125
124
  };
126
- // 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (-30m / 30s to NOW)
125
+ // 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (60s live rolling stream)
127
126
  const BUCKET_COUNT = 12;
128
127
  const chartHeight = 64;
129
128
  const svgWidth = 320;
130
129
  const [selectedBucketIdx, setSelectedBucketIdx] = useState(null);
130
+ const [liveTick, setLiveTick] = useState(0);
131
+ useEffect(() => {
132
+ if (!isTrackingEnabled)
133
+ return;
134
+ const interval = setInterval(() => {
135
+ setLiveTick(t => (t + 1) % 100000);
136
+ }, 1000);
137
+ return () => clearInterval(interval);
138
+ }, [isTrackingEnabled]);
131
139
  const histogramData = useMemo(() => {
132
140
  const buckets = [];
133
141
  const now = Date.now();
134
- const windowMs = 60000; // 60s window
135
- const bucketDuration = windowMs / BUCKET_COUNT;
142
+ const windowMs = 60000; // 60s live rolling window
143
+ const bucketDuration = windowMs / BUCKET_COUNT; // 5s per bucket
136
144
  for (let i = 0; i < BUCKET_COUNT; i++) {
137
145
  const bucketAgeSec = Math.round(((BUCKET_COUNT - 1 - i) * bucketDuration) / 1000);
138
146
  buckets.push({
@@ -197,7 +205,7 @@ const AnalyticsHeader = React.memo(() => {
197
205
  peakVal,
198
206
  eventRate,
199
207
  };
200
- }, [filteredAnalyticsEvents, chartHeight, svgWidth, t]);
208
+ }, [filteredAnalyticsEvents, chartHeight, svgWidth, liveTick, t]);
201
209
  const selectedBucket = selectedBucketIdx != null ? histogramData.buckets[selectedBucketIdx] : null;
202
210
  return (<View style={styles.analyticsHeaderCard}>
203
211
  {/* ── 1. Top Header Row (GA4 Style) ─────────────────────────────────── */}
@@ -269,7 +277,7 @@ const AnalyticsHeader = React.memo(() => {
269
277
  }}/>)}
270
278
  </View>
271
279
 
272
- {/* Multi-Select Category Buttons with Checkboxes */}
280
+ {/* Multi-Select Category Buttons */}
273
281
  <View style={{
274
282
  flexDirection: 'row',
275
283
  flexWrap: 'wrap',
@@ -298,18 +306,6 @@ const AnalyticsHeader = React.memo(() => {
298
306
  elevation: 2,
299
307
  },
300
308
  ]}>
301
- <View style={{
302
- width: 12,
303
- height: 12,
304
- borderRadius: 3,
305
- borderWidth: 1.2,
306
- borderColor: isAllSelected ? AppColors.white : AppColors.indigo400,
307
- backgroundColor: isAllSelected ? AppColors.white : 'transparent',
308
- alignItems: 'center',
309
- justifyContent: 'center',
310
- }}>
311
- {isAllSelected && <CheckIcon color={AppColors.indigo600Alt} size={8}/>}
312
- </View>
313
309
  <LayersIcon color={isAllSelected ? AppColors.white : AppColors.indigo600Alt} size={11}/>
314
310
  <Text style={{
315
311
  fontFamily: AppFonts.interBold,
@@ -345,18 +341,6 @@ const AnalyticsHeader = React.memo(() => {
345
341
  elevation: 2,
346
342
  },
347
343
  ]}>
348
- <View style={{
349
- width: 12,
350
- height: 12,
351
- borderRadius: 3,
352
- borderWidth: 1.2,
353
- borderColor: isSelected ? AppColors.white : AppColors.amber500,
354
- backgroundColor: isSelected ? AppColors.white : 'transparent',
355
- alignItems: 'center',
356
- justifyContent: 'center',
357
- }}>
358
- {isSelected && <CheckIcon color={AppColors.amber600} size={8}/>}
359
- </View>
360
344
  <CartIcon color={isSelected ? AppColors.white : AppColors.amber700} size={11}/>
361
345
  <Text style={{
362
346
  fontFamily: AppFonts.interBold,
@@ -392,18 +376,6 @@ const AnalyticsHeader = React.memo(() => {
392
376
  elevation: 2,
393
377
  },
394
378
  ]}>
395
- <View style={{
396
- width: 12,
397
- height: 12,
398
- borderRadius: 3,
399
- borderWidth: 1.2,
400
- borderColor: isSelected ? AppColors.white : AppColors.sky400,
401
- backgroundColor: isSelected ? AppColors.white : 'transparent',
402
- alignItems: 'center',
403
- justifyContent: 'center',
404
- }}>
405
- {isSelected && <CheckIcon color={AppColors.sky600} size={8}/>}
406
- </View>
407
379
  <GlobeIcon color={isSelected ? AppColors.white : AppColors.sky600} size={11}/>
408
380
  <Text style={{
409
381
  fontFamily: AppFonts.interBold,
@@ -439,18 +411,6 @@ const AnalyticsHeader = React.memo(() => {
439
411
  elevation: 2,
440
412
  },
441
413
  ]}>
442
- <View style={{
443
- width: 12,
444
- height: 12,
445
- borderRadius: 3,
446
- borderWidth: 1.2,
447
- borderColor: isSelected ? AppColors.white : AppColors.purple400,
448
- backgroundColor: isSelected ? AppColors.white : 'transparent',
449
- alignItems: 'center',
450
- justifyContent: 'center',
451
- }}>
452
- {isSelected && <CheckIcon color={AppColors.violet600} size={8}/>}
453
- </View>
454
414
  <BoltIcon color={isSelected ? AppColors.white : AppColors.purple} size={11}/>
455
415
  <Text style={{
456
416
  fontFamily: AppFonts.interBold,
@@ -486,18 +446,6 @@ const AnalyticsHeader = React.memo(() => {
486
446
  elevation: 2,
487
447
  },
488
448
  ]}>
489
- <View style={{
490
- width: 12,
491
- height: 12,
492
- borderRadius: 3,
493
- borderWidth: 1.2,
494
- borderColor: isSelected ? AppColors.white : AppColors.pink400,
495
- backgroundColor: isSelected ? AppColors.white : 'transparent',
496
- alignItems: 'center',
497
- justifyContent: 'center',
498
- }}>
499
- {isSelected && <CheckIcon color={AppColors.pink600} size={8}/>}
500
- </View>
501
449
  <SparkleIcon color={isSelected ? AppColors.white : AppColors.brandPurple} size={11}/>
502
450
  <Text style={{
503
451
  fontFamily: AppFonts.interBold,
@@ -693,7 +641,7 @@ const AnalyticsHeader = React.memo(() => {
693
641
  </View>
694
642
  </View>)}
695
643
 
696
- {/* Timeline Axis Labels */}
644
+ {/* Timeline Axis Labels (60s Realtime Rolling Stream) */}
697
645
  <View style={{
698
646
  flexDirection: 'row',
699
647
  justifyContent: 'space-between',
@@ -705,21 +653,21 @@ const AnalyticsHeader = React.memo(() => {
705
653
  fontSize: 8.5,
706
654
  color: AppColors.grayTextWeak,
707
655
  }}>
708
- {t('analytics.time30mAgo')}
656
+ -60s
709
657
  </Text>
710
658
  <Text style={{
711
659
  fontFamily: AppFonts.interMedium,
712
660
  fontSize: 8.5,
713
661
  color: AppColors.grayTextWeak,
714
662
  }}>
715
- {t('analytics.time20mAgo')}
663
+ -40s
716
664
  </Text>
717
665
  <Text style={{
718
666
  fontFamily: AppFonts.interMedium,
719
667
  fontSize: 8.5,
720
668
  color: AppColors.grayTextWeak,
721
669
  }}>
722
- {t('analytics.time10mAgo')}
670
+ -20s
723
671
  </Text>
724
672
  <Text style={{
725
673
  fontFamily: AppFonts.interBold,
@@ -959,7 +907,7 @@ const AnalyticsTab = React.memo(() => {
959
907
  <AnalyticsFilterModal visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)}/>
960
908
 
961
909
  <View style={{ flex: 1 }} onLayout={() => setIsAnalyticsLayoutReady(true)}>
962
- {selectedEvent != null ? (<AnalyticsDetail event={selectedEvent}/>) : isAnalyticsLayoutReady ? (<FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<View style={styles.emptyContainer}>
910
+ {isAnalyticsLayoutReady ? (<FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<View style={styles.emptyContainer}>
963
911
  <View style={styles.emptyIconWrap}>
964
912
  <EmptyRadarIcon color={AppColors.purple} size={32}/>
965
913
  </View>