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.
Files changed (104) hide show
  1. package/README.md +123 -101
  2. package/android/build.gradle +13 -1
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +890 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.kt +17 -0
  5. package/dist/commonjs/components/ConsoleLogCard.js +5 -5
  6. package/dist/commonjs/components/CopyButton.js +3 -0
  7. package/dist/commonjs/components/EndOfListFooter.js +1 -1
  8. package/dist/commonjs/components/ErrorBoundary.js +3 -0
  9. package/dist/commonjs/components/Inspector/AnalyticsTab.js +25 -73
  10. package/dist/commonjs/components/Inspector/BundleTab.js +671 -189
  11. package/dist/commonjs/components/Inspector/ConsoleTab.js +110 -99
  12. package/dist/commonjs/components/Inspector/CrashTab.js +99 -91
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +107 -20
  14. package/dist/commonjs/components/Inspector/MainScreen.js +111 -68
  15. package/dist/commonjs/components/Inspector/NetworkTab.js +151 -30
  16. package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
  17. package/dist/commonjs/components/Inspector/ReduxTab.js +18 -10
  18. package/dist/commonjs/components/Inspector/SettingsPanel.js +1218 -1238
  19. package/dist/commonjs/components/Inspector/TabBar.js +4 -2
  20. package/dist/commonjs/components/JsonViewer.js +9 -4
  21. package/dist/commonjs/components/LogCard.js +31 -1
  22. package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
  23. package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
  24. package/dist/commonjs/components/NetworkIcons.d.ts +3 -0
  25. package/dist/commonjs/components/NetworkIcons.js +15 -1
  26. package/dist/commonjs/components/Slider.d.ts +13 -0
  27. package/dist/commonjs/components/Slider.js +261 -0
  28. package/dist/commonjs/components/TouchableScale.d.ts +1 -0
  29. package/dist/commonjs/components/TouchableScale.js +30 -32
  30. package/dist/commonjs/constants/index.d.ts +1 -2
  31. package/dist/commonjs/constants/index.js +4 -0
  32. package/dist/commonjs/constants/version.d.ts +1 -1
  33. package/dist/commonjs/constants/version.js +1 -1
  34. package/dist/commonjs/customHooks/analyticsLogger.d.ts +4 -0
  35. package/dist/commonjs/customHooks/analyticsLogger.js +8 -6
  36. package/dist/commonjs/customHooks/crashHandler.js +8 -1
  37. package/dist/commonjs/helpers/index.d.ts +1 -0
  38. package/dist/commonjs/helpers/index.js +25 -1
  39. package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
  40. package/dist/commonjs/helpers/searchQueryParser.js +236 -0
  41. package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
  42. package/dist/commonjs/helpers/settingsStore.js +59 -3
  43. package/dist/commonjs/index.d.ts +1 -0
  44. package/dist/commonjs/index.js +220 -43
  45. package/dist/commonjs/native/NativeInspector.d.ts +125 -0
  46. package/dist/commonjs/native/NativeInspector.js +313 -0
  47. package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
  48. package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
  49. package/dist/commonjs/styles/index.js +41 -41
  50. package/dist/commonjs/types/enums.d.ts +1 -1
  51. package/dist/commonjs/types/interfaces.d.ts +9 -0
  52. package/dist/esm/components/ConsoleLogCard.js +5 -5
  53. package/dist/esm/components/CopyButton.js +3 -0
  54. package/dist/esm/components/EndOfListFooter.js +2 -2
  55. package/dist/esm/components/ErrorBoundary.js +3 -0
  56. package/dist/esm/components/Inspector/AnalyticsTab.js +27 -75
  57. package/dist/esm/components/Inspector/BundleTab.js +671 -189
  58. package/dist/esm/components/Inspector/ConsoleTab.js +111 -100
  59. package/dist/esm/components/Inspector/CrashTab.js +99 -91
  60. package/dist/esm/components/Inspector/InspectorHeader.js +108 -21
  61. package/dist/esm/components/Inspector/MainScreen.js +113 -70
  62. package/dist/esm/components/Inspector/NetworkTab.js +152 -31
  63. package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
  64. package/dist/esm/components/Inspector/ReduxTab.js +18 -10
  65. package/dist/esm/components/Inspector/SettingsPanel.js +1222 -1242
  66. package/dist/esm/components/Inspector/TabBar.js +4 -2
  67. package/dist/esm/components/JsonViewer.js +9 -4
  68. package/dist/esm/components/LogCard.js +32 -2
  69. package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
  70. package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
  71. package/dist/esm/components/NetworkIcons.d.ts +3 -0
  72. package/dist/esm/components/NetworkIcons.js +11 -0
  73. package/dist/esm/components/Slider.d.ts +13 -0
  74. package/dist/esm/components/Slider.js +222 -0
  75. package/dist/esm/components/TouchableScale.d.ts +1 -0
  76. package/dist/esm/components/TouchableScale.js +31 -33
  77. package/dist/esm/constants/index.d.ts +1 -2
  78. package/dist/esm/constants/index.js +4 -0
  79. package/dist/esm/constants/version.d.ts +1 -1
  80. package/dist/esm/constants/version.js +1 -1
  81. package/dist/esm/customHooks/analyticsLogger.d.ts +4 -0
  82. package/dist/esm/customHooks/analyticsLogger.js +6 -5
  83. package/dist/esm/customHooks/crashHandler.js +8 -1
  84. package/dist/esm/helpers/index.d.ts +1 -0
  85. package/dist/esm/helpers/index.js +11 -1
  86. package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
  87. package/dist/esm/helpers/searchQueryParser.js +233 -0
  88. package/dist/esm/helpers/settingsStore.d.ts +9 -0
  89. package/dist/esm/helpers/settingsStore.js +58 -3
  90. package/dist/esm/index.d.ts +1 -0
  91. package/dist/esm/index.js +207 -44
  92. package/dist/esm/native/NativeInspector.d.ts +125 -0
  93. package/dist/esm/native/NativeInspector.js +289 -0
  94. package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
  95. package/dist/esm/native/NativeNetworkInspector.js +2 -0
  96. package/dist/esm/styles/index.js +41 -41
  97. package/dist/esm/types/enums.d.ts +1 -1
  98. package/dist/esm/types/interfaces.d.ts +9 -0
  99. package/ios/NetworkInspectorModule.h +6 -0
  100. package/ios/NetworkInspectorModule.m +760 -5
  101. package/package.json +13 -2
  102. package/react-native-inapp-inspector.podspec +7 -2
  103. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
  104. 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;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_native_1 = require("react-native");
