react-native-inapp-inspector 2.3.15 → 2.3.16

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 (96) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  3. package/dist/commonjs/components/Inspector/ConsoleTab.js +0 -22
  4. package/dist/commonjs/components/Inspector/CrashTab.js +0 -23
  5. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  6. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +56 -4
  8. package/dist/commonjs/components/Inspector/MainScreen.js +45 -3
  9. package/dist/commonjs/components/Inspector/NetworkTab.js +27 -38
  10. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  11. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  12. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  13. package/dist/commonjs/components/Inspector/ReduxTab.js +0 -22
  14. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  15. package/dist/commonjs/components/Inspector/StorageTab.js +0 -23
  16. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  17. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  18. package/dist/commonjs/components/NetworkIcons.js +33 -2
  19. package/dist/commonjs/constants/version.d.ts +1 -1
  20. package/dist/commonjs/constants/version.js +1 -1
  21. package/dist/commonjs/helpers/index.d.ts +1 -0
  22. package/dist/commonjs/helpers/index.js +1 -0
  23. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  24. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  25. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  26. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  27. package/dist/commonjs/helpers/telemetry.js +339 -8
  28. package/dist/commonjs/index.d.ts +1 -0
  29. package/dist/commonjs/index.js +32 -2
  30. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  31. package/dist/commonjs/styles/AppFonts.js +1 -0
  32. package/dist/commonjs/styles/index.d.ts +22 -0
  33. package/dist/commonjs/styles/index.js +19 -0
  34. package/dist/commonjs/types/enums.d.ts +1 -0
  35. package/dist/commonjs/types/enums.js +1 -0
  36. package/dist/commonjs/types/interfaces.d.ts +12 -0
  37. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  38. package/dist/esm/components/Inspector/ConsoleTab.js +1 -23
  39. package/dist/esm/components/Inspector/CrashTab.js +1 -24
  40. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  41. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  42. package/dist/esm/components/Inspector/InspectorHeader.js +57 -5
  43. package/dist/esm/components/Inspector/MainScreen.js +46 -4
  44. package/dist/esm/components/Inspector/NetworkTab.js +28 -39
  45. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  46. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  47. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  48. package/dist/esm/components/Inspector/ReduxTab.js +1 -23
  49. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  50. package/dist/esm/components/Inspector/StorageTab.js +0 -23
  51. package/dist/esm/components/Inspector/TabBar.js +50 -15
  52. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  53. package/dist/esm/components/NetworkIcons.js +26 -0
  54. package/dist/esm/constants/version.d.ts +1 -1
  55. package/dist/esm/constants/version.js +1 -1
  56. package/dist/esm/helpers/index.d.ts +1 -0
  57. package/dist/esm/helpers/index.js +1 -0
  58. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  59. package/dist/esm/helpers/remoteConfig.js +160 -0
  60. package/dist/esm/helpers/searchQueryParser.js +2 -0
  61. package/dist/esm/helpers/telemetry.d.ts +5 -0
  62. package/dist/esm/helpers/telemetry.js +332 -9
  63. package/dist/esm/index.d.ts +1 -0
  64. package/dist/esm/index.js +30 -2
  65. package/dist/esm/styles/AppFonts.d.ts +2 -0
  66. package/dist/esm/styles/AppFonts.js +1 -0
  67. package/dist/esm/styles/index.d.ts +22 -0
  68. package/dist/esm/styles/index.js +19 -0
  69. package/dist/esm/types/enums.d.ts +1 -0
  70. package/dist/esm/types/enums.js +1 -0
  71. package/dist/esm/types/interfaces.d.ts +12 -0
  72. package/package.json +1 -1
  73. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  74. package/src/components/Inspector/ConsoleTab.tsx +0 -23
  75. package/src/components/Inspector/CrashTab.tsx +0 -23
  76. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  77. package/src/components/Inspector/InspectorHeader.tsx +78 -2
  78. package/src/components/Inspector/MainScreen.tsx +59 -3
  79. package/src/components/Inspector/NetworkTab.tsx +69 -78
  80. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  81. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  82. package/src/components/Inspector/ReduxTab.tsx +0 -23
  83. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  84. package/src/components/Inspector/StorageTab.tsx +0 -23
  85. package/src/components/Inspector/TabBar.tsx +57 -20
  86. package/src/components/NetworkIcons.tsx +92 -0
  87. package/src/constants/version.ts +1 -1
  88. package/src/helpers/index.ts +1 -0
  89. package/src/helpers/remoteConfig.ts +212 -0
  90. package/src/helpers/searchQueryParser.ts +3 -0
  91. package/src/helpers/telemetry.ts +381 -10
  92. package/src/index.tsx +42 -0
  93. package/src/styles/AppFonts.ts +2 -0
  94. package/src/styles/index.ts +20 -1
  95. package/src/types/enums.ts +1 -0
  96. package/src/types/interfaces.ts +12 -0
