react-native-inapp-inspector 2.3.15 → 2.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  3. package/dist/commonjs/components/Inspector/ConsoleTab.js +0 -22
  4. package/dist/commonjs/components/Inspector/CrashTab.js +0 -23
  5. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  6. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +56 -4
  8. package/dist/commonjs/components/Inspector/MainScreen.js +45 -3
  9. package/dist/commonjs/components/Inspector/NetworkTab.js +27 -38
  10. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  11. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  12. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  13. package/dist/commonjs/components/Inspector/ReduxTab.js +0 -22
  14. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  15. package/dist/commonjs/components/Inspector/StorageTab.js +0 -23
  16. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  17. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  18. package/dist/commonjs/components/NetworkIcons.js +33 -2
  19. package/dist/commonjs/constants/version.d.ts +1 -1
  20. package/dist/commonjs/constants/version.js +1 -1
  21. package/dist/commonjs/helpers/index.d.ts +1 -0
  22. package/dist/commonjs/helpers/index.js +1 -0
  23. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  24. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  25. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  26. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  27. package/dist/commonjs/helpers/telemetry.js +339 -8
  28. package/dist/commonjs/index.d.ts +1 -0
  29. package/dist/commonjs/index.js +32 -2
  30. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  31. package/dist/commonjs/styles/AppFonts.js +1 -0
  32. package/dist/commonjs/styles/index.d.ts +22 -0
  33. package/dist/commonjs/styles/index.js +19 -0
  34. package/dist/commonjs/types/enums.d.ts +1 -0
  35. package/dist/commonjs/types/enums.js +1 -0
  36. package/dist/commonjs/types/interfaces.d.ts +12 -0
  37. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  38. package/dist/esm/components/Inspector/ConsoleTab.js +1 -23
  39. package/dist/esm/components/Inspector/CrashTab.js +1 -24
  40. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  41. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  42. package/dist/esm/components/Inspector/InspectorHeader.js +57 -5
  43. package/dist/esm/components/Inspector/MainScreen.js +46 -4
  44. package/dist/esm/components/Inspector/NetworkTab.js +28 -39
  45. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  46. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  47. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  48. package/dist/esm/components/Inspector/ReduxTab.js +1 -23
  49. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  50. package/dist/esm/components/Inspector/StorageTab.js +0 -23
  51. package/dist/esm/components/Inspector/TabBar.js +50 -15
  52. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  53. package/dist/esm/components/NetworkIcons.js +26 -0
  54. package/dist/esm/constants/version.d.ts +1 -1
  55. package/dist/esm/constants/version.js +1 -1
  56. package/dist/esm/helpers/index.d.ts +1 -0
  57. package/dist/esm/helpers/index.js +1 -0
  58. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  59. package/dist/esm/helpers/remoteConfig.js +160 -0
  60. package/dist/esm/helpers/searchQueryParser.js +2 -0
  61. package/dist/esm/helpers/telemetry.d.ts +5 -0
  62. package/dist/esm/helpers/telemetry.js +332 -9
  63. package/dist/esm/index.d.ts +1 -0
  64. package/dist/esm/index.js +30 -2
  65. package/dist/esm/styles/AppFonts.d.ts +2 -0
  66. package/dist/esm/styles/AppFonts.js +1 -0
  67. package/dist/esm/styles/index.d.ts +22 -0
  68. package/dist/esm/styles/index.js +19 -0
  69. package/dist/esm/types/enums.d.ts +1 -0
  70. package/dist/esm/types/enums.js +1 -0
  71. package/dist/esm/types/interfaces.d.ts +12 -0
  72. package/package.json +1 -1
  73. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  74. package/src/components/Inspector/ConsoleTab.tsx +0 -23
  75. package/src/components/Inspector/CrashTab.tsx +0 -23
  76. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  77. package/src/components/Inspector/InspectorHeader.tsx +78 -2
  78. package/src/components/Inspector/MainScreen.tsx +59 -3
  79. package/src/components/Inspector/NetworkTab.tsx +69 -78
  80. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  81. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  82. package/src/components/Inspector/ReduxTab.tsx +0 -23
  83. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  84. package/src/components/Inspector/StorageTab.tsx +0 -23
  85. package/src/components/Inspector/TabBar.tsx +57 -20
  86. package/src/components/NetworkIcons.tsx +92 -0
  87. package/src/constants/version.ts +1 -1
  88. package/src/helpers/index.ts +1 -0
  89. package/src/helpers/remoteConfig.ts +212 -0
  90. package/src/helpers/searchQueryParser.ts +3 -0
  91. package/src/helpers/telemetry.ts +381 -10
  92. package/src/index.tsx +42 -0
  93. package/src/styles/AppFonts.ts +2 -0
  94. package/src/styles/index.ts +20 -1
  95. package/src/types/enums.ts +1 -0
  96. package/src/types/interfaces.ts +12 -0
@@ -1,10 +1,25 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.setTelemetryEnabled = setTelemetryEnabled;
7
+ exports.markSearchFilterUsed = markSearchFilterUsed;
4
8
  exports.trackActiveTelemetryHeartbeat = trackActiveTelemetryHeartbeat;
9
+ exports.trackTelemetryEvent = trackTelemetryEvent;
10
+ exports.trackInspectorTabView = trackInspectorTabView;
11
+ exports.trackInspectorScreenView = trackInspectorScreenView;
12
+ exports.trackInspectorScreenRecord = trackInspectorScreenRecord;
13
+ const react_1 = __importDefault(require("react"));
5
14
  const react_native_1 = require("react-native");
