react-native-inapp-inspector 1.1.24 → 1.1.26

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 (114) hide show
  1. package/android/build.gradle +36 -0
  2. package/android/src/main/AndroidManifest.xml +3 -0
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +114 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +28 -0
  5. package/dist/commonjs/components/AnalyticsEventCard.js +94 -88
  6. package/dist/commonjs/components/ConsoleLogCard.js +49 -25
  7. package/dist/commonjs/components/ErrorBoundary.d.ts +1 -1
  8. package/dist/commonjs/components/ErrorBoundary.js +9 -145
  9. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.d.ts +7 -0
  10. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1002 -0
  11. package/dist/commonjs/components/Inspector/AnalyticsTab.js +637 -10
  12. package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -1
  13. package/dist/commonjs/components/Inspector/BundleTab.js +826 -406
  14. package/dist/commonjs/components/Inspector/CrashDetail.d.ts +3 -0
  15. package/dist/commonjs/components/Inspector/CrashDetail.js +796 -0
  16. package/dist/commonjs/components/Inspector/CrashFilterModal.d.ts +20 -0
  17. package/dist/commonjs/components/Inspector/CrashFilterModal.js +597 -0
  18. package/dist/commonjs/components/Inspector/CrashTab.d.ts +3 -0
  19. package/dist/commonjs/components/Inspector/CrashTab.js +727 -0
  20. package/dist/commonjs/components/Inspector/InspectorContext.js +6 -1
  21. package/dist/commonjs/components/Inspector/InspectorHeader.js +65 -28
  22. package/dist/commonjs/components/Inspector/LogDetail.js +227 -114
  23. package/dist/commonjs/components/Inspector/MainScreen.js +13 -4
  24. package/dist/commonjs/components/Inspector/NetworkDetail.js +131 -81
  25. package/dist/commonjs/components/Inspector/PerformanceTab.js +20 -10
  26. package/dist/commonjs/components/Inspector/SettingsPanel.js +90 -1
  27. package/dist/commonjs/components/Inspector/TabBar.js +15 -3
  28. package/dist/commonjs/components/NetworkIcons.d.ts +25 -0
  29. package/dist/commonjs/components/NetworkIcons.js +188 -1
  30. package/dist/commonjs/components/SegmentedTabs.js +33 -23
  31. package/dist/commonjs/components/TreeNode.js +13 -12
  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.js +70 -44
  35. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +5 -1
  36. package/dist/commonjs/customHooks/bundleAnalyzer.js +497 -126
  37. package/dist/commonjs/customHooks/consoleLogger.d.ts +1 -0
  38. package/dist/commonjs/customHooks/consoleLogger.js +153 -51
  39. package/dist/commonjs/customHooks/crashHandler.d.ts +64 -0
  40. package/dist/commonjs/customHooks/crashHandler.js +681 -0
  41. package/dist/commonjs/customHooks/networkLogger.js +74 -49
  42. package/dist/commonjs/customHooks/performanceTracker.d.ts +8 -0
  43. package/dist/commonjs/customHooks/performanceTracker.js +44 -3
  44. package/dist/commonjs/decorators/index.d.ts +49 -0
  45. package/dist/commonjs/decorators/index.js +142 -0
  46. package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +18 -0
  47. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +174 -0
  48. package/dist/commonjs/helpers/index.d.ts +7 -4
  49. package/dist/commonjs/helpers/index.js +102 -64
  50. package/dist/commonjs/i18n/locales/en.json +182 -4
  51. package/dist/commonjs/index.d.ts +6 -0
  52. package/dist/commonjs/index.js +310 -8
  53. package/dist/commonjs/styles/index.d.ts +4 -1
  54. package/dist/commonjs/styles/index.js +22 -19
  55. package/dist/commonjs/types/enums.d.ts +156 -9
  56. package/dist/commonjs/types/enums.js +139 -2
  57. package/dist/commonjs/types/interfaces.d.ts +70 -1
  58. package/dist/esm/components/AnalyticsEventCard.js +95 -89
  59. package/dist/esm/components/ConsoleLogCard.js +49 -25
  60. package/dist/esm/components/ErrorBoundary.d.ts +1 -1
  61. package/dist/esm/components/ErrorBoundary.js +10 -113
  62. package/dist/esm/components/Inspector/AnalyticsFilterModal.d.ts +7 -0
  63. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +964 -0
  64. package/dist/esm/components/Inspector/AnalyticsTab.js +639 -12
  65. package/dist/esm/components/Inspector/BundleTab.d.ts +1 -1
  66. package/dist/esm/components/Inspector/BundleTab.js +827 -407
  67. package/dist/esm/components/Inspector/CrashDetail.d.ts +3 -0
  68. package/dist/esm/components/Inspector/CrashDetail.js +758 -0
  69. package/dist/esm/components/Inspector/CrashFilterModal.d.ts +20 -0
  70. package/dist/esm/components/Inspector/CrashFilterModal.js +557 -0
  71. package/dist/esm/components/Inspector/CrashTab.d.ts +3 -0
  72. package/dist/esm/components/Inspector/CrashTab.js +689 -0
  73. package/dist/esm/components/Inspector/InspectorContext.js +1 -0
  74. package/dist/esm/components/Inspector/InspectorHeader.js +66 -29
  75. package/dist/esm/components/Inspector/LogDetail.js +227 -114
  76. package/dist/esm/components/Inspector/MainScreen.js +14 -5
  77. package/dist/esm/components/Inspector/NetworkDetail.js +132 -49
  78. package/dist/esm/components/Inspector/PerformanceTab.js +20 -10
  79. package/dist/esm/components/Inspector/SettingsPanel.js +91 -2
  80. package/dist/esm/components/Inspector/TabBar.js +16 -4
  81. package/dist/esm/components/NetworkIcons.d.ts +25 -0
  82. package/dist/esm/components/NetworkIcons.js +161 -0
  83. package/dist/esm/components/SegmentedTabs.js +33 -23
  84. package/dist/esm/components/TreeNode.js +13 -12
  85. package/dist/esm/constants/version.d.ts +1 -1
  86. package/dist/esm/constants/version.js +1 -1
  87. package/dist/esm/customHooks/analyticsLogger.js +70 -44
  88. package/dist/esm/customHooks/bundleAnalyzer.d.ts +5 -1
  89. package/dist/esm/customHooks/bundleAnalyzer.js +493 -125
  90. package/dist/esm/customHooks/consoleLogger.d.ts +1 -0
  91. package/dist/esm/customHooks/consoleLogger.js +151 -50
  92. package/dist/esm/customHooks/crashHandler.d.ts +64 -0
  93. package/dist/esm/customHooks/crashHandler.js +659 -0
  94. package/dist/esm/customHooks/networkLogger.js +74 -49
  95. package/dist/esm/customHooks/performanceTracker.d.ts +8 -0
  96. package/dist/esm/customHooks/performanceTracker.js +38 -1
  97. package/dist/esm/decorators/index.d.ts +49 -0
  98. package/dist/esm/decorators/index.js +137 -0
  99. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +18 -0
  100. package/dist/esm/helpers/gaAnalyticsRegistry.js +169 -0
  101. package/dist/esm/helpers/index.d.ts +7 -4
  102. package/dist/esm/helpers/index.js +100 -63
  103. package/dist/esm/i18n/locales/en.json +182 -4
  104. package/dist/esm/index.d.ts +6 -0
  105. package/dist/esm/index.js +262 -8
  106. package/dist/esm/styles/index.d.ts +4 -1
  107. package/dist/esm/styles/index.js +22 -19
  108. package/dist/esm/types/enums.d.ts +156 -9
  109. package/dist/esm/types/enums.js +138 -3
  110. package/dist/esm/types/interfaces.d.ts +70 -1
  111. package/ios/NetworkInspectorModule.h +6 -0
  112. package/ios/NetworkInspectorModule.m +125 -0
  113. package/package.json +5 -2
  114. package/react-native-inapp-inspector.podspec +18 -0
