react-native-inapp-inspector 1.1.34 → 1.1.36

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 (75) hide show
  1. package/dist/commonjs/components/ConsoleLogCard.js +57 -56
  2. package/dist/commonjs/components/CopyButton.js +7 -1
  3. package/dist/commonjs/components/Inspector/BundleTab.js +19 -19
  4. package/dist/commonjs/components/Inspector/CrashDetail.js +16 -12
  5. package/dist/commonjs/components/Inspector/InspectorHeader.js +16 -16
  6. package/dist/commonjs/components/Inspector/MainScreen.js +6 -2
  7. package/dist/commonjs/components/Inspector/NetworkTab.js +97 -1
  8. package/dist/commonjs/components/Inspector/ReduxDetail.js +24 -19
  9. package/dist/commonjs/components/Inspector/ReduxTab.js +12 -8
  10. package/dist/commonjs/components/Inspector/SettingsPanel.js +1243 -673
  11. package/dist/commonjs/components/LogCard.js +27 -9
  12. package/dist/commonjs/components/MetaAccordion.js +42 -0
  13. package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
  14. package/dist/commonjs/components/NetworkIcons.js +48 -1
  15. package/dist/commonjs/components/Toast.js +3 -3
  16. package/dist/commonjs/components/TouchableScale.d.ts +4 -2
  17. package/dist/commonjs/components/TouchableScale.js +4 -4
  18. package/dist/commonjs/constants/version.d.ts +1 -1
  19. package/dist/commonjs/constants/version.js +1 -1
  20. package/dist/commonjs/customHooks/analyticsLogger.d.ts +2 -0
  21. package/dist/commonjs/customHooks/analyticsLogger.js +10 -1
  22. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +2 -0
  23. package/dist/commonjs/customHooks/bundleAnalyzer.js +26 -17
  24. package/dist/commonjs/customHooks/consoleLogger.d.ts +2 -0
  25. package/dist/commonjs/customHooks/consoleLogger.js +10 -1
  26. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -0
  27. package/dist/commonjs/customHooks/crashHandler.js +10 -1
  28. package/dist/commonjs/customHooks/networkLogger.d.ts +2 -0
  29. package/dist/commonjs/customHooks/networkLogger.js +12 -1
  30. package/dist/commonjs/customHooks/performanceTracker.d.ts +3 -1
  31. package/dist/commonjs/customHooks/performanceTracker.js +18 -4
  32. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -0
  33. package/dist/commonjs/customHooks/reduxLogger.js +10 -1
  34. package/dist/commonjs/i18n/locales/en.json +96 -28
  35. package/dist/commonjs/index.js +78 -34
  36. package/dist/commonjs/styles/AppColors.d.ts +28 -0
  37. package/dist/commonjs/styles/AppColors.js +30 -0
  38. package/dist/esm/components/ConsoleLogCard.js +58 -57
  39. package/dist/esm/components/CopyButton.js +7 -1
  40. package/dist/esm/components/Inspector/BundleTab.js +19 -19
  41. package/dist/esm/components/Inspector/CrashDetail.js +16 -12
  42. package/dist/esm/components/Inspector/InspectorHeader.js +16 -16
  43. package/dist/esm/components/Inspector/MainScreen.js +6 -2
  44. package/dist/esm/components/Inspector/NetworkTab.js +99 -3
  45. package/dist/esm/components/Inspector/ReduxDetail.js +24 -19
  46. package/dist/esm/components/Inspector/ReduxTab.js +12 -8
  47. package/dist/esm/components/Inspector/SettingsPanel.js +1246 -676
  48. package/dist/esm/components/LogCard.js +27 -9
  49. package/dist/esm/components/MetaAccordion.js +42 -0
  50. package/dist/esm/components/NetworkIcons.d.ts +9 -0
  51. package/dist/esm/components/NetworkIcons.js +38 -0
  52. package/dist/esm/components/Toast.js +3 -3
  53. package/dist/esm/components/TouchableScale.d.ts +4 -2
  54. package/dist/esm/components/TouchableScale.js +4 -4
  55. package/dist/esm/constants/version.d.ts +1 -1
  56. package/dist/esm/constants/version.js +1 -1
  57. package/dist/esm/customHooks/analyticsLogger.d.ts +2 -0
  58. package/dist/esm/customHooks/analyticsLogger.js +7 -0
  59. package/dist/esm/customHooks/bundleAnalyzer.d.ts +2 -0
  60. package/dist/esm/customHooks/bundleAnalyzer.js +23 -16
  61. package/dist/esm/customHooks/consoleLogger.d.ts +2 -0
  62. package/dist/esm/customHooks/consoleLogger.js +7 -0
  63. package/dist/esm/customHooks/crashHandler.d.ts +2 -0
  64. package/dist/esm/customHooks/crashHandler.js +7 -0
  65. package/dist/esm/customHooks/networkLogger.d.ts +2 -0
  66. package/dist/esm/customHooks/networkLogger.js +9 -0
  67. package/dist/esm/customHooks/performanceTracker.d.ts +3 -1
  68. package/dist/esm/customHooks/performanceTracker.js +15 -3
  69. package/dist/esm/customHooks/reduxLogger.d.ts +2 -0
  70. package/dist/esm/customHooks/reduxLogger.js +7 -0
  71. package/dist/esm/i18n/locales/en.json +96 -28
  72. package/dist/esm/index.js +64 -20
  73. package/dist/esm/styles/AppColors.d.ts +28 -0
  74. package/dist/esm/styles/AppColors.js +30 -0
  75. package/package.json +3 -2
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useRef } from 'react';
1
+ import React, { useCallback, useMemo, useRef } from 'react';
2
2
  import { Animated, FlatList, Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
3
  import { animateNextLayout, useInspector } from './InspectorContext';
4
4
  import useAccordion from '../../customHooks/useAccordion';
@@ -12,7 +12,8 @@ import styles from '../../styles';
12
12
  import { AppColors } from '../../styles/AppColors';
13
13
  import { AppFonts } from '../../styles/AppFonts';
14
14
  import { STATUS_FILTERS, METHOD_COLORS } from '../../constants';
15
- import { SearchIcon, ClearIcon, TrashIcon, SortArrowIcon, FilterIcon, ChevronIcon, CheckIcon, CircleCheckIcon, CircleXIcon, CircleAlertIcon, LayersIcon, HeaderPauseIcon, } from '../NetworkIcons';
15
+ import { useTranslation } from '../../i18n';
16
+ import { SearchIcon, ClearIcon, TrashIcon, SortArrowIcon, FilterIcon, ChevronIcon, CheckIcon, CircleCheckIcon, CircleXIcon, CircleAlertIcon, LayersIcon, HeaderPauseIcon, ClockIcon, } from '../NetworkIcons';
16
17
  const STATUS_META = {
17
18
  ALL: { color: AppColors.grayText, Icon: LayersIcon },
18
19
  '2xx': { color: AppColors.greenColor, Icon: CircleCheckIcon },
@@ -58,8 +59,43 @@ const FilterChip = React.memo(({ label, color, Icon, badge, active, onPress, })
58
59
  });
59
60
  const NetworkTab = React.memo(() => {
60
61
  const { groupedData, search, setSearch, handleDelete, selectedLogs, sortOrder, setSortOrder, statusFilters, setStatusFilters, methodFilters, setMethodFilters, availableMethods, filteredLogs, logs, toggleSectionFilter, toggleSectionCollapse, minStart, totalRange, newLogIds, toggleSelect, setSelected, isNetworkPaused, setIsNetworkPaused, } = useInspector();
62
+ const { t } = useTranslation();
61
63
  const filtersAccordion = useAccordion(false, 300, 260);
62
64
  const apisListRef = useRef(null);
65
+ const networkMetrics = useMemo(() => {
66
+ if (!logs || logs.length === 0)
67
+ return null;
68
+ let successCount = 0;
69
+ let completedCount = 0;
70
+ let totalDuration = 0;
71
+ let totalBytes = 0;
72
+ const durations = [];
73
+ logs.forEach(log => {
74
+ if (log.status != null) {
75
+ completedCount++;
76
+ const s = typeof log.status === 'number' ? log.status : parseInt(String(log.status), 10);
77
+ if (!isNaN(s)) {
78
+ if (s >= 200 && s < 400) {
79
+ successCount++;
80
+ }
81
+ }
82
+ }
83
+ if (typeof log.duration === 'number' && log.duration > 0) {
84
+ durations.push(log.duration);
85
+ totalDuration += log.duration;
86
+ }
87
+ });
88
+ durations.sort((a, b) => a - b);
89
+ const avgDuration = durations.length > 0 ? Math.round(totalDuration / durations.length) : 0;
90
+ const p95 = durations.length > 0 ? durations[Math.floor(durations.length * 0.95)] : 0;
91
+ const successRate = completedCount > 0 ? Math.round((successCount / completedCount) * 100) : 100;
92
+ return {
93
+ successRate,
94
+ avgDuration,
95
+ p95,
96
+ totalCount: logs.length,
97
+ };
98
+ }, [logs]);
63
99
  const renderItem = useCallback(({ item, index }) => {
64
100
  if (item.type === 'header') {
65
101
  return (<AnimatedEntrance index={index} distance={8}>
@@ -98,7 +134,67 @@ const NetworkTab = React.memo(() => {
98
134
  setSelected,
99
135
  ]);
100
136
  return (<View style={{ flex: 1 }}>
101
- <FlatList ref={apisListRef} data={groupedData} keyExtractor={item => item?.id?.toString()} renderItem={renderItem} initialNumToRender={10} maxToRenderPerBatch={10} windowSize={5} removeClippedSubviews={true} ListHeaderComponent={<View style={{ marginTop: 8 }}>
137
+ <FlatList ref={apisListRef} data={groupedData} keyExtractor={item => item?.id?.toString()} renderItem={renderItem} initialNumToRender={10} maxToRenderPerBatch={10} windowSize={5} removeClippedSubviews={true} ListHeaderComponent={<View style={{ marginTop: 6 }}>
138
+ {/* Network Health & Telemetry Strip */}
139
+ {networkMetrics != null && networkMetrics.totalCount > 0 && (<View style={{
140
+ flexDirection: 'row',
141
+ alignItems: 'center',
142
+ justifyContent: 'space-between',
143
+ backgroundColor: AppColors.grayBackground,
144
+ borderRadius: 8,
145
+ paddingHorizontal: 10,
146
+ paddingVertical: 5.5,
147
+ marginHorizontal: 12,
148
+ marginBottom: 6,
149
+ borderWidth: 1,
150
+ borderColor: AppColors.dividerColor,
151
+ }}>
152
+ {/* Success Rate */}
153
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 4.5 }}>
154
+ <View style={{
155
+ width: 6,
156
+ height: 6,
157
+ borderRadius: 3,
158
+ backgroundColor: networkMetrics.successRate >= 95
159
+ ? AppColors.greenColor
160
+ : networkMetrics.successRate >= 80
161
+ ? AppColors.amber500
162
+ : AppColors.errorColor,
163
+ }}/>
164
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 10.5, color: AppColors.primaryBlack }}>
165
+ {networkMetrics.successRate}%
166
+ </Text>
167
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 10, color: AppColors.grayTextWeak }}>
168
+ {t('network.successRate')}
169
+ </Text>
170
+ </View>
171
+
172
+ <View style={{ width: 1, height: 11, backgroundColor: AppColors.dividerColor }}/>
173
+
174
+ {/* Avg Latency */}
175
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
176
+ <ClockIcon color={AppColors.purple} size={10}/>
177
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 10.5, color: AppColors.purple }}>
178
+ {networkMetrics.avgDuration}ms
179
+ </Text>
180
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 10, color: AppColors.grayTextWeak }}>
181
+ {t('network.avgLatency')}
182
+ </Text>
183
+ </View>
184
+
185
+ <View style={{ width: 1, height: 11, backgroundColor: AppColors.dividerColor }}/>
186
+
187
+ {/* P95 Latency */}
188
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
189
+ <Text style={{ fontFamily: AppFonts.interBold, fontSize: 10.5, color: AppColors.primaryBlack }}>
190
+ {networkMetrics.p95}ms
191
+ </Text>
192
+ <Text style={{ fontFamily: AppFonts.interRegular, fontSize: 10, color: AppColors.grayTextWeak }}>
193
+ P95
194
+ </Text>
195
+ </View>
196
+ </View>)}
197
+
102
198
  <View style={styles.toolbarRow}>
