react-native-inapp-inspector 1.1.35 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -101
- package/android/build.gradle +13 -1
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +890 -0
- package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.kt +17 -0
- package/dist/commonjs/components/ConsoleLogCard.js +5 -5
- package/dist/commonjs/components/CopyButton.js +3 -0
- package/dist/commonjs/components/EndOfListFooter.js +1 -1
- package/dist/commonjs/components/ErrorBoundary.js +3 -0
- package/dist/commonjs/components/Inspector/AnalyticsTab.js +25 -73
- package/dist/commonjs/components/Inspector/BundleTab.js +671 -189
- package/dist/commonjs/components/Inspector/ConsoleTab.js +110 -99
- package/dist/commonjs/components/Inspector/CrashTab.js +99 -91
- package/dist/commonjs/components/Inspector/InspectorHeader.js +107 -20
- package/dist/commonjs/components/Inspector/MainScreen.js +111 -68
- package/dist/commonjs/components/Inspector/NetworkTab.js +151 -30
- package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
- package/dist/commonjs/components/Inspector/ReduxTab.js +18 -10
- package/dist/commonjs/components/Inspector/SettingsPanel.js +1218 -1238
- package/dist/commonjs/components/Inspector/TabBar.js +4 -2
- 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 +3 -0
- package/dist/commonjs/components/NetworkIcons.js +15 -1
- package/dist/commonjs/components/Slider.d.ts +13 -0
- package/dist/commonjs/components/Slider.js +261 -0
- package/dist/commonjs/components/TouchableScale.d.ts +1 -0
- package/dist/commonjs/components/TouchableScale.js +30 -32
- package/dist/commonjs/constants/index.d.ts +1 -2
- package/dist/commonjs/constants/index.js +4 -0
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/analyticsLogger.d.ts +4 -0
- package/dist/commonjs/customHooks/analyticsLogger.js +8 -6
- package/dist/commonjs/customHooks/crashHandler.js +8 -1
- package/dist/commonjs/helpers/index.d.ts +1 -0
- package/dist/commonjs/helpers/index.js +25 -1
- package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
- package/dist/commonjs/helpers/searchQueryParser.js +236 -0
- package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
- package/dist/commonjs/helpers/settingsStore.js +59 -3
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +220 -43
- package/dist/commonjs/native/NativeInspector.d.ts +125 -0
- package/dist/commonjs/native/NativeInspector.js +313 -0
- package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
- package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
- package/dist/commonjs/styles/index.js +41 -41
- package/dist/commonjs/types/enums.d.ts +1 -1
- package/dist/commonjs/types/interfaces.d.ts +9 -0
- package/dist/esm/components/ConsoleLogCard.js +5 -5
- package/dist/esm/components/CopyButton.js +3 -0
- package/dist/esm/components/EndOfListFooter.js +2 -2
- package/dist/esm/components/ErrorBoundary.js +3 -0
- package/dist/esm/components/Inspector/AnalyticsTab.js +27 -75
- package/dist/esm/components/Inspector/BundleTab.js +671 -189
- package/dist/esm/components/Inspector/ConsoleTab.js +111 -100
- package/dist/esm/components/Inspector/CrashTab.js +99 -91
- package/dist/esm/components/Inspector/InspectorHeader.js +108 -21
- package/dist/esm/components/Inspector/MainScreen.js +113 -70
- package/dist/esm/components/Inspector/NetworkTab.js +152 -31
- package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
- package/dist/esm/components/Inspector/ReduxTab.js +18 -10
- package/dist/esm/components/Inspector/SettingsPanel.js +1222 -1242
- package/dist/esm/components/Inspector/TabBar.js +4 -2
- 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 +3 -0
- package/dist/esm/components/NetworkIcons.js +11 -0
- package/dist/esm/components/Slider.d.ts +13 -0
- package/dist/esm/components/Slider.js +222 -0
- package/dist/esm/components/TouchableScale.d.ts +1 -0
- package/dist/esm/components/TouchableScale.js +31 -33
- package/dist/esm/constants/index.d.ts +1 -2
- package/dist/esm/constants/index.js +4 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/analyticsLogger.d.ts +4 -0
- package/dist/esm/customHooks/analyticsLogger.js +6 -5
- package/dist/esm/customHooks/crashHandler.js +8 -1
- package/dist/esm/helpers/index.d.ts +1 -0
- package/dist/esm/helpers/index.js +11 -1
- package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
- package/dist/esm/helpers/searchQueryParser.js +233 -0
- package/dist/esm/helpers/settingsStore.d.ts +9 -0
- package/dist/esm/helpers/settingsStore.js +58 -3
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +207 -44
- package/dist/esm/native/NativeInspector.d.ts +125 -0
- package/dist/esm/native/NativeInspector.js +289 -0
- package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
- package/dist/esm/native/NativeNetworkInspector.js +2 -0
- package/dist/esm/styles/index.js +41 -41
- package/dist/esm/types/enums.d.ts +1 -1
- package/dist/esm/types/interfaces.d.ts +9 -0
- package/ios/NetworkInspectorModule.h +6 -0
- package/ios/NetworkInspectorModule.m +760 -5
- package/package.json +13 -2
- package/react-native-inapp-inspector.podspec +7 -2
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
- package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +0 -28
|
@@ -0,0 +1,313 @@
|
|
|
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.fetchNativeCachedPage = exports.pushNativeLogRecord = exports.getNativeSystemMetrics = exports.triggerNativeHaptic = exports.setNativeStorageItem = exports.getNativeStorageItem = exports.subscribeNativeDeviceShake = exports.getNativeFpsMetrics = exports.stopNativeFpsMonitoring = exports.startNativeFpsMonitoring = exports.subscribeNativeFloatingButtonPress = exports.setNativeFloatingButtonBadge = exports.hideNativeFloatingButton = exports.showNativeFloatingButton = exports.subscribeNativeCrashes = exports.enableNativeCrashProtection = exports.getNativeDeviceMetrics = exports.isNativeModuleAvailable = void 0;
|
|
7
|
+
const react_native_1 = require("react-native");
|
|
8
|
+
const NativeNetworkInspector_1 = __importDefault(require("./NativeNetworkInspector"));
|
|
9
|
+
// Seamless TurboModule (New Architecture / JSI) & Legacy NativeModules Bridge resolution
|
|
10
|
+
const NativeModule = NativeNetworkInspector_1.default || react_native_1.NativeModules.NetworkInspectorModule;
|
|
11
|
+
const isNativeModuleAvailable = () => {
|
|
12
|
+
return !!NativeModule;
|
|
13
|
+
};
|
|
14
|
+
exports.isNativeModuleAvailable = isNativeModuleAvailable;
|
|
15
|
+
const nativeEmitter = (0, exports.isNativeModuleAvailable)()
|
|
16
|
+
? new react_native_1.NativeEventEmitter(NativeModule)
|
|
17
|
+
: null;
|
|
18
|
+
/**
|
|
19
|
+
* Retrieves low-level native hardware and system metrics (RAM, Heap, Disk, Battery, CPU).
|
|
20
|
+
*/
|
|
21
|
+
const getNativeDeviceMetrics = async () => {
|
|
22
|
+
if (!NativeModule || !NativeModule.getDeviceMetrics) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const metrics = await NativeModule.getDeviceMetrics();
|
|
27
|
+
return metrics;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.getNativeDeviceMetrics = getNativeDeviceMetrics;
|
|
34
|
+
/**
|
|
35
|
+
* Enables native signal and uncaught exception protection in the iOS / Android runtime.
|
|
36
|
+
* Automatically ensures the native floating icon is shown and available before UI renders.
|
|
37
|
+
*/
|
|
38
|
+
const enableNativeCrashProtection = async (options) => {
|
|
39
|
+
if (!NativeModule || !NativeModule.enableNativeCrashProtection) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const result = await NativeModule.enableNativeCrashProtection();
|
|
44
|
+
if (options?.showFloatingButton !== false) {
|
|
45
|
+
await (0, exports.showNativeFloatingButton)();
|
|
46
|
+
}
|
|
47
|
+
return !!result;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.enableNativeCrashProtection = enableNativeCrashProtection;
|
|
54
|
+
/**
|
|
55
|
+
* Subscribes to fatal native crash events caught by the iOS / Kotlin exception handlers.
|
|
56
|
+
*/
|
|
57
|
+
const subscribeNativeCrashes = (callback) => {
|
|
58
|
+
if (!nativeEmitter) {
|
|
59
|
+
return () => { };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const subscription = nativeEmitter.addListener('onNativeCrash', callback);
|
|
63
|
+
return () => {
|
|
64
|
+
subscription.remove();
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
return () => { };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.subscribeNativeCrashes = subscribeNativeCrashes;
|
|
72
|
+
/**
|
|
73
|
+
* Displays the 100% native main-thread floating overlay button.
|
|
74
|
+
* Dragging & touches run on the native UI thread, completely isolated from JS thread stalls.
|
|
75
|
+
*/
|
|
76
|
+
const showNativeFloatingButton = async (options) => {
|
|
77
|
+
if (!NativeModule || !NativeModule.showFloatingButton) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const result = await NativeModule.showFloatingButton(options || {});
|
|
82
|
+
return !!result;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
exports.showNativeFloatingButton = showNativeFloatingButton;
|
|
89
|
+
/**
|
|
90
|
+
* Hides the native floating overlay button.
|
|
91
|
+
*/
|
|
92
|
+
const hideNativeFloatingButton = async () => {
|
|
93
|
+
if (!NativeModule || !NativeModule.hideFloatingButton) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const result = await NativeModule.hideFloatingButton();
|
|
98
|
+
return !!result;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
exports.hideNativeFloatingButton = hideNativeFloatingButton;
|
|
105
|
+
/**
|
|
106
|
+
* Updates the badge/status dot on the native floating overlay button.
|
|
107
|
+
*/
|
|
108
|
+
const setNativeFloatingButtonBadge = async (hasBadge) => {
|
|
109
|
+
if (!NativeModule || !NativeModule.setFloatingButtonBadge) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const result = await NativeModule.setFloatingButtonBadge(hasBadge);
|
|
114
|
+
return !!result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
exports.setNativeFloatingButtonBadge = setNativeFloatingButtonBadge;
|
|
121
|
+
/**
|
|
122
|
+
* Subscribes to tap events on the native floating button.
|
|
123
|
+
*/
|
|
124
|
+
const subscribeNativeFloatingButtonPress = (callback) => {
|
|
125
|
+
if (!nativeEmitter) {
|
|
126
|
+
return () => { };
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const subscription = nativeEmitter.addListener('onFloatingButtonPress', callback);
|
|
130
|
+
return () => {
|
|
131
|
+
subscription.remove();
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
return () => { };
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
exports.subscribeNativeFloatingButtonPress = subscribeNativeFloatingButtonPress;
|
|
139
|
+
/**
|
|
140
|
+
* Starts hardware-accurate native UI thread FPS tracking (CADisplayLink / Choreographer).
|
|
141
|
+
*/
|
|
142
|
+
const startNativeFpsMonitoring = async () => {
|
|
143
|
+
if (!NativeModule || !NativeModule.startFpsMonitoring) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const result = await NativeModule.startFpsMonitoring();
|
|
148
|
+
return !!result;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
exports.startNativeFpsMonitoring = startNativeFpsMonitoring;
|
|
155
|
+
/**
|
|
156
|
+
* Stops native FPS tracking.
|
|
157
|
+
*/
|
|
158
|
+
const stopNativeFpsMonitoring = async () => {
|
|
159
|
+
if (!NativeModule || !NativeModule.stopFpsMonitoring) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const result = await NativeModule.stopFpsMonitoring();
|
|
164
|
+
return !!result;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
exports.stopNativeFpsMonitoring = stopNativeFpsMonitoring;
|
|
171
|
+
/**
|
|
172
|
+
* Reads the latest live hardware FPS from CADisplayLink (iOS) or Choreographer (Android).
|
|
173
|
+
*/
|
|
174
|
+
const getNativeFpsMetrics = async () => {
|
|
175
|
+
if (!NativeModule || !NativeModule.getFpsMetrics) {
|
|
176
|
+
return { fps: 60, targetFps: 60 };
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const metrics = await NativeModule.getFpsMetrics();
|
|
180
|
+
return {
|
|
181
|
+
fps: typeof metrics?.fps === 'number' ? metrics.fps : 60,
|
|
182
|
+
targetFps: typeof metrics?.targetFps === 'number' ? metrics.targetFps : 60,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return { fps: 60, targetFps: 60 };
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
exports.getNativeFpsMetrics = getNativeFpsMetrics;
|
|
190
|
+
/**
|
|
191
|
+
* Subscribes to physical hardware shake events (or Cmd+Ctrl+Z on iOS simulator).
|
|
192
|
+
*/
|
|
193
|
+
const subscribeNativeDeviceShake = (callback) => {
|
|
194
|
+
if (!nativeEmitter) {
|
|
195
|
+
return () => { };
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
const subscription = nativeEmitter.addListener('onDeviceShake', callback);
|
|
199
|
+
return () => {
|
|
200
|
+
subscription.remove();
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return () => { };
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
exports.subscribeNativeDeviceShake = subscribeNativeDeviceShake;
|
|
208
|
+
/**
|
|
209
|
+
* Reads a persisted value synchronously from native NSUserDefaults / SharedPreferences.
|
|
210
|
+
*/
|
|
211
|
+
const getNativeStorageItem = async (key) => {
|
|
212
|
+
if (!NativeModule || !NativeModule.getNativeStorageItem) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const val = await NativeModule.getNativeStorageItem(key);
|
|
217
|
+
return typeof val === 'string' ? val : null;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
exports.getNativeStorageItem = getNativeStorageItem;
|
|
224
|
+
/**
|
|
225
|
+
* Persists a key-value pair to native NSUserDefaults / SharedPreferences with 0ms latency.
|
|
226
|
+
*/
|
|
227
|
+
const setNativeStorageItem = async (key, value) => {
|
|
228
|
+
if (!NativeModule || !NativeModule.setNativeStorageItem) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
const result = await NativeModule.setNativeStorageItem(key, value);
|
|
233
|
+
return !!result;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
exports.setNativeStorageItem = setNativeStorageItem;
|
|
240
|
+
/**
|
|
241
|
+
* Triggers hardware native haptic feedback (iOS UIFeedbackGenerator / Android VibrationEffect).
|
|
242
|
+
*/
|
|
243
|
+
const triggerNativeHaptic = async (style = 'light') => {
|
|
244
|
+
if (!NativeModule || !NativeModule.triggerHaptic) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
const result = await NativeModule.triggerHaptic(style);
|
|
249
|
+
return !!result;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
exports.triggerNativeHaptic = triggerNativeHaptic;
|
|
256
|
+
/**
|
|
257
|
+
* Retrieves live system thermal state and RAM telemetry directly from native layer.
|
|
258
|
+
*/
|
|
259
|
+
const getNativeSystemMetrics = async () => {
|
|
260
|
+
if (!NativeModule || !NativeModule.getNativeSystemMetrics) {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
try {
|
|
264
|
+
const metrics = await NativeModule.getNativeSystemMetrics();
|
|
265
|
+
return metrics;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
exports.getNativeSystemMetrics = getNativeSystemMetrics;
|
|
272
|
+
/**
|
|
273
|
+
* Pushes a log payload to native background worker queues for instant native page caching.
|
|
274
|
+
*/
|
|
275
|
+
const pushNativeLogRecord = async (pageKey, jsonPayload) => {
|
|
276
|
+
if (!NativeModule || !NativeModule.pushNativeLogRecord) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
const result = await NativeModule.pushNativeLogRecord(pageKey, jsonPayload);
|
|
281
|
+
return !!result;
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
exports.pushNativeLogRecord = pushNativeLogRecord;
|
|
288
|
+
/**
|
|
289
|
+
* Fetches pre-indexed, pre-sliced page data directly from native background memory queues.
|
|
290
|
+
* Delivers instantaneous 0ms page loading without blocking JS render thread.
|
|
291
|
+
*/
|
|
292
|
+
const fetchNativeCachedPage = async (pageKey, offset = 0, limit = 50, query = '') => {
|
|
293
|
+
if (!NativeModule || !NativeModule.getNativeCachedPage) {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
const rawJson = await NativeModule.getNativeCachedPage(pageKey, offset, limit, query);
|
|
298
|
+
if (!rawJson)
|
|
299
|
+
return null;
|
|
300
|
+
const parsed = JSON.parse(rawJson);
|
|
301
|
+
const parsedItems = (parsed.items || []).map((item) => typeof item === 'string' ? JSON.parse(item) : item);
|
|
302
|
+
return {
|
|
303
|
+
pageKey: parsed.pageKey || pageKey,
|
|
304
|
+
total: parsed.total || 0,
|
|
305
|
+
offset: parsed.offset || offset,
|
|
306
|
+
items: parsedItems,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
exports.fetchNativeCachedPage = fetchNativeCachedPage;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
enableNativeCrashProtection(): Promise<boolean>;
|
|
4
|
+
getDeviceMetrics(): Promise<Object>;
|
|
5
|
+
showFloatingButton(options: Object): Promise<boolean>;
|
|
6
|
+
hideFloatingButton(): Promise<boolean>;
|
|
7
|
+
setFloatingButtonBadge(hasBadge: boolean): Promise<boolean>;
|
|
8
|
+
setFloatingButtonPosition(x: number, y: number): Promise<boolean>;
|
|
9
|
+
startFpsMonitoring(): Promise<boolean>;
|
|
10
|
+
stopFpsMonitoring(): Promise<boolean>;
|
|
11
|
+
getFpsMetrics(): Promise<Object>;
|
|
12
|
+
getNativeStorageItem(key: string): Promise<string | null>;
|
|
13
|
+
setNativeStorageItem(key: string, value: string | null): Promise<boolean>;
|
|
14
|
+
triggerHaptic(style: string): Promise<boolean>;
|
|
15
|
+
getNativeSystemMetrics(): Promise<Object>;
|
|
16
|
+
pushNativeLogRecord(pageKey: string, jsonPayload: string): Promise<boolean>;
|
|
17
|
+
getNativeCachedPage(pageKey: string, offset: number, limit: number, query: string): Promise<string>;
|
|
18
|
+
addListener(eventName: string): void;
|
|
19
|
+
removeListeners(count: number): void;
|
|
20
|
+
}
|
|
21
|
+
declare const _default: Spec;
|
|
22
|
+
export default _default;
|
|
@@ -43,10 +43,10 @@ const getRawStyles = (colors) => ({
|
|
|
43
43
|
header: {
|
|
44
44
|
flexDirection: 'row',
|
|
45
45
|
alignItems: 'center',
|
|
46
|
-
paddingHorizontal:
|
|
47
|
-
paddingVertical:
|
|
46
|
+
paddingHorizontal: 10,
|
|
47
|
+
paddingVertical: 8,
|
|
48
48
|
zIndex: 10,
|
|
49
|
-
minHeight:
|
|
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:
|
|
73
|
+
gap: 5,
|
|
74
74
|
},
|
|
75
75
|
headerTitle: {
|
|
76
76
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
@@ -172,12 +172,12 @@ const getRawStyles = (colors) => ({
|
|
|
172
172
|
fontSize: 12,
|
|
173
173
|
letterSpacing: 0.2,
|
|
174
174
|
},
|
|
175
|
-
listContent: { paddingBottom:
|
|
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',
|
|
179
|
-
bottom:
|
|
180
|
-
right:
|
|
179
|
+
bottom: 22,
|
|
180
|
+
right: 16,
|
|
181
181
|
width: 38,
|
|
182
182
|
height: 38,
|
|
183
183
|
borderRadius: 19,
|
|
@@ -186,16 +186,16 @@ const getRawStyles = (colors) => ({
|
|
|
186
186
|
justifyContent: 'center',
|
|
187
187
|
shadowColor: colors.black,
|
|
188
188
|
shadowOffset: { width: 0, height: 3 },
|
|
189
|
-
shadowOpacity: 0.
|
|
190
|
-
shadowRadius:
|
|
191
|
-
elevation:
|
|
192
|
-
zIndex:
|
|
189
|
+
shadowOpacity: 0.3,
|
|
190
|
+
shadowRadius: 6,
|
|
191
|
+
elevation: 12,
|
|
192
|
+
zIndex: 999,
|
|
193
193
|
},
|
|
194
194
|
detailScroll: { flex: 1 },
|
|
195
195
|
closeButtonSquare: {
|
|
196
|
-
width:
|
|
197
|
-
height:
|
|
198
|
-
borderRadius:
|
|
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:
|
|
418
|
-
marginTop:
|
|
417
|
+
marginHorizontal: 8,
|
|
418
|
+
marginTop: 10,
|
|
419
419
|
marginBottom: 4,
|
|
420
|
-
paddingHorizontal:
|
|
421
|
-
paddingVertical:
|
|
422
|
-
borderRadius:
|
|
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:
|
|
444
|
+
gap: 6,
|
|
445
445
|
},
|
|
446
446
|
domainIconWrap: {
|
|
447
|
-
width:
|
|
448
|
-
height:
|
|
449
|
-
borderRadius:
|
|
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
|
|
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:
|
|
518
|
-
paddingVertical:
|
|
519
|
-
borderRadius:
|
|
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:
|
|
526
|
+
fontSize: 9.5,
|
|
527
527
|
},
|
|
528
528
|
treeNodeRow: {
|
|
529
529
|
flexDirection: 'row',
|
|
530
530
|
alignItems: 'stretch',
|
|
531
|
-
marginHorizontal:
|
|
532
|
-
paddingRight:
|
|
533
|
-
paddingLeft:
|
|
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:
|
|
547
|
+
width: 14,
|
|
548
548
|
position: 'relative',
|
|
549
549
|
},
|
|
550
550
|
modernTreeLine: {
|
|
551
551
|
position: 'absolute',
|
|
552
|
-
left:
|
|
552
|
+
left: 7,
|
|
553
553
|
top: 0,
|
|
554
|
-
width:
|
|
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:
|
|
562
|
+
borderBottomLeftRadius: 8,
|
|
563
563
|
},
|
|
564
564
|
modernTreeBranch: {
|
|
565
565
|
position: 'absolute',
|
|
566
|
-
left:
|
|
566
|
+
left: 7,
|
|
567
567
|
top: '50%',
|
|
568
|
-
width:
|
|
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
|
|
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:
|
|
615
|
-
height:
|
|
614
|
+
width: 15,
|
|
615
|
+
height: 15,
|
|
616
616
|
borderRadius: 4,
|
|
617
|
-
borderWidth: 1.
|
|
617
|
+
borderWidth: 1.8,
|
|
618
618
|
borderColor: colors.grayTextWeak,
|
|
619
619
|
alignItems: 'center',
|
|
620
620
|
justifyContent: 'center',
|
|
@@ -25,7 +25,7 @@ export declare const StatusFilter: {
|
|
|
25
25
|
readonly FiveXx: "5xx";
|
|
26
26
|
readonly Failed: "Failed";
|
|
27
27
|
};
|
|
28
|
-
export type StatusFilter = (typeof StatusFilter)[keyof typeof StatusFilter];
|
|
28
|
+
export type StatusFilter = (typeof StatusFilter)[keyof typeof StatusFilter] | string;
|
|
29
29
|
export declare const SortOrder: {
|
|
30
30
|
readonly Newest: "newest";
|
|
31
31
|
readonly Oldest: "oldest";
|
|
@@ -140,6 +140,9 @@ export interface PersistedSettings {
|
|
|
140
140
|
defaultTab?: string;
|
|
141
141
|
maxNetworkLogs?: number;
|
|
142
142
|
maxConsoleLogs?: number;
|
|
143
|
+
maxAnalyticsEventsLimit?: number;
|
|
144
|
+
maxCrashLogs?: number;
|
|
145
|
+
isAutoRamLimitEnabled?: boolean;
|
|
143
146
|
showConsoleLevels?: {
|
|
144
147
|
info: boolean;
|
|
145
148
|
warn: boolean;
|
|
@@ -197,6 +200,7 @@ export interface InspectorContextValue {
|
|
|
197
200
|
activePulseAnim: Animated.Value;
|
|
198
201
|
unreadPulseAnim: Animated.Value;
|
|
199
202
|
runClearAllWithAnimation: () => void;
|
|
203
|
+
useNativeFab: boolean;
|
|
200
204
|
fabPan: Animated.ValueXY;
|
|
201
205
|
fabPanResponder: PanResponderInstance;
|
|
202
206
|
fabDraggedRef: React.MutableRefObject<boolean>;
|
|
@@ -313,6 +317,11 @@ export interface InspectorContextValue {
|
|
|
313
317
|
setMaxNetworkLogs: React.Dispatch<React.SetStateAction<number>>;
|
|
314
318
|
maxConsoleLogs: number;
|
|
315
319
|
setMaxConsoleLogs: React.Dispatch<React.SetStateAction<number>>;
|
|
320
|
+
maxAnalyticsEventsLimit: number;
|
|
321
|
+
setMaxAnalyticsEventsLimit: React.Dispatch<React.SetStateAction<number>>;
|
|
322
|
+
isAutoRamLimitEnabled: boolean;
|
|
323
|
+
setIsAutoRamLimitEnabled: React.Dispatch<React.SetStateAction<boolean>>;
|
|
324
|
+
deviceFreeRamMb: number;
|
|
316
325
|
reduxAutoRefresh: boolean;
|
|
317
326
|
setReduxAutoRefreshState: React.Dispatch<React.SetStateAction<boolean>>;
|
|
318
327
|
reduxExpandDepth: number;
|
|
@@ -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
|
-
<
|
|
76
|
+
<LogSyntaxHighlighter text={remainingText} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>
|
|
77
77
|
</View>);
|
|
78
78
|
}
|
|
79
|
-
return (<
|
|
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
|
-
<
|
|
237
|
+
<LogSyntaxHighlighter text={jsonPreview.text} search={searchStr} style={[
|
|
238
238
|
styles.jsonPreviewText,
|
|
239
239
|
{ color: AppColors.primaryBlack },
|
|
240
|
-
]}
|
|
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>
|
|
@@ -4,6 +4,7 @@ import { Share } from 'react-native';
|
|
|
4
4
|
import TouchableScale from './TouchableScale';
|
|
5
5
|
// Helpers
|
|
6
6
|
import { copyToClipboard } from '../helpers';
|
|
7
|
+
import { triggerNativeHaptic } from '../native/NativeInspector';
|
|
7
8
|
// Assets
|
|
8
9
|
import { TerminalIcon, FetchIcon, CopyIcon, CheckIcon } from './NetworkIcons';
|
|
9
10
|
// Stylesheet
|
|
@@ -12,6 +13,7 @@ import styles from '../styles';
|
|
|
12
13
|
const CopyButton = React.memo(({ value, label, iconType = 'copy' }) => {
|
|
13
14
|
const [copied, setCopied] = useState(false);
|
|
14
15
|
const handlePress = useCallback(() => {
|
|
16
|
+
triggerNativeHaptic('success');
|
|
15
17
|
const resolvedValue = typeof value === 'function' ? value() : value;
|
|
16
18
|
copyToClipboard(resolvedValue, label);
|
|
17
19
|
setCopied(true);
|
|
@@ -19,6 +21,7 @@ const CopyButton = React.memo(({ value, label, iconType = 'copy' }) => {
|
|
|
19
21
|
}, [value, label]);
|
|
20
22
|
const handleLongPress = useCallback(() => {
|
|
21
23
|
try {
|
|
24
|
+
triggerNativeHaptic('medium');
|
|
22
25
|
const resolvedValue = typeof value === 'function' ? value() : value;
|
|
23
26
|
const textToShare = typeof resolvedValue === 'string'
|
|
24
27
|
? resolvedValue
|
|
@@ -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:
|
|
30
|
+
paddingBottom: Platform.OS === 'ios' ? 44 : 32,
|
|
31
31
|
gap: 8,
|
|
32
32
|
},
|
|
33
33
|
dividerLine: {
|
|
@@ -7,6 +7,7 @@ import { t } from '../i18n';
|
|
|
7
7
|
import { WarningTriangleIcon, CopyIcon, RefreshCcwIcon, ClearIcon, CircleAlertIcon, } from './NetworkIcons';
|
|
8
8
|
import { handleInterceptedCrash } from '../customHooks/crashHandler';
|
|
9
9
|
import { CrashType } from '../types/enums';
|
|
10
|
+
import { showNativeFloatingButton, setNativeFloatingButtonBadge, } from '../native/NativeInspector';
|
|
10
11
|
function parseStackTrace(stack) {
|
|
11
12
|
if (!stack)
|
|
12
13
|
return { rootFrame: null, frames: [] };
|
|
@@ -109,6 +110,8 @@ ${error.stack || 'No stack trace available'}
|
|
|
109
110
|
try {
|
|
110
111
|
const stack = error?.stack || errorInfo?.componentStack || '';
|
|
111
112
|
handleInterceptedCrash(error, stack, false, CrashType.Render, errorInfo?.componentStack);
|
|
113
|
+
showNativeFloatingButton();
|
|
114
|
+
setNativeFloatingButtonBadge(true);
|
|
112
115
|
}
|
|
113
116
|
catch { }
|
|
114
117
|
}
|