@@ -36,7 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.getLastActionForReducer = exports.clearActionHistory = exports.getActionHistory = exports.subscribeReduxState = exports.getReduxState = exports.inspectorReduxMiddleware = exports.connectReduxStore = exports.ErrorBoundary = 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;
39
+ exports.ActiveTab = exports.InspectCatch = exports.InspectTrackTime = exports.InspectLog = exports.getPerformanceEvents = exports.subscribePerformanceEvents = exports.clearPerformanceEvents = exports.logPerformanceEvent = 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
+ 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 = void 0;
40
41
  const react_1 = __importStar(require("react"));
41
42
  const react_native_1 = require("react-native");
42
43
  const native_1 = require("@react-navigation/native");
@@ -55,6 +56,8 @@ const networkLogger_1 = require("./customHooks/networkLogger");
55
56
  // Console
56
57
  const consoleLogger_1 = require("./customHooks/consoleLogger");
57
58
  const logFilters_1 = require("./customHooks/logFilters");
59
+ // Crash Protection
60
+ const crashHandler_1 = require("./customHooks/crashHandler");
58
61
  const analyticsLogger_1 = require("./customHooks/analyticsLogger");
59
62
  const reduxLogger_1 = require("./customHooks/reduxLogger");
60
63
  const constants_1 = require("./constants");
@@ -128,6 +131,14 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
128
131
  const latestAnalyticsEventsRef = (0, react_1.useRef)([]);
129
132
  const [lastReadLogsCount, setLastReadLogsCount] = (0, react_1.useState)(0);
130
133
  const [lastReadApisCount, setLastReadApisCount] = (0, react_1.useState)(0);
