react-native-inapp-inspector 1.1.13 → 1.1.15

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 (250) hide show
  1. package/README.md +9 -34
  2. package/dist/commonjs/assets/svgAssets.d.ts +3 -0
  3. package/dist/commonjs/assets/svgAssets.js +17 -0
  4. package/dist/commonjs/components/AnalyticsEventCard.d.ts +1 -14
  5. package/dist/commonjs/components/AnalyticsEventCard.js +120 -50
  6. package/dist/commonjs/components/AnalyticsGraph.d.ts +2 -6
  7. package/dist/commonjs/components/AnalyticsGraph.js +8 -8
  8. package/dist/commonjs/components/AnalyticsTabView.d.ts +15 -0
  9. package/dist/commonjs/components/AnalyticsTabView.js +157 -0
  10. package/dist/commonjs/components/AnimatedEntrance.d.ts +1 -1
  11. package/dist/commonjs/components/AnimatedEntrance.js +2 -2
  12. package/dist/commonjs/components/ApiDetailView.d.ts +22 -0
  13. package/dist/commonjs/components/ApiDetailView.js +304 -0
  14. package/dist/commonjs/components/ApisTabView.d.ts +33 -0
  15. package/dist/commonjs/components/ApisTabView.js +235 -0
  16. package/dist/commonjs/components/CodeSnippet.d.ts +1 -5
  17. package/dist/commonjs/components/CodeSnippet.js +34 -34
  18. package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -8
  19. package/dist/commonjs/components/ConsoleLogCard.js +262 -442
  20. package/dist/commonjs/components/ConsoleLogDetailView.d.ts +9 -0
  21. package/dist/commonjs/components/ConsoleLogDetailView.js +278 -0
  22. package/dist/commonjs/components/ConsoleLogsTabView.d.ts +24 -0
  23. package/dist/commonjs/components/ConsoleLogsTabView.js +354 -0
  24. package/dist/commonjs/components/DiffViewer.js +4 -2
  25. package/dist/commonjs/components/DomainHeader.js +66 -41
  26. package/dist/commonjs/components/EmptyState.d.ts +2 -2
  27. package/dist/commonjs/components/EmptyState.js +2 -2
  28. package/dist/commonjs/components/EndOfListFooter.d.ts +8 -0
  29. package/dist/commonjs/components/EndOfListFooter.js +90 -0
  30. package/dist/commonjs/components/ErrorBoundary.d.ts +5 -14
  31. package/dist/commonjs/components/ErrorBoundary.js +28 -28
  32. package/dist/commonjs/components/FloatingBubble.d.ts +14 -0
  33. package/dist/commonjs/components/FloatingBubble.js +75 -0
  34. package/dist/commonjs/components/HeadersSection.js +5 -3
  35. package/dist/commonjs/components/HighlightText.d.ts +1 -1
  36. package/dist/commonjs/components/HighlightText.js +5 -7
  37. package/dist/commonjs/components/Inspector/AnalyticsTab.d.ts +3 -0
  38. package/dist/commonjs/components/Inspector/AnalyticsTab.js +232 -0
  39. package/dist/commonjs/components/Inspector/ConsoleTab.d.ts +3 -0
  40. package/dist/commonjs/components/Inspector/ConsoleTab.js +410 -0
  41. package/dist/commonjs/components/Inspector/FabLauncher.d.ts +3 -0
  42. package/dist/commonjs/components/Inspector/FabLauncher.js +54 -0
  43. package/dist/commonjs/components/Inspector/InsightsDashboard.d.ts +3 -0
  44. package/dist/commonjs/components/Inspector/InsightsDashboard.js +619 -0
  45. package/dist/commonjs/components/Inspector/InspectorContext.d.ts +5 -0
  46. package/dist/commonjs/components/Inspector/InspectorContext.js +18 -0
  47. package/dist/commonjs/components/Inspector/InspectorHeader.d.ts +3 -0
  48. package/dist/commonjs/components/Inspector/InspectorHeader.js +452 -0
  49. package/dist/commonjs/components/Inspector/LogDetail.d.ts +3 -0
  50. package/dist/commonjs/components/Inspector/LogDetail.js +963 -0
  51. package/dist/commonjs/components/Inspector/MainScreen.d.ts +3 -0
  52. package/dist/commonjs/components/Inspector/MainScreen.js +68 -0
  53. package/dist/commonjs/components/Inspector/NavigationTracker.d.ts +3 -0
  54. package/dist/commonjs/components/Inspector/NavigationTracker.js +12 -0
  55. package/dist/commonjs/components/Inspector/NetworkDetail.d.ts +3 -0
  56. package/dist/commonjs/components/Inspector/NetworkDetail.js +405 -0
  57. package/dist/commonjs/components/Inspector/NetworkTab.d.ts +3 -0
  58. package/dist/commonjs/components/Inspector/NetworkTab.js +281 -0
  59. package/dist/commonjs/components/Inspector/ReduxTab.d.ts +3 -0
  60. package/dist/commonjs/components/Inspector/ReduxTab.js +75 -0
  61. package/dist/commonjs/components/Inspector/SettingsPanel.d.ts +3 -0
  62. package/dist/commonjs/components/Inspector/SettingsPanel.js +1476 -0
  63. package/dist/commonjs/components/Inspector/TabBar.d.ts +3 -0
  64. package/dist/commonjs/components/Inspector/TabBar.js +95 -0
  65. package/dist/commonjs/components/Inspector/WebViewTab.d.ts +3 -0
  66. package/dist/commonjs/components/Inspector/WebViewTab.js +757 -0
  67. package/dist/commonjs/components/InspectorHeader.d.ts +19 -0
  68. package/dist/commonjs/components/InspectorHeader.js +329 -0
  69. package/dist/commonjs/components/InspectorTabBar.d.ts +16 -0
  70. package/dist/commonjs/components/InspectorTabBar.js +90 -0
  71. package/dist/commonjs/components/JsonViewer.d.ts +4 -1
  72. package/dist/commonjs/components/JsonViewer.js +110 -171
  73. package/dist/commonjs/components/LogCard.js +109 -86
  74. package/dist/commonjs/components/MetaAccordion.d.ts +1 -10
  75. package/dist/commonjs/components/MetaAccordion.js +23 -21
  76. package/dist/commonjs/components/NavigationTracker.d.ts +7 -0
  77. package/dist/commonjs/components/NavigationTracker.js +76 -0
  78. package/dist/commonjs/components/NetworkIcons.d.ts +6 -0
  79. package/dist/commonjs/components/NetworkIcons.js +54 -8
  80. package/dist/commonjs/components/ReduxTabView.d.ts +9 -0
  81. package/dist/commonjs/components/ReduxTabView.js +56 -0
  82. package/dist/commonjs/components/ReduxTreeView.js +241 -200
  83. package/dist/commonjs/components/SegmentedTabs.d.ts +15 -0
  84. package/dist/commonjs/components/SegmentedTabs.js +52 -0
  85. package/dist/commonjs/components/SettingsView.d.ts +13 -0
  86. package/dist/commonjs/components/SettingsView.js +328 -0
  87. package/dist/commonjs/components/TouchableScale.d.ts +2 -2
  88. package/dist/commonjs/components/TouchableScale.js +2 -2
  89. package/dist/commonjs/components/TreeNode.js +2 -2
  90. package/dist/commonjs/constants/index.js +1 -12
  91. package/dist/commonjs/constants/version.d.ts +1 -1
  92. package/dist/commonjs/constants/version.js +1 -1
  93. package/dist/commonjs/customHooks/analyticsLogger.d.ts +8 -0
  94. package/dist/commonjs/customHooks/analyticsLogger.js +42 -1
  95. package/dist/commonjs/customHooks/consoleLogger.js +137 -13
  96. package/dist/commonjs/customHooks/networkLogger.d.ts +0 -1
  97. package/dist/commonjs/customHooks/networkLogger.js +0 -1
  98. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -9
  99. package/dist/commonjs/enums/index.d.ts +39 -0
  100. package/dist/commonjs/enums/index.js +50 -0
  101. package/dist/commonjs/helpers/index.d.ts +27 -1
  102. package/dist/commonjs/helpers/index.js +187 -12
  103. package/dist/commonjs/helpers/settingsStore.d.ts +2 -24
  104. package/dist/commonjs/i18n/en.json +144 -0
  105. package/dist/commonjs/i18n/index.d.ts +2 -0
  106. package/dist/commonjs/i18n/index.js +27 -0
  107. package/dist/commonjs/i18n/locales/en.json +314 -0
  108. package/dist/commonjs/index.d.ts +2 -3
  109. package/dist/commonjs/index.js +207 -4927
  110. package/dist/commonjs/styles/AppColors.d.ts +148 -0
  111. package/dist/commonjs/styles/AppColors.js +176 -0
  112. package/dist/commonjs/styles/common.d.ts +3 -0
  113. package/dist/commonjs/styles/common.js +201 -0
  114. package/dist/commonjs/styles/index.d.ts +219 -435
  115. package/dist/commonjs/styles/index.js +312 -488
  116. package/dist/commonjs/types/enums.d.ts +9 -0
  117. package/dist/commonjs/types/enums.js +4 -0
  118. package/dist/commonjs/types/index.d.ts +4 -111
  119. package/dist/commonjs/types/index.js +16 -0
  120. package/dist/commonjs/types/interfaces.d.ts +337 -0
  121. package/dist/commonjs/types/interfaces.js +2 -0
  122. package/dist/esm/assets/svgAssets.d.ts +3 -0
  123. package/dist/esm/assets/svgAssets.js +14 -0
  124. package/dist/esm/components/AnalyticsEventCard.d.ts +1 -14
  125. package/dist/esm/components/AnalyticsEventCard.js +118 -48
  126. package/dist/esm/components/AnalyticsGraph.d.ts +2 -6
  127. package/dist/esm/components/AnalyticsGraph.js +8 -8
  128. package/dist/esm/components/AnalyticsTabView.d.ts +15 -0
  129. package/dist/esm/components/AnalyticsTabView.js +151 -0
  130. package/dist/esm/components/AnimatedEntrance.d.ts +1 -1
  131. package/dist/esm/components/AnimatedEntrance.js +2 -2
  132. package/dist/esm/components/ApiDetailView.d.ts +22 -0
  133. package/dist/esm/components/ApiDetailView.js +264 -0
  134. package/dist/esm/components/ApisTabView.d.ts +33 -0
  135. package/dist/esm/components/ApisTabView.js +196 -0
  136. package/dist/esm/components/CodeSnippet.d.ts +1 -5
  137. package/dist/esm/components/CodeSnippet.js +34 -34
  138. package/dist/esm/components/ConsoleLogCard.d.ts +1 -8
  139. package/dist/esm/components/ConsoleLogCard.js +262 -409
  140. package/dist/esm/components/ConsoleLogDetailView.d.ts +9 -0
  141. package/dist/esm/components/ConsoleLogDetailView.js +271 -0
  142. package/dist/esm/components/ConsoleLogsTabView.d.ts +24 -0
  143. package/dist/esm/components/ConsoleLogsTabView.js +348 -0
  144. package/dist/esm/components/DiffViewer.js +4 -2
  145. package/dist/esm/components/DomainHeader.js +66 -41
  146. package/dist/esm/components/EmptyState.d.ts +2 -2
  147. package/dist/esm/components/EmptyState.js +2 -2
  148. package/dist/esm/components/EndOfListFooter.d.ts +8 -0
  149. package/dist/esm/components/EndOfListFooter.js +83 -0
  150. package/dist/esm/components/ErrorBoundary.d.ts +5 -14
  151. package/dist/esm/components/ErrorBoundary.js +29 -29
  152. package/dist/esm/components/FloatingBubble.d.ts +14 -0
  153. package/dist/esm/components/FloatingBubble.js +68 -0
  154. package/dist/esm/components/HeadersSection.js +5 -3
  155. package/dist/esm/components/HighlightText.d.ts +1 -1
  156. package/dist/esm/components/HighlightText.js +5 -7
  157. package/dist/esm/components/Inspector/AnalyticsTab.d.ts +3 -0
  158. package/dist/esm/components/Inspector/AnalyticsTab.js +194 -0
  159. package/dist/esm/components/Inspector/ConsoleTab.d.ts +3 -0
  160. package/dist/esm/components/Inspector/ConsoleTab.js +372 -0
  161. package/dist/esm/components/Inspector/FabLauncher.d.ts +3 -0
  162. package/dist/esm/components/Inspector/FabLauncher.js +49 -0
  163. package/dist/esm/components/Inspector/InsightsDashboard.d.ts +3 -0
  164. package/dist/esm/components/Inspector/InsightsDashboard.js +614 -0
  165. package/dist/esm/components/Inspector/InspectorContext.d.ts +5 -0
  166. package/dist/esm/components/Inspector/InspectorContext.js +13 -0
  167. package/dist/esm/components/Inspector/InspectorHeader.d.ts +3 -0
  168. package/dist/esm/components/Inspector/InspectorHeader.js +447 -0
  169. package/dist/esm/components/Inspector/LogDetail.d.ts +3 -0
  170. package/dist/esm/components/Inspector/LogDetail.js +925 -0
  171. package/dist/esm/components/Inspector/MainScreen.d.ts +3 -0
  172. package/dist/esm/components/Inspector/MainScreen.js +63 -0
  173. package/dist/esm/components/Inspector/NavigationTracker.d.ts +3 -0
  174. package/dist/esm/components/Inspector/NavigationTracker.js +10 -0
  175. package/dist/esm/components/Inspector/NetworkDetail.d.ts +3 -0
  176. package/dist/esm/components/Inspector/NetworkDetail.js +367 -0
  177. package/dist/esm/components/Inspector/NetworkTab.d.ts +3 -0
  178. package/dist/esm/components/Inspector/NetworkTab.js +243 -0
  179. package/dist/esm/components/Inspector/ReduxTab.d.ts +3 -0
  180. package/dist/esm/components/Inspector/ReduxTab.js +70 -0
  181. package/dist/esm/components/Inspector/SettingsPanel.d.ts +3 -0
  182. package/dist/esm/components/Inspector/SettingsPanel.js +1438 -0
  183. package/dist/esm/components/Inspector/TabBar.d.ts +3 -0
  184. package/dist/esm/components/Inspector/TabBar.js +90 -0
  185. package/dist/esm/components/Inspector/WebViewTab.d.ts +3 -0
  186. package/dist/esm/components/Inspector/WebViewTab.js +752 -0
  187. package/dist/esm/components/InspectorHeader.d.ts +19 -0
  188. package/dist/esm/components/InspectorHeader.js +323 -0
  189. package/dist/esm/components/InspectorTabBar.d.ts +16 -0
  190. package/dist/esm/components/InspectorTabBar.js +84 -0
  191. package/dist/esm/components/JsonViewer.d.ts +4 -1
  192. package/dist/esm/components/JsonViewer.js +111 -172
  193. package/dist/esm/components/LogCard.js +111 -88
  194. package/dist/esm/components/MetaAccordion.d.ts +1 -10
  195. package/dist/esm/components/MetaAccordion.js +23 -21
  196. package/dist/esm/components/NavigationTracker.d.ts +7 -0
  197. package/dist/esm/components/NavigationTracker.js +39 -0
  198. package/dist/esm/components/NetworkIcons.d.ts +6 -0
  199. package/dist/esm/components/NetworkIcons.js +46 -6
  200. package/dist/esm/components/ReduxTabView.d.ts +9 -0
  201. package/dist/esm/components/ReduxTabView.js +50 -0
  202. package/dist/esm/components/ReduxTreeView.js +243 -202
  203. package/dist/esm/components/SegmentedTabs.d.ts +15 -0
  204. package/dist/esm/components/SegmentedTabs.js +47 -0
  205. package/dist/esm/components/SettingsView.d.ts +13 -0
  206. package/dist/esm/components/SettingsView.js +321 -0
  207. package/dist/esm/components/TouchableScale.d.ts +2 -2
  208. package/dist/esm/components/TouchableScale.js +2 -2
  209. package/dist/esm/components/TreeNode.js +2 -2
  210. package/dist/esm/constants/index.js +1 -12
  211. package/dist/esm/constants/version.d.ts +1 -1
  212. package/dist/esm/constants/version.js +1 -1
  213. package/dist/esm/customHooks/analyticsLogger.d.ts +8 -0
  214. package/dist/esm/customHooks/analyticsLogger.js +37 -0
  215. package/dist/esm/customHooks/consoleLogger.js +137 -13
  216. package/dist/esm/customHooks/networkLogger.d.ts +0 -1
  217. package/dist/esm/customHooks/networkLogger.js +0 -1
  218. package/dist/esm/customHooks/reduxLogger.d.ts +2 -9
  219. package/dist/esm/enums/index.d.ts +39 -0
  220. package/dist/esm/enums/index.js +47 -0
  221. package/dist/esm/helpers/index.d.ts +27 -1
  222. package/dist/esm/helpers/index.js +180 -11
  223. package/dist/esm/helpers/settingsStore.d.ts +2 -24
  224. package/dist/esm/i18n/en.json +144 -0
  225. package/dist/esm/i18n/index.d.ts +2 -0
  226. package/dist/esm/i18n/index.js +22 -0
  227. package/dist/esm/i18n/locales/en.json +314 -0
  228. package/dist/esm/index.d.ts +2 -3
  229. package/dist/esm/index.js +207 -4923
  230. package/dist/esm/styles/AppColors.d.ts +148 -0
  231. package/dist/esm/styles/AppColors.js +176 -0
  232. package/dist/esm/styles/common.d.ts +3 -0
  233. package/dist/esm/styles/common.js +197 -0
  234. package/dist/esm/styles/index.d.ts +219 -435
  235. package/dist/esm/styles/index.js +312 -488
  236. package/dist/esm/types/enums.d.ts +9 -0
  237. package/dist/esm/types/enums.js +3 -0
  238. package/dist/esm/types/index.d.ts +4 -111
  239. package/dist/esm/types/index.js +2 -1
  240. package/dist/esm/types/interfaces.d.ts +337 -0
  241. package/dist/esm/types/interfaces.js +1 -0
  242. package/example/App.tsx +88 -1
  243. package/example/android/app/build.gradle +29 -1
  244. package/example/android/app/src/main/java/com/example/MainApplication.kt +25 -0
  245. package/example/android/build.gradle +31 -4
  246. package/example/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  247. package/example/android/gradle.properties +1 -0
  248. package/example/android/settings.gradle +20 -1
  249. package/example/package-lock.json +1 -1
  250. package/package.json +3 -1
