react-native-inapp-inspector 2.3.14 → 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.
- package/README.md +1 -0
- package/dist/commonjs/components/AnimatedEntrance.js +3 -3
- package/dist/commonjs/components/ConsoleLogCard.js +174 -100
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
- package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -38
- package/dist/commonjs/components/Inspector/CrashTab.js +19 -28
- package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
- package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
- package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
- package/dist/commonjs/components/Inspector/InspectorHeader.js +58 -6
- package/dist/commonjs/components/Inspector/MainScreen.js +100 -58
- package/dist/commonjs/components/Inspector/NetworkTab.js +26 -371
- package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
- package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
- package/dist/commonjs/components/Inspector/PerformanceTab.js +40 -7
- package/dist/commonjs/components/Inspector/ReduxTab.js +3 -23
- package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
- package/dist/commonjs/components/Inspector/StorageTab.js +23 -28
- package/dist/commonjs/components/Inspector/TabBar.js +50 -15
- package/dist/commonjs/components/JsonViewer.js +14 -2
- package/dist/commonjs/components/LogCard.js +428 -227
- package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
- package/dist/commonjs/components/NetworkIcons.js +33 -2
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
- package/dist/commonjs/customHooks/consoleLogger.js +34 -2
- package/dist/commonjs/customHooks/crashHandler.js +1 -1
- package/dist/commonjs/customHooks/networkLogger.js +184 -26
- package/dist/commonjs/helpers/index.d.ts +1 -0
- package/dist/commonjs/helpers/index.js +1 -0
- package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
- package/dist/commonjs/helpers/remoteConfig.js +165 -0
- package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
- package/dist/commonjs/helpers/searchQueryParser.js +39 -291
- package/dist/commonjs/helpers/telemetry.d.ts +5 -0
- package/dist/commonjs/helpers/telemetry.js +339 -8
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +173 -29
- package/dist/commonjs/styles/AppFonts.d.ts +2 -0
- package/dist/commonjs/styles/AppFonts.js +1 -0
- package/dist/commonjs/styles/index.d.ts +22 -0
- package/dist/commonjs/styles/index.js +19 -0
- package/dist/commonjs/types/enums.d.ts +1 -0
- package/dist/commonjs/types/enums.js +1 -0
- package/dist/commonjs/types/interfaces.d.ts +12 -0
- package/dist/esm/components/AnimatedEntrance.js +3 -3
- package/dist/esm/components/ConsoleLogCard.js +141 -100
- package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
- package/dist/esm/components/Inspector/ConsoleTab.js +26 -39
- package/dist/esm/components/Inspector/CrashTab.js +20 -29
- package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
- package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
- package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
- package/dist/esm/components/Inspector/InspectorHeader.js +60 -8
- package/dist/esm/components/Inspector/MainScreen.js +101 -59
- package/dist/esm/components/Inspector/NetworkTab.js +27 -372
- package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
- package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
- package/dist/esm/components/Inspector/PerformanceTab.js +40 -7
- package/dist/esm/components/Inspector/ReduxTab.js +4 -24
- package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
- package/dist/esm/components/Inspector/StorageTab.js +23 -28
- package/dist/esm/components/Inspector/TabBar.js +50 -15
- package/dist/esm/components/JsonViewer.js +14 -2
- package/dist/esm/components/LogCard.js +422 -221
- package/dist/esm/components/NetworkIcons.d.ts +5 -0
- package/dist/esm/components/NetworkIcons.js +26 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.js +1 -1
- package/dist/esm/customHooks/consoleLogger.js +34 -2
- package/dist/esm/customHooks/crashHandler.js +1 -1
- package/dist/esm/customHooks/networkLogger.js +184 -26
- package/dist/esm/helpers/index.d.ts +1 -0
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/helpers/remoteConfig.d.ts +4 -0
- package/dist/esm/helpers/remoteConfig.js +160 -0
- package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
- package/dist/esm/helpers/searchQueryParser.js +39 -291
- package/dist/esm/helpers/telemetry.d.ts +5 -0
- package/dist/esm/helpers/telemetry.js +332 -9
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +171 -29
- package/dist/esm/styles/AppFonts.d.ts +2 -0
- package/dist/esm/styles/AppFonts.js +1 -0
- package/dist/esm/styles/index.d.ts +22 -0
- package/dist/esm/styles/index.js +19 -0
- package/dist/esm/types/enums.d.ts +1 -0
- package/dist/esm/types/enums.js +1 -0
- package/dist/esm/types/interfaces.d.ts +12 -0
- package/package.json +1 -1
- package/src/components/AnimatedEntrance.tsx +3 -3
- package/src/components/ConsoleLogCard.tsx +154 -103
- package/src/components/Inspector/AnalyticsTab.tsx +0 -23
- package/src/components/Inspector/ConsoleTab.tsx +27 -41
- package/src/components/Inspector/CrashTab.tsx +19 -28
- package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
- package/src/components/Inspector/FeedbackModal.tsx +626 -0
- package/src/components/Inspector/InspectorHeader.tsx +83 -5
- package/src/components/Inspector/MainScreen.tsx +61 -6
- package/src/components/Inspector/NetworkTab.tsx +70 -480
- package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
- package/src/components/Inspector/PerformanceTab.tsx +44 -8
- package/src/components/Inspector/ReduxTab.tsx +9 -24
- package/src/components/Inspector/SettingsPanel.tsx +1162 -197
- package/src/components/Inspector/StorageTab.tsx +27 -30
- package/src/components/Inspector/TabBar.tsx +57 -20
- package/src/components/JsonViewer.tsx +15 -2
- package/src/components/LogCard.tsx +528 -339
- package/src/components/NetworkIcons.tsx +92 -0
- package/src/constants/version.ts +1 -1
- package/src/customHooks/analyticsLogger.ts +1 -1
- package/src/customHooks/consoleLogger.ts +36 -3
- package/src/customHooks/crashHandler.ts +1 -1
- package/src/customHooks/networkLogger.ts +214 -26
- package/src/helpers/index.ts +1 -0
- package/src/helpers/remoteConfig.ts +212 -0
- package/src/helpers/searchQueryParser.ts +42 -284
- package/src/helpers/telemetry.ts +381 -10
- package/src/index.tsx +374 -211
- package/src/styles/AppFonts.ts +2 -0
- package/src/styles/index.ts +20 -1
- package/src/types/enums.ts +1 -0
- 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;
|
|
@@ -248,11 +249,19 @@ const PerformanceTab = React.memo(() => {
|
|
|
248
249
|
// Filtered Events
|
|
249
250
|
const filteredEvents = useMemo(() => {
|
|
250
251
|
return events.filter(e => {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
let matchSearch = true;
|
|
253
|
+
if (search && search.trim().length > 0) {
|
|
254
|
+
const queryTokens = search.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
255
|
+
const corpus = [
|
|
256
|
+
e.label || '',
|
|
257
|
+
e.detail || '',
|
|
258
|
+
e.source || '',
|
|
259
|
+
e.category || '',
|
|
260
|
+
e.severity || '',
|
|
261
|
+
e.bottleneckThread || '',
|
|
262
|
+
].join(' ').toLowerCase();
|
|
263
|
+
matchSearch = queryTokens.every(tok => corpus.includes(tok));
|
|
264
|
+
}
|
|
256
265
|
|
|
257
266
|
const matchFilter =
|
|
258
267
|
filterCategory === 'ALL'
|
|
@@ -468,7 +477,13 @@ const PerformanceTab = React.memo(() => {
|
|
|
468
477
|
|
|
469
478
|
{/* Live FPS Telemetry Recorder Toggle */}
|
|
470
479
|
<TouchableScale
|
|
471
|
-
onPress={() =>
|
|
480
|
+
onPress={() => {
|
|
481
|
+
setIsRecording(prev => {
|
|
482
|
+
const next = !prev;
|
|
483
|
+
trackInspectorScreenRecord(next ? 'start' : 'stop', 'performance_fps');
|
|
484
|
+
return next;
|
|
485
|
+
});
|
|
486
|
+
}}
|
|
472
487
|
style={[
|
|
473
488
|
perfStyles.recordToggleBtn,
|
|
474
489
|
isRecording
|
|
@@ -1052,10 +1067,31 @@ const PerformanceTab = React.memo(() => {
|
|
|
1052
1067
|
{filteredEvents.length === 0 ? (
|
|
1053
1068
|
<View style={perfStyles.emptyCard}>
|
|
1054
1069
|
<BoltIcon color={AppColors.amber500} size={30} />
|
|
1055
|
-
<Text style={perfStyles.emptyTitle}>
|
|
1070
|
+
<Text style={perfStyles.emptyTitle}>
|
|
1071
|
+
{search.trim().length > 0 ? 'No Matching Events' : t('performance.emptyTitle')}
|
|
1072
|
+
</Text>
|
|
1056
1073
|
<Text style={perfStyles.emptySub}>
|
|
1057
|
-
{
|
|
1074
|
+
{search.trim().length > 0
|
|
1075
|
+
? `No performance events match "${search}"`
|
|
1076
|
+
: t('performance.emptySubtitle')}
|
|
1058
1077
|
</Text>
|
|
1078
|
+
{search.trim().length > 0 && (
|
|
1079
|
+
<TouchableScale
|
|
1080
|
+
onPress={() => setSearch('')}
|
|
1081
|
+
style={{
|
|
1082
|
+
marginTop: 10,
|
|
1083
|
+
paddingHorizontal: 14,
|
|
1084
|
+
paddingVertical: 6,
|
|
1085
|
+
borderRadius: 8,
|
|
1086
|
+
backgroundColor: AppColors.grayBackground,
|
|
1087
|
+
borderWidth: 1,
|
|
1088
|
+
borderColor: AppColors.grayBorderSecondary,
|
|
1089
|
+
}}>
|
|
1090
|
+
<Text style={{color: AppColors.brandPurple, fontSize: 12, fontFamily: AppFonts.interBold}}>
|
|
1091
|
+
Clear Search
|
|
1092
|
+
</Text>
|
|
1093
|
+
</TouchableScale>
|
|
1094
|
+
)}
|
|
1059
1095
|
</View>
|
|
1060
1096
|
) : (
|
|
1061
1097
|
filteredEvents.map(event => {
|
|
@@ -670,7 +670,15 @@ const ReduxTab = React.memo(() => {
|
|
|
670
670
|
renderToHardwareTextureAndroid={true}
|
|
671
671
|
ListEmptyComponent={
|
|
672
672
|
<EmptyState
|
|
673
|
-
isSearch={reduxSearch.length > 0}
|
|
673
|
+
isSearch={reduxSearch.trim().length > 0}
|
|
674
|
+
searchQuery={reduxSearch}
|
|
675
|
+
onClearSearch={() => setReduxSearch('')}
|
|
676
|
+
customTitle={reduxSearch.trim().length > 0 ? 'No Matching Slices' : 'No Redux State Detected'}
|
|
677
|
+
customSub={
|
|
678
|
+
reduxSearch.trim().length > 0
|
|
679
|
+
? `No Redux slices match "${reduxSearch}"`
|
|
680
|
+
: 'Attach the Redux store or dispatch actions to see state slices.'
|
|
681
|
+
}
|
|
674
682
|
/>
|
|
675
683
|
}
|
|
676
684
|
ListFooterComponent={
|
|
@@ -687,29 +695,6 @@ const ReduxTab = React.memo(() => {
|
|
|
687
695
|
]}
|
|
688
696
|
keyboardShouldPersistTaps="handled"
|
|
689
697
|
/>
|
|
690
|
-
|
|
691
|
-
<TouchableScale
|
|
692
|
-
onPress={() => {
|
|
693
|
-
try {
|
|
694
|
-
listRef.current?.scrollToOffset({
|
|
695
|
-
offset: 0,
|
|
696
|
-
animated: true,
|
|
697
|
-
});
|
|
698
|
-
} catch {
|
|
699
|
-
try {
|
|
700
|
-
listRef.current?.scrollToIndex({
|
|
701
|
-
index: 0,
|
|
702
|
-
animated: true,
|
|
703
|
-
});
|
|
704
|
-
} catch {}
|
|
705
|
-
}
|
|
706
|
-
}}
|
|
707
|
-
hitSlop={12}
|
|
708
|
-
style={styles.scrollTopBtn}>
|
|
709
|
-
<View style={{transform: [{rotate: '180deg'}]}}>
|
|
710
|
-
<ChevronIcon color={AppColors.white} size={18} />
|
|
711
|
-
</View>
|
|
712
|
-
</TouchableScale>
|
|
713
698
|
</View>
|
|
714
699
|
);
|
|
715
700
|
});
|