@@ -0,0 +1,532 @@
1
+ import React, {useEffect, useRef, useState} from 'react';
2
+ import {
3
+ Animated,
4
+ Linking,
5
+ Modal,
6
+ Platform,
7
+ StyleSheet,
8
+ Text,
9
+ TouchableOpacity,
10
+ View,
11
+ } from 'react-native';
12
+ import {AppColors} from '../../styles/AppColors';
13
+ import {AppFonts} from '../../styles/AppFonts';
14
+ import TouchableScale from '../TouchableScale';
15
+ import {loadSettings, saveSettings} from '../../helpers/settingsStore';
16
+ import {trackTelemetryEvent} from '../../helpers/telemetry';
17
+ import {
18
+ StarIcon,
19
+ CloseWhite,
20
+ CheckIcon,
21
+ GitHubIcon,
22
+ NpmIcon,
23
+ ClockIcon,
24
+ } from '../NetworkIcons';
25
+
26
+ // 5-day interval in milliseconds
27
+ const FIVE_DAYS_MS = 5 * 24 * 60 * 60 * 1000;
28
+ const GITHUB_REPO_URL =
29
+ 'https://github.com/vengatmacuser/react-native-inapp-inspector';
30
+ const NPM_PACKAGE_URL =
31
+ 'https://www.npmjs.com/package/react-native-inapp-inspector';
32
+
33
+ export const NpmStarPrompt: React.FC = () => {
34
+ const [isOpen, setIsOpen] = useState(false);
35
+ const slideAnim = useRef(new Animated.Value(200)).current;
36
+ const fadeAnim = useRef(new Animated.Value(0)).current;
37
+ const pulseAnim = useRef(new Animated.Value(1)).current;
38
+
39
+ useEffect(() => {
40
+ let isMounted = true;
41
+
42
+ async function checkEligibility() {
43
+ try {
44
+ const settings = await loadSettings();
45
+
46
+ // 1. If user already actioned the prompt, never show again permanently
47
+ if (settings.starPromptActioned) {
48
+ return;
49
+ }
50
+
51
+ const now = Date.now();
52
+ const firstSeen = settings.starPromptFirstSeen || now;
53
+
54
+ // If first seen is not set, initialize it
55
+ if (!settings.starPromptFirstSeen) {
56
+ await saveSettings({
57
+ ...settings,
58
+ starPromptFirstSeen: now,
59
+ });
60
+ }
61
+
62
+ const lastShown = settings.starPromptLastShown || firstSeen;
63
+ const timeElapsed = now - lastShown;
64
+
65
+ // 2. Check if at least 5 days have passed since last prompt / first install
66
+ if (timeElapsed >= FIVE_DAYS_MS) {
67
+ // Random probability factor to make it feel natural across sessions
68
+ const shouldShow = Math.random() < 0.65;
69
+ if (shouldShow && isMounted) {
70
+ // Delay slightly after modal open so it does not interfere with startup
71
+ setTimeout(() => {
72
+ if (isMounted) {
73
+ openPrompt();
74
+ }
75
+ }, 1800);
76
+ }
77
+ }
78
+ } catch {
79
+ // silent fallback
80
+ }
81
+ }
82
+
83
+ checkEligibility();
84
+
85
+ return () => {
86
+ isMounted = false;
87
+ };
88
+ }, []);
89
+
90
+ const openPrompt = async () => {
91
+ setIsOpen(true);
92
+ try {
93
+ const settings = await loadSettings();
94
+ await saveSettings({
95
+ ...settings,
96
+ starPromptLastShown: Date.now(),
97
+ });
98
+ trackTelemetryEvent('npm_star_prompt_shown', {
99
+ trigger: '5_day_interval',
100
+ platform: Platform.OS,
101
+ });
102
+ } catch {}
103
+
104
+ Animated.parallel([
105
+ Animated.spring(slideAnim, {
106
+ toValue: 0,
107
+ friction: 8,
108
+ tension: 50,
109
+ useNativeDriver: true,
110
+ }),
111
+ Animated.timing(fadeAnim, {
112
+ toValue: 1,
113
+ duration: 250,
114
+ useNativeDriver: true,
115
+ }),
116
+ ]).start();
117
+
118
+ // Subtle star pulse animation
119
+ Animated.loop(
120
+ Animated.sequence([
121
+ Animated.timing(pulseAnim, {
122
+ toValue: 1.15,
123
+ duration: 900,
124
+ useNativeDriver: true,
125
+ }),
126
+ Animated.timing(pulseAnim, {
127
+ toValue: 1,
128
+ duration: 900,
129
+ useNativeDriver: true,
130
+ }),
131
+ ]),
132
+ ).start();
133
+ };
134
+
135
+ const closePrompt = (callback?: () => void) => {
136
+ Animated.parallel([
137
+ Animated.timing(fadeAnim, {
138
+ toValue: 0,
139
+ duration: 180,
140
+ useNativeDriver: true,
141
+ }),
142
+ Animated.timing(slideAnim, {
143
+ toValue: 200,
144
+ duration: 180,
145
+ useNativeDriver: true,
146
+ }),
147
+ ]).start(() => {
148
+ setIsOpen(false);
149
+ if (callback) callback();
150
+ });
151
+ };
152
+
153
+ const handleStarNow = async () => {
154
+ try {
155
+ const settings = await loadSettings();
156
+ await saveSettings({
157
+ ...settings,
158
+ starPromptActioned: true,
159
+ });
160
+ trackTelemetryEvent('npm_star_prompt_action', {
161
+ action: 'starred',
162
+ platform: Platform.OS,
163
+ });
164
+ } catch {}
165
+
166
+ closePrompt(() => {
167
+ Linking.openURL(GITHUB_REPO_URL).catch(() => {
168
+ Linking.openURL(NPM_PACKAGE_URL).catch(() => {});
169
+ });
170
+ });
171
+ };
172
+
173
+ const handleAlreadyStarred = async () => {
174
+ try {
175
+ const settings = await loadSettings();
176
+ await saveSettings({
177
+ ...settings,
178
+ starPromptActioned: true,
179
+ });
180
+ trackTelemetryEvent('npm_star_prompt_action', {
181
+ action: 'already_starred',
182
+ platform: Platform.OS,
183
+ });
184
+ } catch {}
185
+
186
+ closePrompt();
187
+ };
188
+
189
+ const handleRemindLater = async () => {
190
+ try {
191
+ const settings = await loadSettings();
192
+ await saveSettings({
193
+ ...settings,
194
+ starPromptLastShown: Date.now(),
195
+ });
196
+ trackTelemetryEvent('npm_star_prompt_action', {
197
+ action: 'remind_later',
198
+ platform: Platform.OS,
199
+ });
200
+ } catch {}
201
+
202
+ closePrompt();
203
+ };
204
+
205
+ const handleDontAskAgain = async () => {
206
+ try {
207
+ const settings = await loadSettings();
208
+ await saveSettings({
209
+ ...settings,
210
+ starPromptActioned: true,
211
+ });
212
+ trackTelemetryEvent('npm_star_prompt_action', {
213
+ action: 'dont_ask_again',
214
+ platform: Platform.OS,
215
+ });
216
+ } catch {}
217
+
218
+ closePrompt();
219
+ };
220
+
221
+ if (!isOpen) return null;
222
+
223
+ return (
224
+ <Modal
225
+ transparent
226
+ visible={isOpen}
227
+ animationType="none"
228
+ onRequestClose={handleRemindLater}>
229
+ <Animated.View
230
+ style={[
231
+ styles.backdrop,
232
+ {
233
+ opacity: fadeAnim,
234
+ },
235
+ ]}>
236
+ <TouchableOpacity
237
+ style={StyleSheet.absoluteFill}
238
+ activeOpacity={1}
239
+ onPress={handleRemindLater}
240
+ />
241
+
242
+ <Animated.View
243
+ style={[
244
+ styles.cardContainer,
245
+ {
246
+ transform: [{translateY: slideAnim}],
247
+ },
248
+ ]}>
249
+ {/* Glowing Star Icon Header */}
250
+ <View style={styles.headerIconWrapper}>
251
+ <Animated.View
252
+ style={[
253
+ styles.iconGlow,
254
+ {
255
+ transform: [{scale: pulseAnim}],
256
+ },
257
+ ]}
258
+ />
259
+ <View style={styles.iconCircle}>
260
+ <StarIcon size={26} color="#F59E0B" />
261
+ </View>
262
+ </View>
263
+
264
+ {/* Close X */}
265
+ <TouchableOpacity
266
+ onPress={handleRemindLater}
267
+ hitSlop={{top: 10, bottom: 10, left: 10, right: 10}}
268
+ style={styles.closeBtn}>
269
+ <CloseWhite size={12} color={AppColors.grayText} />
270
+ </TouchableOpacity>
271
+
272
+ {/* Pill Badge */}
273
+ <View style={styles.pillBadge}>
274
+ <Text style={styles.pillBadgeText}>SUPPORT OPEN SOURCE</Text>
275
+ </View>
276
+
277
+ {/* Title & Description */}
278
+ <Text style={styles.title}>Enjoying In-App Inspector?</Text>
279
+ <Text style={styles.description}>
280
+ If this debugging tool saves you time, please consider giving us a
281
+ star on GitHub & npm. Your support helps us build more features!
282
+ </Text>
283
+
284
+ {/* Quick Metrics Bar */}
285
+ <View style={styles.metricsBar}>
286
+ <View style={styles.metricItem}>
287
+ <GitHubIcon size={13} color={AppColors.grayText} />
288
+ <Text style={styles.metricText}>GitHub Star</Text>
289
+ </View>
290
+ <View style={styles.metricDot} />
291
+ <View style={styles.metricItem}>
292
+ <NpmIcon size={13} color="#CB3837" />
293
+ <Text style={styles.metricText}>npm Package</Text>
294
+ </View>
295
+ <View style={styles.metricDot} />
296
+ <View style={styles.metricItem}>
297
+ <Text style={styles.metricText}>100% Free</Text>
298
+ </View>
299
+ </View>
300
+
301
+ {/* Primary Button: Star on GitHub */}
302
+ <TouchableScale
303
+ accessible={true}
304
+ accessibilityRole="button"
305
+ accessibilityLabel="Star on GitHub"
306
+ onPress={handleStarNow}
307
+ style={styles.primaryButton}>
308
+ <View style={styles.primaryButtonContent}>
309
+ <StarIcon size={16} color={AppColors.white} />
310
+ <Text style={styles.primaryButtonText}>⭐ Star on GitHub & npm</Text>
311
+ </View>
312
+ </TouchableScale>
313
+
314
+ {/* Secondary Action: Already Starred */}
315
+ <TouchableScale
316
+ accessible={true}
317
+ accessibilityRole="button"
318
+ accessibilityLabel="I already starred"
319
+ onPress={handleAlreadyStarred}
320
+ style={styles.secondaryButton}>
321
+ <View style={styles.secondaryButtonContent}>
322
+ <CheckIcon size={13} color={AppColors.purple} />
323
+ <Text style={styles.secondaryButtonText}>I Already Starred</Text>
324
+ </View>
325
+ </TouchableScale>
326
+
327
+ {/* Bottom Link Row: Remind Later & Don't Ask Again */}
328
+ <View style={styles.footerRow}>
329
+ <TouchableOpacity
330
+ onPress={handleRemindLater}
331
+ hitSlop={{top: 8, bottom: 8, left: 8, right: 8}}>
332
+ <Text style={styles.footerLinkText}>Remind Me Later</Text>
333
+ </TouchableOpacity>
334
+
335
+ <View style={styles.footerSeparator} />
336
+
337
+ <TouchableOpacity
338
+ onPress={handleDontAskAgain}
339
+ hitSlop={{top: 8, bottom: 8, left: 8, right: 8}}>
340
+ <Text style={styles.footerLinkTextMuted}>Don't Ask Again</Text>
341
+ </TouchableOpacity>
342
+ </View>
343
+ </Animated.View>
344
+ </Animated.View>
345
+ </Modal>
346
+ );
347
+ };
348
+
349
+ const styles = StyleSheet.create({
350
+ backdrop: {
351
+ ...StyleSheet.absoluteFillObject,
352
+ backgroundColor: 'rgba(15, 23, 42, 0.65)',
353
+ justifyContent: 'center',
354
+ alignItems: 'center',
355
+ paddingHorizontal: 20,
356
+ zIndex: 99999,
357
+ },
358
+ cardContainer: {
359
+ width: '100%',
360
+ maxWidth: 380,
361
+ backgroundColor: AppColors.white,
362
+ borderRadius: 22,
363
+ padding: 22,
364
+ alignItems: 'center',
365
+ shadowColor: AppColors.black,
366
+ shadowOffset: {width: 0, height: 8},
367
+ shadowOpacity: 0.22,
368
+ shadowRadius: 20,
369
+ elevation: 12,
370
+ borderWidth: 1.5,
371
+ borderColor: `${AppColors.purple}25`,
372
+ },
373
+ headerIconWrapper: {
374
+ position: 'relative',
375
+ alignItems: 'center',
376
+ justifyContent: 'center',
377
+ marginBottom: 12,
378
+ },
379
+ iconGlow: {
380
+ position: 'absolute',
381
+ width: 68,
382
+ height: 68,
383
+ borderRadius: 34,
384
+ backgroundColor: '#F59E0B22',
385
+ },
386
+ iconCircle: {
387
+ width: 54,
388
+ height: 54,
389
+ borderRadius: 27,
390
+ backgroundColor: '#FEF3C7',
391
+ borderWidth: 2,
392
+ borderColor: '#FDE68A',
393
+ alignItems: 'center',
394
+ justifyContent: 'center',
395
+ },
396
+ closeBtn: {
397
+ position: 'absolute',
398
+ top: 14,
399
+ right: 14,
400
+ width: 28,
401
+ height: 28,
402
+ borderRadius: 14,
403
+ backgroundColor: AppColors.grayBackground,
404
+ alignItems: 'center',
405
+ justifyContent: 'center',
406
+ },
407
+ pillBadge: {
408
+ backgroundColor: `${AppColors.purple}14`,
409
+ paddingHorizontal: 9,
410
+ paddingVertical: 3,
411
+ borderRadius: 10,
412
+ marginBottom: 8,
413
+ },
414
+ pillBadgeText: {
415
+ fontFamily: AppFonts.interBold,
416
+ fontSize: 9.5,
417
+ color: AppColors.purple,
418
+ letterSpacing: 0.6,
419
+ },
420
+ title: {
421
+ fontFamily: AppFonts.interBold,
422
+ fontSize: 18,
423
+ lineHeight: 23,
424
+ color: AppColors.primaryBlack,
425
+ textAlign: 'center',
426
+ marginBottom: 6,
427
+ },
428
+ description: {
429
+ fontFamily: AppFonts.interRegular,
430
+ fontSize: 12.5,
431
+ lineHeight: 18,
432
+ color: AppColors.grayText,
433
+ textAlign: 'center',
434
+ marginBottom: 14,
435
+ paddingHorizontal: 8,
436
+ },
437
+ metricsBar: {
438
+ flexDirection: 'row',
439
+ alignItems: 'center',
440
+ justifyContent: 'center',
441
+ backgroundColor: AppColors.grayBackground,
442
+ paddingVertical: 7,
443
+ paddingHorizontal: 14,
444
+ borderRadius: 10,
445
+ marginBottom: 16,
446
+ gap: 8,
447
+ },
448
+ metricItem: {
449
+ flexDirection: 'row',
450
+ alignItems: 'center',
451
+ gap: 4,
452
+ },
453
+ metricText: {
454
+ fontFamily: AppFonts.interMedium,
455
+ fontSize: 11,
456
+ color: AppColors.primaryBlack,
457
+ },
458
+ metricDot: {
459
+ width: 3.5,
460
+ height: 3.5,
461
+ borderRadius: 2,
462
+ backgroundColor: AppColors.dividerColor,
463
+ },
464
+ primaryButton: {
465
+ width: '100%',
466
+ backgroundColor: AppColors.purple,
467
+ borderRadius: 12,
468
+ paddingVertical: 12,
469
+ alignItems: 'center',
470
+ justifyContent: 'center',
471
+ marginBottom: 8,
472
+ shadowColor: AppColors.purple,
473
+ shadowOffset: {width: 0, height: 4},
474
+ shadowOpacity: 0.3,
475
+ shadowRadius: 8,
476
+ elevation: 4,
477
+ },
478
+ primaryButtonContent: {
479
+ flexDirection: 'row',
480
+ alignItems: 'center',
481
+ gap: 7,
482
+ },
483
+ primaryButtonText: {
484
+ fontFamily: AppFonts.interBold,
485
+ fontSize: 14,
486
+ color: AppColors.white,
487
+ },
488
+ secondaryButton: {
489
+ width: '100%',
490
+ backgroundColor: `${AppColors.purple}10`,
491
+ borderWidth: 1,
492
+ borderColor: `${AppColors.purple}30`,
493
+ borderRadius: 12,
494
+ paddingVertical: 10,
495
+ alignItems: 'center',
496
+ justifyContent: 'center',
497
+ marginBottom: 14,
498
+ },
499
+ secondaryButtonContent: {
500
+ flexDirection: 'row',
501
+ alignItems: 'center',
502
+ gap: 6,
503
+ },
504
+ secondaryButtonText: {
505
+ fontFamily: AppFonts.interBold,
506
+ fontSize: 13,
507
+ color: AppColors.purple,
508
+ },
509
+ footerRow: {
510
+ flexDirection: 'row',
511
+ alignItems: 'center',
512
+ justifyContent: 'center',
513
+ gap: 12,
514
+ },
515
+ footerLinkText: {
516
+ fontFamily: AppFonts.interMedium,
517
+ fontSize: 11.5,
518
+ color: AppColors.grayText,
519
+ },
520
+ footerSeparator: {
521
+ width: 1,
522
+ height: 12,
523
+ backgroundColor: AppColors.dividerColor,
524
+ },
525
+ footerLinkTextMuted: {
526
+ fontFamily: AppFonts.interRegular,
527
+ fontSize: 11.5,
528
+ color: AppColors.grayTextWeak,
529
+ },
530
+ });
531
+
532
+ export default NpmStarPrompt;
@@ -55,6 +55,7 @@ import {
55
55
  NativeSystemMetrics,
56
56
  isNativeModuleAvailable,
57
57
  } from '../../native/NativeInspector';
