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,9 @@
1
+ import React from 'react';
2
+ import { ConsoleLog } from '../types';
3
+ interface ConsoleLogDetailViewProps {
4
+ selectedConsoleLog: ConsoleLog;
5
+ detailSearch: string;
6
+ onSetDetailSearch: (search: string) => void;
7
+ }
8
+ export declare const ConsoleLogDetailView: React.FC<ConsoleLogDetailViewProps>;
9
+ export default ConsoleLogDetailView;
@@ -0,0 +1,271 @@
1
+ import React from 'react';
2
+ import { Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
+ import { useTranslation } from 'react-i18next';
4
+ import CopyButton from './CopyButton';
5
+ import HighlightText from './HighlightText';
6
+ import JsonViewer from './JsonViewer';
7
+ import { SearchIcon, ClearIcon, } from './NetworkIcons';
8
+ import { AppColors } from '../styles/AppColors';
9
+ import { AppFonts } from '../styles/AppFonts';
10
+ import styles from '../styles';
11
+ import { getJsonContent } from '../helpers';
12
+ export const ConsoleLogDetailView = ({ selectedConsoleLog, detailSearch, onSetDetailSearch, }) => {
13
+ const { t } = useTranslation();
14
+ const jsonContent = getJsonContent(selectedConsoleLog.message);
15
+ const isAnalyticsError = selectedConsoleLog.message
16
+ .toLowerCase()
17
+ .includes('[analytics error]');
18
+ const isUserLog = selectedConsoleLog.sourceMethod === 'log';
19
+ const getLogColors = () => {
20
+ if (isAnalyticsError) {
21
+ return {
22
+ badgeBg: `${AppColors.skyBlue}15`,
23
+ badgeText: AppColors.skyBlue,
24
+ label: 'ERROR',
25
+ };
26
+ }
27
+ switch (selectedConsoleLog.type) {
28
+ case 'error':
29
+ return {
30
+ badgeBg: `${AppColors.errorColor}15`,
31
+ badgeText: AppColors.errorColor,
32
+ label: 'ERROR',
33
+ };
34
+ case 'warn':
35
+ return {
36
+ badgeBg: `${AppColors.lightOrange}15`,
37
+ badgeText: AppColors.darkOrange || AppColors.lightOrange,
38
+ label: 'WARN',
39
+ };
40
+ default:
41
+ if (isUserLog) {
42
+ return {
43
+ badgeBg: AppColors.slateBorder,
44
+ badgeText: AppColors.slateText,
45
+ label: 'INFO',
46
+ };
47
+ }
48
+ return {
49
+ badgeBg: `${AppColors.purple}15`,
50
+ badgeText: AppColors.purple,
51
+ label: 'INFO',
52
+ };
53
+ }
54
+ };
55
+ const colors = getLogColors();
56
+ return (<ScrollView style={{ flex: 1, backgroundColor: AppColors.grayBackground }} contentContainerStyle={{ padding: 16, gap: 12 }} nestedScrollEnabled={true}>
57
+ {/* 1. Header Info Card */}
58
+ <View style={{
59
+ backgroundColor: AppColors.primaryLight,
60
+ borderRadius: 12,
61
+ borderWidth: 1,
62
+ borderColor: AppColors.grayBorderSecondary,
63
+ padding: 14,
64
+ gap: 12,
65
+ }}>
66
+ <View style={{
67
+ flexDirection: 'row',
68
+ justifyContent: 'space-between',
69
+ alignItems: 'center',
70
+ flexWrap: 'wrap',
71
+ gap: 8,
72
+ }}>
73
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
74
+ <View style={[styles.badge, { backgroundColor: colors.badgeBg }]}>
75
+ <Text style={[styles.badgeText, { color: colors.badgeText }]}>
76
+ {colors.label}
77
+ </Text>
78
+ </View>
79
+ <View style={[
80
+ styles.badge,
81
+ {
82
+ backgroundColor: 'rgba(107, 78, 255, 0.08)',
83
+ borderColor: 'rgba(107, 78, 255, 0.2)',
84
+ borderWidth: 1,
85
+ },
86
+ ]}>
87
+ <Text style={[styles.badgeText, { color: AppColors.indigoAccent }]}>
88
+ console.
89
+ {selectedConsoleLog.sourceMethod ||
90
+ selectedConsoleLog.type ||
91
+ 'log'}
92
+ </Text>
93
+ </View>
94
+ {jsonContent && (<View style={[
95
+ styles.badge,
96
+ {
97
+ backgroundColor: 'rgba(13, 148, 136, 0.08)',
98
+ borderColor: 'rgba(13, 148, 136, 0.18)',
99
+ borderWidth: 1,
100
+ },
101
+ ]}>
102
+ <Text style={[styles.badgeText, { color: AppColors.teal }]}>
103
+ {Array.isArray(jsonContent.data)
104
+ ? `Array[${jsonContent.data.length}]`
105
+ : `Object{${Object.keys(jsonContent.data ?? {}).length}}`}
106
+ </Text>
107
+ </View>)}
108
+ {selectedConsoleLog.duplicateCount != null &&
109
+ selectedConsoleLog.duplicateCount > 1 && (<View style={[
110
+ styles.badge,
111
+ {
112
+ backgroundColor: 'rgba(104, 75, 155, 0.1)',
113
+ borderColor: 'rgba(104, 75, 155, 0.25)',
114
+ borderWidth: 1,
115
+ },
116
+ ]}>
117
+ <Text style={[
118
+ styles.badgeText,
119
+ { color: AppColors.purple, fontWeight: '700' },
120
+ ]}>
121
+ ×{selectedConsoleLog.duplicateCount}
122
+ </Text>
123
+ </View>)}
124
+ </View>
125
+
126
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
127
+ <Text style={{
128
+ fontFamily: AppFonts.interBold,
129
+ fontSize: 12,
130
+ color: AppColors.grayTextWeak,
131
+ }}>
132
+ #{selectedConsoleLog.id + 1}
133
+ </Text>
134
+ <CopyButton value={selectedConsoleLog.message} label="Log message"/>
135
+ </View>
136
+ </View>
137
+
138
+ <View style={{
139
+ flexDirection: 'row',
140
+ justifyContent: 'space-between',
141
+ alignItems: 'center',
142
+ borderTopWidth: 1,
143
+ borderTopColor: AppColors.dividerColor,
144
+ paddingTop: 10,
145
+ }}>
146
+ <Text style={{
147
+ fontFamily: AppFonts.interMedium,
148
+ fontSize: 12,
149
+ color: AppColors.grayText,
150
+ }}>
151
+ {t('details.captured_at')}
152
+ <Text style={{
153
+ fontFamily: AppFonts.interBold,
154
+ color: AppColors.primaryBlack,
155
+ }}>
156
+ {new Date(selectedConsoleLog.timestamp).toLocaleTimeString()}
157
+ </Text>
158
+ </Text>
159
+ <Text style={{
160
+ fontFamily: AppFonts.interRegular,
161
+ fontSize: 11,
162
+ color: AppColors.grayTextWeak,
163
+ }}>
164
+ {selectedConsoleLog.message.length} {t('details.chars')}
165
+ </Text>
166
+ </View>
167
+ </View>
168
+
169
+ {/* 2. Caller Stack Frame Card (if available) */}
170
+ {selectedConsoleLog.caller &&
171
+ selectedConsoleLog.caller !== 'Unknown' && (<View style={{
172
+ backgroundColor: AppColors.primaryLight,
173
+ borderRadius: 12,
174
+ borderWidth: 1,
175
+ borderColor: AppColors.grayBorderSecondary,
176
+ padding: 14,
177
+ gap: 8,
178
+ }}>
179
+ <View style={{
180
+ flexDirection: 'row',
181
+ justifyContent: 'space-between',
182
+ alignItems: 'center',
183
+ }}>
184
+ <Text style={{
185
+ fontFamily: AppFonts.interBold,
186
+ fontSize: 11,
187
+ color: AppColors.grayTextWeak,
188
+ letterSpacing: 0.5,
189
+ }}>
190
+ {t('details.caller_location')}
191
+ </Text>
192
+ <CopyButton value={selectedConsoleLog.caller} label="Caller location"/>
193
+ </View>
194
+ <View style={{
195
+ backgroundColor: AppColors.grayBackground,
196
+ padding: 10,
197
+ borderRadius: 8,
198
+ borderWidth: 1,
199
+ borderColor: AppColors.dividerColor,
200
+ }}>
201
+ <Text style={{
202
+ fontFamily: AppFonts.interRegular,
203
+ fontSize: 11.5,
204
+ color: AppColors.primaryBlack,
205
+ }} selectable>
206
+ {selectedConsoleLog.caller}
207
+ </Text>
208
+ </View>
209
+ </View>)}
210
+
211
+ {/* 3. Search Bar for detail page */}
212
+ <View style={styles.searchContainer}>
213
+ <SearchIcon color={AppColors.grayTextWeak} size={16}/>
214
+ <TextInput placeholder={t('search.log_details_placeholder')} placeholderTextColor={AppColors.grayTextWeak} value={detailSearch} onChangeText={onSetDetailSearch} style={styles.searchInput} autoCorrect={false} autoCapitalize="none"/>
215
+ {detailSearch.length > 0 && (<Pressable onPress={() => onSetDetailSearch('')} hitSlop={10} style={styles.clearBtn}>
216
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
217
+ </Pressable>)}
218
+ </View>
219
+
220
+ {/* 4. Log Content Card */}
221
+ <View style={{
222
+ backgroundColor: AppColors.primaryLight,
223
+ borderRadius: 12,
224
+ borderWidth: 1,
225
+ borderColor: AppColors.grayBorderSecondary,
226
+ padding: 14,
227
+ gap: 10,
228
+ }}>
229
+ <Text style={{
230
+ fontFamily: AppFonts.interBold,
231
+ fontSize: 11,
232
+ color: AppColors.grayTextWeak,
233
+ letterSpacing: 0.5,
234
+ }}>
235
+ {t('details.log_payload')}
236
+ </Text>
237
+
238
+ {jsonContent ? (<>
239
+ {jsonContent.header ? (<View style={{
240
+ padding: 10,
241
+ backgroundColor: AppColors.grayBackground,
242
+ borderRadius: 8,
243
+ borderWidth: 1,
244
+ borderColor: AppColors.dividerColor,
245
+ marginBottom: 6,
246
+ }}>
247
+ <HighlightText text={jsonContent.header} search={detailSearch} style={{
248
+ fontFamily: AppFonts.interMedium,
249
+ fontSize: 12,
250
+ color: AppColors.primaryBlack,
251
+ }} highlightStyle={styles.highlight} detectLinks={true} selectable={true}/>
252
+ </View>) : null}
253
+ <JsonViewer data={jsonContent.data} search={detailSearch} wrap={true}/>
254
+ </>) : (<View style={{
255
+ padding: 12,
256
+ backgroundColor: AppColors.grayBackground,
257
+ borderRadius: 8,
258
+ borderWidth: 1,
259
+ borderColor: AppColors.dividerColor,
260
+ }}>
261
+ <HighlightText text={selectedConsoleLog.message} search={detailSearch} style={{
262
+ fontFamily: AppFonts.interRegular,
263
+ fontSize: 12,
264
+ color: AppColors.primaryBlack,
265
+ lineHeight: 18,
266
+ }} highlightStyle={styles.highlight} detectLinks={true} selectable={true}/>
267
+ </View>)}
268
+ </View>
269
+ </ScrollView>);
270
+ };
271
+ export default ConsoleLogDetailView;
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { ConsoleLog, LocalFilter, SortOrder } from '../types';
3
+ interface ConsoleLogsTabViewProps {
4
+ logSearch: string;
5
+ onSetLogSearch: (val: string) => void;
6
+ logSortOrder: SortOrder;
7
+ onToggleSortOrder: () => void;
8
+ onDeleteLogs: () => void;
9
+ logFilters: Set<LocalFilter>;
10
+ onSetLogFilters: React.Dispatch<React.SetStateAction<Set<LocalFilter>>>;
11
+ logCounts: {
12
+ all: string;
13
+ info: string;
14
+ warn: string;
15
+ error: string;
16
+ 'user-log': string;
17
+ analytics: string;
18
+ };
19
+ visibleConsoleLogs: ConsoleLog[];
20
+ filteredConsoleLogs: ConsoleLog[];
21
+ onSelectConsoleLog: (item: ConsoleLog) => void;
22
+ }
23
+ export declare const ConsoleLogsTabView: React.FC<ConsoleLogsTabViewProps>;
24
+ export default ConsoleLogsTabView;
@@ -0,0 +1,348 @@
1
+ import React from 'react';
2
+ import { FlatList, Pressable, ScrollView, Text, TextInput, View, } from 'react-native';
3
+ import { useTranslation } from 'react-i18next';
4
+ import TouchableScale from './TouchableScale';
5
+ import { ConsoleLogCard } from './ConsoleLogCard';
6
+ import EmptyState from './EmptyState';
7
+ import AnimatedEntrance from './AnimatedEntrance';
8
+ import { SearchIcon, ClearIcon, SortArrowIcon, WipeIcon, LayersIcon, UserIcon, AnalyticsIcon, InfoCircleIcon, WarningTriangleIcon, ErrorCircleIcon, } from './NetworkIcons';
9
+ import { AppColors } from '../styles/AppColors';
10
+ import { AppFonts } from '../styles/AppFonts';
11
+ import styles from '../styles';
12
+ export const ConsoleLogsTabView = React.memo(({ logSearch, onSetLogSearch, logSortOrder, onToggleSortOrder, onDeleteLogs, logFilters, onSetLogFilters, logCounts, visibleConsoleLogs, filteredConsoleLogs, onSelectConsoleLog, }) => {
13
+ const { t } = useTranslation();
14
+ const renderItem = React.useCallback(({ item, index }) => (<AnimatedEntrance index={index} distance={8}>
15
+ <ConsoleLogCard item={item} searchStr={logSearch} onPress={() => onSelectConsoleLog(item)}/>
16
+ </AnimatedEntrance>), [logSearch, onSelectConsoleLog]);
17
+ const keyExtractor = React.useCallback((item) => String(item.id), []);
18
+ return (<View style={{ flex: 1 }}>
19
+ <View style={{
20
+ backgroundColor: AppColors.white,
21
+ borderBottomWidth: 1,
22
+ borderBottomColor: AppColors.dividerColor,
23
+ paddingBottom: 6,
24
+ }}>
25
+ <View style={[
26
+ styles.toolbarRow,
27
+ { marginTop: 12, marginBottom: 8 },
28
+ ]}>
29
+ <View style={styles.searchContainer}>
30
+ <SearchIcon color={AppColors.grayTextWeak} size={16}/>
31
+ <TextInput placeholder={t('search.logs_placeholder')} placeholderTextColor={AppColors.grayTextWeak} value={logSearch} onChangeText={onSetLogSearch} style={styles.searchInput} autoCorrect={false} autoCapitalize="none"/>
32
+ {logSearch.length > 0 && (<Pressable onPress={() => onSetLogSearch('')} hitSlop={10} style={styles.clearBtn}>
33
+ <ClearIcon color={AppColors.grayTextWeak} size={14}/>
34
+ </Pressable>)}
35
+ </View>
36
+
37
+ <View style={styles.toolbarRight}>
38
+ <TouchableScale style={styles.toolbarBtn} onPress={onToggleSortOrder} hitSlop={10}>
39
+ <SortArrowIcon color={AppColors.grayTextStrong} size={18} direction={logSortOrder === 'newest' ? 'down' : 'up'}/>
40
+ </TouchableScale>
41
+ <TouchableScale style={[
42
+ styles.toolbarBtn,
43
+ {
44
+ borderColor: 'rgba(255,46,87,0.22)',
45
+ backgroundColor: 'rgba(255,46,87,0.06)',
46
+ },
47
+ ]} onPress={onDeleteLogs} hitSlop={6}>
48
+ <WipeIcon color={AppColors.errorColor} size={15}/>
49
+ </TouchableScale>
50
+ </View>
51
+ </View>
52
+
53
+ <ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ marginVertical: 4, maxHeight: 46 }} contentContainerStyle={{
54
+ paddingHorizontal: 16,
55
+ paddingBottom: 4,
56
+ flexDirection: 'row',
57
+ alignItems: 'center',
58
+ gap: 8,
59
+ }}>
60
+ {(() => {
61
+ const active = logFilters.has('all');
62
+ return (<TouchableScale onPress={() => onSetLogFilters(new Set(['all']))}>
63
+ <View style={[
64
+ styles.statusFilterChip,
65
+ active && {
66
+ borderColor: AppColors.purpleShade700,
67
+ backgroundColor: AppColors.purpleShade50,
68
+ },
69
+ ]}>
70
+ <View style={{
71
+ flexDirection: 'row',
72
+ alignItems: 'center',
73
+ gap: 5,
74
+ }}>
75
+ <LayersIcon size={12} color={active
76
+ ? AppColors.purpleShade700
77
+ : AppColors.grayTextStrong}/>
78
+ <Text numberOfLines={1} style={[
79
+ styles.statusFilterText,
80
+ active && {
81
+ color: AppColors.purpleShade700,
82
+ fontFamily: AppFonts.interBold,
83
+ },
84
+ ]}>
85
+ {t('filters.all')} ({logCounts.all})
86
+ </Text>
87
+ </View>
88
+ </View>
89
+ </TouchableScale>);
90
+ })()}
91
+
92
+ {(() => {
93
+ const active = logFilters.has('user-log');
94
+ return (<TouchableScale onPress={() => {
95
+ onSetLogFilters(prev => {
96
+ const next = new Set(prev);
97
+ next.delete('all');
98
+ next.has('user-log')
99
+ ? next.delete('user-log')
100
+ : next.add('user-log');
101
+ if (next.size === 0)
102
+ next.add('all');
103
+ return next;
104
+ });
105
+ }}>
106
+ <View style={[
107
+ styles.statusFilterChip,
108
+ active && {
109
+ borderColor: AppColors.slateSubtle,
110
+ backgroundColor: AppColors.slateLight,
111
+ },
112
+ ]}>
113
+ <View style={{
114
+ flexDirection: 'row',
115
+ alignItems: 'center',
116
+ gap: 5,
117
+ }}>
118
+ <UserIcon size={12} color={active ? AppColors.slateText : AppColors.grayTextStrong}/>
119
+ <Text numberOfLines={1} style={[
120
+ styles.statusFilterText,
121
+ active && {
122
+ color: AppColors.slateText,
123
+ fontFamily: AppFonts.interBold,
124
+ },
125
+ ]}>
126
+ {t('filters.user_log')} ({logCounts['user-log']})
127
+ </Text>
128
+ </View>
129
+ </View>
130
+ </TouchableScale>);
131
+ })()}
132
+
133
+ {(() => {
134
+ const active = logFilters.has('info');
135
+ return (<TouchableScale onPress={() => {
136
+ onSetLogFilters(prev => {
137
+ const next = new Set(prev);
138
+ next.delete('all');
139
+ next.has('info')
140
+ ? next.delete('info')
141
+ : next.add('info');
142
+ if (next.size === 0)
143
+ next.add('all');
144
+ return next;
145
+ });
146
+ }}>
147
+ <View style={[
148
+ styles.statusFilterChip,
149
+ active && {
150
+ borderColor: AppColors.skyBlue,
151
+ backgroundColor: `${AppColors.skyBlue}15`,
152
+ },
153
+ ]}>
154
+ <View style={{
155
+ flexDirection: 'row',
156
+ alignItems: 'center',
157
+ gap: 5,
158
+ }}>
159
+ <InfoCircleIcon size={12} color={active
160
+ ? AppColors.skyBlue
161
+ : AppColors.grayTextStrong}/>
162
+ <Text numberOfLines={1} style={[
163
+ styles.statusFilterText,
164
+ active && {
165
+ color: AppColors.skyBlue,
166
+ fontFamily: AppFonts.interBold,
167
+ },
168
+ ]}>
169
+ {t('filters.info')} ({logCounts.info})
170
+ </Text>
171
+ </View>
172
+ </View>
173
+ </TouchableScale>);
174
+ })()}
175
+
176
+ {(() => {
177
+ const active = logFilters.has('warn');
178
+ return (<TouchableScale onPress={() => {
179
+ onSetLogFilters(prev => {
180
+ const next = new Set(prev);
181
+ next.delete('all');
182
+ next.has('warn')
183
+ ? next.delete('warn')
184
+ : next.add('warn');
185
+ if (next.size === 0)
186
+ next.add('all');
187
+ return next;
188
+ });
189
+ }}>
190
+ <View style={[
191
+ styles.statusFilterChip,
192
+ active && {
193
+ borderColor: AppColors.lightOrange,
194
+ backgroundColor: `${AppColors.lightOrange}15`,
195
+ },
196
+ ]}>
197
+ <View style={{
198
+ flexDirection: 'row',
199
+ alignItems: 'center',
200
+ gap: 5,
201
+ }}>
202
+ <WarningTriangleIcon size={12} color={active
203
+ ? AppColors.darkOrange
204
+ : AppColors.grayTextStrong}/>
205
+ <Text numberOfLines={1} style={[
206
+ styles.statusFilterText,
207
+ active && {
208
+ color: AppColors.darkOrange,
209
+ fontFamily: AppFonts.interBold,
210
+ },
211
+ ]}>
212
+ {t('filters.warn')} ({logCounts.warn})
213
+ </Text>
214
+ </View>
215
+ </View>
216
+ </TouchableScale>);
217
+ })()}
218
+
219
+ {(() => {
220
+ const active = logFilters.has('error');
221
+ return (<TouchableScale onPress={() => {
222
+ onSetLogFilters(prev => {
223
+ const next = new Set(prev);
224
+ next.delete('all');
225
+ next.has('error')
226
+ ? next.delete('error')
227
+ : next.add('error');
228
+ if (next.size === 0)
229
+ next.add('all');
230
+ return next;
231
+ });
232
+ }}>
233
+ <View style={[
234
+ styles.statusFilterChip,
235
+ active && {
236
+ borderColor: AppColors.errorColor,
237
+ backgroundColor: `${AppColors.errorColor}15`,
238
+ },
239
+ ]}>
240
+ <View style={{
241
+ flexDirection: 'row',
242
+ alignItems: 'center',
243
+ gap: 5,
244
+ }}>
245
+ <ErrorCircleIcon size={12} color={active
246
+ ? AppColors.errorColor
247
+ : AppColors.grayTextStrong}/>
248
+ <Text numberOfLines={1} style={[
249
+ styles.statusFilterText,
250
+ active && {
251
+ color: AppColors.errorColor,
252
+ fontFamily: AppFonts.interBold,
253
+ },
254
+ ]}>
255
+ {t('filters.error')} ({logCounts.error})
256
+ </Text>
257
+ </View>
258
+ </View>
259
+ </TouchableScale>);
260
+ })()}
261
+
262
+ {(() => {
263
+ const active = logFilters.has('analytics');
264
+ return (<TouchableScale onPress={() => {
265
+ onSetLogFilters(prev => {
266
+ const next = new Set(prev);
267
+ next.delete('all');
268
+ next.has('analytics')
269
+ ? next.delete('analytics')
270
+ : next.add('analytics');
271
+ if (next.size === 0)
272
+ next.add('all');
273
+ return next;
274
+ });
275
+ }}>
276
+ <View style={[
277
+ styles.statusFilterChip,
278
+ active && {
279
+ borderColor: AppColors.purple,
280
+ backgroundColor: `${AppColors.purple}15`,
281
+ },
282
+ ]}>
283
+ <View style={{
284
+ flexDirection: 'row',
285
+ alignItems: 'center',
286
+ gap: 5,
287
+ }}>
288
+ <AnalyticsIcon size={12} color={active
289
+ ? AppColors.purple
290
+ : AppColors.grayTextStrong}/>
291
+ <Text numberOfLines={1} style={[
292
+ styles.statusFilterText,
293
+ active && {
294
+ color: AppColors.purple,
295
+ fontFamily: AppFonts.interBold,
296
+ },
297
+ ]}>
298
+ {t('filters.analytics')} ({logCounts.analytics})
299
+ </Text>
300
+ </View>
301
+ </View>
302
+ </TouchableScale>);
303
+ })()}
304
+ </ScrollView>
305
+ </View>
306
+
307
+ <FlatList data={filteredConsoleLogs} ListHeaderComponent={(() => {
308
+ const total = visibleConsoleLogs.length;
309
+ const filtered = filteredConsoleLogs.length;
310
+ const isAllSelected = logFilters.has('all') ||
311
+ !Array.from(logFilters).some(f => f !== 'all');
312
+ if (isAllSelected) {
313
+ return (<Text style={[
314
+ styles.resultCount,
315
+ { marginBottom: 4, marginTop: 12 },
316
+ ]}>
317
+ {t('filters.showing_logs', { filtered, total })}
318
+ </Text>);
319
+ }
320
+ else {
321
+ const activeFilterNames = Array.from(logFilters)
322
+ .filter(f => f !== 'all')
323
+ .map(f => {
324
+ if (f === 'user-log')
325
+ return t('filters.user_log');
326
+ if (f === 'analytics')
327
+ return t('filters.analytics');
328
+ return (f.charAt(0).toUpperCase() +
329
+ f.slice(1));
330
+ });
331
+ return (<Text style={[
332
+ styles.resultCount,
333
+ { marginBottom: 4, marginTop: 12 },
334
+ ]}>
335
+ {t('filters.filtering_logs', {
336
+ filters: activeFilterNames.join(', '),
337
+ filtered,
338
+ total,
339
+ })}
340
+ </Text>);
341
+ }
342
+ })()} renderItem={renderItem} keyExtractor={keyExtractor} initialNumToRender={15} maxToRenderPerBatch={15} windowSize={7} removeClippedSubviews={true} ListEmptyComponent={<EmptyState isSearch={logSearch.length > 0 || logFilters.size > 0}/>} contentContainerStyle={[
343
+ styles.listContent,
344
+ filteredConsoleLogs.length === 0 && { flexGrow: 1 },
345
+ ]} keyboardShouldPersistTaps="handled"/>
346
+ </View>);
347
+ });
348
+ export default ConsoleLogsTabView;
@@ -1,3 +1,4 @@
1
+ import { useTranslation } from 'react-i18next';
1
2
  import React, { useMemo } from 'react';
2
3
  import { View, Text, ScrollView } from 'react-native';
3
4
  // Helpers
@@ -6,17 +7,18 @@ import { getDiff } from '../helpers';
6
7
  import { AppColors } from '../styles/AppColors';
7
8
  import styles from '../styles';
8
9
  const DiffViewer = React.memo(({ oldData, newData, forceOpen, }) => {
10
+ const { t } = useTranslation();
9
11
  const diffs = useMemo(() => getDiff(oldData, newData), [oldData, newData]);
10
12
  if (forceOpen === false) {
11
13
  return (<View style={styles.codeBlock}>
12
14
  <Text style={[styles.codeText, { color: AppColors.grayTextWeak }]}>
13
- {'{ Diff hidden }'}
15
+ {t('network.diffHidden')}
14
16
  </Text>
15
17
  </View>);
16
18
  }
17
19
  if (diffs.length === 0) {
18
20
  return (<View style={styles.codeBlock}>
19
- <Text style={styles.codeText}>No differences from previous API.</Text>
21
+ <Text style={styles.codeText}>{t('network.noDiff')}</Text>
20
22
  </View>);
21
23
  }
22
24
  return (<ScrollView horizontal showsHorizontalScrollIndicator={true} style={styles.codeBlockScroll}>