react-native-inapp-inspector 1.1.25 → 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 (70) 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/ErrorBoundary.d.ts +1 -1
  6. package/dist/commonjs/components/ErrorBoundary.js +9 -145
  7. package/dist/commonjs/components/Inspector/CrashDetail.d.ts +3 -0
  8. package/dist/commonjs/components/Inspector/CrashDetail.js +796 -0
  9. package/dist/commonjs/components/Inspector/CrashFilterModal.d.ts +20 -0
  10. package/dist/commonjs/components/Inspector/CrashFilterModal.js +597 -0
  11. package/dist/commonjs/components/Inspector/CrashTab.d.ts +3 -0
  12. package/dist/commonjs/components/Inspector/CrashTab.js +727 -0
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +52 -23
  14. package/dist/commonjs/components/Inspector/LogDetail.js +4 -3
  15. package/dist/commonjs/components/Inspector/MainScreen.js +12 -3
  16. package/dist/commonjs/components/Inspector/SettingsPanel.js +90 -1
  17. package/dist/commonjs/components/Inspector/TabBar.js +15 -3
  18. package/dist/commonjs/components/NetworkIcons.d.ts +11 -0
  19. package/dist/commonjs/components/NetworkIcons.js +96 -1
  20. package/dist/commonjs/components/SegmentedTabs.js +2 -1
  21. package/dist/commonjs/constants/version.d.ts +1 -1
  22. package/dist/commonjs/constants/version.js +1 -1
  23. package/dist/commonjs/customHooks/analyticsLogger.js +70 -44
  24. package/dist/commonjs/customHooks/consoleLogger.d.ts +1 -0
  25. package/dist/commonjs/customHooks/consoleLogger.js +70 -6
  26. package/dist/commonjs/customHooks/crashHandler.d.ts +64 -0
  27. package/dist/commonjs/customHooks/crashHandler.js +681 -0
  28. package/dist/commonjs/customHooks/networkLogger.js +64 -48
  29. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +1 -1
  30. package/dist/commonjs/i18n/locales/en.json +131 -0
  31. package/dist/commonjs/index.d.ts +3 -1
  32. package/dist/commonjs/index.js +95 -1
  33. package/dist/commonjs/types/enums.d.ts +41 -0
  34. package/dist/commonjs/types/enums.js +37 -1
  35. package/dist/commonjs/types/interfaces.d.ts +51 -1
  36. package/dist/esm/components/ErrorBoundary.d.ts +1 -1
  37. package/dist/esm/components/ErrorBoundary.js +10 -113
  38. package/dist/esm/components/Inspector/CrashDetail.d.ts +3 -0
  39. package/dist/esm/components/Inspector/CrashDetail.js +758 -0
  40. package/dist/esm/components/Inspector/CrashFilterModal.d.ts +20 -0
  41. package/dist/esm/components/Inspector/CrashFilterModal.js +557 -0
  42. package/dist/esm/components/Inspector/CrashTab.d.ts +3 -0
  43. package/dist/esm/components/Inspector/CrashTab.js +689 -0
  44. package/dist/esm/components/Inspector/InspectorHeader.js +52 -23
  45. package/dist/esm/components/Inspector/LogDetail.js +4 -3
  46. package/dist/esm/components/Inspector/MainScreen.js +12 -3
  47. package/dist/esm/components/Inspector/SettingsPanel.js +91 -2
  48. package/dist/esm/components/Inspector/TabBar.js +16 -4
  49. package/dist/esm/components/NetworkIcons.d.ts +11 -0
  50. package/dist/esm/components/NetworkIcons.js +83 -0
  51. package/dist/esm/components/SegmentedTabs.js +2 -1
  52. package/dist/esm/constants/version.d.ts +1 -1
  53. package/dist/esm/constants/version.js +1 -1
  54. package/dist/esm/customHooks/analyticsLogger.js +70 -44
  55. package/dist/esm/customHooks/consoleLogger.d.ts +1 -0
  56. package/dist/esm/customHooks/consoleLogger.js +68 -5
  57. package/dist/esm/customHooks/crashHandler.d.ts +64 -0
  58. package/dist/esm/customHooks/crashHandler.js +659 -0
  59. package/dist/esm/customHooks/networkLogger.js +64 -48
  60. package/dist/esm/helpers/gaAnalyticsRegistry.js +1 -1
  61. package/dist/esm/i18n/locales/en.json +131 -0
  62. package/dist/esm/index.d.ts +3 -1
  63. package/dist/esm/index.js +73 -1
  64. package/dist/esm/types/enums.d.ts +41 -0
  65. package/dist/esm/types/enums.js +36 -0
  66. package/dist/esm/types/interfaces.d.ts +51 -1
  67. package/ios/NetworkInspectorModule.h +6 -0
  68. package/ios/NetworkInspectorModule.m +125 -0
  69. package/package.json +5 -2
  70. package/react-native-inapp-inspector.podspec +18 -0
@@ -50,7 +50,7 @@ const constants_2 = require("../../constants");
50
50
  const helpers_1 = require("../../helpers");
51
51
  const NetworkIcons_1 = require("../NetworkIcons");
