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,963 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const react_1 = __importStar(require("react"));
40
+ const react_i18next_1 = require("react-i18next");
41
+ const react_native_1 = require("react-native");
42
+ const InspectorContext_1 = require("./InspectorContext");
43
+ const HighlightText_1 = __importDefault(require("../HighlightText"));
44
+ const JsonViewer_1 = __importDefault(require("../JsonViewer"));
45
+ const CopyButton_1 = __importDefault(require("../CopyButton"));
46
+ const SegmentedTabs_1 = __importDefault(require("../SegmentedTabs"));
47
+ const NetworkIcons_1 = require("../NetworkIcons");
48
+ const AppColors_1 = require("../../styles/AppColors");
49
+ const AppFonts_1 = require("../../styles/AppFonts");
50
+ const styles_1 = __importDefault(require("../../styles"));
51
+ const helpers_1 = require("../../helpers");
52
+ const getRelativeTime = (timestamp) => {
53
+ const now = Date.now();
54
+ const diff = now - timestamp;
55
+ const seconds = Math.floor(diff / 1000);
56
+ const minutes = Math.floor(seconds / 60);
57
+ const hours = Math.floor(minutes / 60);
58
+ const days = Math.floor(hours / 24);
59
+ if (seconds < 60)
60
+ return `${seconds}s ago`;
61
+ if (minutes < 60)
62
+ return `${minutes}m ago`;
63
+ if (hours < 24)
64
+ return `${hours}h ago`;
65
+ return `${days}d ago`;
66
+ };
67
+ const LogDetail = () => {
68
+ const { t } = (0, react_i18next_1.useTranslation)();
69
+ const { selectedLog } = (0, InspectorContext_1.useInspector)();
70
+ const [activeTab, setActiveTab] = (0, react_1.useState)('output');
71
+ const [detailSearch, setDetailSearch] = (0, react_1.useState)('');
72
+ const [viewMode, setViewMode] = (0, react_1.useState)('pretty');
73
+ const jsonContent = (0, react_1.useMemo)(() => (selectedLog ? (0, helpers_1.getJsonContent)(selectedLog.message) : null), [selectedLog]);
74
+ const [stackViewMode, setStackViewMode] = (0, react_1.useState)('structured');
75
+ const [stackSource, setStackSource] = (0, react_1.useState)('caller');
76
+ const activeStackString = (0, react_1.useMemo)(() => {
77
+ if (!selectedLog)
78
+ return '';
79
+ if (stackSource === 'error' && selectedLog.errorStack) {
80
+ return selectedLog.errorStack;
81
+ }
82
+ return selectedLog.stack || selectedLog.caller || '';
83
+ }, [selectedLog, stackSource]);
84
+ const originFrame = (0, react_1.useMemo)(() => {
85
+ if (!selectedLog)
86
+ return null;
87
+ if (selectedLog.caller && selectedLog.caller !== 'Unknown') {
88
+ return (0, helpers_1.parseStackLine)(selectedLog.caller, true);
89
+ }
90
+ if (selectedLog.stack) {
91
+ const firstLine = selectedLog.stack
92
+ .split('\n')
93
+ .find(l => l.trim().length > 0);
94
+ if (firstLine)
95
+ return (0, helpers_1.parseStackLine)(firstLine, true);
96
+ }
97
+ return null;
98
+ }, [selectedLog]);
99
+ const parsedStackFrames = (0, react_1.useMemo)(() => {
100
+ if (!activeStackString)
101
+ return [];
102
+ return activeStackString
103
+ .split('\n')
104
+ .map(l => l.trim())
105
+ .filter(l => l.length > 0)
106
+ .map((line, idx) => (0, helpers_1.parseStackLine)(line, idx === 0));
107
+ }, [activeStackString]);
108
+ if (!selectedLog)
109
+ return null;
110
+ const isDark = AppColors_1.AppColors.primaryLight !== AppColors_1.AppColors.white;
111
+ const getTypeColors = () => {
112
+ if (selectedLog.type === 'error') {
113
+ return {
114
+ border: AppColors_1.AppColors.errorColor,
115
+ badgeBg: `${AppColors_1.AppColors.errorColor}15`,
116
+ badgeText: AppColors_1.AppColors.errorColor,
117
+ label: 'ERROR',
118
+ };
119
+ }
120
+ if (selectedLog.type === 'warn') {
121
+ return {
122
+ border: AppColors_1.AppColors.lightOrange,
123
+ badgeBg: `${AppColors_1.AppColors.lightOrange}15`,
124
+ badgeText: AppColors_1.AppColors.darkOrange || AppColors_1.AppColors.lightOrange,
125
+ label: 'WARN',
126
+ };
127
+ }
128
+ return {
129
+ border: AppColors_1.AppColors.purple,
130
+ badgeBg: `${AppColors_1.AppColors.purple}15`,
131
+ badgeText: AppColors_1.AppColors.purple,
132
+ label: 'INFO',
133
+ };
134
+ };
135
+ const typeColors = getTypeColors();
136
+ const hasMultipleArgs = selectedLog.rawArgs != null && selectedLog.rawArgs.length > 1;
137
+ const hasStack = Boolean(selectedLog.stack && selectedLog.stack.trim().length > 0);
138
+ const subTabs = [
139
+ {
140
+ key: 'output',
141
+ label: 'Output',
142
+ icon: (isActive) => (<NetworkIcons_1.TerminalIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak} size={12}/>),
143
+ },
144
+ ...(hasMultipleArgs
145
+ ? [
146
+ {
147
+ key: 'arguments',
148
+ label: `Args (${selectedLog.rawArgs?.length})`,
149
+ icon: (isActive) => (<NetworkIcons_1.RequestIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak} size={12}/>),
150
+ },
151
+ ]
152
+ : []),
153
+ ...(hasStack
154
+ ? [
155
+ {
156
+ key: 'stack',
157
+ label: 'Stack Trace',
158
+ icon: (isActive) => (<NetworkIcons_1.LayersIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak} size={12}/>),
159
+ },
160
+ ]
161
+ : []),
162
+ {
163
+ key: 'metadata',
164
+ label: 'Metadata',
165
+ icon: (isActive) => (<NetworkIcons_1.InfoCircleIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak} size={12}/>),
166
+ },
167
+ ];
168
+ return (<react_native_1.View style={{ flex: 1 }}>
169
+ {/* Enhanced details header bar */}
170
+ <react_native_1.View style={styles_1.default.detailInfoBar}>
171
+ <react_native_1.View style={{ flexDirection: 'column', gap: 10 }}>
172
+ {/* Top Row: Type badge, method, content pill & Copy button */}
173
+ <react_native_1.View style={{
174
+ flexDirection: 'row',
175
+ alignItems: 'center',
176
+ justifyContent: 'space-between',
177
+ gap: 8,
178
+ }}>
179
+ <react_native_1.View style={{
180
+ flexDirection: 'row',
181
+ alignItems: 'center',
182
+ gap: 6,
183
+ flex: 1,
184
+ flexWrap: 'wrap',
185
+ }}>
186
+ {/* Type Badge */}
187
+ <react_native_1.View style={[
188
+ styles_1.default.typeChip,
189
+ {
190
+ backgroundColor: typeColors.badgeBg,
191
+ borderWidth: 1,
192
+ borderColor: `${typeColors.border}40`,
193
+ paddingHorizontal: 8,
194
+ paddingVertical: 3,
195
+ },
196
+ ]}>
197
+ <react_native_1.View style={[
198
+ styles_1.default.typeDot,
199
+ { backgroundColor: typeColors.badgeText },
200
+ ]}/>
201
+ <react_native_1.Text style={[
202
+ styles_1.default.typeChipText,
203
+ { color: typeColors.badgeText, fontSize: 10 },
204
+ ]}>
205
+ {typeColors.label}
206
+ </react_native_1.Text>
207
+ </react_native_1.View>
208
+
209
+ {/* Method chip */}
210
+ <react_native_1.View style={[
211
+ styles_1.default.metaChip,
212
+ {
213
+ backgroundColor: `${AppColors_1.AppColors.brandPurple}12`,
214
+ borderColor: `${AppColors_1.AppColors.brandPurple}30`,
215
+ },
216
+ ]}>
217
+ <react_native_1.Text style={[
218
+ styles_1.default.metaChipText,
219
+ { color: AppColors_1.AppColors.brandPurple, fontSize: 10 },
220
+ ]}>
221
+ console.
222
+ {selectedLog.sourceMethod || selectedLog.type || 'log'}
223
+ </react_native_1.Text>
224
+ </react_native_1.View>
225
+
226
+ {/* JSON content type chip */}
227
+ {jsonContent && (<react_native_1.View style={[
228
+ styles_1.default.metaChip,
229
+ {
230
+ backgroundColor: `${AppColors_1.AppColors.teal600}12`,
231
+ borderColor: `${AppColors_1.AppColors.teal600}2B`,
232
+ },
233
+ ]}>
234
+ <react_native_1.Text style={[
235
+ styles_1.default.metaChipText,
236
+ { color: AppColors_1.AppColors.teal600, fontSize: 10 },
237
+ ]}>
238
+ {Array.isArray(jsonContent.data)
239
+ ? `Array[${jsonContent.data.length}]`
240
+ : `Object{${Object.keys(jsonContent.data).length}}`}
241
+ </react_native_1.Text>
242
+ </react_native_1.View>)}
243
+
244
+ {/* Duplicate count chip */}
245
+ {selectedLog.duplicateCount != null &&
246
+ selectedLog.duplicateCount > 1 && (<react_native_1.View style={[
247
+ styles_1.default.metaChip,
248
+ {
249
+ backgroundColor: `${AppColors_1.AppColors.purple}1A`,
250
+ borderColor: `${AppColors_1.AppColors.purple}3D`,
251
+ },
252
+ ]}>
253
+ <react_native_1.Text style={[
254
+ styles_1.default.metaChipText,
255
+ { color: AppColors_1.AppColors.purple, fontWeight: '700' },
256
+ ]}>
257
+ {t('console.duplicates', {
258
+ count: selectedLog.duplicateCount,
259
+ })}
260
+ </react_native_1.Text>
261
+ </react_native_1.View>)}
262
+ </react_native_1.View>
263
+
264
+ {/* Quick Copy button */}
265
+ <CopyButton_1.default value={selectedLog.message} label={t('console.logMessage')}/>
266
+ </react_native_1.View>
267
+
268
+ {/* Caller & Trace origin info */}
269
+ <react_native_1.View style={{ gap: 4 }}>
270
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
271
+ {originFrame?.fileExt && originFrame.fileExt !== 'other' && (<react_native_1.View style={{
272
+ backgroundColor: originFrame.fileExt === 'tsx' || originFrame.fileExt === 'ts'
273
+ ? AppColors_1.AppColors.brandPurple
274
+ : AppColors_1.AppColors.teal600,
275
+ borderRadius: 4,
276
+ paddingHorizontal: 5,
277
+ paddingVertical: 1.5,
278
+ }}>
279
+ <react_native_1.Text style={{
280
+ fontFamily: AppFonts_1.AppFonts.interBold,
281
+ fontSize: 9.5,
282
+ color: AppColors_1.AppColors.white,
283
+ letterSpacing: 0.5,
284
+ }}>
285
+ {originFrame.fileExt.toUpperCase()}
286
+ </react_native_1.Text>
287
+ </react_native_1.View>)}
288
+
289
+ <react_native_1.Text selectable style={{
290
+ fontFamily: AppFonts_1.AppFonts.interBold,
291
+ fontSize: 13,
292
+ color: AppColors_1.AppColors.primaryBlack,
293
+ lineHeight: 18,
294
+ }} numberOfLines={1}>
295
+ {originFrame?.functionName && originFrame.functionName !== '<anonymous>'
296
+ ? `${originFrame.functionName}()`
297
+ : originFrame?.fileName || t('console.consoleLog')}
298
+ </react_native_1.Text>
299
+
300
+ {originFrame?.fileName && (<react_native_1.View style={[
301
+ styles_1.default.metaChip,
302
+ {
303
+ backgroundColor: `${AppColors_1.AppColors.brandPurple}12`,
304
+ borderColor: `${AppColors_1.AppColors.brandPurple}30`,
305
+ paddingHorizontal: 7,
306
+ paddingVertical: 2,
307
+ },
308
+ ]}>
309
+ <react_native_1.Text style={[
310
+ styles_1.default.metaChipText,
311
+ { color: AppColors_1.AppColors.brandPurple, fontSize: 10, fontFamily: AppFonts_1.AppFonts.interBold },
312
+ ]}>
313
+ 📄 {originFrame.fileName}
314
+ {originFrame.lineNumber ? `:${originFrame.lineNumber}` : ''}
315
+ {originFrame.columnNumber ? `:${originFrame.columnNumber}` : ''}
316
+ </react_native_1.Text>
317
+ </react_native_1.View>)}
318
+ </react_native_1.View>
319
+
320
+ {/* Enhanced metadata metrics row */}
321
+ <react_native_1.View style={{
322
+ flexDirection: 'row',
323
+ alignItems: 'center',
324
+ gap: 8,
325
+ flexWrap: 'wrap',
326
+ }}>
327
+ <react_native_1.Text style={{
328
+ fontFamily: AppFonts_1.AppFonts.interBold,
329
+ fontSize: 10,
330
+ color: AppColors_1.AppColors.grayTextWeak,
331
+ }}>
332
+ #{selectedLog.id + 1}
333
+ </react_native_1.Text>
334
+ <react_native_1.Text style={detailStyles.metaDot}>•</react_native_1.Text>
335
+ <react_native_1.Text style={{
336
+ fontFamily: AppFonts_1.AppFonts.interRegular,
337
+ fontSize: 10,
338
+ color: AppColors_1.AppColors.grayTextWeak,
339
+ }}>
340
+ {(0, helpers_1.formatDateTime)(selectedLog.timestamp)} ({getRelativeTime(selectedLog.timestamp)})
341
+ </react_native_1.Text>
342
+ <react_native_1.Text style={detailStyles.metaDot}>•</react_native_1.Text>
343
+ <react_native_1.Text style={{
344
+ fontFamily: AppFonts_1.AppFonts.interRegular,
345
+ fontSize: 10,
346
+ color: AppColors_1.AppColors.grayTextWeak,
347
+ }}>
348
+ {(0, helpers_1.getSize)(selectedLog.message)}
349
+ </react_native_1.Text>
350
+ </react_native_1.View>
351
+ </react_native_1.View>
352
+ </react_native_1.View>
353
+ </react_native_1.View>
354
+
355
+ {/* Sub-tabs header */}
356
+ <react_native_1.View style={detailStyles.tabsHeaderWrap}>
357
+ <SegmentedTabs_1.default tabs={subTabs} activeKey={activeTab} onChange={key => setActiveTab(key)}/>
358
+ </react_native_1.View>
359
+
360
+ {/* Search row (only for output/arguments/stack tabs) */}
361
+ {activeTab !== 'metadata' && (<react_native_1.View style={{ paddingHorizontal: 12, paddingTop: 6, paddingBottom: 4 }}>
362
+ <react_native_1.View style={[styles_1.default.detailSearchRow, { marginBottom: 0 }]}>
363
+ <react_native_1.View style={[
364
+ styles_1.default.detailSearchBox,
365
+ {
366
+ backgroundColor: isDark
367
+ ? `${AppColors_1.AppColors.brandPurple}10`
368
+ : AppColors_1.AppColors.purpleShade50,
369
+ borderWidth: 1,
370
+ borderColor: AppColors_1.AppColors.dividerColor,
371
+ },
372
+ ]}>
373
+ <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
374
+ <react_native_1.TextInput placeholder="Search in log details..." placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={detailSearch} onChangeText={setDetailSearch} style={styles_1.default.detailSearchInput} autoCorrect={false} autoCapitalize="none"/>
375
+ {detailSearch.length > 0 && (<react_native_1.Pressable onPress={() => setDetailSearch('')} hitSlop={10} style={{ padding: 6 }}>
376
+ <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={13}/>
377
+ </react_native_1.Pressable>)}
378
+ </react_native_1.View>
379
+ </react_native_1.View>
380
+ </react_native_1.View>)}
381
+
382
+ {/* Tab Content Container */}
383
+ <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{
384
+ paddingHorizontal: 12,
385
+ paddingTop: 6,
386
+ paddingBottom: 28,
387
+ flexGrow: 1,
388
+ }} showsVerticalScrollIndicator={true} keyboardShouldPersistTaps="handled">
389
+ {/* Tab 1: Output / Message */}
390
+ {activeTab === 'output' && (<react_native_1.View style={[
391
+ styles_1.default.sectionContainer,
392
+ {
393
+ backgroundColor: isDark
394
+ ? `${AppColors_1.AppColors.purple}12`
395
+ : AppColors_1.AppColors.purpleShade50,
396
+ borderWidth: 1,
397
+ borderColor: AppColors_1.AppColors.dividerColor,
398
+ borderRadius: 12,
399
+ overflow: 'hidden',
400
+ flex: 1,
401
+ },
402
+ ]}>
403
+ {/* Section Header with View Modes */}
404
+ <react_native_1.View style={{
405
+ flexDirection: 'column',
406
+ gap: 8,
407
+ paddingHorizontal: 12,
408
+ paddingVertical: 10,
409
+ borderBottomWidth: 1,
410
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
411
+ backgroundColor: isDark
412
+ ? AppColors_1.AppColors.primaryLight
413
+ : AppColors_1.AppColors.grayBackground,
414
+ }}>
415
+ <react_native_1.View style={{
416
+ flexDirection: 'row',
417
+ justifyContent: 'space-between',
418
+ alignItems: 'center',
419
+ }}>
420
+ <react_native_1.Text style={{
421
+ fontFamily: AppFonts_1.AppFonts.interBold,
422
+ fontSize: 11.5,
423
+ color: AppColors_1.AppColors.purple,
424
+ letterSpacing: 0.4,
425
+ textTransform: 'uppercase',
426
+ }}>
427
+ {jsonContent
428
+ ? t('console.jsonTitle')
429
+ : t('console.messageTitle')}
430
+ </react_native_1.Text>
431
+ <CopyButton_1.default value={selectedLog.message} label={t('console.logMessage')}/>
432
+ </react_native_1.View>
433
+
434
+ {jsonContent && (<SegmentedTabs_1.default tabs={[
435
+ {
436
+ key: 'pretty',
437
+ label: t('network.jsonViewer.pretty'),
438
+ icon: (isActive) => (<NetworkIcons_1.PrettyIcon color={isActive
439
+ ? AppColors_1.AppColors.white
440
+ : AppColors_1.AppColors.grayTextWeak} size={12}/>),
441
+ },
442
+ {
443
+ key: 'raw',
444
+ label: t('network.jsonViewer.raw'),
445
+ icon: (isActive) => (<NetworkIcons_1.RawIcon color={isActive
446
+ ? AppColors_1.AppColors.white
447
+ : AppColors_1.AppColors.grayTextWeak} size={12}/>),
448
+ },
449
+ {
450
+ key: 'table',
451
+ label: t('network.jsonViewer.table'),
452
+ icon: (isActive) => (<NetworkIcons_1.TableIcon color={isActive
453
+ ? AppColors_1.AppColors.white
454
+ : AppColors_1.AppColors.grayTextWeak} size={12}/>),
455
+ },
456
+ ]} activeKey={viewMode} onChange={key => setViewMode(key)}/>)}
457
+ </react_native_1.View>
458
+
459
+ {/* Content Body */}
460
+ <react_native_1.View style={{ padding: 12, flex: 1 }}>
461
+ {jsonContent ? (<>
462
+ {jsonContent.header ? (<react_native_1.View style={{
463
+ backgroundColor: AppColors_1.AppColors.primaryLight,
464
+ borderRadius: 8,
465
+ borderWidth: 1,
466
+ borderColor: AppColors_1.AppColors.dividerColor,
467
+ padding: 10,
468
+ marginBottom: 8,
469
+ }}>
470
+ <react_native_1.Text selectable style={{
471
+ fontFamily: AppFonts_1.AppFonts.interRegular,
472
+ fontSize: 12,
473
+ color: AppColors_1.AppColors.primaryBlack,
474
+ lineHeight: 17,
475
+ }}>
476
+ {jsonContent.header}
477
+ </react_native_1.Text>
478
+ </react_native_1.View>) : null}
479
+ <JsonViewer_1.default data={jsonContent.data} search={detailSearch} wrap forceOpen hideTabs fullHeight mode={viewMode} defaultExpandDepth={jsonContent.data &&
480
+ typeof jsonContent.data === 'object' &&
481
+ Object.keys(jsonContent.data).length > 10
482
+ ? 1
483
+ : 2}/>
484
+ </>) : (<react_native_1.View style={{
485
+ backgroundColor: AppColors_1.AppColors.primaryLight,
486
+ borderRadius: 8,
487
+ borderWidth: 1,
488
+ borderColor: AppColors_1.AppColors.dividerColor,
489
+ padding: 10,
490
+ }}>
491
+ <HighlightText_1.default text={selectedLog.message} search={detailSearch} style={{
492
+ fontFamily: AppFonts_1.AppFonts.interRegular,
493
+ fontSize: 12,
494
+ color: AppColors_1.AppColors.primaryBlack,
495
+ lineHeight: 18,
496
+ }} highlightStyle={{
497
+ backgroundColor: AppColors_1.AppColors.yellowHighlight,
498
+ color: AppColors_1.AppColors.primaryBlack,
499
+ borderRadius: 3,
500
+ paddingHorizontal: 2,
501
+ }} detectLinks={true}/>
502
+ </react_native_1.View>)}
503
+ </react_native_1.View>
504
+ </react_native_1.View>)}
505
+
506
+ {/* Tab 2: Individual Arguments */}
507
+ {activeTab === 'arguments' && selectedLog.rawArgs && (<react_native_1.View style={{ gap: 10 }}>
508
+ {selectedLog.rawArgs.map((arg, idx) => {
509
+ const argType = arg === null
510
+ ? 'null'
511
+ : Array.isArray(arg)
512
+ ? `Array[${arg.length}]`
513
+ : typeof arg === 'object'
514
+ ? `Object{${Object.keys(arg).length}}`
515
+ : typeof arg;
516
+ const isObj = arg != null &&
517
+ (typeof arg === 'object' || Array.isArray(arg));
518
+ const argStr = isObj
519
+ ? JSON.stringify(arg, null, 2)
520
+ : String(arg);
521
+ return (<react_native_1.View key={idx} style={[
522
+ styles_1.default.sectionContainer,
523
+ {
524
+ backgroundColor: AppColors_1.AppColors.primaryLight,
525
+ borderRadius: 10,
526
+ borderWidth: 1,
527
+ borderColor: AppColors_1.AppColors.dividerColor,
528
+ overflow: 'hidden',
529
+ },
530
+ ]}>
531
+ <react_native_1.View style={{
532
+ flexDirection: 'row',
533
+ alignItems: 'center',
534
+ justifyContent: 'space-between',
535
+ paddingHorizontal: 12,
536
+ paddingVertical: 8,
537
+ backgroundColor: AppColors_1.AppColors.grayBackground,
538
+ borderBottomWidth: 1,
539
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
540
+ }}>
541
+ <react_native_1.View style={{
542
+ flexDirection: 'row',
543
+ alignItems: 'center',
544
+ gap: 6,
545
+ }}>
546
+ <react_native_1.Text style={{
547
+ fontFamily: AppFonts_1.AppFonts.interBold,
548
+ fontSize: 11,
549
+ color: AppColors_1.AppColors.purple,
550
+ }}>
551
+ Arg #{idx + 1}
552
+ </react_native_1.Text>
553
+ <react_native_1.View style={[
554
+ styles_1.default.metaChip,
555
+ {
556
+ backgroundColor: `${AppColors_1.AppColors.teal600}12`,
557
+ borderColor: `${AppColors_1.AppColors.teal600}2B`,
558
+ paddingHorizontal: 5,
559
+ paddingVertical: 1.5,
560
+ },
561
+ ]}>
562
+ <react_native_1.Text style={[
563
+ styles_1.default.metaChipText,
564
+ { color: AppColors_1.AppColors.teal600, fontSize: 9 },
565
+ ]}>
566
+ {argType}
567
+ </react_native_1.Text>
568
+ </react_native_1.View>
569
+ </react_native_1.View>
570
+ <CopyButton_1.default value={argStr} label={`Arg #${idx + 1}`}/>
571
+ </react_native_1.View>
572
+
573
+ <react_native_1.View style={{ padding: 10 }}>
574
+ {isObj ? (<JsonViewer_1.default data={arg} search={detailSearch} wrap forceOpen hideTabs defaultExpandDepth={2}/>) : (<HighlightText_1.default text={argStr} search={detailSearch} style={{
575
+ fontFamily: AppFonts_1.AppFonts.interRegular,
576
+ fontSize: 12,
577
+ color: AppColors_1.AppColors.primaryBlack,
578
+ lineHeight: 17,
579
+ }} highlightStyle={{
580
+ backgroundColor: AppColors_1.AppColors.yellowHighlight,
581
+ color: AppColors_1.AppColors.primaryBlack,
582
+ }}/>)}
583
+ </react_native_1.View>
584
+ </react_native_1.View>);
585
+ })}
586
+ </react_native_1.View>)}
587
+
588
+ {/* Tab 3: Call Stack Trace */}
589
+ {activeTab === 'stack' && (<react_native_1.View style={[
590
+ styles_1.default.sectionContainer,
591
+ {
592
+ backgroundColor: isDark
593
+ ? `${AppColors_1.AppColors.purple}12`
594
+ : AppColors_1.AppColors.purpleShade50,
595
+ borderWidth: 1,
596
+ borderColor: AppColors_1.AppColors.dividerColor,
597
+ borderRadius: 12,
598
+ overflow: 'hidden',
599
+ },
600
+ ]}>
601
+ {/* Section Header with Mode Switch */}
602
+ <react_native_1.View style={{
603
+ flexDirection: 'column',
604
+ gap: 8,
605
+ paddingHorizontal: 12,
606
+ paddingVertical: 10,
607
+ borderBottomWidth: 1,
608
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
609
+ backgroundColor: isDark
610
+ ? AppColors_1.AppColors.primaryLight
611
+ : AppColors_1.AppColors.grayBackground,
612
+ }}>
613
+ <react_native_1.View style={{
614
+ flexDirection: 'row',
615
+ alignItems: 'center',
616
+ justifyContent: 'space-between',
617
+ }}>
618
+ <react_native_1.Text style={{
619
+ fontFamily: AppFonts_1.AppFonts.interBold,
620
+ fontSize: 11.5,
621
+ color: AppColors_1.AppColors.purple,
622
+ textTransform: 'uppercase',
623
+ letterSpacing: 0.4,
624
+ }}>
625
+ {stackSource === 'error' ? 'Error Exception Stack' : 'Call Stack'} ({parsedStackFrames.length} frames)
626
+ </react_native_1.Text>
627
+ <CopyButton_1.default value={activeStackString} label="Full Stack Trace"/>
628
+ </react_native_1.View>
629
+
630
+ {/* Source Switcher if Error Stack exists */}
631
+ {selectedLog.errorStack && (<SegmentedTabs_1.default tabs={[
632
+ {
633
+ key: 'caller',
634
+ label: 'Call Origin Stack',
635
+ },
636
+ {
637
+ key: 'error',
638
+ label: 'Error Thrown Stack',
639
+ },
640
+ ]} activeKey={stackSource} onChange={key => setStackSource(key)}/>)}
641
+
642
+ {/* Structured vs Raw View Mode Tabs */}
643
+ <SegmentedTabs_1.default tabs={[
644
+ {
645
+ key: 'structured',
646
+ label: 'Structured Cards',
647
+ icon: (isActive) => (<NetworkIcons_1.LayersIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak} size={12}/>),
648
+ },
649
+ {
650
+ key: 'raw',
651
+ label: 'Raw Trace',
652
+ icon: (isActive) => (<NetworkIcons_1.RawIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak} size={12}/>),
653
+ },
654
+ ]} activeKey={stackViewMode} onChange={key => setStackViewMode(key)}/>
655
+ </react_native_1.View>
656
+
657
+ {/* Stack Content: Structured Cards or Raw Full Trace */}
658
+ {stackViewMode === 'structured' ? (<react_native_1.View style={{ padding: 12, gap: 10 }}>
659
+ {parsedStackFrames.length > 0 ? (parsedStackFrames.map((frame, frameIdx) => {
660
+ const isTopFrame = frameIdx === 0;
661
+ return (<react_native_1.View key={frameIdx} style={{
662
+ backgroundColor: isTopFrame
663
+ ? `${AppColors_1.AppColors.brandPurple}0A`
664
+ : AppColors_1.AppColors.primaryLight,
665
+ borderRadius: 8,
666
+ borderWidth: 1,
667
+ borderColor: isTopFrame
668
+ ? `${AppColors_1.AppColors.brandPurple}30`
669
+ : AppColors_1.AppColors.dividerColor,
670
+ padding: 10,
671
+ gap: 5,
672
+ }}>
673
+ {/* Frame Header Row */}
674
+ <react_native_1.View style={{
675
+ flexDirection: 'row',
676
+ alignItems: 'center',
677
+ justifyContent: 'space-between',
678
+ gap: 6,
679
+ }}>
680
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flex: 1 }}>
681
+ <react_native_1.View style={{
682
+ backgroundColor: isTopFrame
683
+ ? AppColors_1.AppColors.brandPurple
684
+ : AppColors_1.AppColors.grayBorderSecondary,
685
+ borderRadius: 4,
686
+ paddingHorizontal: 5,
687
+ paddingVertical: 1.5,
688
+ }}>
689
+ <react_native_1.Text style={{
690
+ fontFamily: AppFonts_1.AppFonts.interBold,
691
+ fontSize: 9,
692
+ color: isTopFrame
693
+ ? AppColors_1.AppColors.white
694
+ : AppColors_1.AppColors.grayTextStrong,
695
+ }}>
696
+ #{frameIdx + 1}
697
+ {isTopFrame ? ' ORIGIN' : ''}
698
+ </react_native_1.Text>
699
+ </react_native_1.View>
700
+
701
+ <HighlightText_1.default text={frame.functionName !== '<anonymous>' ? `${frame.functionName}()` : '<anonymous>'} search={detailSearch} style={{
702
+ fontFamily: AppFonts_1.AppFonts.interBold,
703
+ fontSize: 12,
704
+ color: isTopFrame
705
+ ? AppColors_1.AppColors.primaryBlack
706
+ : AppColors_1.AppColors.grayTextStrong,
707
+ }} highlightStyle={{
708
+ backgroundColor: AppColors_1.AppColors.yellowHighlight,
709
+ color: AppColors_1.AppColors.primaryBlack,
710
+ }}/>
711
+ </react_native_1.View>
712
+
713
+ {frame.lineNumber && (<react_native_1.View style={{
714
+ backgroundColor: `${AppColors_1.AppColors.teal600}15`,
715
+ borderColor: `${AppColors_1.AppColors.teal600}30`,
716
+ borderWidth: 1,
717
+ borderRadius: 4,
718
+ paddingHorizontal: 6,
719
+ paddingVertical: 1.5,
720
+ }}>
721
+ <react_native_1.Text style={{
722
+ fontFamily: AppFonts_1.AppFonts.interBold,
723
+ fontSize: 9.5,
724
+ color: AppColors_1.AppColors.teal600,
725
+ }}>
726
+ L{frame.lineNumber}
727
+ {frame.columnNumber ? `:C${frame.columnNumber}` : ''}
728
+ </react_native_1.Text>
729
+ </react_native_1.View>)}
730
+ </react_native_1.View>
731
+
732
+ {/* File Path Row */}
733
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
734
+ {frame.fileExt && frame.fileExt !== 'other' && (<react_native_1.View style={{
735
+ backgroundColor: frame.fileExt === 'tsx' || frame.fileExt === 'ts'
736
+ ? `${AppColors_1.AppColors.brandPurple}18`
737
+ : `${AppColors_1.AppColors.teal600}18`,
738
+ borderRadius: 3,
739
+ paddingHorizontal: 4,
740
+ paddingVertical: 1,
741
+ }}>
742
+ <react_native_1.Text style={{
743
+ fontFamily: AppFonts_1.AppFonts.interBold,
744
+ fontSize: 8.5,
745
+ color: frame.fileExt === 'tsx' || frame.fileExt === 'ts'
746
+ ? AppColors_1.AppColors.brandPurple
747
+ : AppColors_1.AppColors.teal600,
748
+ }}>
749
+ {frame.fileExt.toUpperCase()}
750
+ </react_native_1.Text>
751
+ </react_native_1.View>)}
752
+ <react_native_1.Text style={{
753
+ fontFamily: AppFonts_1.AppFonts.interMedium,
754
+ fontSize: 10.5,
755
+ color: isTopFrame
756
+ ? AppColors_1.AppColors.brandPurple
757
+ : AppColors_1.AppColors.grayTextWeak,
758
+ }}>
759
+ 📄 {frame.fileName}
760
+ </react_native_1.Text>
761
+ </react_native_1.View>
762
+
763
+ {/* Full path */}
764
+ {frame.fullPath && frame.fullPath !== frame.fileName && (<react_native_1.Text selectable style={{
765
+ fontFamily: AppFonts_1.AppFonts.interRegular,
766
+ fontSize: 9.5,
767
+ color: AppColors_1.AppColors.grayTextWeak,
768
+ lineHeight: 14,
769
+ }} numberOfLines={2}>
770
+ {frame.fullPath}
771
+ </react_native_1.Text>)}
772
+ </react_native_1.View>);
773
+ })) : (<react_native_1.Text style={{
774
+ fontFamily: AppFonts_1.AppFonts.interRegular,
775
+ fontSize: 11.5,
776
+ color: AppColors_1.AppColors.grayTextWeak,
777
+ textAlign: 'center',
778
+ paddingVertical: 16,
779
+ }}>
780
+ No call stack trace available for this log.
781
+ </react_native_1.Text>)}
782
+ </react_native_1.View>) : (
783
+ /* Raw Full Trace Monospace Block */
784
+ <react_native_1.View style={{
785
+ backgroundColor: AppColors_1.AppColors.primaryLight,
786
+ padding: 12,
787
+ }}>
788
+ {activeStackString.split('\n').filter(l => l.trim().length > 0).map((line, lineIdx) => (<react_native_1.View key={lineIdx} style={{
789
+ flexDirection: 'row',
790
+ alignItems: 'flex-start',
791
+ paddingVertical: 2,
792
+ }}>
793
+ <react_native_1.Text style={{
794
+ width: 28,
795
+ textAlign: 'right',
796
+ paddingRight: 8,
797
+ fontFamily: AppFonts_1.AppFonts.interRegular,
798
+ fontSize: 11,
799
+ color: AppColors_1.AppColors.grayTextWeak,
800
+ lineHeight: 17,
801
+ }}>
802
+ {lineIdx + 1}
803
+ </react_native_1.Text>
804
+ <HighlightText_1.default text={line.trim()} search={detailSearch} style={{
805
+ flex: 1,
806
+ fontFamily: AppFonts_1.AppFonts.interRegular,
807
+ fontSize: 12,
808
+ color: AppColors_1.AppColors.primaryBlack,
809
+ lineHeight: 17,
810
+ }} highlightStyle={{
811
+ backgroundColor: AppColors_1.AppColors.yellowHighlight,
812
+ color: AppColors_1.AppColors.primaryBlack,
813
+ }}/>
814
+ </react_native_1.View>))}
815
+ </react_native_1.View>)}
816
+ </react_native_1.View>)}
817
+
818
+ {/* Tab 4: Structured Metadata */}
819
+ {activeTab === 'metadata' && (<react_native_1.View style={[
820
+ styles_1.default.sectionContainer,
821
+ {
822
+ backgroundColor: AppColors_1.AppColors.primaryLight,
823
+ borderRadius: 10,
824
+ borderWidth: 1,
825
+ borderColor: AppColors_1.AppColors.dividerColor,
826
+ overflow: 'hidden',
827
+ },
828
+ ]}>
829
+ <react_native_1.View style={{
830
+ flexDirection: 'row',
831
+ alignItems: 'center',
832
+ justifyContent: 'space-between',
833
+ paddingHorizontal: 12,
834
+ paddingVertical: 9,
835
+ backgroundColor: AppColors_1.AppColors.grayBackground,
836
+ borderBottomWidth: 1,
837
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
838
+ }}>
839
+ <react_native_1.Text style={{
840
+ fontFamily: AppFonts_1.AppFonts.interBold,
841
+ fontSize: 11.5,
842
+ color: AppColors_1.AppColors.purple,
843
+ textTransform: 'uppercase',
844
+ letterSpacing: 0.4,
845
+ }}>
846
+ Log Properties
847
+ </react_native_1.Text>
848
+ <CopyButton_1.default value={JSON.stringify({
849
+ id: selectedLog.id + 1,
850
+ type: selectedLog.type,
851
+ sourceMethod: selectedLog.sourceMethod || 'log',
852
+ timestamp: selectedLog.timestamp,
853
+ dateTime: (0, helpers_1.formatDateTime)(selectedLog.timestamp),
854
+ caller: selectedLog.caller,
855
+ triggerFile: originFrame?.fileName,
856
+ triggerLine: originFrame?.lineNumber,
857
+ triggerFunction: originFrame?.functionName,
858
+ charCount: selectedLog.message.length,
859
+ size: (0, helpers_1.getSize)(selectedLog.message),
860
+ duplicates: selectedLog.duplicateCount || 1,
861
+ }, null, 2)} label="Metadata JSON"/>
862
+ </react_native_1.View>
863
+
864
+ <react_native_1.View style={{ paddingHorizontal: 12, paddingVertical: 4 }}>
865
+ {[
866
+ { label: 'Log ID', value: `#${selectedLog.id + 1}` },
867
+ { label: 'Level', value: selectedLog.type.toUpperCase() },
868
+ {
869
+ label: 'Source Method',
870
+ value: `console.${selectedLog.sourceMethod || selectedLog.type || 'log'}`,
871
+ },
872
+ {
873
+ label: 'Triggered At',
874
+ value: `${(0, helpers_1.formatDateTime)(selectedLog.timestamp)} (${getRelativeTime(selectedLog.timestamp)})`,
875
+ },
876
+ { label: 'Timestamp (ms)', value: String(selectedLog.timestamp) },
877
+ {
878
+ label: 'Trigger File',
879
+ value: originFrame?.fileName || 'Unknown',
880
+ },
881
+ ...(originFrame?.lineNumber
882
+ ? [
883
+ {
884
+ label: 'Trigger Location',
885
+ value: `Line ${originFrame.lineNumber}, Col ${originFrame.columnNumber || 0}`,
886
+ },
887
+ ]
888
+ : []),
889
+ ...(originFrame?.functionName && originFrame.functionName !== '<anonymous>'
890
+ ? [
891
+ {
892
+ label: 'Trigger Function',
893
+ value: `${originFrame.functionName}()`,
894
+ },
895
+ ]
896
+ : []),
897
+ {
898
+ label: 'Full Location',
899
+ value: selectedLog.caller || 'Unknown',
900
+ },
901
+ {
902
+ label: 'Character Length',
903
+ value: `${selectedLog.message.length} chars`,
904
+ },
905
+ {
906
+ label: 'Approx. Size',
907
+ value: (0, helpers_1.getSize)(selectedLog.message),
908
+ },
909
+ {
910
+ label: 'Duplicate Count',
911
+ value: String(selectedLog.duplicateCount || 1),
912
+ },
913
+ ...(hasMultipleArgs
914
+ ? [
915
+ {
916
+ label: 'Arguments Count',
917
+ value: `${selectedLog.rawArgs?.length} arguments`,
918
+ },
919
+ ]
920
+ : []),
921
+ ].map((row, rIdx, arr) => (<react_native_1.View key={rIdx} style={{
922
+ flexDirection: 'row',
923
+ justifyContent: 'space-between',
924
+ alignItems: 'center',
925
+ paddingVertical: 8,
926
+ borderBottomWidth: rIdx < arr.length - 1 ? 1 : 0,
927
+ borderBottomColor: AppColors_1.AppColors.grayBorderSecondary,
928
+ }}>
929
+ <react_native_1.Text style={{
930
+ fontFamily: AppFonts_1.AppFonts.interMedium,
931
+ fontSize: 11.5,
932
+ color: AppColors_1.AppColors.grayTextWeak,
933
+ }}>
934
+ {row.label}
935
+ </react_native_1.Text>
936
+ <react_native_1.Text selectable style={{
937
+ fontFamily: AppFonts_1.AppFonts.interBold,
938
+ fontSize: 11.5,
939
+ color: AppColors_1.AppColors.primaryBlack,
940
+ maxWidth: '60%',
941
+ textAlign: 'right',
942
+ }} numberOfLines={2}>
943
+ {row.value}
944
+ </react_native_1.Text>
945
+ </react_native_1.View>))}
946
+ </react_native_1.View>
947
+ </react_native_1.View>)}
948
+ </react_native_1.ScrollView>
949
+ </react_native_1.View>);
950
+ };
951
+ const detailStyles = react_native_1.StyleSheet.create({
952
+ metaDot: {
953
+ fontSize: 10,
954
+ color: AppColors_1.AppColors.grayTextWeak,
955
+ opacity: 0.7,
956
+ },
957
+ tabsHeaderWrap: {
958
+ paddingHorizontal: 12,
959
+ paddingTop: 8,
960
+ paddingBottom: 4,
961
+ },
962
+ });
963
+ exports.default = LogDetail;