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