58
+ import {trackInspectorScreenRecord} from '../../helpers/telemetry';
58
59
 
59
60
  export interface PerformanceEvent {
60
61
  id: string;
@@ -476,7 +477,13 @@ const PerformanceTab = React.memo(() => {
476
477
 
477
478
  {/* Live FPS Telemetry Recorder Toggle */}
478
479
  <TouchableScale
479
- onPress={() => setIsRecording(prev => !prev)}
480
+ onPress={() => {
481
+ setIsRecording(prev => {
482
+ const next = !prev;
483
+ trackInspectorScreenRecord(next ? 'start' : 'stop', 'performance_fps');
484
+ return next;
485
+ });
486
+ }}
480
487
  style={[
481
488
  perfStyles.recordToggleBtn,
482
489
  isRecording
@@ -695,29 +695,6 @@ const ReduxTab = React.memo(() => {
695
695
  ]}
696
696
  keyboardShouldPersistTaps="handled"
697
697
  />
698
-
699
- <TouchableScale
700
- onPress={() => {
701
- try {
702
- listRef.current?.scrollToOffset({
703
- offset: 0,
704
- animated: true,
705
- });
706
- } catch {
707
- try {
708
- listRef.current?.scrollToIndex({
709
- index: 0,
710
- animated: true,
711
- });
712
- } catch {}
713
- }
714
- }}
715
- hitSlop={12}
716
- style={styles.scrollTopBtn}>
717
- <View style={{transform: [{rotate: '180deg'}]}}>
718
- <ChevronIcon color={AppColors.white} size={18} />
719
- </View>
720
- </TouchableScale>
721
698
  </View>
722
699
  );
723
700
  });