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.
- package/README.md +10 -0
- package/android/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
- package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
- package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/9.2.0/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/build/reports/problems/problems-report.html +659 -0
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +33 -24
- package/dist/commonjs/components/ConsoleLogCard.js +5 -5
- package/dist/commonjs/components/EndOfListFooter.js +1 -1
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +19 -71
- package/dist/commonjs/components/Inspector/BundleTab.js +670 -188
- package/dist/commonjs/components/Inspector/ConsoleTab.js +109 -98
- package/dist/commonjs/components/Inspector/CrashTab.js +2 -1
- package/dist/commonjs/components/Inspector/InspectorHeader.js +102 -19
- package/dist/commonjs/components/Inspector/MainScreen.js +151 -17
- package/dist/commonjs/components/Inspector/NetworkTab.js +104 -20
- package/dist/commonjs/components/Inspector/SettingsPanel.js +1111 -1385
- package/dist/commonjs/components/Inspector/TabBar.js +3 -4
- package/dist/commonjs/components/Inspector/TelemetryConsentModal.d.ts +3 -0
- package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +212 -0
- package/dist/commonjs/components/JsonViewer.js +9 -4
- package/dist/commonjs/components/LogCard.js +31 -1
- package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
- package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
- package/dist/commonjs/components/NetworkIcons.d.ts +2 -0
- package/dist/commonjs/components/NetworkIcons.js +10 -1
- package/dist/commonjs/components/Slider.d.ts +13 -0
- package/dist/commonjs/components/Slider.js +261 -0
- 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/crashHandler.js +1 -1
- package/dist/commonjs/helpers/index.d.ts +2 -0
- package/dist/commonjs/helpers/index.js +16 -0
- package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
- package/dist/commonjs/helpers/searchQueryParser.js +236 -0
- package/dist/commonjs/helpers/settingsStore.js +13 -13
- package/dist/commonjs/helpers/telemetry.d.ts +99 -0
- package/dist/commonjs/helpers/telemetry.js +398 -0
- package/dist/commonjs/index.d.ts +2 -0
- package/dist/commonjs/index.js +30 -21
- package/dist/commonjs/native/NativeInspector.d.ts +5 -0
- package/dist/commonjs/native/NativeInspector.js +3 -2
- package/dist/commonjs/styles/index.js +35 -35
- package/dist/esm/components/ConsoleLogCard.js +5 -5
- package/dist/esm/components/EndOfListFooter.js +2 -2
- package/dist/esm/components/Inspector/AnalyticsTab.js +21 -73
- package/dist/esm/components/Inspector/BundleTab.js +670 -188
- package/dist/esm/components/Inspector/ConsoleTab.js +110 -99
- package/dist/esm/components/Inspector/CrashTab.js +2 -1
- package/dist/esm/components/Inspector/InspectorHeader.js +103 -20
- package/dist/esm/components/Inspector/MainScreen.js +119 -18
- package/dist/esm/components/Inspector/NetworkTab.js +105 -21
- package/dist/esm/components/Inspector/SettingsPanel.js +1114 -1388
- package/dist/esm/components/Inspector/TabBar.js +4 -5
- package/dist/esm/components/Inspector/TelemetryConsentModal.d.ts +3 -0
- package/dist/esm/components/Inspector/TelemetryConsentModal.js +175 -0
- package/dist/esm/components/JsonViewer.js +9 -4
- package/dist/esm/components/LogCard.js +32 -2
- package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
- package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
- package/dist/esm/components/NetworkIcons.d.ts +2 -0
- package/dist/esm/components/NetworkIcons.js +7 -0
- package/dist/esm/components/Slider.d.ts +13 -0
- package/dist/esm/components/Slider.js +222 -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/crashHandler.js +1 -1
- package/dist/esm/helpers/index.d.ts +2 -0
- package/dist/esm/helpers/index.js +2 -0
- package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
- package/dist/esm/helpers/searchQueryParser.js +233 -0
- package/dist/esm/helpers/settingsStore.js +13 -13
- package/dist/esm/helpers/telemetry.d.ts +99 -0
- package/dist/esm/helpers/telemetry.js +380 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +20 -21
- package/dist/esm/native/NativeInspector.d.ts +5 -0
- package/dist/esm/native/NativeInspector.js +3 -2
- package/dist/esm/styles/index.js +35 -35
- package/ios/{NetworkInspectorModule.m → NetworkInspectorModule.mm} +193 -97
- package/package.json +2 -2
|
@@ -8,10 +8,10 @@ const react_native_1 = require("react-native");
|
|
|
8
8
|
const InspectorContext_1 = require("./InspectorContext");
|
|
9
9
|
const styles_1 = __importDefault(require("../../styles"));
|
|
10
10
|
const AppColors_1 = require("../../styles/AppColors");
|
|
11
|
+
const TouchableScale_1 = __importDefault(require("../TouchableScale"));
|
|
11
12
|
const NetworkIcons_1 = require("../NetworkIcons");
|
|
12
13
|
const reduxLogger_1 = require("../../customHooks/reduxLogger");
|
|
13
14
|
const analyticsLogger_1 = require("../../customHooks/analyticsLogger");
|
|
14
|
-
const NativeInspector_1 = require("../../native/NativeInspector");
|
|
15
15
|
const TabBar = react_1.default.memo(() => {
|
|
16
16
|
const { activeTab, switchActiveTab, tabVisibility, logs, consoleLogs, analyticsEvents, crashRecords, lastReadApisCount, lastReadLogsCount, lastReadCrashesCount, unreadPulseAnim, } = (0, InspectorContext_1.useInspector)();
|
|
17
17
|
const isReduxAvail = (0, reduxLogger_1.isReduxConnected)();
|
|
@@ -85,9 +85,8 @@ const TabBar = react_1.default.memo(() => {
|
|
|
85
85
|
consoleLogs.length > lastReadLogsCount;
|
|
86
86
|
const hasUnreadCrashes = activeTab !== 'crash' &&
|
|
87
87
|
(crashRecords?.length || 0) > (lastReadCrashesCount || 0);
|
|
88
|
-
return (<
|
|
88
|
+
return (<TouchableScale_1.default key={tab.key} onPress={() => {
|
|
89
89
|
switchActiveTab(tab.key);
|
|
90
|
-
(0, NativeInspector_1.triggerNativeHaptic)('light');
|
|
91
90
|
}} style={[
|
|
92
91
|
styles_1.default.contentTabButton,
|
|
93
92
|
isActive && styles_1.default.contentTabButtonActive,
|
|
@@ -124,7 +123,7 @@ const TabBar = react_1.default.memo(() => {
|
|
|
124
123
|
transform: [{ scale: unreadPulseAnim }],
|
|
125
124
|
}}/>)}
|
|
126
125
|
</react_native_1.View>
|
|
127
|
-
</
|
|
126
|
+
</TouchableScale_1.default>);
|
|
128
127
|
})}
|
|
129
128
|
</react_native_1.ScrollView>
|
|
130
129
|
</react_native_1.View>);
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.TelemetryConsentModal = void 0;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const react_native_1 = require("react-native");
|
|
39
|
+
const AppColors_1 = require("../../styles/AppColors");
|
|
40
|
+
const BrandCircleIcon_1 = require("../BrandCircleIcon");
|
|
41
|
+
const telemetry_1 = require("../../helpers/telemetry");
|
|
42
|
+
const TelemetryConsentModal = () => {
|
|
43
|
+
const [visible, setVisible] = (0, react_1.useState)(false);
|
|
44
|
+
const fadeAnim = (0, react_1.useState)(new react_native_1.Animated.Value(0))[0];
|
|
45
|
+
(0, react_1.useEffect)(() => {
|
|
46
|
+
let isMounted = true;
|
|
47
|
+
(0, telemetry_1.getTelemetryConsentStatus)().then(status => {
|
|
48
|
+
if (isMounted && status === 'undetermined') {
|
|
49
|
+
setVisible(true);
|
|
50
|
+
react_native_1.Animated.timing(fadeAnim, {
|
|
51
|
+
toValue: 1,
|
|
52
|
+
duration: 300,
|
|
53
|
+
useNativeDriver: true,
|
|
54
|
+
}).start();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return () => {
|
|
58
|
+
isMounted = false;
|
|
59
|
+
};
|
|
60
|
+
}, [fadeAnim]);
|
|
61
|
+
const handleDecision = async (granted) => {
|
|
62
|
+
react_native_1.Animated.timing(fadeAnim, {
|
|
63
|
+
toValue: 0,
|
|
64
|
+
duration: 200,
|
|
65
|
+
useNativeDriver: true,
|
|
66
|
+
}).start(async () => {
|
|
67
|
+
setVisible(false);
|
|
68
|
+
await (0, telemetry_1.setTelemetryConsent)(granted);
|
|
69
|
+
if (granted) {
|
|
70
|
+
// Immediately trigger the session initialization ping
|
|
71
|
+
(0, telemetry_1.sendSessionTelemetryPing)({ force: true });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
if (!visible)
|
|
76
|
+
return null;
|
|
77
|
+
return (<react_native_1.Modal transparent visible={visible} animationType="none" statusBarTranslucent>
|
|
78
|
+
<react_native_1.View style={styles.overlay}>
|
|
79
|
+
<react_native_1.Animated.View style={[styles.card, { opacity: fadeAnim }]}>
|
|
80
|
+
<react_native_1.View style={styles.headerRow}>
|
|
81
|
+
<react_native_1.View style={styles.iconWrapper}>
|
|
82
|
+
<BrandCircleIcon_1.BrandCircleIcon size={40}/>
|
|
83
|
+
</react_native_1.View>
|
|
84
|
+
<react_native_1.View style={styles.titleContainer}>
|
|
85
|
+
<react_native_1.Text style={styles.title}>Help Improve In-App Inspector</react_native_1.Text>
|
|
86
|
+
<react_native_1.Text style={styles.subtitle}>Anonymous Diagnostic Insights</react_native_1.Text>
|
|
87
|
+
</react_native_1.View>
|
|
88
|
+
</react_native_1.View>
|
|
89
|
+
|
|
90
|
+
<react_native_1.Text style={styles.description}>
|
|
91
|
+
To help us continually enhance tooling performance and compatibility,
|
|
92
|
+
would you mind sharing anonymous diagnostics (such as React Native
|
|
93
|
+
version, JavaScript engine, and platform architecture)?
|
|
94
|
+
</react_native_1.Text>
|
|
95
|
+
|
|
96
|
+
<react_native_1.View style={styles.privacyBadge}>
|
|
97
|
+
<react_native_1.Text style={styles.privacyText}>
|
|
98
|
+
🔒 <react_native_1.Text style={{ fontWeight: '700' }}>Privacy Guaranteed:</react_native_1.Text> We
|
|
99
|
+
only collect non-identifiable environment metrics. No personal
|
|
100
|
+
data, tokens, or network request payloads are ever collected.
|
|
101
|
+
</react_native_1.Text>
|
|
102
|
+
</react_native_1.View>
|
|
103
|
+
|
|
104
|
+
<react_native_1.View style={styles.buttonRow}>
|
|
105
|
+
<react_native_1.TouchableOpacity style={styles.declineButton} onPress={() => handleDecision(false)} activeOpacity={0.7}>
|
|
106
|
+
<react_native_1.Text style={styles.declineText}>Not Now</react_native_1.Text>
|
|
107
|
+
</react_native_1.TouchableOpacity>
|
|
108
|
+
|
|
109
|
+
<react_native_1.TouchableOpacity style={styles.allowButton} onPress={() => handleDecision(true)} activeOpacity={0.8}>
|
|
110
|
+
<react_native_1.Text style={styles.allowText}>Allow & Share</react_native_1.Text>
|
|
111
|
+
</react_native_1.TouchableOpacity>
|
|
112
|
+
</react_native_1.View>
|
|
113
|
+
</react_native_1.Animated.View>
|
|
114
|
+
</react_native_1.View>
|
|
115
|
+
</react_native_1.Modal>);
|
|
116
|
+
};
|
|
117
|
+
exports.TelemetryConsentModal = TelemetryConsentModal;
|
|
118
|
+
const styles = react_native_1.StyleSheet.create({
|
|
119
|
+
overlay: {
|
|
120
|
+
flex: 1,
|
|
121
|
+
backgroundColor: 'rgba(0, 0, 0, 0.65)',
|
|
122
|
+
justifyContent: 'center',
|
|
123
|
+
alignItems: 'center',
|
|
124
|
+
padding: 24,
|
|
125
|
+
zIndex: 999999,
|
|
126
|
+
},
|
|
127
|
+
card: {
|
|
128
|
+
width: '100%',
|
|
129
|
+
maxWidth: 420,
|
|
130
|
+
backgroundColor: '#1E1F29',
|
|
131
|
+
borderRadius: 20,
|
|
132
|
+
padding: 22,
|
|
133
|
+
borderWidth: 1,
|
|
134
|
+
borderColor: 'rgba(255, 255, 255, 0.12)',
|
|
135
|
+
shadowColor: '#000',
|
|
136
|
+
shadowOffset: { width: 0, height: 10 },
|
|
137
|
+
shadowOpacity: 0.5,
|
|
138
|
+
shadowRadius: 20,
|
|
139
|
+
elevation: 24,
|
|
140
|
+
},
|
|
141
|
+
headerRow: {
|
|
142
|
+
flexDirection: 'row',
|
|
143
|
+
alignItems: 'center',
|
|
144
|
+
marginBottom: 14,
|
|
145
|
+
},
|
|
146
|
+
iconWrapper: {
|
|
147
|
+
marginRight: 14,
|
|
148
|
+
},
|
|
149
|
+
titleContainer: {
|
|
150
|
+
flex: 1,
|
|
151
|
+
},
|
|
152
|
+
title: {
|
|
153
|
+
fontSize: 17,
|
|
154
|
+
fontWeight: '700',
|
|
155
|
+
color: '#FFFFFF',
|
|
156
|
+
letterSpacing: -0.2,
|
|
157
|
+
},
|
|
158
|
+
subtitle: {
|
|
159
|
+
fontSize: 12,
|
|
160
|
+
color: AppColors_1.AppColors.purple || '#9055FF',
|
|
161
|
+
fontWeight: '600',
|
|
162
|
+
marginTop: 2,
|
|
163
|
+
},
|
|
164
|
+
description: {
|
|
165
|
+
fontSize: 13,
|
|
166
|
+
lineHeight: 19,
|
|
167
|
+
color: 'rgba(255, 255, 255, 0.75)',
|
|
168
|
+
marginBottom: 14,
|
|
169
|
+
},
|
|
170
|
+
privacyBadge: {
|
|
171
|
+
backgroundColor: 'rgba(144, 85, 255, 0.12)',
|
|
172
|
+
borderRadius: 10,
|
|
173
|
+
padding: 10,
|
|
174
|
+
borderWidth: 1,
|
|
175
|
+
borderColor: 'rgba(144, 85, 255, 0.25)',
|
|
176
|
+
marginBottom: 20,
|
|
177
|
+
},
|
|
178
|
+
privacyText: {
|
|
179
|
+
fontSize: 11,
|
|
180
|
+
lineHeight: 16,
|
|
181
|
+
color: '#D8C6FF',
|
|
182
|
+
},
|
|
183
|
+
buttonRow: {
|
|
184
|
+
flexDirection: 'row',
|
|
185
|
+
justifyContent: 'flex-end',
|
|
186
|
+
alignItems: 'center',
|
|
187
|
+
gap: 12,
|
|
188
|
+
},
|
|
189
|
+
declineButton: {
|
|
190
|
+
paddingVertical: 10,
|
|
191
|
+
paddingHorizontal: 16,
|
|
192
|
+
borderRadius: 10,
|
|
193
|
+
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
|
194
|
+
},
|
|
195
|
+
declineText: {
|
|
196
|
+
fontSize: 13,
|
|
197
|
+
fontWeight: '600',
|
|
198
|
+
color: 'rgba(255, 255, 255, 0.7)',
|
|
199
|
+
},
|
|
200
|
+
allowButton: {
|
|
201
|
+
paddingVertical: 10,
|
|
202
|
+
paddingHorizontal: 20,
|
|
203
|
+
borderRadius: 10,
|
|
204
|
+
backgroundColor: '#7C3AED',
|
|
205
|
+
},
|
|
206
|
+
allowText: {
|
|
207
|
+
fontSize: 13,
|
|
208
|
+
fontWeight: '700',
|
|
209
|
+
color: '#FFFFFF',
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
exports.default = exports.TelemetryConsentModal;
|
|
@@ -106,20 +106,25 @@ const JsonViewer = react_1.default.memo(({ data, search, forceOpen, defaultExpan
|
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
108
|
const rawText = react_1.default.useMemo(() => {
|
|
109
|
+
if (data === undefined || data === null) {
|
|
110
|
+
return '';
|
|
111
|
+
}
|
|
109
112
|
if (typeof data === 'string') {
|
|
110
113
|
return data;
|
|
111
114
|
}
|
|
112
115
|
try {
|
|
113
|
-
|
|
116
|
+
const stringified = JSON.stringify(data);
|
|
117
|
+
return stringified ?? '';
|
|
114
118
|
}
|
|
115
119
|
catch {
|
|
116
|
-
return String(data);
|
|
120
|
+
return String(data) || '';
|
|
117
121
|
}
|
|
118
122
|
}, [data]);
|
|
119
123
|
const [showFullRaw, setShowFullRaw] = (0, react_1.useState)(false);
|
|
120
124
|
const RAW_LIMIT = 50000;
|
|
121
|
-
const
|
|
122
|
-
const
|
|
125
|
+
const safeRawText = typeof rawText === 'string' ? rawText : '';
|
|
126
|
+
const isTruncated = safeRawText.length > RAW_LIMIT && !showFullRaw;
|
|
127
|
+
const displayRawText = isTruncated ? safeRawText.slice(0, RAW_LIMIT) : safeRawText;
|
|
123
128
|
(0, react_1.useEffect)(() => {
|
|
124
129
|
if (externalMode) {
|
|
125
130
|
setInternalMode(externalMode);
|
|
@@ -97,6 +97,22 @@ const LogCard = react_1.default.memo(function LogCard({ item, onPress, timelineM
|
|
|
97
97
|
}).start();
|
|
98
98
|
}
|
|
99
99
|
}, [isNew]);
|
|
100
|
+
const renderStatusIcon = () => {
|
|
101
|
+
if (isLoading) {
|
|
102
|
+
return <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.darkOrange} size={9}/>;
|
|
103
|
+
}
|
|
104
|
+
const num = typeof item.status === 'number' ? item.status : parseInt(String(item.status || 0), 10);
|
|
105
|
+
if (num >= 200 && num < 300) {
|
|
106
|
+
return <NetworkIcons_1.CircleCheckIcon color={AppColors_1.AppColors.greenColor} size={9}/>;
|
|
107
|
+
}
|
|
108
|
+
if (num >= 300 && num < 400) {
|
|
109
|
+
return <NetworkIcons_1.RepeatIcon color={AppColors_1.AppColors.amber700} size={9}/>;
|
|
110
|
+
}
|
|
111
|
+
if (num >= 400 && num < 500) {
|
|
112
|
+
return <NetworkIcons_1.CircleAlertIcon color={AppColors_1.AppColors.darkOrange} size={9}/>;
|
|
113
|
+
}
|
|
114
|
+
return <NetworkIcons_1.CircleXIcon color={AppColors_1.AppColors.errorColor} size={9}/>;
|
|
115
|
+
};
|
|
100
116
|
const triggeredAt = (0, helpers_1.formatDateTime)(item.startTime);
|
|
101
117
|
const isJson = item.url.split('?')[0].toLowerCase().endsWith('.json');
|
|
102
118
|
return (<TouchableScale_1.default onPress={onPress} style={[
|
|
@@ -248,6 +264,9 @@ const LogCard = react_1.default.memo(function LogCard({ item, onPress, timelineM
|
|
|
248
264
|
<react_native_1.View style={[
|
|
249
265
|
styles_1.default.statusPill,
|
|
250
266
|
{
|
|
267
|
+
flexDirection: 'row',
|
|
268
|
+
alignItems: 'center',
|
|
269
|
+
gap: 3.5,
|
|
251
270
|
backgroundColor: isFailed
|
|
252
271
|
? `${AppColors_1.AppColors.errorColor}15`
|
|
253
272
|
: isLoading
|
|
@@ -260,6 +279,7 @@ const LogCard = react_1.default.memo(function LogCard({ item, onPress, timelineM
|
|
|
260
279
|
: `${statusColor}30`,
|
|
261
280
|
},
|
|
262
281
|
]}>
|
|
282
|
+
{renderStatusIcon()}
|
|
263
283
|
<react_native_1.Text style={[
|
|
264
284
|
styles_1.default.statusPillText,
|
|
265
285
|
{
|
|
@@ -282,7 +302,17 @@ const LogCard = react_1.default.memo(function LogCard({ item, onPress, timelineM
|
|
|
282
302
|
{/* Row 2: Full URL Capsule Container (Clickable with link prompt) */}
|
|
283
303
|
<react_native_1.View style={styles_1.default.cardSlugBox}>
|
|
284
304
|
<react_native_1.Pressable onPress={handleOpenUrl} style={styles_1.default.slugLeft} hitSlop={6}>
|
|
285
|
-
<react_native_1.
|
|
305
|
+
<react_native_1.View style={{
|
|
306
|
+
width: 17,
|
|
307
|
+
height: 17,
|
|
308
|
+
borderRadius: 4,
|
|
309
|
+
backgroundColor: `${AppColors_1.AppColors.skyBlue}1A`,
|
|
310
|
+
alignItems: 'center',
|
|
311
|
+
justifyContent: 'center',
|
|
312
|
+
marginRight: 4,
|
|
313
|
+
}}>
|
|
314
|
+
<NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.skyBlue} size={11}/>
|
|
315
|
+
</react_native_1.View>
|
|
286
316
|
<HighlightText_1.default text={item.url} search={searchStr} style={[styles_1.default.slugText, { color: AppColors_1.AppColors.skyBlue, textDecorationLine: 'underline' }]} highlightStyle={styles_1.default.highlight} numberOfLines={2} ellipsizeMode="middle"/>
|
|
287
317
|
</react_native_1.Pressable>
|
|
288
318
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TextStyle } from 'react-native';
|
|
3
|
+
export interface LogSyntaxHighlighterProps {
|
|
4
|
+
text: string;
|
|
5
|
+
search?: string;
|
|
6
|
+
numberOfLines?: number;
|
|
7
|
+
style?: TextStyle | TextStyle[];
|
|
8
|
+
detectLinks?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface Token {
|
|
11
|
+
type: 'key' | 'string' | 'number' | 'boolean' | 'null' | 'url' | 'bracket' | 'tag' | 'plain';
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const tokenizeText: (input: string) => Token[];
|
|
15
|
+
export declare const LogSyntaxHighlighter: React.FC<LogSyntaxHighlighterProps>;
|
|
16
|
+
export default LogSyntaxHighlighter;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LogSyntaxHighlighter = exports.tokenizeText = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const react_native_1 = require("react-native");
|
|
9
|
+
const AppColors_1 = require("../styles/AppColors");
|
|
10
|
+
const AppFonts_1 = require("../styles/AppFonts");
|
|
11
|
+
const helpers_1 = require("../helpers");
|
|
12
|
+
const TOKEN_REGEX = /("(?:\\.|[^"\\])*"(?=\s*:))|("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|(\b-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b)|(\b(?:true|false)\b)|(\b(?:null|undefined|NaN)\b)|(https?:\/\/[^\s"',]+)|(\[[\w\s_-]+\])|([{}[\],:])|([^"'\d\s{}[\],:]+|[ \t\r\n]+)/g;
|
|
13
|
+
const tokenizeText = (input) => {
|
|
14
|
+
if (!input)
|
|
15
|
+
return [];
|
|
16
|
+
const tokens = [];
|
|
17
|
+
let match;
|
|
18
|
+
TOKEN_REGEX.lastIndex = 0;
|
|
19
|
+
while ((match = TOKEN_REGEX.exec(input)) !== null) {
|
|
20
|
+
if (match[1]) {
|
|
21
|
+
tokens.push({ type: 'key', value: match[1] });
|
|
22
|
+
}
|
|
23
|
+
else if (match[2]) {
|
|
24
|
+
tokens.push({ type: 'string', value: match[2] });
|
|
25
|
+
}
|
|
26
|
+
else if (match[3]) {
|
|
27
|
+
tokens.push({ type: 'number', value: match[3] });
|
|
28
|
+
}
|
|
29
|
+
else if (match[4]) {
|
|
30
|
+
tokens.push({ type: 'boolean', value: match[4] });
|
|
31
|
+
}
|
|
32
|
+
else if (match[5]) {
|
|
33
|
+
tokens.push({ type: 'null', value: match[5] });
|
|
34
|
+
}
|
|
35
|
+
else if (match[6]) {
|
|
36
|
+
tokens.push({ type: 'url', value: match[6] });
|
|
37
|
+
}
|
|
38
|
+
else if (match[7]) {
|
|
39
|
+
tokens.push({ type: 'tag', value: match[7] });
|
|
40
|
+
}
|
|
41
|
+
else if (match[8]) {
|
|
42
|
+
tokens.push({ type: 'bracket', value: match[8] });
|
|
43
|
+
}
|
|
44
|
+
else if (match[9]) {
|
|
45
|
+
tokens.push({ type: 'plain', value: match[9] });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return tokens;
|
|
49
|
+
};
|
|
50
|
+
exports.tokenizeText = tokenizeText;
|
|
51
|
+
const getTokenColor = (type) => {
|
|
52
|
+
switch (type) {
|
|
53
|
+
case 'key':
|
|
54
|
+
return AppColors_1.AppColors.sky600 || '#0369a1';
|
|
55
|
+
case 'string':
|
|
56
|
+
return AppColors_1.AppColors.emerald600 || '#059669';
|
|
57
|
+
case 'number':
|
|
58
|
+
return AppColors_1.AppColors.amber600 || '#d97706';
|
|
59
|
+
case 'boolean':
|
|
60
|
+
return AppColors_1.AppColors.purple || '#7c3aed';
|
|
61
|
+
case 'null':
|
|
62
|
+
return AppColors_1.AppColors.red600 || '#dc2626';
|
|
63
|
+
case 'url':
|
|
64
|
+
return '#0284c7';
|
|
65
|
+
case 'tag':
|
|
66
|
+
return AppColors_1.AppColors.violet600 || '#7c3aed';
|
|
67
|
+
case 'bracket':
|
|
68
|
+
return AppColors_1.AppColors.slate500 || '#64748b';
|
|
69
|
+
case 'plain':
|
|
70
|
+
default:
|
|
71
|
+
return AppColors_1.AppColors.primaryBlack || '#1e293b';
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.LogSyntaxHighlighter = react_1.default.memo(({ text, search, numberOfLines, style, detectLinks = true }) => {
|
|
75
|
+
if (!text)
|
|
76
|
+
return null;
|
|
77
|
+
const tokens = react_1.default.useMemo(() => (0, exports.tokenizeText)(text), [text]);
|
|
78
|
+
const renderToken = (token, tokenIdx) => {
|
|
79
|
+
const baseColor = getTokenColor(token.type);
|
|
80
|
+
const isUrl = token.type === 'url';
|
|
81
|
+
const isKey = token.type === 'key';
|
|
82
|
+
const tokenStyle = {
|
|
83
|
+
color: baseColor,
|
|
84
|
+
fontFamily: isKey ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interRegular,
|
|
85
|
+
textDecorationLine: isUrl ? 'underline' : 'none',
|
|
86
|
+
};
|
|
87
|
+
if (!search || search.trim().length === 0) {
|
|
88
|
+
return (<react_native_1.Text key={tokenIdx} style={tokenStyle} onPress={isUrl && detectLinks
|
|
89
|
+
? () => (0, helpers_1.handleOpenExternalLink)(token.value)
|
|
90
|
+
: undefined}>
|
|
91
|
+
{token.value}
|
|
92
|
+
</react_native_1.Text>);
|
|
93
|
+
}
|
|
94
|
+
const regex = new RegExp(`(${(0, helpers_1.escapeRegex)(search.trim())})`, 'gi');
|
|
95
|
+
const parts = token.value.split(regex);
|
|
96
|
+
return (<react_native_1.Text key={tokenIdx} style={tokenStyle}>
|
|
97
|
+
{parts.map((part, partIdx) => {
|
|
98
|
+
const isMatch = part.toLowerCase() === search.trim().toLowerCase();
|
|
99
|
+
return isMatch ? (<react_native_1.Text key={partIdx} style={[
|
|
100
|
+
tokenStyle,
|
|
101
|
+
styles.searchHighlight,
|
|
102
|
+
]}>
|
|
103
|
+
{part}
|
|
104
|
+
</react_native_1.Text>) : (<react_native_1.Text key={partIdx} style={tokenStyle} onPress={isUrl && detectLinks
|
|
105
|
+
? () => (0, helpers_1.handleOpenExternalLink)(token.value)
|
|
106
|
+
: undefined}>
|
|
107
|
+
{part}
|
|
108
|
+
</react_native_1.Text>);
|
|
109
|
+
})}
|
|
110
|
+
</react_native_1.Text>);
|
|
111
|
+
};
|
|
112
|
+
return (<react_native_1.Text style={[styles.containerText, style]} numberOfLines={numberOfLines}>
|
|
113
|
+
{tokens.map(renderToken)}
|
|
114
|
+
</react_native_1.Text>);
|
|
115
|
+
});
|
|
116
|
+
const styles = react_native_1.StyleSheet.create({
|
|
117
|
+
containerText: {
|
|
118
|
+
fontFamily: AppFonts_1.AppFonts.interRegular,
|
|
119
|
+
fontSize: 12,
|
|
120
|
+
lineHeight: 18,
|
|
121
|
+
color: AppColors_1.AppColors.primaryBlack,
|
|
122
|
+
},
|
|
123
|
+
searchHighlight: {
|
|
124
|
+
backgroundColor: '#fef08a',
|
|
125
|
+
color: '#854d0e',
|
|
126
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
127
|
+
borderRadius: 2,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
exports.default = exports.LogSyntaxHighlighter;
|
|
@@ -125,3 +125,5 @@ export declare const AlertTriangleIcon: ({ color, size }: IconProps) => React.JS
|
|
|
125
125
|
export declare const BugIcon: ({ color, size }: IconProps) => React.JSX.Element;
|
|
126
126
|
export declare const TagIcon: ({ color, size }: IconProps) => React.JSX.Element;
|
|
127
127
|
export declare const NpmIcon: ({ color, size }: IconProps) => React.JSX.Element;
|
|
128
|
+
export declare const ResetIcon: ({ color, size }: IconProps) => React.JSX.Element;
|
|
129
|
+
export declare const ChevronDownIcon: ({ color, size }: IconProps) => React.JSX.Element;
|
|
@@ -38,7 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.InfoCircleIcon = exports.UserIcon = exports.LayersIcon = exports.WipeIcon = exports.FolderIcon = exports.SettingsIcon = exports.EyeIcon = exports.JsIcon = exports.CssIcon = exports.HtmlIcon = exports.BrandSquareIcon = exports.BrandCircleIcon = exports.MoonIcon = exports.SunIcon = exports.DebugIcon = exports.InsightsIcon = exports.AnalyticsIcon = exports.WhiteBackNavigation = exports.CloseWhite = exports.DownloadIcon = exports.FilterIcon = exports.ChevronIcon = exports.SortArrowIcon = exports.GlobeIcon = exports.DiffIcon = exports.SignalIcon = exports.ExportIcon = exports.HeaderPauseIcon = exports.TrashIcon = exports.FailIcon = exports.CircleAlertIcon = exports.CircleXIcon = exports.CircleCheckIcon = exports.CheckIcon = exports.TerminalIcon = exports.FetchIcon = exports.CopyIcon = exports.HeadersIcon = exports.ResponseIcon = exports.RequestIcon = exports.SizeIcon = exports.StatusIcon = exports.CalendarIcon = exports.ClockIcon = exports.ClearIcon = exports.SearchIcon = exports.ExpandCollapseIcon = exports.ScreenIcon = exports.MapPinIcon = exports.EmptyRadarIcon = void 0;
|
|
40
40
|
exports.DiagnosticsIcon = exports.StackTraceIcon = exports.LayoutIcon = exports.ChipIcon = exports.SkullIcon = exports.ShieldAlertIcon = exports.CrashIcon = exports.UserCheckIcon = exports.TargetGoalIcon = exports.RepeatIcon = exports.PinIcon = exports.HourglassIcon = exports.FlameIcon = exports.CodeBracketsIcon = exports.AndroidIcon = exports.AppleIcon = exports.LinkChainIcon = exports.GitHubIcon = exports.PackageBoxIcon = exports.ExternalLinkIcon = exports.MoneyIcon = exports.CartIcon = exports.TextAaIcon = exports.BrainIcon = exports.AtomIcon = exports.MapIcon = exports.SparkleIcon = exports.LightbulbIcon = exports.DocIcon = exports.FolderOpenIcon = exports.BanIcon = exports.BoltIcon = exports.PerformanceIcon = exports.ReduxIcon = exports.MetadataIcon = exports.StorageIcon = exports.RefreshCcwIcon = exports.TimelineIcon = exports.LiveStateIcon = exports.BundleIcon = exports.ForwardChevronIcon = exports.PackageIcon = exports.TableIcon = exports.RawIcon = exports.PrettyIcon = exports.SortIcon = exports.MotionIcon = exports.TrendingUpIcon = exports.ErrorCircleIcon = exports.WarningTriangleIcon = void 0;
|
|
41
|
-
exports.NpmIcon = exports.TagIcon = exports.BugIcon = exports.AlertTriangleIcon = exports.SmartphoneIcon = exports.KeyIcon = exports.BarChartIcon = exports.DiceIcon = exports.ZapIcon = exports.FlaskIcon = exports.LoadingSpinnerIcon = exports.ListenerIcon = exports.AllFramesIcon = exports.AppFramesIcon = exports.RawJsonIcon = exports.TrailIcon = void 0;
|
|
41
|
+
exports.ChevronDownIcon = exports.ResetIcon = exports.NpmIcon = exports.TagIcon = exports.BugIcon = exports.AlertTriangleIcon = exports.SmartphoneIcon = exports.KeyIcon = exports.BarChartIcon = exports.DiceIcon = exports.ZapIcon = exports.FlaskIcon = exports.LoadingSpinnerIcon = exports.ListenerIcon = exports.AllFramesIcon = exports.AppFramesIcon = exports.RawJsonIcon = exports.TrailIcon = void 0;
|
|
42
42
|
const react_1 = __importDefault(require("react"));
|
|
43
43
|
const react_native_svg_1 = __importStar(require("react-native-svg"));
|
|
44
44
|
// Stylesheet
|
|
@@ -860,3 +860,12 @@ const NpmIcon = ({ color = '#CB3837', size = 14 }) => (<react_native_svg_1.defau
|
|
|
860
860
|
<react_native_svg_1.Path d="M48 48h160v160h-32V96h-32v112H48V48z" fill="#FFFFFF"/>
|
|
861
861
|
</react_native_svg_1.default>);
|
|
862
862
|
exports.NpmIcon = NpmIcon;
|
|
863
|
+
const ResetIcon = ({ color = AppColors_1.AppColors.white, size = 16 }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
864
|
+
<react_native_svg_1.Path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
865
|
+
<react_native_svg_1.Path d="M3 3v5h5" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
866
|
+
</react_native_svg_1.default>);
|
|
867
|
+
exports.ResetIcon = ResetIcon;
|
|
868
|
+
const ChevronDownIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14 }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
869
|
+
<react_native_svg_1.Path d="M6 9l6 6 6-6" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
870
|
+
</react_native_svg_1.default>);
|
|
871
|
+
exports.ChevronDownIcon = ChevronDownIcon;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SliderProps {
|
|
3
|
+
value: number;
|
|
4
|
+
onValueChange: (value: number) => void;
|
|
5
|
+
min?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
step?: number;
|
|
8
|
+
formatLabel?: (value: number) => string;
|
|
9
|
+
quickPresets?: number[];
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const Slider: React.FC<SliderProps>;
|
|
13
|
+
export default Slider;
|