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,264 @@
1
+ import React from 'react';
2
+ import { Linking, Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
+ import Svg, { Circle } from 'react-native-svg';
4
+ import { useTranslation } from 'react-i18next';
5
+ import TouchableScale from './TouchableScale';
6
+ import CopyButton from './CopyButton';
7
+ import SectionHeader from './SectionHeader';
8
+ import JsonViewer from './JsonViewer';
9
+ import DiffViewer from './DiffViewer';
10
+ import HeadersSection from './HeadersSection';
11
+ import { GlobeIcon, ClearIcon, } from './NetworkIcons';
12
+ import { METHOD_COLORS } from '../constants';
13
+ import { AppColors } from '../styles/AppColors';
14
+ import { AppFonts } from '../styles/AppFonts';
15
+ import styles from '../styles';
16
+ import { getStatusColor, formatDisplayUrl, getFetchCommand, getCurlCommand, getSize, } from '../helpers';
17
+ export const ApiDetailView = ({ selected, apiDetailActiveTab, onSetApiDetailActiveTab, detailSearch, onSetDetailSearch, reqExpanded, onToggleReqExpanded, resExpanded, onToggleResExpanded, showReqDiff, onToggleShowReqDiff, showResDiff, onToggleShowResDiff, prevRequestData, prevResponseData, }) => {
18
+ const { t } = useTranslation();
19
+ const detailDisplayUrl = formatDisplayUrl(selected.url);
20
+ let hostStr = '';
21
+ let pathStr = detailDisplayUrl;
22
+ let queryStr = '';
23
+ try {
24
+ const qIndex = detailDisplayUrl.indexOf('?');
25
+ let cleanUrlForParsing = detailDisplayUrl;
26
+ if (qIndex !== -1) {
27
+ pathStr = detailDisplayUrl.substring(0, qIndex);
28
+ queryStr = detailDisplayUrl.substring(qIndex);
29
+ cleanUrlForParsing = pathStr;
30
+ }
31
+ const schemeIndex = cleanUrlForParsing.indexOf('://');
32
+ if (schemeIndex !== -1) {
33
+ const withoutScheme = cleanUrlForParsing.substring(schemeIndex + 3);
34
+ const firstSlash = withoutScheme.indexOf('/');
35
+ if (firstSlash !== -1) {
36
+ hostStr = withoutScheme.substring(0, firstSlash);
37
+ pathStr = withoutScheme.substring(firstSlash);
38
+ }
39
+ else {
40
+ hostStr = withoutScheme;
41
+ pathStr = '/';
42
+ }
43
+ }
44
+ }
45
+ catch (e) { }
46
+ return (<View style={{ flex: 1 }}>
47
+ {/* Non-scrollable details header */}
48
+ <View style={{ paddingHorizontal: 6, paddingTop: 4 }}>
49
+ <View style={styles.detailInfoBar}>
50
+ <View style={styles.detailInfoTop}>
51
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
52
+ <View style={[
53
+ styles.methodBadge,
54
+ {
55
+ backgroundColor: METHOD_COLORS[selected.method] ??
56
+ AppColors.grayText,
57
+ },
58
+ ]}>
59
+ <Text style={styles.methodBadgeText}>{selected.method}</Text>
60
+ </View>
61
+ {selected.status != null && (<View style={[
62
+ styles.chip,
63
+ {
64
+ backgroundColor: `${getStatusColor(selected.status)}15`,
65
+ borderColor: `${getStatusColor(selected.status)}30`,
66
+ },
67
+ ]}>
68
+ {selected.status !== 0 && (<Svg width="10" height="10" viewBox="0 0 10 10">
69
+ <Circle cx="5" cy="5" r="5" fill={getStatusColor(selected.status)}/>
70
+ </Svg>)}
71
+ <Text style={[
72
+ styles.chipText,
73
+ {
74
+ color: selected.status === 0
75
+ ? AppColors.errorColor
76
+ : getStatusColor(selected.status),
77
+ },
78
+ ]}>
79
+ {selected.status === 0
80
+ ? 'Failed'
81
+ : String(selected.status)}
82
+ </Text>
83
+ </View>)}
84
+
85
+ {selected.duration != null && (<View style={[
86
+ styles.chip,
87
+ {
88
+ backgroundColor: 'rgba(104,75,155,0.08)',
89
+ borderColor: 'rgba(104,75,155,0.18)',
90
+ },
91
+ ]}>
92
+ <Text style={[
93
+ styles.chipText,
94
+ { color: AppColors.purple },
95
+ ]}>
96
+ {selected.duration}ms
97
+ </Text>
98
+ </View>)}
99
+ </View>
100
+ <View style={styles.detailInfoRight}>
101
+ <TouchableScale style={styles.iconSquareBtn} onPress={() => Linking.openURL(detailDisplayUrl)} hitSlop={12}>
102
+ <GlobeIcon color={AppColors.grayTextWeak} size={14}/>
103
+ </TouchableScale>
104
+ <CopyButton value={getFetchCommand(selected)} label="fetch()" iconType="fetch"/>
105
+ <CopyButton value={getCurlCommand(selected)} label="cURL" iconType="terminal"/>
106
+ <CopyButton value={detailDisplayUrl} label="URL"/>
107
+ </View>
108
+ </View>
109
+
110
+ <Pressable style={{
111
+ backgroundColor: AppColors.grayBackground,
112
+ borderRadius: 10,
113
+ borderWidth: 1,
114
+ borderColor: AppColors.dividerColor,
115
+ padding: 10,
116
+ marginTop: 6,
117
+ }} onPress={() => Linking.openURL(detailDisplayUrl)}>
118
+ <View style={{
119
+ flexDirection: 'row',
120
+ alignItems: 'center',
121
+ justifyContent: 'space-between',
122
+ marginBottom: 2,
123
+ }}>
124
+ <Text style={{
125
+ fontFamily: AppFonts.interMedium,
126
+ fontSize: 10,
127
+ color: AppColors.grayTextWeak,
128
+ flex: 1,
129
+ }} numberOfLines={1}>
130
+ {hostStr || 'API Endpoint'}
131
+ </Text>
132
+ {queryStr ? (<View style={{
133
+ backgroundColor: 'rgba(104,75,155,0.08)',
134
+ paddingHorizontal: 5,
135
+ paddingVertical: 1,
136
+ borderRadius: 4,
137
+ }}>
138
+ <Text style={{
139
+ fontFamily: AppFonts.interBold,
140
+ fontSize: 8.5,
141
+ color: AppColors.purple,
142
+ }}>
143
+ Query Params
144
+ </Text>
145
+ </View>) : null}
146
+ </View>
147
+ <Text selectable={true} style={{
148
+ fontFamily: AppFonts.interBold,
149
+ fontSize: 12,
150
+ color: AppColors.primaryBlack,
151
+ marginTop: 2,
152
+ }} numberOfLines={2}>
153
+ {pathStr}
154
+ </Text>
155
+ {queryStr ? (<Text selectable={true} style={{
156
+ fontFamily: AppFonts.interRegular,
157
+ fontSize: 10,
158
+ color: AppColors.grayTextWeak,
159
+ marginTop: 4,
160
+ }} numberOfLines={1}>
161
+ {queryStr}
162
+ </Text>) : null}
163
+ </Pressable>
164
+ </View>
165
+
166
+ {/* Tab Selection */}
167
+ <ScrollView horizontal showsHorizontalScrollIndicator={false} style={styles.detailTabBar}>
168
+ {['response', 'request', 'headers', 'metadata'].map(tab => (<TouchableScale key={tab} style={[
169
+ styles.detailTab,
170
+ apiDetailActiveTab === tab && styles.detailTabActive,
171
+ ]} onPress={() => onSetApiDetailActiveTab(tab)}>
172
+ <Text style={[
173
+ styles.detailTabText,
174
+ apiDetailActiveTab === tab && styles.detailTabTextActive,
175
+ ]}>
176
+ {t(`details.tab_${tab}`)}
177
+ </Text>
178
+ </TouchableScale>))}
179
+ </ScrollView>
180
+ </View>
181
+
182
+ {/* Scrollable details content */}
183
+ <ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 6, gap: 4 }} keyboardShouldPersistTaps="handled" nestedScrollEnabled={true}>
184
+ {apiDetailActiveTab === 'metadata' && (<View style={styles.sectionContainer}>
185
+ <View style={styles.metadataCard}>
186
+ <View style={styles.metadataRow}>
187
+ <Text style={styles.metadataLabel}>{t('details.duration')}</Text>
188
+ <Text style={styles.metadataValue}>
189
+ {selected.duration != null
190
+ ? `${selected.duration} ms`
191
+ : '—'}
192
+ </Text>
193
+ </View>
194
+ <View style={styles.metadataRow}>
195
+ <Text style={styles.metadataLabel}>{t('details.timestamp')}</Text>
196
+ <Text style={styles.metadataValue}>
197
+ {new Date(selected.startTime).toLocaleString()}
198
+ </Text>
199
+ </View>
200
+ <View style={styles.metadataRow}>
201
+ <Text style={styles.metadataLabel}>{t('details.request_size')}</Text>
202
+ <Text style={styles.metadataValue}>
203
+ {getSize(selected.request)}
204
+ </Text>
205
+ </View>
206
+ <View style={styles.metadataRow}>
207
+ <Text style={styles.metadataLabel}>{t('details.response_size')}</Text>
208
+ <Text style={styles.metadataValue}>
209
+ {getSize(selected.response)}
210
+ </Text>
211
+ </View>
212
+
213
+ {selected.caller && (<View style={[
214
+ styles.metadataRow,
215
+ { flexDirection: 'column', alignItems: 'flex-start', gap: 4 },
216
+ ]}>
217
+ <Text style={styles.metadataLabel}>Caller Stack</Text>
218
+ <Text style={[styles.metadataValue, { fontSize: 11 }]} selectable>
219
+ {selected.caller}
220
+ </Text>
221
+ </View>)}
222
+ </View>
223
+ </View>)}
224
+
225
+ {apiDetailActiveTab === 'headers' && (<>
226
+ <HeadersSection title="Response Headers" headers={selected.responseHeaders} search={detailSearch}/>
227
+ <HeadersSection title="Request Headers" headers={selected.requestHeaders} search={detailSearch}/>
228
+ </>)}
229
+
230
+ {apiDetailActiveTab === 'request' && (<>
231
+ <View style={styles.detailSearchRow}>
232
+ <View style={styles.detailSearchBox}>
233
+ <TextInput placeholder="Search request..." placeholderTextColor={AppColors.grayTextWeak} value={detailSearch} onChangeText={onSetDetailSearch} style={styles.detailSearchInput} autoCorrect={false} autoCapitalize="none"/>
234
+ {detailSearch.length > 0 && (<Pressable onPress={() => onSetDetailSearch('')} hitSlop={10} style={{ padding: 8 }}>
235
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
236
+ </Pressable>)}
237
+ </View>
238
+ </View>
239
+
240
+ <View style={styles.sectionContainer}>
241
+ <SectionHeader title="Request Payload" value={selected.request} expanded={reqExpanded} onToggleExpand={onToggleReqExpanded} showDiff={prevRequestData != null} isDiffing={showReqDiff} onToggleDiff={onToggleShowReqDiff}/>
242
+ {showReqDiff ? (<DiffViewer oldData={prevRequestData} newData={selected.request} forceOpen={reqExpanded}/>) : (<JsonViewer data={selected.request} search={detailSearch} forceOpen={reqExpanded} wrap/>)}
243
+ </View>
244
+ </>)}
245
+
246
+ {apiDetailActiveTab === 'response' && (<>
247
+ <View style={styles.detailSearchRow}>
248
+ <View style={styles.detailSearchBox}>
249
+ <TextInput placeholder="Search response..." placeholderTextColor={AppColors.grayTextWeak} value={detailSearch} onChangeText={onSetDetailSearch} style={styles.detailSearchInput} autoCorrect={false} autoCapitalize="none"/>
250
+ {detailSearch.length > 0 && (<Pressable onPress={() => onSetDetailSearch('')} hitSlop={10} style={{ padding: 8 }}>
251
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
252
+ </Pressable>)}
253
+ </View>
254
+ </View>
255
+
256
+ <View style={styles.sectionContainer}>
257
+ <SectionHeader title="Response" value={selected.response} expanded={resExpanded} onToggleExpand={onToggleResExpanded} showDiff={prevResponseData != null} isDiffing={showResDiff} onToggleDiff={onToggleShowResDiff}/>
258
+ {showResDiff ? (<DiffViewer oldData={prevResponseData} newData={selected.response} forceOpen={resExpanded}/>) : (<JsonViewer data={selected.response} search={detailSearch} forceOpen={resExpanded} wrap/>)}
259
+ </View>
260
+ </>)}
261
+ </ScrollView>
262
+ </View>);
263
+ };
264
+ export default ApiDetailView;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { FlatList } from 'react-native';
3
+ import { NetworkLog, StatusFilter, Method, SortOrder, GroupedListItem, LocalFilter } from '../types';
4
+ interface ApisTabViewProps {
5
+ search: string;
6
+ onSetSearch: (val: string) => void;
7
+ sortOrder: SortOrder;
8
+ onToggleSortOrder: () => void;
9
+ statusFilters: Set<StatusFilter>;
10
+ onToggleStatusFilter: (filter: StatusFilter) => void;
11
+ methodFilters: Set<Method>;
12
+ onToggleMethodFilter: (method: Method) => void;
13
+ availableMethods: Method[];
14
+ sectionFilters: Record<string, Set<LocalFilter>>;
15
+ onToggleSectionFilter: (section: string, filter: LocalFilter) => void;
16
+ groupByDomain: boolean;
17
+ onToggleGroupByDomain: () => void;
18
+ collapsedDomains: Set<string>;
19
+ onToggleCollapseDomain: (domain: string) => void;
20
+ onDeleteLogs: () => void;
21
+ selectedLogs: Set<number>;
22
+ onToggleSelectLog: (id: number) => void;
23
+ filteredLogs: NetworkLog[];
24
+ groupedListItems: GroupedListItem[];
25
+ onSelectLog: (log: NetworkLog) => void;
26
+ apisListRef: React.RefObject<FlatList<any> | null>;
27
+ logCounts: {
28
+ total: number;
29
+ filtered: number;
30
+ };
31
+ }
32
+ export declare const ApisTabView: React.FC<ApisTabViewProps>;
33
+ export default ApisTabView;
@@ -0,0 +1,196 @@
1
+ import React from 'react';
2
+ import { FlatList, Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
+ import Svg, { Circle } from 'react-native-svg';
4
+ import { useTranslation } from 'react-i18next';
5
+ import TouchableScale from './TouchableScale';
6
+ import LogCard from './LogCard';
7
+ import DomainHeader from './DomainHeader';
8
+ import EmptyState from './EmptyState';
9
+ import AnimatedEntrance from './AnimatedEntrance';
10
+ import { SearchIcon, ClearIcon, SortArrowIcon, FilterIcon, WipeIcon, ChevronIcon, } from './NetworkIcons';
11
+ import { STATUS_FILTERS, METHOD_COLORS } from '../constants';
12
+ import { getDomainColor } from '../helpers';
13
+ import { AppColors } from '../styles/AppColors';
14
+ import { AppFonts } from '../styles/AppFonts';
15
+ import styles from '../styles';
16
+ export const ApisTabView = React.memo(({ search, onSetSearch, sortOrder, onToggleSortOrder, statusFilters, onToggleStatusFilter, methodFilters, onToggleMethodFilter, availableMethods, sectionFilters, onToggleSectionFilter, groupByDomain, onToggleGroupByDomain, collapsedDomains, onToggleCollapseDomain, onDeleteLogs, selectedLogs, onToggleSelectLog, filteredLogs, groupedListItems, onSelectLog, apisListRef, logCounts, }) => {
17
+ const { t } = useTranslation();
18
+ const isSearchOrFilter = search.length > 0 || statusFilters.size > 0 || methodFilters.size > 0;
19
+ const renderItem = React.useCallback(({ item, index }) => {
20
+ if ('type' in item && item.type === 'header') {
21
+ const isCollapsed = collapsedDomains.has(item.domain);
22
+ const secFilter = sectionFilters[item.domain] ?? new Set();
23
+ return (<DomainHeader domain={item.domain} count={item.count} color={getDomainColor(item.domain)} isCollapsed={isCollapsed} onToggle={() => onToggleCollapseDomain(item.domain)} activeFilters={secFilter} onToggleFilter={f => onToggleSectionFilter(item.domain, f)} has2xx={item.has2xx} has4xx={item.has4xx} has5xx={item.has5xx}/>);
24
+ }
25
+ const log = item;
26
+ return (<AnimatedEntrance index={index} distance={8}>
27
+ <LogCard item={log} onPress={() => onSelectLog(log)} isSelected={selectedLogs.has(log.id)} onSelect={() => onToggleSelectLog(log.id)} searchStr={search}/>
28
+ </AnimatedEntrance>);
29
+ }, [
30
+ collapsedDomains,
31
+ onToggleCollapseDomain,
32
+ sectionFilters,
33
+ onToggleSectionFilter,
34
+ onSelectLog,
35
+ selectedLogs,
36
+ onToggleSelectLog,
37
+ search,
38
+ ]);
39
+ return (<View style={{ flex: 1 }}>
40
+ {/* Search and Filters Toolbar */}
41
+ <View style={{
42
+ backgroundColor: AppColors.white,
43
+ borderBottomWidth: 1,
44
+ borderBottomColor: AppColors.dividerColor,
45
+ paddingBottom: 6,
46
+ }}>
47
+ <View style={[styles.toolbarRow, { marginTop: 12, marginBottom: 8 }]}>
48
+ <View style={styles.searchContainer}>
49
+ <SearchIcon color={AppColors.grayTextWeak} size={16}/>
50
+ <TextInput placeholder={t('search.apis_placeholder')} placeholderTextColor={AppColors.grayTextWeak} value={search} onChangeText={onSetSearch} style={styles.searchInput} autoCorrect={false} autoCapitalize="none"/>
51
+ {search.length > 0 && (<Pressable onPress={() => onSetSearch('')} hitSlop={10} style={styles.clearBtn}>
52
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
53
+ </Pressable>)}
54
+ </View>
55
+
56
+ <View style={styles.toolbarRight}>
57
+ <TouchableScale style={styles.toolbarBtn} onPress={onToggleSortOrder} hitSlop={10}>
58
+ <SortArrowIcon color={AppColors.grayTextStrong} size={18} direction={sortOrder === 'newest' ? 'down' : 'up'}/>
59
+ </TouchableScale>
60
+ <TouchableScale style={[
61
+ styles.toolbarBtn,
62
+ {
63
+ borderColor: 'rgba(255,46,87,0.22)',
64
+ backgroundColor: 'rgba(255,46,87,0.06)',
65
+ },
66
+ ]} onPress={onDeleteLogs} hitSlop={6}>
67
+ <WipeIcon color={AppColors.errorColor} size={15}/>
68
+ </TouchableScale>
69
+ </View>
70
+ </View>
71
+
72
+ {/* Filter Chips Scroll View */}
73
+ <ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ marginVertical: 4, maxHeight: 46 }} contentContainerStyle={{
74
+ paddingHorizontal: 16,
75
+ paddingBottom: 4,
76
+ flexDirection: 'row',
77
+ alignItems: 'center',
78
+ gap: 8,
79
+ }}>
80
+ <TouchableScale onPress={onToggleGroupByDomain}>
81
+ <View style={[
82
+ styles.statusFilterChip,
83
+ groupByDomain && {
84
+ borderColor: AppColors.purple,
85
+ backgroundColor: 'rgba(107, 78, 255, 0.08)',
86
+ },
87
+ ]}>
88
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
89
+ <FilterIcon size={12} color={groupByDomain ? AppColors.purple : AppColors.grayTextStrong}/>
90
+ <Text style={[
91
+ styles.statusFilterText,
92
+ groupByDomain && {
93
+ color: AppColors.purple,
94
+ fontFamily: AppFonts.interBold,
95
+ },
96
+ ]}>
97
+ {t('filters.group_by_domain')}
98
+ </Text>
99
+ </View>
100
+ </View>
101
+ </TouchableScale>
102
+
103
+ {/* Status Filter Chips */}
104
+ {STATUS_FILTERS.map(f => {
105
+ const active = statusFilters.has(f);
106
+ const badgeColor = f === '2xx'
107
+ ? AppColors.greenColor
108
+ : f === '3xx'
109
+ ? AppColors.skyBlue
110
+ : f === '4xx'
111
+ ? AppColors.lightOrange
112
+ : f === '5xx'
113
+ ? AppColors.errorColor
114
+ : AppColors.grayText;
115
+ return (<TouchableScale key={f} onPress={() => onToggleStatusFilter(f)}>
116
+ <View style={[
117
+ styles.statusFilterChip,
118
+ active && {
119
+ borderColor: badgeColor,
120
+ backgroundColor: `${badgeColor}15`,
121
+ },
122
+ ]}>
123
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
124
+ <Svg width="8" height="8" viewBox="0 0 8 8">
125
+ <Circle cx="4" cy="4" r="4" fill={active ? badgeColor : AppColors.grayTextWeak}/>
126
+ </Svg>
127
+ <Text style={[
128
+ styles.statusFilterText,
129
+ active && {
130
+ color: badgeColor,
131
+ fontFamily: AppFonts.interBold,
132
+ },
133
+ ]}>
134
+ {f}
135
+ </Text>
136
+ </View>
137
+ </View>
138
+ </TouchableScale>);
139
+ })}
140
+
141
+ {/* Method Filter Chips */}
142
+ {availableMethods.map(method => {
143
+ const active = methodFilters.has(method);
144
+ const mColor = METHOD_COLORS[method] ?? AppColors.purple;
145
+ return (<TouchableScale key={method} onPress={() => onToggleMethodFilter(method)}>
146
+ <View style={[
147
+ styles.statusFilterChip,
148
+ active && {
149
+ borderColor: mColor,
150
+ backgroundColor: `${mColor}15`,
151
+ },
152
+ ]}>
153
+ <Text style={[
154
+ styles.statusFilterText,
155
+ active && {
156
+ color: mColor,
157
+ fontFamily: AppFonts.interBold,
158
+ },
159
+ ]}>
160
+ {method}
161
+ </Text>
162
+ </View>
163
+ </TouchableScale>);
164
+ })}
165
+ </ScrollView>
166
+ </View>
167
+
168
+ {/* Main List */}
169
+ <FlatList ref={apisListRef} data={groupByDomain ? groupedListItems : filteredLogs} keyExtractor={(item, index) => 'id' in item && item.id != null
170
+ ? item.id.toString()
171
+ : 'domain' in item
172
+ ? `domain-${item.domain}`
173
+ : index.toString()} ListHeaderComponent={<Text style={[styles.resultCount, { marginBottom: 4, marginTop: 12 }]}>
174
+ {t('filters.showing_requests', {
175
+ filtered: logCounts.filtered,
176
+ total: logCounts.total,
177
+ })}
178
+ </Text>} renderItem={renderItem} initialNumToRender={15} maxToRenderPerBatch={15} windowSize={7} removeClippedSubviews={true} ListEmptyComponent={<EmptyState isSearch={isSearchOrFilter}/>} contentContainerStyle={[
179
+ styles.listContent,
180
+ filteredLogs.length === 0 && { flexGrow: 1 },
181
+ ]} keyboardShouldPersistTaps="handled"/>
182
+
183
+ {/* Scroll to Top Button */}
184
+ <TouchableScale onPress={() => {
185
+ apisListRef.current?.scrollToOffset({
186
+ offset: 0,
187
+ animated: true,
188
+ });
189
+ }} hitSlop={10} style={styles.scrollTopBtn}>
190
+ <View style={{ transform: [{ rotate: '180deg' }] }}>
191
+ <ChevronIcon color={AppColors.white} size={18}/>
192
+ </View>
193
+ </TouchableScale>
194
+ </View>);
195
+ });
196
+ export default ApisTabView;
@@ -1,8 +1,4 @@
1
1
  import React from 'react';
2
- interface CodeSnippetProps {
3
- code: string;
4
- language: 'html' | 'css' | 'javascript';
5
- search?: string;
6
- }
2
+ import { CodeSnippetProps } from '../types';
7
3
  declare const CodeSnippet: React.FC<CodeSnippetProps>;
8
4
  export default CodeSnippet;