react-native-inapp-inspector 2.3.15 → 2.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  3. package/dist/commonjs/components/Inspector/ConsoleTab.js +0 -22
  4. package/dist/commonjs/components/Inspector/CrashTab.js +0 -23
  5. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  6. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +56 -4
  8. package/dist/commonjs/components/Inspector/MainScreen.js +45 -3
  9. package/dist/commonjs/components/Inspector/NetworkTab.js +27 -38
  10. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  11. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  12. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  13. package/dist/commonjs/components/Inspector/ReduxTab.js +0 -22
  14. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  15. package/dist/commonjs/components/Inspector/StorageTab.js +0 -23
  16. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  17. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  18. package/dist/commonjs/components/NetworkIcons.js +33 -2
  19. package/dist/commonjs/constants/version.d.ts +1 -1
  20. package/dist/commonjs/constants/version.js +1 -1
  21. package/dist/commonjs/helpers/index.d.ts +1 -0
  22. package/dist/commonjs/helpers/index.js +1 -0
  23. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  24. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  25. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  26. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  27. package/dist/commonjs/helpers/telemetry.js +339 -8
  28. package/dist/commonjs/index.d.ts +1 -0
  29. package/dist/commonjs/index.js +32 -2
  30. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  31. package/dist/commonjs/styles/AppFonts.js +1 -0
  32. package/dist/commonjs/styles/index.d.ts +22 -0
  33. package/dist/commonjs/styles/index.js +19 -0
  34. package/dist/commonjs/types/enums.d.ts +1 -0
  35. package/dist/commonjs/types/enums.js +1 -0
  36. package/dist/commonjs/types/interfaces.d.ts +12 -0
  37. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  38. package/dist/esm/components/Inspector/ConsoleTab.js +1 -23
  39. package/dist/esm/components/Inspector/CrashTab.js +1 -24
  40. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  41. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  42. package/dist/esm/components/Inspector/InspectorHeader.js +57 -5
  43. package/dist/esm/components/Inspector/MainScreen.js +46 -4
  44. package/dist/esm/components/Inspector/NetworkTab.js +28 -39
  45. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  46. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  47. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  48. package/dist/esm/components/Inspector/ReduxTab.js +1 -23
  49. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  50. package/dist/esm/components/Inspector/StorageTab.js +0 -23
  51. package/dist/esm/components/Inspector/TabBar.js +50 -15
  52. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  53. package/dist/esm/components/NetworkIcons.js +26 -0
  54. package/dist/esm/constants/version.d.ts +1 -1
  55. package/dist/esm/constants/version.js +1 -1
  56. package/dist/esm/helpers/index.d.ts +1 -0
  57. package/dist/esm/helpers/index.js +1 -0
  58. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  59. package/dist/esm/helpers/remoteConfig.js +160 -0
  60. package/dist/esm/helpers/searchQueryParser.js +2 -0
  61. package/dist/esm/helpers/telemetry.d.ts +5 -0
  62. package/dist/esm/helpers/telemetry.js +332 -9
  63. package/dist/esm/index.d.ts +1 -0
  64. package/dist/esm/index.js +30 -2
  65. package/dist/esm/styles/AppFonts.d.ts +2 -0
  66. package/dist/esm/styles/AppFonts.js +1 -0
  67. package/dist/esm/styles/index.d.ts +22 -0
  68. package/dist/esm/styles/index.js +19 -0
  69. package/dist/esm/types/enums.d.ts +1 -0
  70. package/dist/esm/types/enums.js +1 -0
  71. package/dist/esm/types/interfaces.d.ts +12 -0
  72. package/package.json +1 -1
  73. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  74. package/src/components/Inspector/ConsoleTab.tsx +0 -23
  75. package/src/components/Inspector/CrashTab.tsx +0 -23
  76. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  77. package/src/components/Inspector/InspectorHeader.tsx +78 -2
  78. package/src/components/Inspector/MainScreen.tsx +59 -3
  79. package/src/components/Inspector/NetworkTab.tsx +69 -78
  80. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  81. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  82. package/src/components/Inspector/ReduxTab.tsx +0 -23
  83. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  84. package/src/components/Inspector/StorageTab.tsx +0 -23
  85. package/src/components/Inspector/TabBar.tsx +57 -20
  86. package/src/components/NetworkIcons.tsx +92 -0
  87. package/src/constants/version.ts +1 -1
  88. package/src/helpers/index.ts +1 -0
  89. package/src/helpers/remoteConfig.ts +212 -0
  90. package/src/helpers/searchQueryParser.ts +3 -0
  91. package/src/helpers/telemetry.ts +381 -10
  92. package/src/index.tsx +42 -0
  93. package/src/styles/AppFonts.ts +2 -0
  94. package/src/styles/index.ts +20 -1
  95. package/src/types/enums.ts +1 -0
  96. package/src/types/interfaces.ts +12 -0