4
+ exports.default = react_native_1.TurboModuleRegistry.get('NetworkInspectorModule');
@@ -43,10 +43,10 @@ const getRawStyles = (colors) => ({
43
43
  header: {
44
44
  flexDirection: 'row',
45
45
  alignItems: 'center',
46
- paddingHorizontal: 12,
47
- paddingVertical: 10,
46
+ paddingHorizontal: 10,
47
+ paddingVertical: 8,
48
48
  zIndex: 10,
49
- minHeight: 56,
49
+ minHeight: 52,
50
50
  shadowColor: colors.black,
51
51
  shadowOffset: { width: 0, height: 2 },
52
52
  shadowOpacity: 0.08,
@@ -70,7 +70,7 @@ const getRawStyles = (colors) => ({
70
70
  flexDirection: 'row',
71
71
  alignItems: 'center',
72
72
  justifyContent: 'flex-end',
73
- gap: 6,
73
+ gap: 5,
74
74
  },
75
75
  headerTitle: {
76
76
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -172,12 +172,12 @@ const getRawStyles = (colors) => ({
172
172
  fontSize: 12,
173
173
  letterSpacing: 0.2,
174
174
  },
175
- listContent: { paddingBottom: 12 },
175
+ listContent: { paddingBottom: react_native_1.Platform.OS === 'ios' ? 44 : 32 },
176
176
  // #2 — scroll-to-top button, always shown at the bottom right.
177
177
  scrollTopBtn: {
178
178
  position: 'absolute',
179
- bottom: 25,
180
- right: 15,
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.25,
190
- shadowRadius: 5,
191
- elevation: 6,
192
- zIndex: 50,
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: 32,
197
- height: 32,
198
- borderRadius: 8,
196
+ width: 30,
197
+ height: 30,
198
+ borderRadius: 7,
199
199
  backgroundColor: `${colors.white}2B`,
200
200
  alignItems: 'center',
201
201
  justifyContent: 'center',
@@ -414,12 +414,12 @@ const getRawStyles = (colors) => ({
414
414
  },
415
415
  clearBtn: { padding: 4 },
416
416
  domainHeaderCard: {
417
- marginHorizontal: 12,
418
- marginTop: 12,
417
+ marginHorizontal: 8,
418
+ marginTop: 10,
419
419
  marginBottom: 4,
420
- paddingHorizontal: 12,
421
- paddingVertical: 8,
422
- borderRadius: 10,
420
+ paddingHorizontal: 8,
421
+ paddingVertical: 7,
422
+ borderRadius: 9,
423
423
  backgroundColor: colors.grayBackground,
424
424
  borderWidth: 1,
425
425
  borderColor: colors.grayBorderSecondary,
@@ -441,18 +441,18 @@ const getRawStyles = (colors) => ({
441
441
  flex: 1,
442
442
  minWidth: 0,
443
443
  marginRight: 6,
444
- gap: 8,
444
+ gap: 6,
445
445
  },
446
446
  domainIconWrap: {
447
- width: 26,
448
- height: 26,
449
- borderRadius: 6,
447
+ width: 22,
448
+ height: 22,
449
+ borderRadius: 5,
450
450
  alignItems: 'center',
451
451
  justifyContent: 'center',
452
452
  },
453
453
  domainTitleText: {
454
454
  fontFamily: AppFonts_1.AppFonts.interBold,
455
- fontSize: 13.5,
455
+ fontSize: 13,
456
456
  fontWeight: '700',
457
457
  color: colors.primaryBlack,
458
458
  textTransform: 'capitalize',
@@ -514,23 +514,23 @@ const getRawStyles = (colors) => ({
514
514
  flexDirection: 'row',
515
515
  alignItems: 'center',
516
516
  gap: 3,
517
- paddingHorizontal: 6,
518
- paddingVertical: 3,
519
- borderRadius: 6,
517
+ paddingHorizontal: 5,
518
+ paddingVertical: 2.5,
519
+ borderRadius: 5,
520
520
  borderWidth: 1,
521
521
  borderColor: colors.grayBorderSecondary,
522
522
  backgroundColor: colors.primaryLight,
523
523
  },
524
524
  domainStatText: {
525
525
  fontFamily: AppFonts_1.AppFonts.interBold,
526
- fontSize: 10,
526
+ fontSize: 9.5,
527
527
  },
528
528
  treeNodeRow: {
529
529
  flexDirection: 'row',
530
530
  alignItems: 'stretch',
531
- marginHorizontal: 12,
532
- paddingRight: 8,
533
- paddingLeft: 4,
531
+ marginHorizontal: 8,
532
+ paddingRight: 4,
533
+ paddingLeft: 0,
534
534
  backgroundColor: colors.grayBackground,
535
535
  borderLeftWidth: 1,
536
536
  borderRightWidth: 1,
@@ -544,14 +544,14 @@ const getRawStyles = (colors) => ({
544
544
  paddingBottom: 6,
545
545
  },
546
546
  treeLines: {
547
- width: 28,
547
+ width: 14,
548
548
  position: 'relative',
549
549
  },
550
550
  modernTreeLine: {
551
551
  position: 'absolute',
552
- left: 14,
552
+ left: 7,
553
553
  top: 0,
554
- width: 14,
554
+ width: 7,
555
555
  height: '100%',
556
556
  borderLeftWidth: 1.5,
557
557
  opacity: 0.5,
@@ -559,19 +559,19 @@ const getRawStyles = (colors) => ({
559
559
  modernTreeLineLast: {
560
560
  height: '50%',
561
561
  borderBottomWidth: 1.5,
562
- borderBottomLeftRadius: 10,
562
+ borderBottomLeftRadius: 8,
563
563
  },
564
564
  modernTreeBranch: {
565
565
  position: 'absolute',
566
- left: 14,
566
+ left: 7,
567
567
  top: '50%',
568
- width: 14,
568
+ width: 7,
569
569
  borderTopWidth: 1.5,
570
570
  opacity: 0.5,
571
571
  },
572
572
  treeCardWrapper: {
573
573
  flex: 1,
574
- paddingVertical: 3.5,
574
+ paddingVertical: 3,
575
575
  },
576
576
  card: {
577
577
  marginHorizontal: 0,
@@ -611,10 +611,10 @@ const getRawStyles = (colors) => ({
611
611
  gap: 5,
612
612
  },
613
613
  smallCheckbox: {
614
- width: 13,
615
- height: 13,
614
+ width: 15,
615
+ height: 15,
616
616
  borderRadius: 4,
617
- borderWidth: 1.5,
617
+ borderWidth: 1.8,
618
618
  borderColor: colors.grayTextWeak,
619
619
  alignItems: 'center',
620
620
  justifyContent: 'center',
@@ -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
- <HighlightText text={remainingText} search={searchStr} style={textStyle} highlightStyle={highlightStyle} numberOfLines={numberOfLines} detectLinks={true}/>
76
+ <LogSyntaxHighlighter text={remainingText} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>
77
77
  </View>);
78
78
  }
79
- return (<HighlightText text={message} search={searchStr} style={textStyle} highlightStyle={highlightStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
79
+ return (<LogSyntaxHighlighter text={message} search={searchStr} style={textStyle} numberOfLines={numberOfLines} detectLinks={true}/>);
80
80
  };
81
81
  export const ConsoleLogCard = React.memo(function ConsoleLogCard({ item, searchStr = '', }) {
82
82
  const { setSelectedLog } = useInspector();
@@ -234,10 +234,10 @@ export const ConsoleLogCard = React.memo(function ConsoleLogCard({ item, searchS
234
234
  {jsonContent ? (<>
235
235
  {jsonContent.header ? (getLogMessageWithBadges(jsonContent.header, searchStr, [styles.messageText, { color: AppColors.primaryBlack }], styles.highlight, 2)) : null}
236
236
  {jsonPreview && (<View style={styles.jsonPreviewContainer}>
237
- <HighlightText text={jsonPreview.text} search={searchStr} style={[
237
+ <LogSyntaxHighlighter text={jsonPreview.text} search={searchStr} style={[
238
238
  styles.jsonPreviewText,
239
239
  { color: AppColors.primaryBlack },
240
- ]} highlightStyle={styles.highlight} detectLinks={false} numberOfLines={5}/>
240
+ ]} detectLinks={false} numberOfLines={5}/>
241
241
  </View>)}
242
242
  </>) : (getLogMessageWithBadges(item.message, searchStr, [styles.messageText, { color: AppColors.primaryBlack }], styles.highlight, 3))}
243
243
  </View>
@@ -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: 28,
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
  }