134
+ const [lastReadCrashesCount, setLastReadCrashesCount] = (0, react_1.useState)(0);
135
+ // ─── Crash state ───────────────────────────────────────────────────────────
136
+ const [crashRecords, setCrashRecords] = (0, react_1.useState)(() => (0, crashHandler_1.getCrashRecords)());
137
+ const [selectedCrash, setSelectedCrash] = (0, react_1.useState)(null);
138
+ const [maxCrashLogs, setMaxCrashLogs] = (0, react_1.useState)(100);
139
+ (0, react_1.useEffect)(() => {
140
+ (0, crashHandler_1.setMaxCrashLogsLimit)(maxCrashLogs);
141
+ }, [maxCrashLogs]);
131
142
  (0, react_1.useEffect)(() => {
132
143
  if (visible) {
133
144
  if (activeTab === 'apis') {
@@ -136,6 +147,9 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
136
147
  if (activeTab === 'logs') {
137
148
  setLastReadLogsCount(consoleLogs.length);
138
149
  }
150
+ if (activeTab === 'crash') {
151
+ setLastReadCrashesCount(crashRecords.length);
152
+ }
139
153
  }
140
154
  }, [visible]);
141
155
  (0, react_1.useEffect)(() => {
@@ -148,6 +162,11 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
148
162
  setLastReadLogsCount(consoleLogs.length);
149
163
  }
150
164
  }, [activeTab, consoleLogs.length]);
165
+ (0, react_1.useEffect)(() => {
166
+ if (activeTab === 'crash') {
167
+ setLastReadCrashesCount(crashRecords.length);
168
+ }
169
+ }, [activeTab, crashRecords.length]);
151
170
  const [maxConsoleLogs, setMaxConsoleLogs] = (0, react_1.useState)(200);
152
171
  const [showConsoleLevels, setShowConsoleLevels] = (0, react_1.useState)({
153
172
  info: true,
@@ -190,6 +209,7 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
190
209
  redux: false,
191
210
  bundle: false,
192
211
  performance: false,
212
+ crash: true,
193
213
  });
194
214
  const [maxNetworkLogs, setMaxNetworkLogs] = (0, react_1.useState)(100);
195
215
  const [reduxAutoRefresh, setReduxAutoRefreshState] = (0, react_1.useState)(true);
@@ -210,8 +230,10 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
210
230
  redux: false,
211
231
  bundle: false,
212
232
  performance: false,
233
+ crash: true,
213
234
  });
214
235
  setDefaultTab('apis');
236
+ setMaxCrashLogs(100);
215
237
  setMaxNetworkLogs(100);
216
238
  setMaxConsoleLogs(200);
217
239
  setShowConsoleLevels({
@@ -244,6 +266,9 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
244
266
  ...prev,
245
267
  ...saved.tabVisibility,
246
268
  apis: true, // APIs is always required
269
+ crash: saved.tabVisibility.crash !== undefined
270
+ ? saved.tabVisibility.crash
271
+ : true,
247
272
  }));
248
273
  if (saved.defaultTab)
249
274
  setDefaultTab(saved.defaultTab);
@@ -269,6 +294,7 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
269
294
  redux: false,
270
295
  bundle: false,
271
296
  performance: false,
297
+ crash: true,
272
298
  },
273
299
  ...(saved.tabVisibility || {}),
274
300
  apis: true,
@@ -371,7 +397,67 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
371
397
  }, []);
372
398
  const [selectedEvent, setSelectedEvent] = (0, react_1.useState)(null);
373
399
  const [analyticsSearch, setAnalyticsSearch] = (0, react_1.useState)('');
374
- const [hideScreenView] = (0, react_1.useState)(true);
400
+ const [analyticsFilters, setAnalyticsFilters] = (0, react_1.useState)({
401
+ categories: new Set(['all']),
402
+ screens: new Set(),
403
+ sources: new Set(['all']),
404
+ userTypes: new Set(['all']),
405
+ timeWindow: 'all',
406
+ payloadComplexity: 'all',
407
+ hasRevenue: false,
408
+ hasItems: false,
409
+ hasUserProps: false,
410
+ hasParams: false,
411
+ onlyDuplicates: false,
412
+ onlyConversions: false,
413
+ sortBy: 'time_desc',
414
+ });
415
+ const isAnalyticsFilterApplied = (0, react_1.useMemo)(() => {
416
+ if (analyticsFilters.categories.size > 0 && !analyticsFilters.categories.has('all'))
417
+ return true;
418
+ if (analyticsFilters.screens.size > 0)
419
+ return true;
420
+ if (analyticsFilters.sources.size > 0 && !analyticsFilters.sources.has('all'))
421
+ return true;
422
+ if (analyticsFilters.userTypes.size > 0 && !analyticsFilters.userTypes.has('all'))
423
+ return true;
424
+ if (analyticsFilters.timeWindow !== 'all')
425
+ return true;
426
+ if (analyticsFilters.payloadComplexity !== 'all')
427
+ return true;
428
+ if (analyticsFilters.hasRevenue)
429
+ return true;
430
+ if (analyticsFilters.hasItems)
431
+ return true;
432
+ if (analyticsFilters.hasUserProps)
433
+ return true;
434
+ if (analyticsFilters.hasParams)
435
+ return true;
436
+ if (analyticsFilters.onlyDuplicates)
437
+ return true;
438
+ if (analyticsFilters.onlyConversions)
439
+ return true;
440
+ if (analyticsFilters.sortBy !== 'time_desc')
441
+ return true;
442
+ return false;
443
+ }, [analyticsFilters]);
444
+ const resetAnalyticsFilters = (0, react_1.useCallback)(() => {
445
+ setAnalyticsFilters({
446
+ categories: new Set(['all']),
447
+ screens: new Set(),
448
+ sources: new Set(['all']),
449
+ userTypes: new Set(['all']),
450
+ timeWindow: 'all',
451
+ payloadComplexity: 'all',
452
+ hasRevenue: false,
453
+ hasItems: false,
454
+ hasUserProps: false,
455
+ hasParams: false,
456
+ onlyDuplicates: false,
457
+ onlyConversions: false,
458
+ sortBy: 'time_desc',
459
+ });
460
+ }, []);
375
461
  const [isAnalyticsLayoutReady, setIsAnalyticsLayoutReady] = (0, react_1.useState)(false);