6
15
  const version_1 = require("../constants/version");
7
16
  const settingsStore_1 = require("./settingsStore");
17
+ const reduxLogger_1 = require("../customHooks/reduxLogger");
18
+ const analyticsLogger_1 = require("../customHooks/analyticsLogger");
19
+ const crashHandler_1 = require("../customHooks/crashHandler");
20
+ const networkLogger_1 = require("../customHooks/networkLogger");
21
+ const NativeInspector_1 = require("../native/NativeInspector");
22
+ const index_1 = require("./index");
8
23
  const telemetryConfig_1 = require("../constants/telemetryConfig");
9
24
  const PKG_NAME = 'react-native-inapp-inspector';
10
25
  const KEY_MATERIAL = `${PKG_NAME}::${telemetryConfig_1.TELEMETRY_SALT}`;
@@ -64,19 +79,33 @@ function getCollectUrl() {
64
79
  }
65
80
  const PING_INTERVAL_MS = 24 * 60 * 60 * 1000;
66
81
  let isTelemetryEnabled = true;
82
+ let _hasSearchFilterBeenUsed = false;
67
83
  function setTelemetryEnabled(enabled) {
68
84
  isTelemetryEnabled = enabled;
69
85
  }
86
+ function markSearchFilterUsed() {
87
+ _hasSearchFilterBeenUsed = true;
88
+ }
70
89
  async function getOrCreateClientId() {
71
90
  try {
72
91
  const settings = await (0, settingsStore_1.loadSettings)();
73
- if (settings.telemetryClientId) {
74
- return settings.telemetryClientId;
92
+ if (settings.telemetryClientId || settings.telemetryDeviceId) {
93
+ const id = settings.telemetryClientId || settings.telemetryDeviceId || '';
94
+ if (!settings.telemetryDeviceId) {
95
+ await (0, settingsStore_1.saveSettings)({ ...settings, telemetryDeviceId: id });
96
+ }
97
+ return id;
75
98
  }
76
99
  const part1 = Math.floor(100000000 + Math.random() * 900000000);
77
100
  const part2 = Math.floor(1000000000 + Math.random() * 9000000000);
78
101
  const newId = `${part1}.${part2}`;
79
- (0, settingsStore_1.saveSettings)({ ...settings, telemetryClientId: newId });
102
+ const now = Date.now();
103
+ await (0, settingsStore_1.saveSettings)({
104
+ ...settings,
105
+ telemetryClientId: newId,
106
+ telemetryDeviceId: newId,
107
+ deviceFirstSeen: settings.deviceFirstSeen || now,
108
+ });
80
109
  return newId;
81
110
  }
82
111
  catch {
@@ -113,26 +142,181 @@ function isDeviceEmulator() {
113
142
  }
114
143
  return false;
115
144
  }
116
- function getSystemMetadata(environment) {
145
+ function getDeviceLocaleInfo() {
146
+ try {
147
+ const opts = typeof Intl !== 'undefined' && Intl.DateTimeFormat ? Intl.DateTimeFormat().resolvedOptions() : {};
148
+ const timeZone = opts.timeZone || 'unknown';
149
+ const locale = opts.locale || 'unknown';
150
+ let countryCode = 'unknown';
151
+ if (locale && locale !== 'unknown') {
152
+ const parts = locale.split(/[-_]/);
153
+ if (parts.length > 1) {
154
+ countryCode = parts[parts.length - 1].toUpperCase();
155
+ }
156
+ }
157
+ return { countryCode, locale, timeZone };
158
+ }
159
+ catch {
160
+ return { countryCode: 'unknown', locale: 'unknown', timeZone: 'unknown' };
161
+ }
162
+ }
163
+ function getSystemMetadata(environment, currentSettings) {
117
164
  const rnConstants = react_native_1.Platform.constants;
118
165
  const rnVersion = rnConstants?.reactNativeVersion
119
166
  ? `${rnConstants.reactNativeVersion.major}.${rnConstants.reactNativeVersion.minor}.${rnConstants.reactNativeVersion.patch}`
120
167
  : 'unknown';
121
168
  const isHermes = Boolean(typeof global.HermesInternal === 'object' && global.HermesInternal !== null);
122
169
  const isFabric = Boolean(global?.nativeFabricUIManager !== undefined);
170
+ const isBridgeless = Boolean(global?._rn_bridgeless || global?.RN$Bridgeless);
123
171
  const isDev = Boolean(typeof __DEV__ !== 'undefined' && __DEV__);
124
172
  const isEmulator = isDeviceEmulator();
173
+ const { countryCode, locale, timeZone } = getDeviceLocaleInfo();
174
+ let screenRes = 'unknown';
175
+ let screenDensity = 1;
176
+ let fontScale = 1;
177
+ let deviceFormFactor = 'phone';
178
+ let screenOrientation = 'portrait';
179
+ try {
180
+ const dim = react_native_1.Dimensions.get('window');
181
+ screenRes = `${Math.round(dim.width)}x${Math.round(dim.height)}`;
182
+ screenDensity = react_native_1.PixelRatio.get();
183
+ fontScale = react_native_1.PixelRatio.getFontScale();
184
+ screenOrientation = dim.width > dim.height ? 'landscape' : 'portrait';
185
+ const isTablet = (react_native_1.Platform.OS === 'ios' && Boolean(react_native_1.Platform.isPad)) ||
186
+ (Math.min(dim.width, dim.height) >= 600);
187
+ deviceFormFactor = isTablet ? 'tablet' : 'phone';
188
+ }
189
+ catch { }
190
+ let appearanceMode = 'unknown';
191
+ try {
192
+ appearanceMode = react_native_1.Appearance?.getColorScheme?.() || 'unknown';
193
+ }
194
+ catch { }
195
+ const isExpo = Boolean(globalThis?.expo ||
196
+ globalThis?.__expo ||
197
+ globalThis?.__turboModuleProxy?.name === 'Expo' ||
198
+ react_native_1.Platform.constants?.ExpoVersion);
199
+ let hermesVersion = 'non_hermes';
200
+ let jsEngine = 'jsc';
201
+ if (isHermes) {
202
+ jsEngine = 'hermes';
203
+ try {
204
+ const props = global.HermesInternal?.getRuntimeProperties?.() || {};
205
+ hermesVersion = props['OSS Release Version'] || (props['Bytecode Version'] ? `bc_v${props['Bytecode Version']}` : 'hermes');
206
+ }
207
+ catch {
208
+ hermesVersion = 'hermes';
209
+ }
210
+ }
211
+ else if (globalThis?._v8) {
212
+ jsEngine = 'v8';
213
+ }
214
+ let reduxAttached = false;
215
+ try {
216
+ reduxAttached = (0, reduxLogger_1.isReduxConnected)();
217
+ }
218
+ catch { }
219
+ let analyticsAttached = false;
220
+ try {
221
+ analyticsAttached = (0, analyticsLogger_1.isFirebaseAnalyticsPatched)();
222
+ }
223
+ catch { }
224
+ const hasNativeModule = (0, NativeInspector_1.isNativeModuleAvailable)();
225
+ const hasMmkv = Boolean(react_native_1.NativeModules?.RNMMKV || globalThis?.MMKV);
226
+ let capturedCrashesCount = 0;
227
+ try {
228
+ capturedCrashesCount = (0, crashHandler_1.getCrashRecords)().length;
229
+ }
230
+ catch { }
231
+ let capturedApisBracket = '0';
232
+ try {
233
+ const apiCount = (0, networkLogger_1.getNetworkLogs)().length;
234
+ capturedApisBracket =
235
+ apiCount === 0
236
+ ? '0'
237
+ : apiCount <= 10
238
+ ? '1-10'
239
+ : apiCount <= 50
240
+ ? '11-50'
241
+ : apiCount <= 100
242
+ ? '51-100'
243
+ : '100+';
244
+ }
245
+ catch { }
246
+ let isMetroConnected = false;
247
+ try {
248
+ isMetroConnected = (0, index_1.isLocalDebugEnvironment)();
249
+ }
250
+ catch { }
251
+ const defaultLandingTab = currentSettings?.defaultTab || 'apis';
252
+ const fabMode = hasNativeModule && currentSettings?.useNativeFab !== false
253
+ ? 'native_ui_thread'
254
+ : 'js_floating_button';
255
+ const deviceBrand = String(rnConstants?.Brand ||
256
+ (react_native_1.Platform.OS === 'ios' ? 'Apple' : 'unknown'));
257
+ const deviceModel = String(rnConstants?.Model ||
258
+ rnConstants?.systemName ||
259
+ (react_native_1.Platform.OS === 'ios' ? 'iPhone/iPad' : 'unknown'));
260
+ const deviceManufacturer = String(rnConstants?.Manufacturer ||
261
+ (react_native_1.Platform.OS === 'ios' ? 'Apple' : 'unknown'));
262
+ let appName = 'App';
263
+ let bundleId = 'unknown';
264
+ let appVersion = 'unknown';
265
+ let appBuild = 'unknown';
266
+ try {
267
+ appName = (0, index_1.getAppName)() || 'App';
268
+ bundleId = (0, index_1.getBundleIdentifier)() || 'unknown';
269
+ const verInfo = (0, index_1.getAppVersionAndBuild)();
270
+ appVersion = verInfo.version || 'unknown';
271
+ appBuild = verInfo.build || 'unknown';
272
+ }
273
+ catch { }
274
+ const reactVer = typeof react_1.default !== 'undefined' && react_1.default.version ? react_1.default.version : 'unknown';
125
275
  return {
276
+ pkg_name: PKG_NAME,
277
+ pkg_version: version_1.LIB_VERSION,
126
278
  lib_version: version_1.LIB_VERSION,
279
+ install_type: isDev ? 'local_dev' : 'bundled_production',
280
+ app_name: appName,
281
+ bundle_id: bundleId,
282
+ app_version: appVersion,
283
+ app_build: appBuild,
284
+ react_version: reactVer,
127
285
  platform: react_native_1.Platform.OS,
128
286
  os_version: String(react_native_1.Platform.Version || 'unknown'),
129
287
  rn_version: rnVersion,
288
+ country_code: countryCode,
289
+ device_locale: locale,
290
+ time_zone: timeZone,
291
+ device_brand: deviceBrand,
292
+ device_model: deviceModel,
293
+ device_manufacturer: deviceManufacturer,
294
+ device_form_factor: deviceFormFactor,
295
+ screen_resolution: screenRes,
296
+ screen_density: screenDensity,
297
+ screen_orientation: screenOrientation,
298
+ font_scale: fontScale,
299
+ appearance_mode: appearanceMode,
300
+ is_expo: isExpo,
301
+ js_engine: jsEngine,
302
+ hermes_version: hermesVersion,
130
303
  is_hermes: isHermes,
131
304
  is_fabric: isFabric,
305
+ is_bridgeless: isBridgeless,
306
+ has_native_module: hasNativeModule,
307
+ has_mmkv: hasMmkv,
308
+ fab_mode: fabMode,
309
+ default_landing_tab: defaultLandingTab,
310
+ captured_crashes_count: capturedCrashesCount,
311
+ captured_apis_bracket: capturedApisBracket,
312
+ search_filter_used: _hasSearchFilterBeenUsed,
313
+ is_metro_connected: isMetroConnected,
132
314
  is_dev: isDev,
133
315
  is_emulator: isEmulator,
134
316
  device_type: isEmulator ? 'emulator' : 'real_device',
135
317
  app_mode: isDev ? 'local_mode' : 'bundled_application',
318
+ redux_attached: reduxAttached,
319
+ analytics_attached: analyticsAttached,
136
320
  environment: environment || (isDev ? 'DEV' : 'PROD'),
137
321
  engagement_time_msec: 1000,
138
322
  };
@@ -150,21 +334,168 @@ async function trackActiveTelemetryHeartbeat(telemetryEnabled = true, environmen
150
334
  const settings = await (0, settingsStore_1.loadSettings)();
151
335
  const lastPing = settings.telemetryLastPing || 0;
152
336
  const now = Date.now();
153
- if (now - lastPing < PING_INTERVAL_MS)
337
+ const isNewDevice = !settings.deviceRegistered;
338
+ if (!isNewDevice && now - lastPing < PING_INTERVAL_MS)
154
339
  return;
155
340
  const clientId = await getOrCreateClientId();
156
- const params = getSystemMetadata(environment);
341
+ const params = getSystemMetadata(environment, settings);
342
+ const deviceParams = {
343
+ ...params,
344
+ device_id: clientId,
345
+ is_new_device: isNewDevice,
346
+ device_first_seen: settings.deviceFirstSeen || now,
347
+ };
348
+ const eventsToDispatch = isNewDevice
349
+ ? [
350
+ { name: 'active_device', params: deviceParams },
351
+ { name: 'first_device_install', params: deviceParams },
352
+ { name: 'inspector_active_heartbeat', params: deviceParams },
353
+ ]
354
+ : [
355
+ { name: 'active_device', params: deviceParams },
356
+ { name: 'inspector_active_heartbeat', params: deviceParams },
357
+ ];
157
358
  await fetch(url, {
158
359
  method: 'POST',
159
360
  headers: { 'Content-Type': 'application/json' },
160
361
  body: JSON.stringify({
161
362
  client_id: clientId,
363
+ user_id: clientId,
162
364
  non_personalized_ads: true,
163
- events: [{ name: 'inspector_active_heartbeat', params }],
365
+ user_properties: {
366
+ device_id: { value: clientId },
367
+ pkg_name: { value: params.pkg_name },
368
+ pkg_version: { value: params.pkg_version },
369
+ install_type: { value: params.install_type },
370
+ app_name: { value: params.app_name },
371
+ bundle_id: { value: params.bundle_id },
372
+ app_version: { value: params.app_version },
373
+ react_version: { value: params.react_version },
374
+ country: { value: params.country_code },
375
+ country_code: { value: params.country_code },
376
+ locale: { value: params.device_locale },
377
+ time_zone: { value: params.time_zone },
378
+ device_brand: { value: params.device_brand },
379
+ device_model: { value: params.device_model },
380
+ device_form_factor: { value: params.device_form_factor },
381
+ screen_resolution: { value: params.screen_resolution },
382
+ appearance_mode: { value: params.appearance_mode },
383
+ is_expo: { value: String(params.is_expo) },
384
+ js_engine: { value: params.js_engine },
385
+ is_fabric: { value: String(params.is_fabric) },
386
+ is_bridgeless: { value: String(params.is_bridgeless) },
387
+ has_native_module: { value: String(params.has_native_module) },
388
+ has_mmkv: { value: String(params.has_mmkv) },
389
+ fab_mode: { value: params.fab_mode },
390
+ default_landing_tab: { value: params.default_landing_tab },
391
+ captured_crashes_count: { value: String(params.captured_crashes_count) },
392
+ captured_apis_bracket: { value: params.captured_apis_bracket },
393
+ search_filter_used: { value: String(params.search_filter_used) },
394
+ is_metro_connected: { value: String(params.is_metro_connected) },
395
+ redux_attached: { value: String(params.redux_attached) },
396
+ analytics_attached: { value: String(params.analytics_attached) },
397
+ platform: { value: params.platform },
398
+ rn_version: { value: params.rn_version },
399
+ lib_version: { value: params.lib_version },
400
+ },
401
+ events: eventsToDispatch,
164
402
  }),
165
403
  });
166
- (0, settingsStore_1.saveSettings)({ ...settings, telemetryLastPing: now });
404
+ await (0, settingsStore_1.saveSettings)({
405
+ ...settings,
406
+ telemetryClientId: clientId,
407
+ telemetryDeviceId: clientId,
408
+ deviceRegistered: true,
409
+ deviceFirstSeen: settings.deviceFirstSeen || now,
410
+ telemetryLastPing: now,
411
+ telemetryLastActive: now,
412
+ });
167
413
  }
168
414
  catch {
169
415
  }
170
416
  }
417
+ async function trackTelemetryEvent(eventName, eventParams) {
418
+ if (!isTelemetryEnabled)
419
+ return;
420
+ const url = getCollectUrl();
421
+ if (!url)
422
+ return;
423
+ try {
424
+ const clientId = await getOrCreateClientId();
425
+ const settings = await (0, settingsStore_1.loadSettings)().catch(() => ({}));
426
+ const metadata = getSystemMetadata(undefined, settings);
427
+ const params = {
428
+ ...metadata,
429
+ device_id: clientId,
430
+ ...eventParams,
431
+ engagement_time_msec: 100,
432
+ };
433
+ await fetch(url, {
434
+ method: 'POST',
435
+ headers: { 'Content-Type': 'application/json' },
436
+ body: JSON.stringify({
437
+ client_id: clientId,
438
+ user_id: clientId,
439
+ non_personalized_ads: true,
440
+ user_properties: {
441
+ device_id: { value: clientId },
442
+ pkg_name: { value: metadata.pkg_name },
443
+ pkg_version: { value: metadata.pkg_version },
444
+ install_type: { value: metadata.install_type },
445
+ app_name: { value: metadata.app_name },
446
+ bundle_id: { value: metadata.bundle_id },
447
+ app_version: { value: metadata.app_version },
448
+ react_version: { value: metadata.react_version },
449
+ country: { value: metadata.country_code },
450
+ country_code: { value: metadata.country_code },
451
+ locale: { value: metadata.device_locale },
452
+ time_zone: { value: metadata.time_zone },
453
+ device_brand: { value: metadata.device_brand },
454
+ device_model: { value: metadata.device_model },
455
+ device_form_factor: { value: metadata.device_form_factor },
456
+ screen_resolution: { value: metadata.screen_resolution },
457
+ appearance_mode: { value: metadata.appearance_mode },
458
+ is_expo: { value: String(metadata.is_expo) },
459
+ js_engine: { value: metadata.js_engine },
460
+ is_fabric: { value: String(metadata.is_fabric) },
461
+ is_bridgeless: { value: String(metadata.is_bridgeless) },
462
+ has_native_module: { value: String(metadata.has_native_module) },
463
+ has_mmkv: { value: String(metadata.has_mmkv) },
464
+ fab_mode: { value: metadata.fab_mode },
465
+ default_landing_tab: { value: metadata.default_landing_tab },
466
+ captured_crashes_count: { value: String(metadata.captured_crashes_count) },
467
+ captured_apis_bracket: { value: metadata.captured_apis_bracket },
468
+ search_filter_used: { value: String(metadata.search_filter_used) },
469
+ is_metro_connected: { value: String(metadata.is_metro_connected) },
470
+ redux_attached: { value: String(metadata.redux_attached) },
471
+ analytics_attached: { value: String(metadata.analytics_attached) },
472
+ platform: { value: metadata.platform },
473
+ rn_version: { value: metadata.rn_version },
474
+ lib_version: { value: metadata.lib_version },
475
+ },
476
+ events: [{ name: eventName, params }],
477
+ }),
478
+ });
479
+ }
480
+ catch {
481
+ }
482
+ }
483
+ function trackInspectorTabView(tabName) {
484
+ trackTelemetryEvent('inspector_tab_view', {
485
+ tab_name: tabName,
486
+ screen_name: `tab_${tabName}`,
487
+ screen_class: 'NetworkInspector',
488
+ });
489
+ }
490
+ function trackInspectorScreenView(screenName) {
491
+ trackTelemetryEvent('screen_view', {
492
+ screen_name: screenName,
493
+ screen_class: 'NetworkInspector',
494
+ });
495
+ }
496
+ function trackInspectorScreenRecord(action, recordingType = 'screen') {
497
+ trackTelemetryEvent('inspector_screen_record', {
498
+ action,
499
+ recording_type: recordingType,
500
+ });
501
+ }
@@ -26,4 +26,5 @@ export { ActiveTab, Method, StatusFilter, SortOrder, LocalFilter, ModalAnimation
26
26
  export { AppFonts, setAppFonts, type AppFontConfig, } from './styles/AppFonts';
27
27
  export { AppColors, setAppColors, getThemeColors, updateAppColorsTheme, } from './styles/AppColors';
28
28
  export { t, i18n, useTranslation, setLanguage, addTranslations, setTranslations, I18nextProvider, } from './i18n';
29
+ export { fetchRemoteConfigModuleStatus, isFirebaseRemoteConfigAvailable, } from './helpers/remoteConfig';
29
30
  export { LIB_VERSION } from './constants/version';
@@ -38,7 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.registerComponentProfile = exports.getHermesMemoryStats = exports.measureAsync = exports.trackHeavyTask = exports.trackNavigationTransition = exports.trackComponentRender = exports.useNavigationProfiler = exports.useComponentProfiler = exports.usePerformanceTracker = exports.registerGAPlugin = exports.getEventCategory = exports.getLastActionForReducer = exports.clearActionHistory = exports.getActionHistory = exports.subscribeReduxState = exports.getReduxState = exports.inspectorReduxMiddleware = exports.connectReduxStore = exports.ErrorBoundary = exports.CrashTab = exports.computeCrashFingerprint = exports.recordUserActionBreadcrumb = exports.recordReduxBreadcrumb = exports.recordNetworkBreadcrumb = exports.recordNavigationBreadcrumb = exports.addCrashBreadcrumb = exports.recordCustomCrash = exports.parseCrashStackTrace = exports.exportCrashReport = exports.simulateTestCrash = exports.clearCrashRecords = exports.getCrashRecords = exports.emitCrashEvent = exports.subscribeCrashEvents = exports.setupGlobalCrashHandler = exports.getCollectionEnabled = exports.getDefaultEventParameters = exports.getCurrentUserId = exports.getCurrentUserProperties = exports.clearAnalyticsEvents = exports.subscribeAnalyticsEvents = exports.logAnalyticsEvent = exports.setupAnalyticsLogger = exports.subscribeConsoleLogs = exports.clearConsoleLogs = exports.setupConsoleLogger = exports.addAxiosInterceptors = exports.subscribeNetworkLogs = exports.clearNetworkLogs = exports.setupNetworkLogger = void 0;
40
40
  exports.connectMMKV = exports.connectAsyncStorage = exports.BrandCircleIcon = exports.BrandSquareIcon = exports.prunePerformanceEvents = exports.getMaxPerformanceEventsLimit = exports.setMaxPerformanceEventsLimit = exports.pruneCrashRecords = exports.getMaxCrashLogsLimit = exports.pruneAnalyticsLogs = exports.getMaxAnalyticsLogsLimit = exports.setMaxAnalyticsLogsLimit = exports.pruneReduxHistory = exports.getMaxReduxHistoryLimit = exports.setMaxReduxHistoryLimit = exports.pruneConsoleLogs = exports.getMaxConsoleLogsLimit = exports.setMaxConsoleLogsLimit = exports.pruneNetworkLogs = exports.getMaxNetworkLogsLimit = exports.setMaxNetworkLogsLimit = exports.subscribeMemoryWarning = exports.pruneAllLogs = exports.setupMemoryWarningHandler = exports.isNativeModuleAvailable = exports.setNativeStorageItem = exports.getNativeStorageItem = exports.getNativeFpsMetrics = exports.stopNativeFpsMonitoring = exports.startNativeFpsMonitoring = exports.subscribeNativeDeviceShake = exports.subscribeNativeFloatingButtonPress = exports.setNativeFloatingButtonBadge = exports.hideNativeFloatingButton = exports.showNativeFloatingButton = exports.subscribeNativeCrashes = exports.enableNativeCrashProtection = exports.getNativeDeviceMetrics = exports.InspectCatch = exports.InspectTrackTime = exports.InspectLog = exports.generateFixSnippet = exports.getInitialPerformanceEvents = exports.getInitialRenderProfiles = exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = exports.getRenderProfiles = exports.subscribeRenderProfiles = void 0;
41
- exports.LIB_VERSION = exports.I18nextProvider = exports.setTranslations = exports.addTranslations = exports.setLanguage = exports.useTranslation = exports.i18n = exports.t = exports.updateAppColorsTheme = exports.getThemeColors = exports.setAppColors = exports.AppColors = exports.setAppFonts = exports.AppFonts = exports.BreadcrumbType = exports.CrashFilterType = exports.CrashDetailSubTab = exports.CrashExportFormat = exports.CrashType = exports.PerformanceSubTab = exports.BundleSubTab = exports.DiffResultType = exports.StackFrameType = exports.GAEventCategory = exports.AnalyticsEventSource = exports.ConsoleLogType = exports.LogFilter = exports.SettingsSubTab = exports.SettingsPage = exports.ModalAnimationType = exports.LocalFilter = exports.SortOrder = exports.StatusFilter = exports.Method = exports.ActiveTab = exports.subscribeToStorageChanges = exports.clearStorageDriver = exports.removeStorageEntry = exports.setStorageEntry = exports.fetchStorageEntries = exports.getRegisteredMMKVInstanceIds = exports.isMMKVConnected = exports.isAsyncStorageConnected = void 0;
41
+ exports.LIB_VERSION = exports.isFirebaseRemoteConfigAvailable = exports.fetchRemoteConfigModuleStatus = exports.I18nextProvider = exports.setTranslations = exports.addTranslations = exports.setLanguage = exports.useTranslation = exports.i18n = exports.t = exports.updateAppColorsTheme = exports.getThemeColors = exports.setAppColors = exports.AppColors = exports.setAppFonts = exports.AppFonts = exports.BreadcrumbType = exports.CrashFilterType = exports.CrashDetailSubTab = exports.CrashExportFormat = exports.CrashType = exports.PerformanceSubTab = exports.BundleSubTab = exports.DiffResultType = exports.StackFrameType = exports.GAEventCategory = exports.AnalyticsEventSource = exports.ConsoleLogType = exports.LogFilter = exports.SettingsSubTab = exports.SettingsPage = exports.ModalAnimationType = exports.LocalFilter = exports.SortOrder = exports.StatusFilter = exports.Method = exports.ActiveTab = exports.subscribeToStorageChanges = exports.clearStorageDriver = exports.removeStorageEntry = exports.setStorageEntry = exports.fetchStorageEntries = exports.getRegisteredMMKVInstanceIds = exports.isMMKVConnected = exports.isAsyncStorageConnected = void 0;
42
42
  const react_1 = __importStar(require("react"));
43
43
  const react_native_1 = require("react-native");
44
44
  const native_1 = require("@react-navigation/native");
@@ -59,9 +59,10 @@ const reduxLogger_1 = require("./customHooks/reduxLogger");
59
59
  const performanceTracker_1 = require("./customHooks/performanceTracker");
60
60
  const bundleAnalyzer_1 = require("./customHooks/bundleAnalyzer");
61
61
  const NativeInspector_2 = require("./native/NativeInspector");
62
+ const remoteConfig_1 = require("./helpers/remoteConfig");
62
63
  const constants_1 = require("./constants");
63
64
  const styles_1 = require("./styles");
64
- const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, environment, initialVisible = false, visible: controlledVisible, }) => {
65
+ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, environment, initialVisible = false, visible: controlledVisible, remoteConfig, }) => {
65
66
  (0, settingsStore_1.setCustomStorage)(storage || null);
66
67
  const [isDark, setIsDark] = (0, react_1.useState)(false);
67
68
  const [reduxState, setReduxState] = (0, react_1.useState)(null);
@@ -198,6 +199,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
198
199
  const [logSearch, setLogSearch] = (0, react_1.useState)('');
199
200
  const [logFilters, setLogFilters] = (0, react_1.useState)(new Set(['all']));
200
201
  const [settingsPage, setSettingsPage] = (0, react_1.useState)(null);
202
+ const [isFeedbackOpen, setIsFeedbackOpen] = (0, react_1.useState)(false);
201
203
  const [settingsActiveSubTab, setSettingsActiveSubTab] = (0, react_1.useState)('module');
202
204
  const [tabVisibility, setTabVisibility] = (0, react_1.useState)({
203
205
  apis: true,
@@ -350,6 +352,25 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
350
352
  cancelled = true;
351
353
  };
352
354
  }, []);
355
+ (0, react_1.useEffect)(() => {
356
+ let isMounted = true;
357
+ if (remoteConfig === false)
358
+ return;
359
+ (0, remoteConfig_1.fetchRemoteConfigModuleStatus)(typeof remoteConfig === 'object' ? remoteConfig : undefined)
360
+ .then(remoteModules => {
361
+ if (isMounted && remoteModules) {
362
+ setTabVisibility(prev => ({
363
+ ...prev,
364
+ ...remoteModules,
365
+ apis: remoteModules.apis ?? true,
366
+ }));
367
+ }
368
+ })
369
+ .catch(() => { });
370
+ return () => {
371
+ isMounted = false;
372
+ };
373
+ }, [remoteConfig]);
353
374
  (0, react_1.useEffect)(() => {
354
375
  if (!settingsHydratedRef.current)
355
376
  return;
@@ -489,6 +510,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
489
510
  setActiveTab(key);
490
511
  loadNativePage(key);
491
512
  }
513
+ (0, telemetry_1.trackInspectorTabView)(key);
492
514
  }, [loadNativePage]);