103
199
  <View style={styles.searchContainer}>
104
200
  <SearchIcon color={AppColors.grayTextWeak} size={16}/>
@@ -976,30 +976,30 @@ const reduxDetailStyles = StyleSheet.create({
976
976
  flexDirection: 'row',
977
977
  alignItems: 'center',
978
978
  gap: 3.5,
979
- backgroundColor: '#ECFDF5',
979
+ backgroundColor: AppColors.mintGreenBg,
980
980
  paddingHorizontal: 6,
981
981
  paddingVertical: 2,
982
982
  borderRadius: 4,
983
983
  borderWidth: 1,
984
- borderColor: '#A7F3D0',
984
+ borderColor: AppColors.mintGreenBorder,
985
985
  },
986
986
  persistedChipText: {
987
987
  fontFamily: AppFonts.interBold,
988
988
  fontSize: 9,
989
- color: '#047857',
989
+ color: AppColors.mintGreenText,
990
990
  },
991
991
  inMemoryChip: {
992
- backgroundColor: '#EEF2FF',
992
+ backgroundColor: AppColors.indigo50,
993
993
  paddingHorizontal: 6,
994
994
  paddingVertical: 2,
995
995
  borderRadius: 4,
996
996
  borderWidth: 1,
997
- borderColor: '#C7D2FE',
997
+ borderColor: AppColors.blueBorder,
998
998
  },
999
999
  inMemoryChipText: {
1000
1000
  fontFamily: AppFonts.interBold,
1001
1001
  fontSize: 9,
1002
- color: '#4338CA',
1002
+ color: AppColors.indigo600Alt,
1003
1003
  },
1004
1004
  subStatsRow: {
1005
1005
  flexDirection: 'row',
@@ -1012,12 +1012,17 @@ const reduxDetailStyles = StyleSheet.create({
1012
1012
  alignItems: 'center',
1013
1013
  gap: 4,
1014
1014
  backgroundColor: AppColors.grayBackground,
1015
- paddingHorizontal: 7,
1016
- paddingVertical: 3.5,
1017
- borderRadius: 6,
1015
+ paddingHorizontal: 6,
1016
+ paddingVertical: 2.5,
1017
+ borderRadius: 5,
1018
1018
  borderWidth: 1,
1019
1019
  borderColor: AppColors.dividerColor,
1020
1020
  },
1021
+ statPillText: {
1022
+ fontFamily: AppFonts.interMedium,
1023
+ fontSize: 10,
1024
+ color: AppColors.grayText,
1025
+ },
1021
1026
  statLabel: {
1022
1027
  fontFamily: AppFonts.interBold,
1023
1028
  fontSize: 10,
@@ -1067,17 +1072,17 @@ const reduxDetailStyles = StyleSheet.create({
1067
1072
  gap: 8,
1068
1073
  },
1069
1074
  actionBadge: {
1070
- backgroundColor: '#EEF2FF',
1075
+ backgroundColor: AppColors.indigo50,
1071
1076
  paddingHorizontal: 6,
1072
1077
  paddingVertical: 2,
1073
1078
  borderRadius: 4,
1074
1079
  borderWidth: 1,
1075
- borderColor: '#C7D2FE',
1080
+ borderColor: AppColors.blueBorder,
1076
1081
  },
1077
1082
  actionBadgeText: {
1078
1083
  fontFamily: AppFonts.interBold,
1079
1084
  fontSize: 9.5,
1080
- color: '#4338CA',
1085
+ color: AppColors.indigo600Alt,
1081
1086
  },
1082
1087
  actionTitle: {
1083
1088
  flex: 1,
@@ -1158,22 +1163,22 @@ const reduxDetailStyles = StyleSheet.create({
1158
1163
  textAlign: 'right',
1159
1164
  },
1160
1165
  persistedInfoCard: {
1161
- backgroundColor: '#ECFDF5',
1166
+ backgroundColor: AppColors.mintGreenBg,
1162
1167
  borderRadius: 8,
1163
1168
  borderWidth: 1,
1164
- borderColor: '#A7F3D0',
1169
+ borderColor: AppColors.mintGreenBorder,
1165
1170
  padding: 10,
1166
1171
  },
1167
1172
  persistedInfoTitle: {
1168
1173
  fontFamily: AppFonts.interBold,
1169
1174
  fontSize: 11,
1170
- color: '#047857',
1175
+ color: AppColors.mintGreenText,
1171
1176
  },
1172
1177
  clearPersistMiniBtn: {
1173
1178
  flexDirection: 'row',
1174
1179
  alignItems: 'center',
1175
1180
  gap: 3,
1176
- backgroundColor: '#FEE2E2',
1181
+ backgroundColor: AppColors.errorCardBg,
1177
1182
  paddingHorizontal: 6,
1178
1183
  paddingVertical: 2.5,
1179
1184
  borderRadius: 4,
@@ -1190,7 +1195,7 @@ const reduxDetailStyles = StyleSheet.create({
1190
1195
  gap: 6,
1191
1196
  backgroundColor: AppColors.errorCardBg,
1192
1197
  borderWidth: 1,
1193
- borderColor: '#FEE2E2',
1198
+ borderColor: AppColors.errorBorder,
1194
1199
  borderRadius: 8,
1195
1200
  paddingVertical: 10,
1196
1201
  marginTop: 14,
@@ -1224,8 +1229,8 @@ const reduxDetailStyles = StyleSheet.create({
1224
1229
  lineHeight: 18,
1225
1230
  },
1226
1231
  highlight: {
1227
- backgroundColor: '#FEF08A',
1228
- color: '#854D0E',
1232
+ backgroundColor: AppColors.yellowHighlight,
1233
+ color: AppColors.amber800Warm,
1229
1234
  fontFamily: AppFonts.interBold,
1230
1235
  },
1231
1236
  });
@@ -387,14 +387,16 @@ const ReduxTab = React.memo(() => {
387
387
  <View style={reduxTabStyles.searchRow}>
388
388
  <View style={styles.searchContainer}>
389
389
  <SearchIcon color={AppColors.grayTextWeak} size={15}/>
390
- <TextInput placeholder="Search Redux slices or actions..." placeholderTextColor={AppColors.grayTextWeak} value={reduxSearch} onChangeText={setReduxSearch} style={styles.searchInput} autoCorrect={false} autoCapitalize="none"/>
391
- {reduxSearch.length > 0 && (<Pressable onPress={() => setReduxSearch('')} hitSlop={10}>
390
+ <TextInput accessible={true} accessibilityRole="search" accessibilityLabel="Search Redux slices or actions" accessibilityHint="Type to filter state slices in real time" placeholder="Search Redux slices or actions..." placeholderTextColor={AppColors.grayTextWeak} value={reduxSearch} onChangeText={setReduxSearch} style={styles.searchInput} autoCorrect={false} autoCapitalize="none"/>
391
+ {reduxSearch.length > 0 && (<Pressable accessible={true} accessibilityRole="button" accessibilityLabel="Clear search input" onPress={() => setReduxSearch('')} hitSlop={10}>
392
392
  <ClearIcon color={AppColors.grayTextWeak} size={14}/>
393
393
  </Pressable>)}
394
394
  </View>
395
395
 
396
396
  {/* Pause / Resume Live Updates Button */}
397
- <TouchableOpacity style={[
397
+ <TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={isReduxPaused
398
+ ? 'Resume live Redux updates'
399
+ : 'Pause live Redux updates'} accessibilityHint="Toggles automatic recording of Redux state updates" style={[
398
400
  styles.toolbarBtn,
399
401
  isReduxPaused && {
400
402
  backgroundColor: `${AppColors.darkOrange}1F`,
@@ -407,7 +409,9 @@ const ReduxTab = React.memo(() => {
407
409
  </TouchableOpacity>
408
410
 
409
411
  {/* Sort Button */}
410
- <TouchableOpacity style={[
412
+ <TouchableOpacity accessible={true} accessibilityRole="button" accessibilityLabel={`Sort order: ${sortMode === 'latest'
413
+ ? 'Recently updated first'
414
+ : 'Alphabetical A to Z'}`} accessibilityHint="Switches sorting between recently updated and alphabetical" style={[
411
415
  styles.toolbarBtn,
412
416
  sortMode === 'latest' && { backgroundColor: `${AppColors.brandPurple}1F`, borderColor: AppColors.brandPurple },
413
417
  ]} onPress={() => setSortMode(prev => (prev === 'latest' ? 'alpha' : 'latest'))} hitSlop={6}>
@@ -539,7 +543,7 @@ const reduxTabStyles = StyleSheet.create({
539
543
  },
540
544
  cardRecentlyUpdated: {
541
545
  borderColor: `${AppColors.brandPurple}66`,
542
- backgroundColor: '#FAFAFF',
546
+ backgroundColor: AppColors.purpleTintBg,
543
547
  },
544
548
  cardHeader: {
545
549
  flexDirection: 'row',
@@ -548,17 +552,17 @@ const reduxTabStyles = StyleSheet.create({
548
552
  marginBottom: 8,
549
553
  },
550
554
  sliceBadge: {
551
- backgroundColor: '#EDE9FE',
555
+ backgroundColor: AppColors.violetSoftBg,
552
556
  paddingHorizontal: 6,
553
557
  paddingVertical: 3,
554
558
  borderRadius: 5,
555
559
  borderWidth: 1,
556
- borderColor: '#DDD6FE',
560
+ borderColor: AppColors.violetSoftBorder,
557
561
  },
558
562
  sliceBadgeText: {
559
563
  fontFamily: AppFonts.interBold,
560
564
  fontSize: 9.5,
561
- color: '#6D28D9',
565
+ color: AppColors.purple700,
562
566
  letterSpacing: 0.4,
563
567
  },
564
568
  sliceName: {