376
462
  const [analyticsHeaderExpanded, setAnalyticsHeaderExpanded] = (0, react_1.useState)(false);
377
463
  const [newEventIds, setNewEventIds] = (0, react_1.useState)(new Set());
@@ -589,6 +675,22 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
589
675
  (0, networkLogger_1.clearNetworkLogs)();
590
676
  (0, consoleLogger_1.setupConsoleLogger)();
591
677
  (0, analyticsLogger_1.autoSetupAnalyticsLogger)();
678
+ (0, crashHandler_1.setupGlobalCrashHandler)();
679
+ const unsubscribeCrash = (0, crashHandler_1.subscribeCrashEvents)(crashInfo => {
680
+ if (crashInfo.message === '__CLEARED__') {
681
+ setCrashRecords([]);
682
+ setSelectedCrash(null);
683
+ return;
684
+ }
685
+ const updated = (0, crashHandler_1.getCrashRecords)();
686
+ setCrashRecords(updated);
687
+ });
688
+ // Sync crashes recorded before this subscription ran (e.g. a render crash
689
+ // during the very first commit, which fires before effects are mounted).
690
+ const pendingCrashes = (0, crashHandler_1.getCrashRecords)();
691
+ if (pendingCrashes.length > 0) {
692
+ setCrashRecords(pendingCrashes);
693
+ }
592
694
  let timeoutId;
593
695
  let isFirstNetworkCall = true;
594
696
  const unsubscribe = (0, networkLogger_1.subscribeNetworkLogs)((raw) => {
@@ -700,6 +802,7 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
700
802
  unsubscribeConsole();
701
803
  clearTimeout(consoleTimeoutId);
702
804
  unsubscribeRedux();
805
+ unsubscribeCrash();
703
806
  };
704
807
  }, []);