52
52
  const InspectorHeader = react_1.default.memo(() => {
53
- const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, setSettingsPage, closeModal, detailTitle, activeTab, environment, } = (0, InspectorContext_1.useInspector)();
53
+ const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, setSettingsPage, closeModal, detailTitle, activeTab, environment, selectedCrash, setSelectedCrash, } = (0, InspectorContext_1.useInspector)();
54
54
  const envConfig = (0, react_1.useMemo)(() => {
55
55
  const rawEnv = (environment || (__DEV__ ? 'DEV' : 'PROD')).trim();
56
56
  const clean = rawEnv.toUpperCase();
@@ -89,7 +89,8 @@ const InspectorHeader = react_1.default.memo(() => {
89
89
  const isDetailView = (activeTab === 'apis' && selected != null) ||
90
90
  (activeTab === 'analytics' && selectedEvent != null) ||
91
91
  (activeTab === 'logs' && selectedLog != null) ||
92
- (activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null));
92
+ (activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null)) ||
93
+ (activeTab === 'crash' && selectedCrash != null);
93
94
  const isAnySelected = isDetailView;
94
95
  const headerTopPadding = react_native_1.Platform.OS === 'ios' && modalHeightPercent >= 95 ? 44 : 0;
95
96
  return (<react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, AppColors_1.AppColors.brandPurple]} style={styles_1.default.headerGradient}>
@@ -100,8 +101,9 @@ const InspectorHeader = react_1.default.memo(() => {
100
101
  {
101
102
  flexDirection: 'row',
102
103
  alignItems: 'center',
103
- gap: 16,
104
- flex: !isDetailView ? 5 : 1,
104
+ gap: 12,
105
+ flex: !isDetailView ? 1 : 0,
106
+ minWidth: 0,
105
107
  },
106
108
  ]}>
107
109
  <TouchableScale_1.default onPress={() => {
@@ -111,6 +113,7 @@ const InspectorHeader = react_1.default.memo(() => {
111
113
  setSelectedLog(null);
112
114
  setSelectedReduxSlice(null);
113
115
  setSelectedReduxAction(null);
116
+ setSelectedCrash(null);
114
117
  });
115
118
  }} hitSlop={15} style={[
116
119
  {
@@ -524,18 +527,58 @@ const InspectorHeader = react_1.default.memo(() => {
524
527
  {selectedReduxAction.timestamp || 'Dispatched'}
525
528
  </react_native_1.Text>
526
529
  </react_native_1.View>
530
+ </react_native_1.View>) : activeTab === 'crash' && selectedCrash != null ? (<react_native_1.View style={styles_1.default.headerDetailCenter}>
531
+ <react_native_1.View style={styles_1.default.headerDetailRow}>
532
+ <react_native_1.View style={[
533
+ styles_1.default.headerMethodBadge,
534
+ {
535
+ backgroundColor: selectedCrash.isFatal
536
+ ? '#DC2626'
537
+ : '#D97706',
538
+ },
539
+ ]}>
540
+ <react_native_1.Text style={styles_1.default.headerMethodText}>
541
+ {selectedCrash.isFatal ? 'FATAL' : selectedCrash.type.toUpperCase()}
542
+ </react_native_1.Text>
543
+ </react_native_1.View>
544
+ <react_native_1.Text style={styles_1.default.headerDetailTitle} numberOfLines={1} ellipsizeMode="middle">
545
+ {selectedCrash.name || selectedCrash.message}
546
+ </react_native_1.Text>
547
+ </react_native_1.View>
548
+ <react_native_1.View style={styles_1.default.headerDetailSubRow}>
549
+ <react_native_1.View style={[
550
+ styles_1.default.headerStatusDot,
551
+ {
552
+ backgroundColor: selectedCrash.isFatal
553
+ ? '#DC2626'
554
+ : '#F59E0B',
555
+ },
556
+ ]}/>
557
+ <react_native_1.Text style={styles_1.default.headerSubTitle}>
558
+ {selectedCrash.timeStr || new Date(selectedCrash.timestamp).toLocaleTimeString()}
559
+ </react_native_1.Text>
560
+ {selectedCrash.deviceInfo?.platform && (<>
561
+ <react_native_1.Text style={[styles_1.default.headerSubTitle, { opacity: 0.6 }]}>•</react_native_1.Text>
562
+ <react_native_1.Text style={styles_1.default.headerSubTitle}>
563
+ {selectedCrash.deviceInfo.platform.toUpperCase()}
564
+ </react_native_1.Text>
565
+ </>)}
566
+ </react_native_1.View>
527
567
  </react_native_1.View>) : null}
528
568
  </react_native_1.View>)}
529
569
 
530
570
  <react_native_1.View style={[
531
571
  styles_1.default.headerRight,
532
- !isAnySelected && {
572
+ {
573
+ flexDirection: 'row',
574
+ alignItems: 'center',
575
+ justifyContent: 'flex-end',
533
576
  flexShrink: 0,
534
- minWidth: 116,
577
+ gap: 8,
535
578
  },
536
579
  ]}>
537
580
  {!isAnySelected && (<TouchableScale_1.default onPress={() => {
538
- react_native_1.Alert.alert('Clear Everything', 'This clears all tabs — APIs, Logs, Analytics and Redux timeline. Continue?', [
581
+ react_native_1.Alert.alert('Clear Everything', 'This clears all tabs — APIs, Logs, Analytics, Redux timeline and Crash history. Continue?', [
539
582
  { text: 'Cancel', style: 'cancel' },
540
583
  {
541
584
  text: 'Clear All',
@@ -543,13 +586,7 @@ const InspectorHeader = react_1.default.memo(() => {
543
586
  style: 'destructive',
544
587
  },
545
588
  ]);
546
- }} hitSlop={15} style={[
547
- styles_1.default.closeButtonSquare,
548
- {
549
- marginRight: 8,
550
- backgroundColor: `${AppColors_1.AppColors.white}26`,
551
- },
552
- ]}>
589
+ }} hitSlop={15} style={styles_1.default.closeButtonSquare}>
553
590
  <react_native_1.Animated.View style={{
554
591
  transform: [
555
592
  {
@@ -570,15 +607,7 @@ const InspectorHeader = react_1.default.memo(() => {
570
607
  </react_native_1.Animated.View>
571
608
  </TouchableScale_1.default>)}
572
609
 
573
- {selected == null &&
574
- selectedEvent == null &&
575
- selectedLog == null && (<TouchableScale_1.default onPress={() => setSettingsPage('main')} hitSlop={15} style={[
576
- styles_1.default.closeButtonSquare,
577
- {
578
- marginRight: 8,
579
- backgroundColor: `${AppColors_1.AppColors.white}26`,
580
- },
581
- ]}>
610
+ {!isAnySelected && (<TouchableScale_1.default onPress={() => setSettingsPage('main')} hitSlop={15} style={styles_1.default.closeButtonSquare}>
582
611
  <NetworkIcons_1.SettingsIcon color={AppColors_1.AppColors.white} size={16}/>
583
612
  </TouchableScale_1.default>)}
584
613
 
@@ -300,7 +300,8 @@ const LogDetail = react_1.default.memo(() => {
300
300
  fontSize: 13,
301
301
  color: AppColors_1.AppColors.primaryBlack,
302
302
  lineHeight: 18,
303
- }} numberOfLines={1}>
303
+ flexShrink: 1,
304
+ }}>
304
305
  {originFrame?.functionName && originFrame.functionName !== '<anonymous>'
305
306
  ? `${originFrame.functionName}()`
306
307
  : originFrame?.fileName || t('console.consoleLog')}
@@ -315,11 +316,11 @@ const LogDetail = react_1.default.memo(() => {
315
316
  paddingVertical: 2,
316
317
  },
317
318
  ]}>
318
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3 }}>
319
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3, flexWrap: 'wrap', flexShrink: 1 }}>
319
320
  <NetworkIcons_1.DocIcon color={AppColors_1.AppColors.brandPurple} size={10}/>
320
321
  <react_native_1.Text style={[
321
322
  styles_1.default.metaChipText,
322
- { color: AppColors_1.AppColors.brandPurple, fontSize: 10, fontFamily: AppFonts_1.AppFonts.interBold },
323
+ { color: AppColors_1.AppColors.brandPurple, fontSize: 10, fontFamily: AppFonts_1.AppFonts.interBold, flexShrink: 1 },
323
324
  ]}>
324
325
  {originFrame.fileName}
325
326
  {originFrame.lineNumber ? `:${originFrame.lineNumber}` : ''}
@@ -53,12 +53,14 @@ const ReduxTab_1 = __importDefault(require("./ReduxTab"));
53
53
  const ReduxDetail_1 = __importDefault(require("./ReduxDetail"));
54
54
  const BundleTab_1 = __importDefault(require("./BundleTab"));
55
55
  const PerformanceTab_1 = __importDefault(require("./PerformanceTab"));
56
+ const CrashTab_1 = __importDefault(require("./CrashTab"));
57
+ const CrashDetail_1 = __importDefault(require("./CrashDetail"));
56
58
  const SettingsPanel_1 = __importDefault(require("./SettingsPanel"));
57
59
  const styles_1 = __importDefault(require("../../styles"));
58
60
  const AppColors_1 = require("../../styles/AppColors");
59
61
  const NavigationTracker_1 = __importDefault(require("./NavigationTracker"));
60
62
  const MainScreen = () => {
61
- const { visible, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, settingsPage, activeTab, isReady, isEnabled, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
63
+ const { visible, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
62
64
  // Lazy-mount each tab on first visit and cache it in memory for 0ms instantaneous switching
63
65
  const [mountedTabs, setMountedTabs] = (0, react_1.useState)({
64
66
  [activeTab]: true,
@@ -73,7 +75,8 @@ const MainScreen = () => {
73
75
  const isDetailActive = (activeTab === 'apis' && selected != null) ||
74
76
  (activeTab === 'analytics' && selectedEvent != null) ||
75
77
  (activeTab === 'logs' && selectedLog != null) ||
76
- (activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null));
78
+ (activeTab === 'redux' && (selectedReduxSlice != null || selectedReduxAction != null)) ||
79
+ (activeTab === 'crash' && selectedCrash != null);
77
80
  return (<>
78
81
  {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') && isEnabled && <FabLauncher_1.default />}
79
82
  <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent>
@@ -91,7 +94,7 @@ const MainScreen = () => {
91
94
  {/* ─── Horizontal Scrollable Tab Bar inside Content ─── */}
92
95
  {!isDetailActive && settingsPage === null ? (<TabBar_1.default />) : null}
93
96
 
94
- {isReady ? (isDetailActive ? (activeTab === 'apis' && selected != null ? (<NetworkDetail_1.default />) : activeTab === 'analytics' && selectedEvent != null ? (<AnalyticsDetail_1.default event={selectedEvent}/>) : activeTab === 'logs' && selectedLog != null ? (<LogDetail_1.default />) : activeTab === 'redux' ? (<ReduxDetail_1.default />) : null) : (<>
97
+ {isReady ? (isDetailActive ? (activeTab === 'apis' && selected != null ? (<NetworkDetail_1.default />) : activeTab === 'analytics' && selectedEvent != null ? (<AnalyticsDetail_1.default event={selectedEvent}/>) : activeTab === 'logs' && selectedLog != null ? (<LogDetail_1.default />) : activeTab === 'redux' ? (<ReduxDetail_1.default />) : activeTab === 'crash' && selectedCrash != null ? (<CrashDetail_1.default />) : null) : (<>
95
98
  <react_native_1.View style={{
96
99
  flex: 1,
97
100
  display: activeTab === 'apis' ? 'flex' : 'none',
@@ -128,6 +131,12 @@ const MainScreen = () => {
128
131
  }}>
129
132
  {mountedTabs.performance && <PerformanceTab_1.default />}
130
133
  </react_native_1.View>
134
+ <react_native_1.View style={{
135
+ flex: 1,
136
+ display: activeTab === 'crash' ? 'flex' : 'none',
137
+ }}>
138
+ {mountedTabs.crash && <CrashTab_1.default />}
139
+ </react_native_1.View>
131
140
  </>)) : (<react_native_1.View style={styles_1.default.empty}>
132
141
  <react_native_1.ActivityIndicator size="large" color={AppColors_1.AppColors.purple}/>
133
142
  <react_native_1.Text style={[styles_1.default.emptySub, { marginTop: 12 }]}>
@@ -50,9 +50,10 @@ const settingsStore_1 = require("../../helpers/settingsStore");
50
50
  const networkLogger_1 = require("../../customHooks/networkLogger");
51
51
  const consoleLogger_1 = require("../../customHooks/consoleLogger");
52
52
  const analyticsLogger_1 = require("../../customHooks/analyticsLogger");
53
+ const crashHandler_1 = require("../../customHooks/crashHandler");
53
54
  const NetworkIcons_1 = require("../NetworkIcons");
54
55
  const SettingsPanel = () => {
55
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, } = (0, InspectorContext_1.useInspector)();
56
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
56
57
  const isPersistent = (0, settingsStore_1.isPersistentStorageAvailable)();
57
58
  const headerTopPadding = react_native_1.Platform.OS === 'ios' && modalHeightPercent >= 95 ? 44 : 0;
58
59
  if (settingsPage === 'main') {
@@ -63,6 +64,7 @@ const SettingsPanel = () => {
63
64
  { key: 'redux', label: 'Redux', icon: 'redux' },
64
65
  { key: 'bundle', label: 'Bundle', icon: 'bundle' },
65
66
  { key: 'performance', label: 'Performance', icon: 'performance' },
67
+ { key: 'crash', label: 'Crash', icon: 'crash' },
66
68
  ];
67
69
  return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
68
70
  {/* Settings Header with back button */}
@@ -273,6 +275,9 @@ const SettingsPanel = () => {
273
275
  {tab.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={isLocked
274
276
  ? AppColors_1.AppColors.grayTextWeak
275
277
  : AppColors_1.AppColors.purple} size={11}/>)}
278
+ {tab.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={isLocked
279
+ ? AppColors_1.AppColors.grayTextWeak
280
+ : AppColors_1.AppColors.purple} size={11}/>)}
276
281
  </react_native_1.View>
277
282
  {/* Label + Required badge */}
278
283
  <react_native_1.Text style={{
@@ -712,6 +717,7 @@ const SettingsPanel = () => {
712
717
  {tab.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
713
718
  {tab.icon === 'bundle' && (<NetworkIcons_1.PackageIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
714
719
  {tab.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
720
+ {tab.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
715
721
  </react_native_1.View>
716
722
  <react_native_1.Text style={{
717
723
  fontFamily: AppFonts_1.AppFonts.interBold,
@@ -1430,6 +1436,89 @@ const SettingsPanel = () => {
1430
1436
  </react_native_1.View>
1431
1437
  </react_native_1.ScrollView>);
1432
1438
  }
1439
+ else if (settingsPage === 'crash') {
1440
+ title = 'Crash Settings';
1441
+ icon = <NetworkIcons_1.CrashIcon color={AppColors_1.AppColors.white} size={16}/>;
1442
+ rightInfo = `Total: ${crashRecords?.length || 0}`;
1443
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1444
+ <react_native_1.View style={{
1445
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1446
+ padding: 16,
1447
+ borderRadius: 12,
1448
+ borderWidth: 1,
1449
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1450
+ gap: 4,
1451
+ }}>
1452
+ {renderSettingRow({
1453
+ icon: <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={16}/>,
1454
+ label: 'Max Crash Logs',
1455
+ description: 'How many crash records to preserve in history',
1456
+ picker: {
1457
+ options: [25, 50, 100, 200],
1458
+ selectedValue: maxCrashLogs || 100,
1459
+ onSelect: val => setMaxCrashLogs(val),
1460
+ },
1461
+ })}
1462
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1463
+ {renderSettingRow({
1464
+ icon: <NetworkIcons_1.ShieldAlertIcon color={AppColors_1.AppColors.greenColor} size={16}/>,
1465
+ label: 'Global Crash Guard',
1466
+ description: 'Intercepts native, JS, and render errors directly',
1467
+ isLast: true,
1468
+ right: (<react_native_1.View style={{
1469
+ paddingHorizontal: 8,
1470
+ paddingVertical: 4,
1471
+ borderRadius: 6,
1472
+ backgroundColor: `${AppColors_1.AppColors.greenColor}1F`,
1473
+ }}>
1474
+ <react_native_1.Text style={{
1475
+ fontFamily: AppFonts_1.AppFonts.interBold,
1476
+ fontSize: 10,
1477
+ color: AppColors_1.AppColors.greenColor,
1478
+ }}>
1479
+ PROTECTED
1480
+ </react_native_1.Text>
1481
+ </react_native_1.View>),
1482
+ })}
1483
+ </react_native_1.View>
1484
+
1485
+ <react_native_1.View style={{
1486
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1487
+ borderRadius: 12,
1488
+ borderWidth: 1,
1489
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1490
+ padding: 16,
1491
+ marginTop: 12,
1492
+ }}>
1493
+ {renderSettingRow({
1494
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1495
+ label: 'Clear Crash History',
1496
+ description: `${crashRecords?.length || 0} crash logs stored`,
1497
+ isLast: true,
1498
+ onPress: () => {
1499
+ (0, crashHandler_1.clearCrashRecords)();
1500
+ react_native_1.Alert.alert('Success', 'Crash logs cleared.');
1501
+ },
1502
+ right: (<react_native_1.View style={{
1503
+ paddingHorizontal: 10,
1504
+ paddingVertical: 5,
1505
+ borderRadius: 7,
1506
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1507
+ borderWidth: 1,
1508
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
1509
+ }}>
1510
+ <react_native_1.Text style={{
1511
+ fontFamily: AppFonts_1.AppFonts.interBold,
1512
+ fontSize: 11,
1513
+ color: AppColors_1.AppColors.errorColor,
1514
+ }}>
1515
+ Clear
1516
+ </react_native_1.Text>
1517
+ </react_native_1.View>),
1518
+ })}
1519
+ </react_native_1.View>
1520
+ </react_native_1.ScrollView>);
1521
+ }
1433
1522
  return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
1434
1523
  <react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, AppColors_1.AppColors.brandPurple]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles_1.default.headerGradient}>
1435
1524
  <react_native_1.View style={{ paddingTop: headerTopPadding, width: '100%' }}>
@@ -11,7 +11,7 @@ const styles_1 = __importDefault(require("../../styles"));
11
11
  const AppColors_1 = require("../../styles/AppColors");
12
12
  const NetworkIcons_1 = require("../NetworkIcons");
13
13
  const TabBar = react_1.default.memo(() => {
14
- const { activeTab, switchActiveTab, tabVisibility, logs, consoleLogs, analyticsEvents, lastReadApisCount, lastReadLogsCount, unreadPulseAnim, } = (0, InspectorContext_1.useInspector)();
14
+ const { activeTab, switchActiveTab, tabVisibility, logs, consoleLogs, analyticsEvents, crashRecords, lastReadApisCount, lastReadLogsCount, lastReadCrashesCount, unreadPulseAnim, } = (0, InspectorContext_1.useInspector)();
15
15
  return (<react_native_1.View style={styles_1.default.tabBarContainer}>
16
16
  <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{ paddingRight: 16 }}>
17
17
  {[
@@ -51,18 +51,28 @@ const TabBar = react_1.default.memo(() => {
51
51
  count: 0,
52
52
  icon: 'performance',
53
53
  },
54
+ {
55
+ key: 'crash',
56
+ label: 'Crash',
57
+ count: crashRecords?.length || 0,
58
+ icon: 'crash',
59
+ },
54
60
  ]
55
61
  .filter(tab => tabVisibility?.[tab.key])
56
62
  .map(tab => {
57
63
  const isActive = activeTab === tab.key;
58
64
  const iconColor = isActive
59
65
  ? AppColors_1.AppColors.white
60
- : AppColors_1.AppColors.grayText;
66
+ : tab.key === 'crash' && tab.count > 0
67
+ ? AppColors_1.AppColors.errorColor
68
+ : AppColors_1.AppColors.grayText;
61
69
  const countLabel = tab.count > 9 ? '9+' : String(tab.count);
62
70
  const hasUnreadApis = activeTab !== 'apis' &&
63
71
  logs.length > lastReadApisCount;
64
72
  const hasUnreadLogs = activeTab !== 'logs' &&
65
73
  consoleLogs.length > lastReadLogsCount;
74
+ const hasUnreadCrashes = activeTab !== 'crash' &&
75
+ (crashRecords?.length || 0) > (lastReadCrashesCount || 0);
66
76
  return (<TouchableScale_1.default key={tab.key} onPress={() => switchActiveTab(tab.key)} style={[
67
77
  styles_1.default.contentTabButton,
68
78
  isActive && styles_1.default.contentTabButtonActive,
@@ -78,6 +88,7 @@ const TabBar = react_1.default.memo(() => {
78
88
  {tab.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={iconColor} size={14}/>)}
79
89
  {tab.icon === 'bundle' && (<NetworkIcons_1.PackageIcon color={iconColor} size={14}/>)}
80
90
  {tab.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={iconColor} size={14}/>)}
91
+ {tab.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={iconColor} size={14}/>)}
81
92
  <react_native_1.Text numberOfLines={1} ellipsizeMode="tail" style={[
82
93
  styles_1.default.contentTabButtonText,
83
94
  isActive &&
@@ -87,7 +98,8 @@ const TabBar = react_1.default.memo(() => {
87
98
  {tab.count > 0 ? `(${countLabel})` : ''}
88
99
  </react_native_1.Text>
89
100
  {((tab.key === 'apis' && hasUnreadApis) ||
90
- (tab.key === 'logs' && hasUnreadLogs)) && (<react_native_1.Animated.View style={{
101
+ (tab.key === 'logs' && hasUnreadLogs) ||
102
+ (tab.key === 'crash' && hasUnreadCrashes)) && (<react_native_1.Animated.View style={{
91
103
  width: 6,
92
104
  height: 6,
93
105
  borderRadius: 3,
@@ -92,3 +92,14 @@ export declare const PinIcon: ({ color, size, }: any) => React.JSX.Element;
92
92
  export declare const RepeatIcon: ({ color, size, }: any) => React.JSX.Element;
93
93
  export declare const TargetGoalIcon: ({ color, size, }: any) => React.JSX.Element;
94
94
  export declare const UserCheckIcon: ({ color, size, }: any) => React.JSX.Element;
95
+ export declare const CrashIcon: ({ color, size, }: any) => React.JSX.Element;
96
+ export declare const ShieldAlertIcon: ({ color, size, }: any) => React.JSX.Element;
97
+ export declare const SkullIcon: ({ color, size, }: any) => React.JSX.Element;
98
+ export declare const ChipIcon: ({ color, size, }: any) => React.JSX.Element;
99
+ export declare const LayoutIcon: ({ color, size, }: any) => React.JSX.Element;
100
+ export declare const StackTraceIcon: ({ color, size, }: any) => React.JSX.Element;
101
+ export declare const DiagnosticsIcon: ({ color, size, }: any) => React.JSX.Element;
102
+ export declare const TrailIcon: ({ color, size, }: any) => React.JSX.Element;
103
+ export declare const RawJsonIcon: ({ color, size, }: any) => React.JSX.Element;
104
+ export declare const AppFramesIcon: ({ color, size, }: any) => React.JSX.Element;
105
+ export declare const AllFramesIcon: ({ color, size, }: any) => React.JSX.Element;
@@ -37,7 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.InfoCircleIcon = exports.UserIcon = exports.LayersIcon = exports.WipeIcon = exports.FolderIcon = exports.SettingsIcon = exports.EyeIcon = exports.JsIcon = exports.CssIcon = exports.HtmlIcon = exports.BrandSquareIcon = exports.BrandCircleIcon = exports.MoonIcon = exports.SunIcon = exports.DebugIcon = exports.InsightsIcon = exports.AnalyticsIcon = exports.WhiteBackNavigation = exports.CloseWhite = exports.DownloadIcon = exports.FilterIcon = exports.ChevronIcon = exports.SortArrowIcon = exports.GlobeIcon = exports.DiffIcon = exports.SignalIcon = exports.ExportIcon = exports.HeaderPauseIcon = exports.TrashIcon = exports.FailIcon = exports.CircleAlertIcon = exports.CircleXIcon = exports.CircleCheckIcon = exports.CheckIcon = exports.TerminalIcon = exports.FetchIcon = exports.CopyIcon = exports.HeadersIcon = exports.ResponseIcon = exports.RequestIcon = exports.SizeIcon = exports.StatusIcon = exports.CalendarIcon = exports.ClockIcon = exports.ClearIcon = exports.SearchIcon = exports.ExpandCollapseIcon = exports.ScreenIcon = exports.MapPinIcon = exports.EmptyRadarIcon = void 0;
40
- exports.UserCheckIcon = exports.TargetGoalIcon = exports.RepeatIcon = exports.PinIcon = exports.HourglassIcon = exports.FlameIcon = exports.CodeBracketsIcon = exports.AndroidIcon = exports.AppleIcon = exports.LinkChainIcon = exports.GitHubIcon = exports.PackageBoxIcon = exports.ExternalLinkIcon = exports.MoneyIcon = exports.CartIcon = exports.TextAaIcon = exports.BrainIcon = exports.AtomIcon = exports.MapIcon = exports.SparkleIcon = exports.LightbulbIcon = exports.DocIcon = exports.FolderOpenIcon = exports.BanIcon = exports.BoltIcon = exports.PerformanceIcon = exports.ReduxIcon = exports.MetadataIcon = exports.StorageIcon = exports.RefreshCcwIcon = exports.TimelineIcon = exports.LiveStateIcon = exports.BundleIcon = exports.ForwardChevronIcon = exports.PackageIcon = exports.TableIcon = exports.RawIcon = exports.PrettyIcon = exports.SortIcon = exports.MotionIcon = exports.TrendingUpIcon = exports.ErrorCircleIcon = exports.WarningTriangleIcon = void 0;
40
+ exports.DiagnosticsIcon = exports.StackTraceIcon = exports.LayoutIcon = exports.ChipIcon = exports.SkullIcon = exports.ShieldAlertIcon = exports.CrashIcon = exports.UserCheckIcon = exports.TargetGoalIcon = exports.RepeatIcon = exports.PinIcon = exports.HourglassIcon = exports.FlameIcon = exports.CodeBracketsIcon = exports.AndroidIcon = exports.AppleIcon = exports.LinkChainIcon = exports.GitHubIcon = exports.PackageBoxIcon = exports.ExternalLinkIcon = exports.MoneyIcon = exports.CartIcon = exports.TextAaIcon = exports.BrainIcon = exports.AtomIcon = exports.MapIcon = exports.SparkleIcon = exports.LightbulbIcon = exports.DocIcon = exports.FolderOpenIcon = exports.BanIcon = exports.BoltIcon = exports.PerformanceIcon = exports.ReduxIcon = exports.MetadataIcon = exports.StorageIcon = exports.RefreshCcwIcon = exports.TimelineIcon = exports.LiveStateIcon = exports.BundleIcon = exports.ForwardChevronIcon = exports.PackageIcon = exports.TableIcon = exports.RawIcon = exports.PrettyIcon = exports.SortIcon = exports.MotionIcon = exports.TrendingUpIcon = exports.ErrorCircleIcon = exports.WarningTriangleIcon = void 0;
41
+ exports.AllFramesIcon = exports.AppFramesIcon = exports.RawJsonIcon = exports.TrailIcon = void 0;
41
42
  const react_1 = __importDefault(require("react"));
42
43
  const react_native_svg_1 = __importStar(require("react-native-svg"));
43
44
  // Stylesheet
@@ -691,3 +692,97 @@ const UserCheckIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14,
691
692
  </react_native_svg_1.default>);
692
693
  };
693
694
  exports.UserCheckIcon = UserCheckIcon;
695
+ const CrashIcon = ({ color = AppColors_1.AppColors.errorColor, size = 14, }) => {
696
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
697
+ {/* Bug / Crash Hybrid Icon */}
698
+ <react_native_svg_1.Path d="M12 2v3M4.93 4.93l2.12 2.12M19.07 4.93l-2.12 2.12M9 10h6M8 14h8M9 18h6" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
699
+ <react_native_svg_1.Path d="M12 8a6 6 0 0 1 6 6v3a6 6 0 0 1-12 0v-3a6 6 0 0 1 6-6z" stroke={color} strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
700
+ <react_native_svg_1.Path d="M3 13h3M18 13h3M4 19l2.5-1.5M20 19l-2.5-1.5M4 9l2.5 1.5M20 9l-2.5 1.5" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
701
+ </react_native_svg_1.default>);
702
+ };
703
+ exports.CrashIcon = CrashIcon;
704
+ const ShieldAlertIcon = ({ color = AppColors_1.AppColors.errorColor, size = 14, }) => {
705
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
706
+ <react_native_svg_1.Path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" stroke={color} strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
707
+ <react_native_svg_1.Line x1="12" y1="8" x2="12" y2="12" stroke={color} strokeWidth="2" strokeLinecap="round"/>
708
+ <react_native_svg_1.Circle cx="12" cy="16" r="1" fill={color}/>
709
+ </react_native_svg_1.default>);
710
+ };
711
+ exports.ShieldAlertIcon = ShieldAlertIcon;
712
+ const SkullIcon = ({ color = AppColors_1.AppColors.errorColor, size = 14, }) => {
713
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
714
+ <react_native_svg_1.Circle cx="12" cy="12" r="9" stroke={color} strokeWidth="1.8"/>
715
+ <react_native_svg_1.Circle cx="9" cy="11" r="1.6" fill={color}/>
716
+ <react_native_svg_1.Circle cx="15" cy="11" r="1.6" fill={color}/>
717
+ <react_native_svg_1.Path d="M8 16c1.2 1 3.2 1.2 4 1.2.8 0 2.8-.2 4-1.2" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
718
+ <react_native_svg_1.Line x1="12" y1="16" x2="12" y2="18" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
719
+ </react_native_svg_1.default>);
720
+ };
721
+ exports.SkullIcon = SkullIcon;
722
+ const ChipIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
723
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
724
+ <react_native_svg_1.Rect x="7" y="7" width="10" height="10" rx="2" stroke={color} strokeWidth="1.8"/>
725
+ <react_native_svg_1.Rect x="10" y="10" width="4" height="4" fill={color}/>
726
+ <react_native_svg_1.Line x1="9" y1="3" x2="9" y2="7" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
727
+ <react_native_svg_1.Line x1="15" y1="3" x2="15" y2="7" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
728
+ <react_native_svg_1.Line x1="9" y1="17" x2="9" y2="21" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
729
+ <react_native_svg_1.Line x1="15" y1="17" x2="15" y2="21" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
730
+ <react_native_svg_1.Line x1="3" y1="9" x2="7" y2="9" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
731
+ <react_native_svg_1.Line x1="3" y1="15" x2="7" y2="15" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
732
+ <react_native_svg_1.Line x1="17" y1="9" x2="21" y2="9" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
733
+ <react_native_svg_1.Line x1="17" y1="15" x2="21" y2="15" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
734
+ </react_native_svg_1.default>);
735
+ };
736
+ exports.ChipIcon = ChipIcon;
737
+ const LayoutIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
738
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
739
+ <react_native_svg_1.Rect x="3" y="3" width="18" height="18" rx="2" stroke={color} strokeWidth="1.8"/>
740
+ <react_native_svg_1.Line x1="3" y1="9" x2="21" y2="9" stroke={color} strokeWidth="1.8"/>
741
+ <react_native_svg_1.Line x1="9" y1="9" x2="9" y2="21" stroke={color} strokeWidth="1.8"/>
742
+ <react_native_svg_1.Rect x="12" y="12" width="6" height="6" fill={color}/>
743
+ </react_native_svg_1.default>);
744
+ };
745
+ exports.LayoutIcon = LayoutIcon;
746
+ const StackTraceIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
747
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
748
+ <react_native_svg_1.Path d="M4 6h16M4 10h11M4 14h16M4 18h9" stroke={color} strokeWidth="2" strokeLinecap="round"/>
749
+ <react_native_svg_1.Path d="M7.5 12.5 4 14l3.5 1.5" stroke={color} strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
750
+ </react_native_svg_1.default>);
751
+ };
752
+ exports.StackTraceIcon = StackTraceIcon;
753
+ const DiagnosticsIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
754
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
755
+ <react_native_svg_1.Path d="M3 12h3l2-5 3 9 2-6 1.5 2H21" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
756
+ <react_native_svg_1.Line x1="4" y1="19" x2="20" y2="19" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
757
+ </react_native_svg_1.default>);
758
+ };
759
+ exports.DiagnosticsIcon = DiagnosticsIcon;
760
+ const TrailIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
761
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
762
+ <react_native_svg_1.Circle cx="5" cy="18" r="2" fill={color}/>
763
+ <react_native_svg_1.Circle cx="12" cy="12" r="2" fill={color}/>
764
+ <react_native_svg_1.Circle cx="19" cy="6" r="2" fill={color}/>
765
+ <react_native_svg_1.Path d="M6.5 16.5 10.5 13.5M13.5 10.5 17.5 7.5" stroke={color} strokeWidth="1.6" strokeLinecap="round"/>
766
+ </react_native_svg_1.default>);
767
+ };
768
+ exports.TrailIcon = TrailIcon;
769
+ const RawJsonIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
770
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
771
+ <react_native_svg_1.Path d="M8 3c-2 1-3 2.5-3 5 0 2-1 3.5-2 4 1 .5 2 2 2 4 0 2.5 1 4 3 5M16 3c2 1 3 2.5 3 5 0 2 1 3.5 2 4-1 .5-2 2-2 4 0 2.5-1 4-3 5" stroke={color} strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
772
+ </react_native_svg_1.default>);
773
+ };
774
+ exports.RawJsonIcon = RawJsonIcon;
775
+ const AppFramesIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
776
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
777
+ <react_native_svg_1.Path d="M4 6h16M4 10h11M4 14h16M4 18h9" stroke={color} strokeWidth="2" strokeLinecap="round"/>
778
+ <react_native_svg_1.Path d="M18 12.5l2 2 3-3.5" stroke="#059669" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
779
+ </react_native_svg_1.default>);
780
+ };
781
+ exports.AppFramesIcon = AppFramesIcon;
782
+ const AllFramesIcon = ({ color = AppColors_1.AppColors.grayTextWeak, size = 14, }) => {
783
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
784
+ <react_native_svg_1.Path d="M4 4h16M4 8h16M4 12h16M4 16h16M4 20h10" stroke={color} strokeWidth="1.8" strokeLinecap="round"/>
785
+ <react_native_svg_1.Rect x="16" y="16" width="4" height="4" rx="1" fill={color}/>
786
+ </react_native_svg_1.default>);
787
+ };
788
+ exports.AllFramesIcon = AllFramesIcon;
@@ -45,7 +45,8 @@ const SegmentedTabs = react_1.default.memo(({ tabs, activeKey, onChange, style }
45
45
  },
46
46
  ]}>
47
47
  {tab.icon ? tab.icon(isActive) : null}
48
- <react_native_1.Text style={{
48
+ <react_native_1.Text numberOfLines={1} ellipsizeMode="tail" style={{
49
+ flexShrink: 1,
49
50
  fontFamily: AppFonts_1.AppFonts.interBold,
50
51
  fontSize: 10.5,
51
52
  color: isActive
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "1.1.25";
1
+ export declare const LIB_VERSION = "1.1.26";
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LIB_VERSION = void 0;
4
4
  // AUTO-GENERATED FILE — do not edit by hand.
5
5
  // Regenerated from package.json on every build by scripts/gen-version.js.
6
- exports.LIB_VERSION = '1.1.25';
6
+ exports.LIB_VERSION = '1.1.26';