react-native-inapp-inspector 2.3.14 → 2.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/AnimatedEntrance.js +3 -3
  3. package/dist/commonjs/components/ConsoleLogCard.js +174 -100
  4. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  5. package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -38
  6. package/dist/commonjs/components/Inspector/CrashTab.js +19 -28
  7. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
  8. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  9. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  10. package/dist/commonjs/components/Inspector/InspectorHeader.js +58 -6
  11. package/dist/commonjs/components/Inspector/MainScreen.js +100 -58
  12. package/dist/commonjs/components/Inspector/NetworkTab.js +26 -371
  13. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  14. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  15. package/dist/commonjs/components/Inspector/PerformanceTab.js +40 -7
  16. package/dist/commonjs/components/Inspector/ReduxTab.js +3 -23
  17. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  18. package/dist/commonjs/components/Inspector/StorageTab.js +23 -28
  19. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  20. package/dist/commonjs/components/JsonViewer.js +14 -2
  21. package/dist/commonjs/components/LogCard.js +428 -227
  22. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  23. package/dist/commonjs/components/NetworkIcons.js +33 -2
  24. package/dist/commonjs/constants/version.d.ts +1 -1
  25. package/dist/commonjs/constants/version.js +1 -1
  26. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  27. package/dist/commonjs/customHooks/consoleLogger.js +34 -2
  28. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  29. package/dist/commonjs/customHooks/networkLogger.js +184 -26
  30. package/dist/commonjs/helpers/index.d.ts +1 -0
  31. package/dist/commonjs/helpers/index.js +1 -0
  32. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  33. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  34. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  35. package/dist/commonjs/helpers/searchQueryParser.js +39 -291
  36. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  37. package/dist/commonjs/helpers/telemetry.js +339 -8
  38. package/dist/commonjs/index.d.ts +1 -0
  39. package/dist/commonjs/index.js +173 -29
  40. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  41. package/dist/commonjs/styles/AppFonts.js +1 -0
  42. package/dist/commonjs/styles/index.d.ts +22 -0
  43. package/dist/commonjs/styles/index.js +19 -0
  44. package/dist/commonjs/types/enums.d.ts +1 -0
  45. package/dist/commonjs/types/enums.js +1 -0
  46. package/dist/commonjs/types/interfaces.d.ts +12 -0
  47. package/dist/esm/components/AnimatedEntrance.js +3 -3
  48. package/dist/esm/components/ConsoleLogCard.js +141 -100
  49. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  50. package/dist/esm/components/Inspector/ConsoleTab.js +26 -39
  51. package/dist/esm/components/Inspector/CrashTab.js +20 -29
  52. package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
  53. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  54. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  55. package/dist/esm/components/Inspector/InspectorHeader.js +60 -8
  56. package/dist/esm/components/Inspector/MainScreen.js +101 -59
  57. package/dist/esm/components/Inspector/NetworkTab.js +27 -372
  58. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  59. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  60. package/dist/esm/components/Inspector/PerformanceTab.js +40 -7
  61. package/dist/esm/components/Inspector/ReduxTab.js +4 -24
  62. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  63. package/dist/esm/components/Inspector/StorageTab.js +23 -28
  64. package/dist/esm/components/Inspector/TabBar.js +50 -15
  65. package/dist/esm/components/JsonViewer.js +14 -2
  66. package/dist/esm/components/LogCard.js +422 -221
  67. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  68. package/dist/esm/components/NetworkIcons.js +26 -0
  69. package/dist/esm/constants/version.d.ts +1 -1
  70. package/dist/esm/constants/version.js +1 -1
  71. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  72. package/dist/esm/customHooks/consoleLogger.js +34 -2
  73. package/dist/esm/customHooks/crashHandler.js +1 -1
  74. package/dist/esm/customHooks/networkLogger.js +184 -26
  75. package/dist/esm/helpers/index.d.ts +1 -0
  76. package/dist/esm/helpers/index.js +1 -0
  77. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  78. package/dist/esm/helpers/remoteConfig.js +160 -0
  79. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  80. package/dist/esm/helpers/searchQueryParser.js +39 -291
  81. package/dist/esm/helpers/telemetry.d.ts +5 -0
  82. package/dist/esm/helpers/telemetry.js +332 -9
  83. package/dist/esm/index.d.ts +1 -0
  84. package/dist/esm/index.js +171 -29
  85. package/dist/esm/styles/AppFonts.d.ts +2 -0
  86. package/dist/esm/styles/AppFonts.js +1 -0
  87. package/dist/esm/styles/index.d.ts +22 -0
  88. package/dist/esm/styles/index.js +19 -0
  89. package/dist/esm/types/enums.d.ts +1 -0
  90. package/dist/esm/types/enums.js +1 -0
  91. package/dist/esm/types/interfaces.d.ts +12 -0
  92. package/package.json +1 -1
  93. package/src/components/AnimatedEntrance.tsx +3 -3
  94. package/src/components/ConsoleLogCard.tsx +154 -103
  95. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  96. package/src/components/Inspector/ConsoleTab.tsx +27 -41
  97. package/src/components/Inspector/CrashTab.tsx +19 -28
  98. package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
  99. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  100. package/src/components/Inspector/InspectorHeader.tsx +83 -5
  101. package/src/components/Inspector/MainScreen.tsx +61 -6
  102. package/src/components/Inspector/NetworkTab.tsx +70 -480
  103. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  104. package/src/components/Inspector/PerformanceTab.tsx +44 -8
  105. package/src/components/Inspector/ReduxTab.tsx +9 -24
  106. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  107. package/src/components/Inspector/StorageTab.tsx +27 -30
  108. package/src/components/Inspector/TabBar.tsx +57 -20
  109. package/src/components/JsonViewer.tsx +15 -2
  110. package/src/components/LogCard.tsx +528 -339
  111. package/src/components/NetworkIcons.tsx +92 -0
  112. package/src/constants/version.ts +1 -1
  113. package/src/customHooks/analyticsLogger.ts +1 -1
  114. package/src/customHooks/consoleLogger.ts +36 -3
  115. package/src/customHooks/crashHandler.ts +1 -1
  116. package/src/customHooks/networkLogger.ts +214 -26
  117. package/src/helpers/index.ts +1 -0
  118. package/src/helpers/remoteConfig.ts +212 -0
  119. package/src/helpers/searchQueryParser.ts +42 -284
  120. package/src/helpers/telemetry.ts +381 -10
  121. package/src/index.tsx +374 -211
  122. package/src/styles/AppFonts.ts +2 -0
  123. package/src/styles/index.ts +20 -1
  124. package/src/types/enums.ts +1 -0
  125. 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';