705
808
  (0, react_1.useEffect)(() => {
@@ -905,15 +1008,110 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
905
1008
  const prevResponseData = prevSameRequest ? prevSameRequest.response : null;
906
1009
  const filteredAnalyticsEvents = (0, react_1.useMemo)(() => {
907
1010
  let events = analyticsEvents;
908
- if (hideScreenView) {
909
- events = events.filter(e => e.name !== 'screen_view');
910
- }
1011
+ // Search query filter
911
1012
  if (analyticsSearch) {
912
1013
  const s = analyticsSearch.toLowerCase();
913
1014
  events = events.filter(e => e.name.toLowerCase().includes(s) ||
914
- JSON.stringify(e.params).toLowerCase().includes(s) ||
1015
+ JSON.stringify(e.params || {}).toLowerCase().includes(s) ||
1016
+ (e.screenName ?? '').toLowerCase().includes(s) ||
915
1017
  (e.pageTitle ?? '').toLowerCase().includes(s));
916
1018
  }
1019
+ // Category filter
1020
+ if (analyticsFilters.categories.size > 0 && !analyticsFilters.categories.has('all')) {
1021
+ events = events.filter(e => {
1022
+ const cat = (0, helpers_1.getEventCategory)(e.name);
1023
+ return analyticsFilters.categories.has(cat);
1024
+ });
1025
+ }
1026
+ // Time window filter
1027
+ if (analyticsFilters.timeWindow !== 'all') {
1028
+ const now = Date.now();
1029
+ const cutoff = analyticsFilters.timeWindow === '1m'
1030
+ ? now - 60 * 1000
1031
+ : analyticsFilters.timeWindow === '5m'
1032
+ ? now - 5 * 60 * 1000
1033
+ : analyticsFilters.timeWindow === '15m'
1034
+ ? now - 15 * 60 * 1000
1035
+ : now - 60 * 60 * 1000;
1036
+ events = events.filter(e => e.timestamp >= cutoff);
1037
+ }
1038
+ // Source filter
1039
+ if (analyticsFilters.sources.size > 0 && !analyticsFilters.sources.has('all')) {
1040
+ events = events.filter(e => analyticsFilters.sources.has(e.source || 'manual'));
1041
+ }
1042
+ // User identification filter
1043
+ if (analyticsFilters.userTypes.size > 0 && !analyticsFilters.userTypes.has('all')) {
1044
+ events = events.filter(e => {
1045
+ const isIdentified = Boolean(e.userId && e.userId.trim() !== '');
1046
+ if (analyticsFilters.userTypes.has('identified') && isIdentified)
1047
+ return true;
1048
+ if (analyticsFilters.userTypes.has('anonymous') && !isIdentified)
1049
+ return true;
1050
+ return false;
1051
+ });
1052
+ }
1053
+ // Payload complexity filter
1054
+ if (analyticsFilters.payloadComplexity !== 'all') {
1055
+ events = events.filter(e => {
1056
+ const count = e.params ? Object.keys(e.params).length : 0;
1057
+ if (analyticsFilters.payloadComplexity === 'none')
1058
+ return count === 0;
1059
+ if (analyticsFilters.payloadComplexity === 'simple')
1060
+ return count >= 1 && count <= 5;
1061
+ if (analyticsFilters.payloadComplexity === 'heavy')
1062
+ return count > 5;
1063
+ return true;
1064
+ });
1065
+ }
1066
+ // Conversion / Goal events filter
1067
+ if (analyticsFilters.onlyConversions) {
1068
+ const CONVERSION_PATTERNS = [
1069
+ 'purchase',
1070
+ 'item_purchase',
1071
+ 'ecommerce_purchase',
1072
+ 'sign_up',
1073
+ 'login',
1074
+ 'lead',
1075
+ 'generate_lead',
1076
+ 'tutorial_complete',
1077
+ 'add_payment_info',
1078
+ 'begin_checkout',
1079
+ 'spend_virtual_currency',
1080
+ ];
1081
+ events = events.filter(e => CONVERSION_PATTERNS.some(pat => e.name.toLowerCase().includes(pat)));
1082
+ }
1083
+ // Screen filter
1084
+ if (analyticsFilters.screens.size > 0) {
1085
+ events = events.filter(e => {
1086
+ const scr = e.screenName ||
1087
+ e.params?.firebase_screen ||
1088
+ e.params?.screen_name ||
1089
+ e.params?.firebase_screen_class ||
1090
+ e.screenClass ||
1091
+ '';
1092
+ return analyticsFilters.screens.has(scr);
1093
+ });
1094
+ }
1095
+ // Has Revenue filter
1096
+ if (analyticsFilters.hasRevenue) {
1097
+ events = events.filter(e => {
1098
+ const val = e.params?.value ?? e.params?.price;
1099
+ return val !== undefined && val !== null && Number(val) > 0;
1100
+ });
1101
+ }
1102
+ // Has Items filter
1103
+ if (analyticsFilters.hasItems) {
1104
+ events = events.filter(e => Array.isArray(e.params?.items) && e.params.items.length > 0);
1105
+ }
1106
+ // Has User Props filter
1107
+ if (analyticsFilters.hasUserProps) {
1108
+ events = events.filter(e => e.userProperties && Object.keys(e.userProperties).length > 0);
1109
+ }
1110
+ // Has Params filter
1111
+ if (analyticsFilters.hasParams) {
1112
+ events = events.filter(e => e.params && Object.keys(e.params).length > 0);
1113
+ }
1114
+ // Deduplication
917
1115
  const deduplicatedEvents = [];
918
1116
  for (const e of events) {
919
1117
  if (deduplicatedEvents.length === 0) {
@@ -933,8 +1131,27 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
933
1131
  deduplicatedEvents.push({ ...e, count: 1 });
934
1132
  }
935
1133
  }
936
- return deduplicatedEvents;
937
- }, [analyticsEvents, analyticsSearch, hideScreenView]);
1134
+ let result = deduplicatedEvents;
1135
+ // Only duplicates filter
1136
+ if (analyticsFilters.onlyDuplicates) {
1137
+ result = result.filter(e => (e.count || 1) > 1);
1138
+ }
1139
+ // Sorting
1140
+ if (analyticsFilters.sortBy === 'time_asc') {
1141
+ result = [...result].sort((a, b) => a.timestamp - b.timestamp);
1142
+ }
1143
+ else if (analyticsFilters.sortBy === 'revenue_desc') {
1144
+ result = [...result].sort((a, b) => {
1145
+ const valA = Number(a.params?.value ?? a.params?.price ?? 0);
1146
+ const valB = Number(b.params?.value ?? b.params?.price ?? 0);
1147
+ return valB - valA;
1148
+ });
1149
+ }
1150
+ else if (analyticsFilters.sortBy === 'count_desc') {
1151
+ result = [...result].sort((a, b) => (b.count || 1) - (a.count || 1));
1152
+ }
1153
+ return result;
1154
+ }, [analyticsEvents, analyticsSearch, analyticsFilters]);
938
1155
  const filteredConsoleLogs = (0, react_1.useMemo)(() => {
939
1156
  let result = visibleConsoleLogs;
940
1157
  // Filters check
@@ -1075,6 +1292,21 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
1075
1292
  ]);
1076
1293
  return;
1077
1294
  }
1295
+ if (activeTab === 'crash') {
1296
+ react_native_1.Alert.alert('Clear Crash History', 'Are you sure you want to clear all intercepted crash records?', [
1297
+ { text: 'Cancel', style: 'cancel' },
1298
+ {
1299
+ text: 'Clear All',
1300
+ onPress: () => {
1301
+ (0, crashHandler_1.clearCrashRecords)();
1302
+ setCrashRecords([]);
1303
+ setSelectedCrash(null);
1304
+ },
1305
+ style: 'destructive',
1306
+ },
1307
+ ]);
1308
+ return;
1309
+ }
1078
1310
  // Default: APIs tab. Only clears NETWORK logs — never touches the other tabs.