493
515
  const [selectedEvent, setSelectedEvent] = (0, react_1.useState)(null);
494
516
  const [analyticsSearch, setAnalyticsSearch] = (0, react_1.useState)('');
@@ -799,10 +821,12 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
799
821
  (0, react_1.useEffect)(() => {
800
822
  isVisibleRefObj.current = visible;
801
823
  if (visible) {
824
+ (0, telemetry_1.trackInspectorScreenView)('InspectorModal');
802
825
  const target = defaultTab === 'apis' || tabVisibility?.[defaultTab]
803
826
  ? defaultTab
804
827
  : 'apis';
805
828
  setActiveTab(target);
829
+ (0, telemetry_1.trackInspectorTabView)(target);
806
830
  if (latestNetworkLogsRef.current.length > 0) {
807
831
  const deduped = (0, helpers_1.deduplicateLogs)(latestNetworkLogsRef.current);
808
832
  const incoming = new Set(deduped.map(l => l.id));
@@ -1663,6 +1687,8 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1663
1687
  setShowHeaderInfo,
1664
1688
  settingsPage,
1665
1689
  setSettingsPage,
1690
+ isFeedbackOpen,
1691
+ setIsFeedbackOpen,
1666
1692
  updateAvailable,
1667
1693
  latestNpmVersion,
1668
1694
  clearAnim,
@@ -1821,6 +1847,7 @@ const NetworkInspector = ({ enabled = true, storage, navigationRef, appIcon, env
1821
1847
  selectedLog,
1822
1848
  showHeaderInfo,
1823
1849
  settingsPage,
1850
+ isFeedbackOpen,
1824
1851
  updateAvailable,
1825
1852
  latestNpmVersion,
1826
1853
  clearAnim,
@@ -2104,5 +2131,8 @@ Object.defineProperty(exports, "setLanguage", { enumerable: true, get: function
2104
2131
  Object.defineProperty(exports, "addTranslations", { enumerable: true, get: function () { return i18n_2.addTranslations; } });
2105
2132
  Object.defineProperty(exports, "setTranslations", { enumerable: true, get: function () { return i18n_2.setTranslations; } });
2106
2133
  Object.defineProperty(exports, "I18nextProvider", { enumerable: true, get: function () { return i18n_2.I18nextProvider; } });
2134
+ var remoteConfig_2 = require("./helpers/remoteConfig");
2135
+ Object.defineProperty(exports, "fetchRemoteConfigModuleStatus", { enumerable: true, get: function () { return remoteConfig_2.fetchRemoteConfigModuleStatus; } });
2136
+ Object.defineProperty(exports, "isFirebaseRemoteConfigAvailable", { enumerable: true, get: function () { return remoteConfig_2.isFirebaseRemoteConfigAvailable; } });
2107
2137
  var version_1 = require("./constants/version");
2108
2138
  Object.defineProperty(exports, "LIB_VERSION", { enumerable: true, get: function () { return version_1.LIB_VERSION; } });
@@ -1,12 +1,14 @@
1
1
  export interface AppFontConfig {
2
2
  interRegular?: string;
3
3
  interMedium?: string;
4
+ interSemiBold?: string;
4
5
  interBold?: string;
5
6
  Sfprotext?: string;
6
7
  }
7
8
  export declare const AppFonts: {
8
9
  interRegular: string;
9
10
  interMedium: string;
11
+ interSemiBold: string;
10
12
  interBold: string;
11
13
  Sfprotext: string;
12
14
  };
@@ -4,6 +4,7 @@ exports.setAppFonts = exports.AppFonts = void 0;
4
4
  exports.AppFonts = {
5
5
  interRegular: 'Inter-Regular',
6
6
  interMedium: 'Inter-Medium',
7
+ interSemiBold: 'Inter-SemiBold',
7
8
  interBold: 'Inter-Bold',
8
9
  Sfprotext: 'Inter-Regular',
9
10
  };
@@ -149,6 +149,28 @@ export declare const getRawStyles: (colors: typeof AppColors) => {
149
149
  listContent: {
150
150
  paddingBottom: number;
151
151
  };
152
+ supportFab: {
153
+ position: string;
154
+ bottom: number;
155
+ right: number;
156
+ width: number;
157
+ height: number;
158
+ borderRadius: number;
159
+ backgroundColor: string;
160
+ alignItems: string;
161
+ justifyContent: string;
162
+ shadowColor: string;
163
+ shadowOffset: {
164
+ width: number;
165
+ height: number;
166
+ };
167
+ shadowOpacity: number;
168
+ shadowRadius: number;
169
+ elevation: number;
170
+ zIndex: number;
171
+ borderWidth: number;
172
+ borderColor: string;
173
+ };
152
174
  scrollTopBtn: {
153
175
  position: string;
154
176
  bottom: number;
@@ -173,6 +173,25 @@ const getRawStyles = (colors) => ({
173
173
  letterSpacing: 0.2,
174
174
  },
175
175
  listContent: { paddingBottom: react_native_1.Platform.OS === 'ios' ? 44 : 32 },
176
+ supportFab: {
177
+ position: 'absolute',
178
+ bottom: 22,
179
+ right: 16,
180
+ width: 42,
181
+ height: 42,
182
+ borderRadius: 21,
183
+ backgroundColor: colors.purple,
184
+ alignItems: 'center',
185
+ justifyContent: 'center',
186
+ shadowColor: colors.purple,
187
+ shadowOffset: { width: 0, height: 4 },
188
+ shadowOpacity: 0.45,
189
+ shadowRadius: 8,
190
+ elevation: 14,
191
+ zIndex: 999,
192
+ borderWidth: 1.5,
193
+ borderColor: 'rgba(255, 255, 255, 0.25)',
194
+ },
176
195
  scrollTopBtn: {
177
196
  position: 'absolute',
178
197
  bottom: 22,
@@ -67,6 +67,7 @@ export declare const SettingsSubTab: {
67
67
  readonly Module: "module";
68
68
  readonly Ui: "ui";
69
69
  readonly Limits: "limits";
70
+ readonly About: "about";
70
71
  };
71
72
  export type SettingsSubTab = (typeof SettingsSubTab)[keyof typeof SettingsSubTab];
72
73
  export declare const LogFilter: {
@@ -63,6 +63,7 @@ exports.SettingsSubTab = {
63
63
  Module: 'module',
64
64
  Ui: 'ui',
65
65
  Limits: 'limits',
66
+ About: 'about',
66
67
  };
67
68
  exports.LogFilter = {
68
69
  All: 'all',
@@ -151,8 +151,17 @@ export interface PersistedSettings {
151
151
  reduxExpandDepth?: number;
152
152
  showDuplicateLogs?: boolean;
153
153
  showUpdateToast?: boolean;
154
+ useNativeFab?: boolean;
155
+ shakeToOpen?: boolean;
154
156
  telemetryClientId?: string;
157
+ telemetryDeviceId?: string;
158
+ deviceRegistered?: boolean;
159
+ deviceFirstSeen?: number;
155
160
  telemetryLastPing?: number;
161
+ telemetryLastActive?: number;
162
+ starPromptActioned?: boolean;
163
+ starPromptLastShown?: number;
164
+ starPromptFirstSeen?: number;
156
165
  }
157
166
  export interface NetworkInspectorProps {
158
167
  enabled?: boolean;
@@ -163,6 +172,7 @@ export interface NetworkInspectorProps {
163
172
  environment?: 'DEV' | 'UAT' | 'PrePROD' | 'PROD' | 'QA' | 'Staging' | string;
164
173
  initialVisible?: boolean;
165
174
  visible?: boolean;
175
+ remoteConfig?: boolean | any;
166
176
  }
167
177
  export interface NavigationTrackerProps {
168
178
  onStateChange: (state: any) => void;
@@ -198,6 +208,8 @@ export interface InspectorContextValue {
198
208
  setShowHeaderInfo: React.Dispatch<React.SetStateAction<boolean>>;
199
209
  settingsPage: SettingsPage;
200
210
  setSettingsPage: React.Dispatch<React.SetStateAction<SettingsPage>>;
211
+ isFeedbackOpen: boolean;
212
+ setIsFeedbackOpen: React.Dispatch<React.SetStateAction<boolean>>;
201
213
  updateAvailable: boolean;
202
214
  latestNpmVersion: string | null;
203
215
  clearAnim: Animated.Value;