@@ -0,0 +1,243 @@
1
+ import React, { useCallback, useRef } from 'react';
2
+ import { Animated, FlatList, Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
+ import { animateNextLayout, useInspector } from './InspectorContext';
4
+ import useAccordion from '../../customHooks/useAccordion';
5
+ import TouchableScale from '../TouchableScale';
6
+ import AnimatedEntrance from '../AnimatedEntrance';
7
+ import DomainHeader from '../DomainHeader';
8
+ import LogCard from '../LogCard';
9
+ import EmptyState from '../EmptyState';
10
+ import EndOfListFooter from '../EndOfListFooter';
11
+ import styles from '../../styles';
12
+ import { AppColors } from '../../styles/AppColors';
13
+ import { AppFonts } from '../../styles/AppFonts';
14
+ import { STATUS_FILTERS, METHOD_COLORS } from '../../constants';
15
+ import { SearchIcon, ClearIcon, TrashIcon, SortArrowIcon, FilterIcon, ChevronIcon, CheckIcon, CircleCheckIcon, CircleXIcon, CircleAlertIcon, LayersIcon, HeaderPauseIcon, } from '../NetworkIcons';
16
+ const STATUS_META = {
17
+ ALL: { color: AppColors.grayText, Icon: LayersIcon },
18
+ '2xx': { color: AppColors.greenColor, Icon: CircleCheckIcon },
19
+ '3xx': { color: AppColors.warningIconGold, Icon: CircleAlertIcon },
20
+ '4xx': { color: AppColors.darkOrange, Icon: CircleAlertIcon },
21
+ '5xx': { color: AppColors.errorColor, Icon: CircleXIcon },
22
+ Failed: { color: AppColors.errorColor, Icon: CircleXIcon },
23
+ };
24
+ const FilterChip = ({ label, color, Icon, badge, active, onPress, }) => {
25
+ const iconColor = active ? color : AppColors.grayTextWeak;
26
+ return (<TouchableScale style={styles.statusFilterWrap} onPress={onPress} hitSlop={10}>
27
+ <View style={[
28
+ styles.statusFilterChip,
29
+ active && {
30
+ borderColor: color,
31
+ backgroundColor: `${color}12`,
32
+ },
33
+ ]}>
34
+ <View style={[
35
+ styles.filterCheckbox,
36
+ active && [
37
+ styles.filterCheckboxActive,
38
+ { backgroundColor: color },
39
+ ],
40
+ ]}>
41
+ {active && (<CheckIcon color={AppColors.white} size={10}/>)}
42
+ </View>
43
+ {badge != null ? (<View style={[
44
+ styles.methodBadgeMini,
45
+ { backgroundColor: badge },
46
+ ]}/>) : (Icon && (<View style={styles.filterChipIcon}>
47
+ <Icon color={iconColor} size={13}/>
48
+ </View>))}
49
+ <Text style={[
50
+ styles.statusFilterText,
51
+ active && { color, fontFamily: AppFonts.interBold },
52
+ ]}>
53
+ {label}
54
+ </Text>
55
+ </View>
56
+ </TouchableScale>);
57
+ };
58
+ const NetworkTab = () => {
59
+ 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();
60
+ const filtersAccordion = useAccordion(false, 300, 260);
61
+ const apisListRef = useRef(null);
62
+ const renderItem = useCallback(({ item, index }) => {
63
+ if (item.type === 'header') {
64
+ return (<AnimatedEntrance index={index} distance={8}>
65
+ <DomainHeader pageName={item.pageName} color={item.color} stats={item.stats} activeFilters={item.activeFilters} onToggleFilter={toggleSectionFilter} isCollapsed={item.isCollapsed} onToggleCollapse={toggleSectionCollapse} isFirst={item.isFirst} timestamp={item.timestamp}/>
66
+ </AnimatedEntrance>);
67
+ }
68
+ const { log, isLast, color } = item;
69
+ return (<AnimatedEntrance index={index} distance={8} style={styles.treeNodeRow}>
70
+ <View style={styles.treeLines}>
71
+ <View style={[
72
+ styles.modernTreeLine,
73
+ { borderColor: color },
74
+ isLast && styles.modernTreeLineLast,
75
+ ]}/>
76
+ {!isLast && (<View style={[styles.modernTreeBranch, { borderColor: color }]}/>)}
77
+ </View>
78
+ <View style={styles.treeCardWrapper}>
79
+ <LogCard item={log} isSelected={selectedLogs.has(log.id)} onToggleSelect={toggleSelect} onPress={() => {
80
+ animateNextLayout();
81
+ setSelected(log);
82
+ }} timelineMinStart={minStart} timelineTotalRange={totalRange} isNew={newLogIds.has(log.id)} searchStr={search}/>
83
+ </View>
84
+ </AnimatedEntrance>);
85
+ }, [
86
+ minStart,
87
+ totalRange,
88
+ newLogIds,
89
+ selectedLogs,
90
+ toggleSelect,
91
+ search,
92
+ toggleSectionFilter,
93
+ toggleSectionCollapse,
94
+ setSelected,
95
+ ]);
96
+ return (<View style={{ flex: 1 }}>
97
+ <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 }}>
98
+ <View style={styles.toolbarRow}>
99
+ <View style={styles.searchContainer}>
100
+ <SearchIcon color={AppColors.grayTextWeak} size={16}/>
101
+ <TextInput placeholder="Search endpoints..." placeholderTextColor={AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={styles.searchInput} autoCorrect={false} autoCapitalize="none"/>
102
+ {search.length > 0 && (<Pressable onPress={() => setSearch('')} hitSlop={10} style={styles.clearBtn}>
103
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
104
+ </Pressable>)}
105
+ </View>
106
+
107
+ <View style={styles.toolbarRight}>
108
+ <TouchableScale style={[
109
+ styles.toolbarBtn,
110
+ isNetworkPaused && {
111
+ borderColor: `${AppColors.darkOrange}50`,
112
+ backgroundColor: `${AppColors.darkOrange}18`,
113
+ },
114
+ ]} onPress={() => setIsNetworkPaused(p => !p)} hitSlop={6}>
115
+ <HeaderPauseIcon isPaused={isNetworkPaused} color={isNetworkPaused
116
+ ? AppColors.darkOrange
117
+ : AppColors.grayTextStrong} size={16}/>
118
+ </TouchableScale>
119
+
120
+ <TouchableScale style={[
121
+ styles.toolbarBtn,
122
+ {
123
+ borderColor: `${AppColors.errorColor}38`,
124
+ backgroundColor: `${AppColors.errorColor}0F`,
125
+ },
126
+ ]} onPress={handleDelete} hitSlop={6}>
127
+ <TrashIcon color={AppColors.errorColor} size={15}/>
128
+ {selectedLogs.size > 0 && (<View style={styles.trashBadge}>
129
+ <Text style={styles.trashBadgeText}>
130
+ {selectedLogs.size}
131
+ </Text>
132
+ </View>)}
133
+ </TouchableScale>
134
+
135
+ <TouchableScale style={styles.toolbarBtn} onPress={() => setSortOrder(o => o === 'newest' ? 'oldest' : 'newest')} hitSlop={10}>
136
+ <SortArrowIcon direction={sortOrder === 'newest' ? 'down' : 'up'} color={AppColors.grayTextStrong} size={18}/>
137
+ </TouchableScale>
138
+
139
+ <TouchableScale style={[
140
+ styles.toolbarBtn,
141
+ filtersAccordion.isOpen &&
142
+ styles.toolbarBtnActive,
143
+ ]} onPress={filtersAccordion.toggleOpen} hitSlop={10}>
144
+ <FilterIcon color={filtersAccordion.isOpen
145
+ ? AppColors.purple
146
+ : AppColors.grayTextStrong} size={18}/>
147
+ </TouchableScale>
148
+ </View>
149
+ </View>
150
+
151
+ <Animated.View style={[
152
+ filtersAccordion.bodyStyle,
153
+ { overflow: 'hidden' },
154
+ ]}>
155
+ <View style={styles.filtersContainer}>
156
+ <Text style={styles.filtersHeading}>
157
+ STATUS
158
+ </Text>
159
+ <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.statusRowContent}>
160
+ {STATUS_FILTERS.map(filter => {
161
+ const isAll = filter === 'ALL';
162
+ const active = isAll
163
+ ? statusFilters.size === 0
164
+ : statusFilters.has(filter);
165
+ const meta = STATUS_META[filter] ?? {
166
+ color: AppColors.grayText,
167
+ Icon: LayersIcon,
168
+ };
169
+ return (<FilterChip key={filter} label={filter} color={meta.color} Icon={meta.Icon} active={active} onPress={() => {
170
+ if (isAll) {
171
+ setStatusFilters(new Set());
172
+ }
173
+ else {
174
+ setStatusFilters(prev => {
175
+ const next = new Set(prev);
176
+ next.has(filter)
177
+ ? next.delete(filter)
178
+ : next.add(filter);
179
+ return next;
180
+ });
181
+ }
182
+ }}/>);
183
+ })}
184
+ </ScrollView>
185
+
186
+ <Text style={[
187
+ styles.filtersHeading,
188
+ { marginTop: 16 },
189
+ ]}>
190
+ METHOD
191
+ </Text>
192
+ <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.statusRowContent}>
193
+ {availableMethods.map(filter => {
194
+ const isAll = filter === 'ALL';
195
+ const active = isAll
196
+ ? methodFilters.size === 0
197
+ : methodFilters.has(filter);
198
+ const methodColor = METHOD_COLORS[filter] ??
199
+ METHOD_COLORS.ALL;
200
+ return (<FilterChip key={filter} label={filter} color={methodColor} badge={methodColor} active={active} onPress={() => {
201
+ if (isAll) {
202
+ setMethodFilters(new Set());
203
+ }
204
+ else {
205
+ setMethodFilters(prev => {
206
+ const next = new Set(prev);
207
+ next.has(filter)
208
+ ? next.delete(filter)
209
+ : next.add(filter);
210
+ return next;
211
+ });
212
+ }
213
+ }}/>);
214
+ })}
215
+ </ScrollView>
216
+ </View>
217
+ </Animated.View>
218
+
219
+ {(search ||
220
+ statusFilters.size > 0 ||
221
+ methodFilters.size > 0) && (<Text style={styles.resultCount}>
222
+ {filteredLogs.length === logs.length
223
+ ? `${logs.length} requests`
224
+ : `${filteredLogs.length} of ${logs.length} filtered requests`}
225
+ </Text>)}
226
+ </View>} ListEmptyComponent={<EmptyState isSearch={search.length > 0 || statusFilters.size > 0}/>} ListFooterComponent={groupedData.length > 0 ? (<EndOfListFooter count={filteredLogs.length} label="requests"/>) : null} contentContainerStyle={[
227
+ styles.listContent,
228
+ filteredLogs.length === 0 && { flexGrow: 1 },
229
+ ]} keyboardShouldPersistTaps="handled"/>
230
+ {/* #2 — always-visible scroll-to-top, bottom right */}
231
+ <TouchableScale onPress={() => {
232
+ apisListRef.current?.scrollToOffset({
233
+ offset: 0,
234
+ animated: true,
235
+ });
236
+ }} hitSlop={10} style={styles.scrollTopBtn}>
237
+ <View style={{ transform: [{ rotate: '180deg' }] }}>
238
+ <ChevronIcon color={AppColors.white} size={18}/>
239
+ </View>
240
+ </TouchableScale>
241
+ </View>);
242
+ };
243
+ export default NetworkTab;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const ReduxTab: () => React.JSX.Element;
3
+ export default ReduxTab;
@@ -0,0 +1,70 @@
1
+ import React from 'react';
2
+ import { Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
+ import { useInspector } from './InspectorContext';
4
+ import { ReduxTreeView } from '../ReduxTreeView';
5
+ import styles from '../../styles';
6
+ import { AppColors } from '../../styles/AppColors';
7
+ import { AppFonts } from '../../styles/AppFonts';
8
+ import { TerminalIcon, ClearIcon } from '../NetworkIcons';
9
+ const ReduxTab = () => {
10
+ const { reduxState, reduxLastActionMap, reduxSearch, setReduxSearch, } = useInspector();
11
+ if (!reduxState) {
12
+ return (<View style={styles.emptyContainer}>
13
+ <View style={styles.emptyIconWrap}>
14
+ <TerminalIcon color={AppColors.purple} size={32}/>
15
+ </View>
16
+ <Text style={styles.emptyTitle}>No Redux Store</Text>
17
+ <Text style={styles.emptySub}>
18
+ To inspect Redux store, call connectReduxStore(store) at app start.
19
+ </Text>
20
+ </View>);
21
+ }
22
+ const reducerKeys = Object.keys(reduxState);
23
+ if (reducerKeys.length === 0) {
24
+ return (<View style={styles.emptyContainer}>
25
+ <Text style={styles.emptyTitle}>Empty Store</Text>
26
+ <Text style={styles.emptySub}>Connected store state is empty.</Text>
27
+ </View>);
28
+ }
29
+ const lastActionMap = reduxLastActionMap;
30
+ return (<ScrollView style={styles.detailScroll} contentContainerStyle={{ paddingBottom: 24 }}>
31
+ {/* Search Bar */}
32
+ <View style={{
33
+ flexDirection: 'row',
34
+ alignItems: 'center',
35
+ backgroundColor: AppColors.grayBackground,
36
+ borderRadius: 8,
37
+ marginHorizontal: 16,
38
+ marginTop: 16,
39
+ marginBottom: 12,
40
+ paddingHorizontal: 10,
41
+ borderWidth: 1,
42
+ borderColor: AppColors.dividerColor,
43
+ height: 36,
44
+ }}>
45
+ <TextInput placeholder="Search Redux keys or values..." placeholderTextColor={AppColors.grayTextWeak} value={reduxSearch} onChangeText={setReduxSearch} style={{
46
+ flex: 1,
47
+ fontFamily: AppFonts.interRegular,
48
+ fontSize: 12,
49
+ color: AppColors.grayTextStrong,
50
+ padding: 0,
51
+ }} autoCorrect={false} autoCapitalize="none"/>
52
+ {reduxSearch.length > 0 && (<Pressable onPress={() => setReduxSearch('')} hitSlop={10}>
53
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
54
+ </Pressable>)}
55
+ </View>
56
+
57
+ {/* Main Content Card */}
58
+ <View style={{
59
+ backgroundColor: AppColors.primaryLight,
60
+ borderRadius: 12,
61
+ borderWidth: 1,
62
+ borderColor: AppColors.grayBorderSecondary,
63
+ marginHorizontal: 16,
64
+ padding: 12,
65
+ }}>
66
+ <ReduxTreeView state={reduxState} lastActionMap={lastActionMap} search={reduxSearch}/>
67
+ </View>
68
+ </ScrollView>);
69
+ };
70
+ export default ReduxTab;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const SettingsPanel: () => React.JSX.Element;
3
+ export default SettingsPanel;