1079
1311
  if (selectedLogs.size > 0) {
1080
1312
  setLogs(prev => prev.filter(l => !selectedLogs.has(l.id)));
@@ -1233,6 +1465,10 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
1233
1465
  filteredAnalyticsEvents,
1234
1466
  analyticsSearch,
1235
1467
  setAnalyticsSearch,
1468
+ analyticsFilters,
1469
+ setAnalyticsFilters,
1470
+ isAnalyticsFilterApplied,
1471
+ resetAnalyticsFilters,
1236
1472
  newEventIds,
1237
1473
  isAnalyticsLayoutReady,
1238
1474
  setIsAnalyticsLayoutReady,
@@ -1252,6 +1488,19 @@ const NetworkInspector = ({ enabled = true, isEnabled = true, storage, navigatio
1252
1488
  setSelectedReduxAction,
1253
1489
  reduxActiveSubTab,
1254
1490
  setReduxActiveSubTab,
1491
+ // ─── Crash ───────────────────────────────────────────────────────────
1492
+ crashRecords,
1493
+ setCrashRecords,
1494
+ selectedCrash,
1495
+ setSelectedCrash,
1496
+ lastReadCrashesCount,
1497
+ maxCrashLogs,
1498
+ setMaxCrashLogs,
1499
+ clearAllCrashes: () => {
1500
+ (0, crashHandler_1.clearCrashRecords)();
1501
+ setCrashRecords([]);
1502
+ setSelectedCrash(null);
1503
+ },
1255
1504
  // ─── Settings ───────────────────────────────────────────────────────
1256
1505
  settingsActiveSubTab,
1257
1506
  setSettingsActiveSubTab,
@@ -1310,6 +1559,24 @@ Object.defineProperty(exports, "getCurrentUserProperties", { enumerable: true, g
1310
1559
  Object.defineProperty(exports, "getCurrentUserId", { enumerable: true, get: function () { return analyticsLogger_2.getCurrentUserId; } });
1311
1560
  Object.defineProperty(exports, "getDefaultEventParameters", { enumerable: true, get: function () { return analyticsLogger_2.getDefaultEventParameters; } });
1312
1561
  Object.defineProperty(exports, "getCollectionEnabled", { enumerable: true, get: function () { return analyticsLogger_2.getCollectionEnabled; } });
1562
+ var crashHandler_2 = require("./customHooks/crashHandler");
1563
+ Object.defineProperty(exports, "setupGlobalCrashHandler", { enumerable: true, get: function () { return crashHandler_2.setupGlobalCrashHandler; } });
1564
+ Object.defineProperty(exports, "subscribeCrashEvents", { enumerable: true, get: function () { return crashHandler_2.subscribeCrashEvents; } });
1565
+ Object.defineProperty(exports, "emitCrashEvent", { enumerable: true, get: function () { return crashHandler_2.emitCrashEvent; } });
1566
+ Object.defineProperty(exports, "getCrashRecords", { enumerable: true, get: function () { return crashHandler_2.getCrashRecords; } });
1567
+ Object.defineProperty(exports, "clearCrashRecords", { enumerable: true, get: function () { return crashHandler_2.clearCrashRecords; } });
1568
+ Object.defineProperty(exports, "simulateTestCrash", { enumerable: true, get: function () { return crashHandler_2.simulateTestCrash; } });
1569
+ Object.defineProperty(exports, "exportCrashReport", { enumerable: true, get: function () { return crashHandler_2.exportCrashReport; } });
1570
+ Object.defineProperty(exports, "parseCrashStackTrace", { enumerable: true, get: function () { return crashHandler_2.parseCrashStackTrace; } });
1571
+ Object.defineProperty(exports, "recordCustomCrash", { enumerable: true, get: function () { return crashHandler_2.recordCustomCrash; } });
1572
+ Object.defineProperty(exports, "addCrashBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.addCrashBreadcrumb; } });
1573
+ Object.defineProperty(exports, "recordNavigationBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordNavigationBreadcrumb; } });
1574
+ Object.defineProperty(exports, "recordNetworkBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordNetworkBreadcrumb; } });
1575
+ Object.defineProperty(exports, "recordReduxBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordReduxBreadcrumb; } });
1576
+ Object.defineProperty(exports, "recordUserActionBreadcrumb", { enumerable: true, get: function () { return crashHandler_2.recordUserActionBreadcrumb; } });
1577
+ Object.defineProperty(exports, "computeCrashFingerprint", { enumerable: true, get: function () { return crashHandler_2.computeCrashFingerprint; } });
1578
+ var CrashTab_1 = require("./components/Inspector/CrashTab");
1579
+ Object.defineProperty(exports, "CrashTab", { enumerable: true, get: function () { return __importDefault(CrashTab_1).default; } });
1313
1580
  var ErrorBoundary_2 = require("./components/ErrorBoundary");
1314
1581
  Object.defineProperty(exports, "ErrorBoundary", { enumerable: true, get: function () { return __importDefault(ErrorBoundary_2).default; } });
1315
1582
  var reduxLogger_2 = require("./customHooks/reduxLogger");
@@ -1320,3 +1587,38 @@ Object.defineProperty(exports, "subscribeReduxState", { enumerable: true, get: f
1320
1587
  Object.defineProperty(exports, "getActionHistory", { enumerable: true, get: function () { return reduxLogger_2.getActionHistory; } });
1321
1588
  Object.defineProperty(exports, "clearActionHistory", { enumerable: true, get: function () { return reduxLogger_2.clearActionHistory; } });
1322
1589
  Object.defineProperty(exports, "getLastActionForReducer", { enumerable: true, get: function () { return reduxLogger_2.getLastActionForReducer; } });
1590
+ var gaAnalyticsRegistry_1 = require("./helpers/gaAnalyticsRegistry");
1591
+ Object.defineProperty(exports, "getEventCategory", { enumerable: true, get: function () { return gaAnalyticsRegistry_1.getEventCategory; } });
1592
+ Object.defineProperty(exports, "registerGAPlugin", { enumerable: true, get: function () { return gaAnalyticsRegistry_1.registerGAPlugin; } });
1593
+ var performanceTracker_1 = require("./customHooks/performanceTracker");
1594
+ Object.defineProperty(exports, "usePerformanceTracker", { enumerable: true, get: function () { return performanceTracker_1.usePerformanceTracker; } });
1595
+ Object.defineProperty(exports, "logPerformanceEvent", { enumerable: true, get: function () { return performanceTracker_1.logPerformanceEvent; } });
1596
+ Object.defineProperty(exports, "clearPerformanceEvents", { enumerable: true, get: function () { return performanceTracker_1.clearPerformanceEvents; } });
1597
+ Object.defineProperty(exports, "subscribePerformanceEvents", { enumerable: true, get: function () { return performanceTracker_1.subscribePerformanceEvents; } });
1598
+ Object.defineProperty(exports, "getPerformanceEvents", { enumerable: true, get: function () { return performanceTracker_1.getPerformanceEvents; } });
1599
+ var decorators_1 = require("./decorators");
1600
+ Object.defineProperty(exports, "InspectLog", { enumerable: true, get: function () { return decorators_1.InspectLog; } });
1601
+ Object.defineProperty(exports, "InspectTrackTime", { enumerable: true, get: function () { return decorators_1.InspectTrackTime; } });
1602
+ Object.defineProperty(exports, "InspectCatch", { enumerable: true, get: function () { return decorators_1.InspectCatch; } });
1603
+ var types_1 = require("./types");
1604
+ Object.defineProperty(exports, "ActiveTab", { enumerable: true, get: function () { return types_1.ActiveTab; } });
1605
+ Object.defineProperty(exports, "Method", { enumerable: true, get: function () { return types_1.Method; } });
1606
+ Object.defineProperty(exports, "StatusFilter", { enumerable: true, get: function () { return types_1.StatusFilter; } });
1607
+ Object.defineProperty(exports, "SortOrder", { enumerable: true, get: function () { return types_1.SortOrder; } });
1608
+ Object.defineProperty(exports, "LocalFilter", { enumerable: true, get: function () { return types_1.LocalFilter; } });
1609
+ Object.defineProperty(exports, "ModalAnimationType", { enumerable: true, get: function () { return types_1.ModalAnimationType; } });
1610
+ Object.defineProperty(exports, "SettingsPage", { enumerable: true, get: function () { return types_1.SettingsPage; } });
1611
+ Object.defineProperty(exports, "SettingsSubTab", { enumerable: true, get: function () { return types_1.SettingsSubTab; } });
1612
+ Object.defineProperty(exports, "LogFilter", { enumerable: true, get: function () { return types_1.LogFilter; } });
1613
+ Object.defineProperty(exports, "ConsoleLogType", { enumerable: true, get: function () { return types_1.ConsoleLogType; } });
1614
+ Object.defineProperty(exports, "AnalyticsEventSource", { enumerable: true, get: function () { return types_1.AnalyticsEventSource; } });
1615
+ Object.defineProperty(exports, "GAEventCategory", { enumerable: true, get: function () { return types_1.GAEventCategory; } });
1616
+ Object.defineProperty(exports, "StackFrameType", { enumerable: true, get: function () { return types_1.StackFrameType; } });
1617
+ Object.defineProperty(exports, "DiffResultType", { enumerable: true, get: function () { return types_1.DiffResultType; } });
1618
+ Object.defineProperty(exports, "BundleSubTab", { enumerable: true, get: function () { return types_1.BundleSubTab; } });
1619
+ Object.defineProperty(exports, "PerformanceSubTab", { enumerable: true, get: function () { return types_1.PerformanceSubTab; } });
1620
+ Object.defineProperty(exports, "CrashType", { enumerable: true, get: function () { return types_1.CrashType; } });
1621
+ Object.defineProperty(exports, "CrashExportFormat", { enumerable: true, get: function () { return types_1.CrashExportFormat; } });
1622
+ Object.defineProperty(exports, "CrashDetailSubTab", { enumerable: true, get: function () { return types_1.CrashDetailSubTab; } });
1623
+ Object.defineProperty(exports, "CrashFilterType", { enumerable: true, get: function () { return types_1.CrashFilterType; } });
1624
+ Object.defineProperty(exports, "BreadcrumbType", { enumerable: true, get: function () { return types_1.BreadcrumbType; } });
@@ -641,6 +641,10 @@ export declare const getRawStyles: (colors: typeof AppColors) => {
641
641
  fontSize: number;
642
642
  color: string;
643
643
  letterSpacing: number;
644
+ backgroundColor: string;
645
+ paddingHorizontal: number;
646
+ paddingVertical: number;
647
+ borderRadius: number;
644
648
  };
645
649
  slugText: {
646
650
  fontFamily: string;
@@ -1457,7 +1461,6 @@ export declare const getRawStyles: (colors: typeof AppColors) => {
1457
1461
  flexDirection: string;
1458
1462
  justifyContent: string;
1459
1463
  alignItems: string;
1460
- marginBottom: number;
1461
1464
  };
1462
1465
  analyticsHeaderTitle: {
1463
1466
  fontFamily: string;
@@ -610,10 +610,10 @@ const getRawStyles = (colors) => ({
610
610
  flexDirection: 'row',
611
611
  alignItems: 'center',
612
612
  justifyContent: 'space-between',
613
- backgroundColor: colors.grayBackground,
614
- borderRadius: 7,
613
+ backgroundColor: `${colors.brandPurple}08`,
614
+ borderRadius: 8,
615
615
  borderWidth: 1,
616
- borderColor: colors.grayBorderSecondary,
616
+ borderColor: `${colors.brandPurple}18`,
617
617
  paddingHorizontal: 8,
618
618
  paddingVertical: 5,
619
619
  marginVertical: 5,
@@ -628,12 +628,16 @@ const getRawStyles = (colors) => ({
628
628
  slugTag: {
629
629
  fontFamily: AppFonts_1.AppFonts.interBold,
630
630
  fontSize: 8.5,
631
- color: colors.grayTextWeak,
631
+ color: colors.brandPurple,
632
632
  letterSpacing: 0.5,
633
+ backgroundColor: `${colors.brandPurple}15`,
634
+ paddingHorizontal: 4,
635
+ paddingVertical: 1,
636
+ borderRadius: 4,
633
637
  },
634
638
  slugText: {
635
639
  fontFamily: AppFonts_1.AppFonts.interBold,
636
- fontSize: 12.5,
640
+ fontSize: 12,
637
641
  color: colors.primaryBlack,
638
642
  flexShrink: 1,
639
643
  },
@@ -1369,11 +1373,11 @@ const getRawStyles = (colors) => ({
1369
1373
  backgroundColor: colors.primaryLight,
1370
1374
  borderRadius: 12,
1371
1375
  borderWidth: 1,
1372
- borderColor: colors.grayBorderSecondary,
1373
- padding: 14,
1374
- marginHorizontal: 12,
1376
+ borderColor: `${colors.brandPurple}20`,
1377
+ padding: 12,
1378
+ marginHorizontal: 10,
1375
1379
  marginTop: 8,
1376
- marginBottom: 8,
1380
+ marginBottom: 6,
1377
1381
  shadowColor: colors.black,
1378
1382
  shadowOpacity: 0.03,
1379
1383
  shadowRadius: 4,
@@ -1384,11 +1388,10 @@ const getRawStyles = (colors) => ({
1384
1388
  flexDirection: 'row',
1385
1389
  justifyContent: 'space-between',
1386
1390
  alignItems: 'center',
1387
- marginBottom: 10,
1388
1391
  },
1389
1392
  analyticsHeaderTitle: {
1390
1393
  fontFamily: AppFonts_1.AppFonts.interBold,
1391
- fontSize: 14,
1394
+ fontSize: 13.5,
1392
1395
  color: colors.primaryBlack,
1393
1396
  },
1394
1397
  statusDot: {
@@ -1399,21 +1402,21 @@ const getRawStyles = (colors) => ({
1399
1402
  analyticsHeaderSubtitle: {
1400
1403
  fontFamily: AppFonts_1.AppFonts.interMedium,
1401
1404
  fontSize: 11,
1402
- color: colors.grayText,
1405
+ color: colors.grayTextWeak,
1403
1406
  marginTop: 2,
1404
1407
  },
1405
1408
  analyticsHeaderToggle: {
1406
- paddingVertical: 4,
1407
- paddingHorizontal: 8,
1408
- borderRadius: 4,
1409
- backgroundColor: colors.grayBackground,
1409
+ paddingVertical: 4.5,
1410
+ paddingHorizontal: 9,
1411
+ borderRadius: 7,
1412
+ backgroundColor: `${colors.brandPurple}12`,
1410
1413
  borderWidth: 1,
1411
- borderColor: colors.grayBorderSecondary,
1414
+ borderColor: `${colors.brandPurple}25`,
1412
1415
  },
1413
1416
  analyticsHeaderToggleText: {
1414
1417
  fontFamily: AppFonts_1.AppFonts.interBold,
1415
- fontSize: 10,
1416
- color: colors.purple,
1418
+ fontSize: 10.5,
1419
+ color: colors.brandPurple,
1417
1420
  },
1418
1421
  analyticsStatsRow: {
1419
1422
  flexDirection: 'row',