@@ -42,6 +42,7 @@ import {
42
42
  NpmIcon,
43
43
  ResetIcon,
44
44
  BoltIcon,
45
+ InfoCircleIcon,
45
46
  } from '../NetworkIcons';
46
47
 
47
48
  const InspectorHeader = React.memo(() => {
@@ -70,6 +71,9 @@ const InspectorHeader = React.memo(() => {
70
71
  runClearAllWithAnimation,
71
72
  settingsPage,
72
73
  setSettingsPage,
74
+ setSettingsActiveSubTab,
75
+ isFeedbackOpen,
76
+ setIsFeedbackOpen,
73
77
  resetToDefaults,
74
78
  closeModal,
75
79
  detailTitle,
@@ -147,7 +151,7 @@ const InspectorHeader = React.memo(() => {
147
151
  (activeTab === 'crash' && selectedCrash != null);
148
152
 
149
153
  const isSettingsView = settingsPage !== null;
150
- const isAnySelected = isDetailView || isSettingsView;
154
+ const isAnySelected = isDetailView || isSettingsView || isFeedbackOpen;
151
155
 
152
156
  const settingsModuleTitle = useMemo(() => {
153
157
  switch (settingsPage) {
@@ -206,6 +210,10 @@ const InspectorHeader = React.memo(() => {
206
210
  ]}>
207
211
  <TouchableScale
208
212
  onPress={() => {
213
+ if (isFeedbackOpen) {
214
+ setIsFeedbackOpen(false);
215
+ return;
216
+ }
209
217
  if (isSettingsView) {
210
218
  if (settingsPage === 'main') {
211
219
  setSettingsPage(null);
@@ -249,7 +257,50 @@ const InspectorHeader = React.memo(() => {
249
257
  <WhiteBackNavigation />
250
258
  </TouchableScale>
251
259
 
252
- {isSettingsView ? (
260
+ {isFeedbackOpen ? (
261
+ <View style={{gap: 2, flex: 1, minWidth: 0}}>
262
+ <View
263
+ style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
264
+ <Text
265
+ style={{
266
+ fontFamily: AppFonts.interBold,
267
+ fontSize: isNarrow ? 14 : 16,
268
+ color: AppColors.white,
269
+ letterSpacing: -0.2,
270
+ }}
271
+ numberOfLines={1}>
272
+ Support & Feedback
273
+ </Text>
274
+ <View
275
+ style={{
276
+ backgroundColor: `${AppColors.white}26`,
277
+ paddingHorizontal: isNarrow ? 4 : 6,
278
+ paddingVertical: 1.5,
279
+ borderRadius: 10,
280
+ borderWidth: 1,
281
+ borderColor: `${AppColors.white}20`,
282
+ }}>
283
+ <Text
284
+ style={{
285
+ fontFamily: AppFonts.interBold,
286
+ fontSize: isNarrow ? 8 : 9,
287
+ color: AppColors.white,
288
+ }}>
289
+ v{LIB_VERSION}
290
+ </Text>
291
+ </View>
292
+ </View>
293
+ <Text
294
+ style={{
295
+ fontFamily: AppFonts.interRegular,
296
+ fontSize: isNarrow ? 9.5 : 10.5,
297
+ color: `${AppColors.white}CC`,
298
+ }}
299
+ numberOfLines={1}>
300
+ Direct line to maintainers & developers
301
+ </Text>
302
+ </View>
303
+ ) : isSettingsView ? (
253
304
  <View style={{gap: 2, flex: 1, minWidth: 0}}>
254
305
  <View
255
306
  style={{flexDirection: 'row', alignItems: 'center', gap: 6}}>
@@ -997,6 +1048,9 @@ const InspectorHeader = React.memo(() => {
997
1048
 
998
1049
  {!isAnySelected && (
999
1050
  <TouchableScale
1051
+ accessible={true}
1052
+ accessibilityRole="button"
1053
+ accessibilityLabel="Settings"
1000
1054
  onPress={() => setSettingsPage('main')}
1001
1055
  hitSlop={15}
1002
1056
  style={[
@@ -1011,6 +1065,28 @@ const InspectorHeader = React.memo(() => {
1011
1065
  </TouchableScale>
1012
1066
  )}
1013
1067
 
1068
+ {!isAnySelected && (
1069
+ <TouchableScale
1070
+ accessible={true}
1071
+ accessibilityRole="button"
1072
+ accessibilityLabel="About and System Specifications"
1073
+ onPress={() => {
1074
+ setSettingsActiveSubTab('about');
1075
+ setSettingsPage('main');
1076
+ }}
1077
+ hitSlop={15}
1078
+ style={[
1079
+ styles.closeButtonSquare,
1080
+ {
1081
+ width: buttonSize,
1082
+ height: buttonSize,
1083
+ borderRadius: isNarrow ? 6 : 7,
1084
+ },
1085
+ ]}>
1086
+ <InfoCircleIcon color={AppColors.white} size={isNarrow ? 12 : 14} />
1087
+ </TouchableScale>
1088
+ )}
1089
+
1014
1090
  <TouchableOpacity
1015
1091
  onPress={closeModal}
1016
1092
  hitSlop={{top: 12, bottom: 12, left: 12, right: 12}}
@@ -8,6 +8,7 @@ import {
8
8
  StatusBar,
9
9
  StyleSheet,
10
10
  Text,
11
+ TouchableOpacity,
11
12
  View,
12
13
  } from 'react-native';
13
14
  import {useInspector} from './InspectorContext';
@@ -32,7 +33,11 @@ import StorageTab from './StorageTab';
32
33
  import DebuggingTab from './DebuggingTab';
33
34
  import SettingsPanel from './SettingsPanel';
34
35
  import NpmUpdateToast from './NpmUpdateToast';
36
+ import NpmStarPrompt from './NpmStarPrompt';
37
+ import FeedbackModal from './FeedbackModal';
35
38
  import Toast from '../Toast';
39
+ import TouchableScale from '../TouchableScale';
40
+ import {HeadphonesIcon} from '../NetworkIcons';
36
41
  import styles from '../../styles';
37
42
  import {AppColors} from '../../styles/AppColors';
38
43
  import NavigationTracker from './NavigationTracker';
@@ -51,6 +56,8 @@ const MainScreen = () => {
51
56
  selectedReduxAction,
52
57
  selectedCrash,
53
58
  settingsPage,
59
+ isFeedbackOpen,
60
+ setIsFeedbackOpen,
54
61
  activeTab,
55
62
  isReady,
56
63
  enabled,
@@ -93,6 +100,19 @@ const MainScreen = () => {
93
100
  }
94
101
  }, [settingsPage !== null]);
95
102
 
103
+ const feedbackAnim = useRef(new Animated.Value(0)).current;
104
+ useEffect(() => {
105
+ if (isFeedbackOpen) {
106
+ feedbackAnim.setValue(0);
107
+ Animated.spring(feedbackAnim, {
108
+ toValue: 1,
109
+ friction: 8,
110
+ tension: 65,
111
+ useNativeDriver: true,
112
+ }).start();
113
+ }
114
+ }, [isFeedbackOpen]);
115
+
96
116
  const tabAnim = useRef(new Animated.Value(1)).current;
97
117
  useEffect(() => {
98
118
  tabAnim.setValue(0);
@@ -139,8 +159,8 @@ const MainScreen = () => {
139
159
  <InspectorHeader />
140
160
 
141
161
  <View style={{flex: 1}}>
142
- {/* ─── Horizontal Scrollable Tab Bar inside Content (Always visible) ─── */}
143
- {!isDetailActive && <TabBar />}
162
+ {/* ─── Horizontal Scrollable Tab Bar inside Content (Always visible unless in detail/settings/feedback) ─── */}
163
+ {!isDetailActive && settingsPage === null && !isFeedbackOpen && <TabBar />}
144
164
 
145
165
  {isReady ? (
146
166
  <View style={{flex: 1}}>
@@ -159,7 +179,7 @@ const MainScreen = () => {
159
179
  },
160
180
  ],
161
181
  },
162
- (isDetailActive || settingsPage !== null) && {
182
+ (isDetailActive || settingsPage !== null || isFeedbackOpen) && {
163
183
  pointerEvents: 'none',
164
184
  },
165
185
  ]}>
@@ -236,6 +256,39 @@ const MainScreen = () => {
236
256
  <SettingsPanel />
237
257
  </Animated.View>
238
258
  )}
259
+
260
+ {/* Support & Feedback Layer - Rendered inside in-app inspector covering full content card */}
261
+ {isFeedbackOpen && (
262
+ <Animated.View
263
+ style={[
264
+ StyleSheet.absoluteFill,
265
+ {
266
+ backgroundColor: AppColors.primaryLight,
267
+ opacity: feedbackAnim,
268
+ transform: [
269
+ {
270
+ translateY: feedbackAnim.interpolate({
271
+ inputRange: [0, 1],
272
+ outputRange: [24, 0],
273
+ }),
274
+ },
275
+ ],
276
+ },
277
+ ]}>
278
+ <FeedbackModal onClose={() => setIsFeedbackOpen(false)} />
279
+ </Animated.View>
280
+ )}
281
+
282
+ {/* Floating Support & Feedback Button (in place of scroll-to-top) */}
283
+ {!isDetailActive && settingsPage === null && !isFeedbackOpen && (
284
+ <TouchableOpacity
285
+ activeOpacity={0.8}
286
+ onPress={() => setIsFeedbackOpen(true)}
287
+ hitSlop={{top: 10, bottom: 10, left: 10, right: 10}}
288
+ style={styles.supportFab}>
289
+ <HeadphonesIcon color={AppColors.white} size={20} />
290
+ </TouchableOpacity>
291
+ )}
239
292
  </View>
240
293
 
241
294
  {/* Bottom floating toast notification */}
@@ -243,6 +296,9 @@ const MainScreen = () => {
243
296
 
244
297
  {/* NPM Version Update Toast with timeout progress bar */}
245
298
  <NpmUpdateToast />
299
+
300
+ {/* 5-Day Periodic Star & Support Prompt */}
301
+ <NpmStarPrompt />
246
302
  </View>
247
303
  </View>
248
304
  </ErrorBoundary>
@@ -570,16 +570,24 @@ const NetworkTab = React.memo(() => {
570
570
  </View>
571
571
  </View>
572
572
 
573
- {/* Quick Filter Horizontal Chips Bar with Live Counts */}
574
- <View style={{marginBottom: 8}}>
573
+ {/* Quick Filter Horizontal Chips Bar with Sticky "More Filters" on Right */}
574
+ <View
575
+ style={{
576
+ flexDirection: 'row',
577
+ alignItems: 'center',
578
+ marginBottom: 8,
579
+ paddingHorizontal: 12,
580
+ gap: 6,
581
+ }}>
575
582
  <ScrollView
576
583
  horizontal
577
584
  showsHorizontalScrollIndicator={false}
585
+ style={{flex: 1}}
578
586
  contentContainerStyle={{
579
- paddingHorizontal: 12,
580
587
  flexDirection: 'row',
581
588
  alignItems: 'center',
582
589
  gap: 6,
590
+ paddingRight: 6,
583
591
  }}>
584
592
  {QUICK_CHIPS.map(chip => {
585
593
  const isActive = quickFilter === chip.id;
@@ -646,67 +654,73 @@ const NetworkTab = React.memo(() => {
646
654
  </TouchableScale>
647
655
  );
648
656
  })}
657
+ </ScrollView>
649
658
 
650
- <TouchableScale
651
- onPress={() => setIsFilterModalOpen(true)}>
652
- <View
659
+ <TouchableScale
660
+ onPress={() => setIsFilterModalOpen(true)}
661
+ style={{flexShrink: 0}}>
662
+ <View
663
+ style={{
664
+ flexDirection: 'row',
665
+ alignItems: 'center',
666
+ paddingHorizontal: 10,
667
+ paddingVertical: 4.5,
668
+ borderRadius: 8,
669
+ backgroundColor:
670
+ statusFilters.size > 0 || methodFilters.size > 0
671
+ ? `${AppColors.purple}20`
672
+ : AppColors.grayBackground,
673
+ borderWidth: 1,
674
+ borderColor:
675
+ statusFilters.size > 0 || methodFilters.size > 0
676
+ ? AppColors.purple
677
+ : AppColors.grayBorderSecondary,
678
+ gap: 5,
679
+ shadowColor: AppColors.black,
680
+ shadowOpacity: 0.04,
681
+ shadowRadius: 2,
682
+ shadowOffset: {width: 0, height: 1},
683
+ elevation: 1,
684
+ }}>
685
+ <FilterIcon
686
+ size={11}
687
+ color={
688
+ statusFilters.size > 0 || methodFilters.size > 0
689
+ ? AppColors.purple
690
+ : AppColors.grayText
691
+ }
692
+ />
693
+ <Text
653
694
  style={{
654
- flexDirection: 'row',
655
- alignItems: 'center',
656
- paddingHorizontal: 10,
657
- paddingVertical: 4.5,
658
- borderRadius: 8,
659
- backgroundColor:
660
- statusFilters.size > 0 || methodFilters.size > 0
661
- ? `${AppColors.purple}20`
662
- : AppColors.grayBackground,
663
- borderWidth: 1,
664
- borderColor:
695
+ fontFamily: AppFonts.interBold,
696
+ fontSize: 10.5,
697
+ color:
665
698
  statusFilters.size > 0 || methodFilters.size > 0
666
699
  ? AppColors.purple
667
- : AppColors.grayBorderSecondary,
668
- gap: 5,
700
+ : AppColors.grayText,
669
701
  }}>
670
- <FilterIcon
671
- size={11}
672
- color={
673
- statusFilters.size > 0 || methodFilters.size > 0
674
- ? AppColors.purple
675
- : AppColors.grayText
676
- }
677
- />
678
- <Text
702
+ More Filters
703
+ </Text>
704
+ {(statusFilters.size > 0 || methodFilters.size > 0) && (
705
+ <View
679
706
  style={{
680
- fontFamily: AppFonts.interBold,
681
- fontSize: 10.5,
682
- color:
683
- statusFilters.size > 0 || methodFilters.size > 0
684
- ? AppColors.purple
685
- : AppColors.grayText,
707
+ backgroundColor: AppColors.purple,
708
+ paddingHorizontal: 4.5,
709
+ paddingVertical: 1,
710
+ borderRadius: 6,
686
711
  }}>
687
- More Filters
688
- </Text>
689
- {(statusFilters.size > 0 || methodFilters.size > 0) && (
690
- <View
712
+ <Text
691
713
  style={{
692
- backgroundColor: AppColors.purple,
693
- paddingHorizontal: 4.5,
694
- paddingVertical: 1,
695
- borderRadius: 6,
714
+ fontFamily: AppFonts.interBold,
715
+ fontSize: 8.5,
716
+ color: AppColors.white,
696
717
  }}>
697
- <Text
698
- style={{
699
- fontFamily: AppFonts.interBold,
700
- fontSize: 8.5,
701
- color: AppColors.white,
702
- }}>
703
- {statusFilters.size + methodFilters.size}
704
- </Text>
705
- </View>
706
- )}
707
- </View>
708
- </TouchableScale>
709
- </ScrollView>
718
+ {statusFilters.size + methodFilters.size}
719
+ </Text>
720
+ </View>
721
+ )}
722
+ </View>
723
+ </TouchableScale>
710
724
  </View>
711
725
 
712
726
  {/* Active Filter Helper Status Bar */}
@@ -791,29 +805,6 @@ const NetworkTab = React.memo(() => {
791
805
  ]}
792
806
  keyboardShouldPersistTaps="handled"
793
807
  />
794
- {/* #2 — always-visible scroll-to-top, bottom right */}
795
- <TouchableScale
796
- onPress={() => {
797
- try {
798
- apisListRef.current?.scrollToOffset({
799
- offset: 0,
800
- animated: true,
801
- });
802
- } catch {
803
- try {
804
- apisListRef.current?.scrollToIndex({
805
- index: 0,
806
- animated: true,
807
- });
808
- } catch {}
809
- }
810
- }}
811
- hitSlop={12}
812
- style={styles.scrollTopBtn}>
813
- <View style={{transform: [{rotate: '180deg'}]}}>
814
- <ChevronIcon color={AppColors.white} size={18} />
815
- </View>
816
- </TouchableScale>
817
808
 
818
809
  {/* Modern Network Filter Modal */}
819
810
  <NetworkFilterModal