react-native-inapp-inspector 1.0.8 → 1.0.10

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 (52) hide show
  1. package/README.md +5 -6
  2. package/assets/social_preview.png +0 -0
  3. package/dist/commonjs/components/AnalyticsDetail.js +28 -23
  4. package/dist/commonjs/components/AnalyticsEventCard.js +9 -9
  5. package/dist/commonjs/components/BrandCircleIcon.d.ts +5 -0
  6. package/dist/commonjs/components/BrandCircleIcon.js +180 -0
  7. package/dist/commonjs/components/BrandSquareIcon.d.ts +5 -0
  8. package/dist/commonjs/components/BrandSquareIcon.js +180 -0
  9. package/dist/commonjs/components/CodeSnippet.js +32 -24
  10. package/dist/commonjs/components/ConsoleLogCard.js +127 -70
  11. package/dist/commonjs/components/JsonViewer.d.ts +2 -1
  12. package/dist/commonjs/components/JsonViewer.js +2 -2
  13. package/dist/commonjs/components/MetaAccordion.d.ts +1 -1
  14. package/dist/commonjs/components/MetaAccordion.js +45 -2
  15. package/dist/commonjs/components/NetworkIcons.d.ts +8 -0
  16. package/dist/commonjs/components/NetworkIcons.js +44 -1
  17. package/dist/commonjs/components/ReduxTreeView.d.ts +6 -0
  18. package/dist/commonjs/components/ReduxTreeView.js +403 -0
  19. package/dist/commonjs/components/TouchableScale.js +15 -1
  20. package/dist/commonjs/components/TreeNode.js +3 -3
  21. package/dist/commonjs/customHooks/reduxLogger.d.ts +4 -0
  22. package/dist/commonjs/customHooks/reduxLogger.js +48 -2
  23. package/dist/commonjs/index.js +1520 -506
  24. package/dist/commonjs/styles/index.d.ts +11 -1
  25. package/dist/commonjs/styles/index.js +19 -9
  26. package/dist/commonjs/types/index.d.ts +4 -0
  27. package/dist/esm/components/AnalyticsDetail.js +28 -23
  28. package/dist/esm/components/AnalyticsEventCard.js +9 -9
  29. package/dist/esm/components/BrandCircleIcon.d.ts +5 -0
  30. package/dist/esm/components/BrandCircleIcon.js +140 -0
  31. package/dist/esm/components/BrandSquareIcon.d.ts +5 -0
  32. package/dist/esm/components/BrandSquareIcon.js +140 -0
  33. package/dist/esm/components/CodeSnippet.js +32 -24
  34. package/dist/esm/components/ConsoleLogCard.js +127 -70
  35. package/dist/esm/components/JsonViewer.d.ts +2 -1
  36. package/dist/esm/components/JsonViewer.js +2 -2
  37. package/dist/esm/components/MetaAccordion.d.ts +1 -1
  38. package/dist/esm/components/MetaAccordion.js +46 -3
  39. package/dist/esm/components/NetworkIcons.d.ts +8 -0
  40. package/dist/esm/components/NetworkIcons.js +35 -0
  41. package/dist/esm/components/ReduxTreeView.d.ts +6 -0
  42. package/dist/esm/components/ReduxTreeView.js +366 -0
  43. package/dist/esm/components/TouchableScale.js +16 -2
  44. package/dist/esm/components/TreeNode.js +3 -3
  45. package/dist/esm/customHooks/reduxLogger.d.ts +4 -0
  46. package/dist/esm/customHooks/reduxLogger.js +43 -1
  47. package/dist/esm/index.js +1523 -509
  48. package/dist/esm/styles/index.d.ts +11 -1
  49. package/dist/esm/styles/index.js +19 -9
  50. package/dist/esm/types/index.d.ts +4 -0
  51. package/example/App.tsx +46 -0
  52. package/package.json +7 -5
@@ -50,6 +50,7 @@ const CopyButton_1 = __importDefault(require("./components/CopyButton"));
50
50
  const SectionHeader_1 = __importDefault(require("./components/SectionHeader"));
51
51
  const EmptyState_1 = __importDefault(require("./components/EmptyState"));
52
52
  const JsonViewer_1 = __importDefault(require("./components/JsonViewer"));
53
+ const ReduxTreeView_1 = require("./components/ReduxTreeView");
53
54
  const DomainHeader_1 = __importDefault(require("./components/DomainHeader"));
54
55
  const DiffViewer_1 = __importDefault(require("./components/DiffViewer"));
55
56
  const LogCard_1 = __importDefault(require("./components/LogCard"));
@@ -75,8 +76,67 @@ const logFilters_1 = require("./customHooks/logFilters");
75
76
  const analyticsLogger_1 = require("./customHooks/analyticsLogger");
76
77
  const AnalyticsEventCard_1 = __importStar(require("./components/AnalyticsEventCard"));
77
78
  const AnalyticsDetail_1 = __importDefault(require("./components/AnalyticsDetail"));
78
- // WebView
79
79
  const webViewLogger_1 = require("./customHooks/webViewLogger");
80
+ let OriginalWebView = null;
81
+ try {
82
+ const RNWebView = require('react-native-webview');
83
+ OriginalWebView = RNWebView.WebView || RNWebView.default;
84
+ }
85
+ catch (e) {
86
+ // Silent fail
87
+ }
88
+ const previewInspectScript = `
89
+ (function() {
90
+ var style = document.createElement('style');
91
+ style.innerHTML = '* { cursor: pointer !important; }';
92
+ document.head.appendChild(style);
93
+
94
+ document.addEventListener('click', function(e) {
95
+ var el = e.target;
96
+ if (!el) return;
97
+
98
+ e.preventDefault();
99
+ e.stopPropagation();
100
+
101
+ var oldOutline = el.style.outline;
102
+ var oldTransition = el.style.transition;
103
+ el.style.transition = 'outline 0.15s ease';
104
+ el.style.outline = '3px solid #684B9B';
105
+ setTimeout(function() {
106
+ el.style.outline = oldOutline;
107
+ el.style.transition = oldTransition;
108
+ }, 600);
109
+
110
+ var tagName = el.tagName.toLowerCase();
111
+ var searchStr = '<' + tagName;
112
+
113
+ if (el.id) {
114
+ searchStr += ' id="' + el.id + '"';
115
+ } else if (el.className && typeof el.className === 'string') {
116
+ var firstClass = el.className.trim().split(/\\s+/)[0];
117
+ if (firstClass) {
118
+ searchStr += ' class="' + firstClass;
119
+ }
120
+ } else {
121
+ var text = (el.textContent || '').trim().substring(0, 25);
122
+ if (text) {
123
+ searchStr = text;
124
+ }
125
+ }
126
+
127
+ if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {
128
+ window.ReactNativeWebView.postMessage(JSON.stringify({
129
+ type: 'preview-inspect',
130
+ tagName: tagName,
131
+ id: el.id || '',
132
+ className: typeof el.className === 'string' ? el.className : '',
133
+ searchStr: searchStr
134
+ }));
135
+ }
136
+ }, true);
137
+ })();
138
+ true;
139
+ `;
80
140
  const reduxLogger_1 = require("./customHooks/reduxLogger");
81
141
  const constants_1 = require("./constants");
82
142
  const NavigationTracker = ({ onStateChange }) => {
@@ -86,7 +146,7 @@ const NavigationTracker = ({ onStateChange }) => {
86
146
  }, [navState, onStateChange]);
87
147
  return null;
88
148
  };
89
- const NetworkInspector = () => {
149
+ const NetworkInspector = ({ enabled = true }) => {
90
150
  const [isDark, setIsDark] = (0, react_1.useState)(false);
91
151
  const [reduxState, setReduxState] = (0, react_1.useState)(null);
92
152
  const [expandedReducers, setExpandedReducers] = (0, react_1.useState)({});
@@ -98,10 +158,21 @@ const NetworkInspector = () => {
98
158
  const [search, setSearch] = (0, react_1.useState)('');
99
159
  const [detailSearch, setDetailSearch] = (0, react_1.useState)('');
100
160
  const [reduxSearch, setReduxSearch] = (0, react_1.useState)('');
101
- const [apiDetailActiveTab, setApiDetailActiveTab] = (0, react_1.useState)('metadata');
161
+ const [apiDetailActiveTab, setApiDetailActiveTab] = (0, react_1.useState)('response');
162
+ (0, react_1.useEffect)(() => {
163
+ if (enabled && visible) {
164
+ react_native_1.LogBox.ignoreAllLogs(true);
165
+ }
166
+ else {
167
+ react_native_1.LogBox.ignoreAllLogs(false);
168
+ }
169
+ return () => {
170
+ react_native_1.LogBox.ignoreAllLogs(false);
171
+ };
172
+ }, [enabled, visible]);
102
173
  (0, react_1.useEffect)(() => {
103
174
  if (selected) {
104
- setApiDetailActiveTab('metadata');
175
+ setApiDetailActiveTab('response');
105
176
  setDetailSearch('');
106
177
  }
107
178
  }, [selected]);
@@ -122,9 +193,43 @@ const NetworkInspector = () => {
122
193
  const [analyticsEvents, setAnalyticsEvents] = (0, react_1.useState)([]);
123
194
  // ─── Logs state ────────────────────────────────────────────────────────────
124
195
  const [consoleLogs, setConsoleLogs] = (0, react_1.useState)([]);
196
+ const [lastReadLogsCount, setLastReadLogsCount] = (0, react_1.useState)(0);
197
+ const [lastReadApisCount, setLastReadApisCount] = (0, react_1.useState)(0);
198
+ (0, react_1.useEffect)(() => {
199
+ if (visible) {
200
+ if (activeTab === 'apis') {
201
+ setLastReadApisCount(logs.length);
202
+ }
203
+ if (activeTab === 'logs') {
204
+ setLastReadLogsCount(consoleLogs.length);
205
+ }
206
+ }
207
+ }, [visible]);
208
+ (0, react_1.useEffect)(() => {
209
+ if (activeTab === 'apis') {
210
+ setLastReadApisCount(logs.length);
211
+ }
212
+ }, [activeTab, logs.length]);
213
+ (0, react_1.useEffect)(() => {
214
+ if (activeTab === 'logs') {
215
+ setLastReadLogsCount(consoleLogs.length);
216
+ }
217
+ }, [activeTab, consoleLogs.length]);
218
+ const [maxConsoleLogs, setMaxConsoleLogs] = (0, react_1.useState)(200);
219
+ const [showConsoleLevels, setShowConsoleLevels] = (0, react_1.useState)({
220
+ info: true,
221
+ warn: true,
222
+ error: true,
223
+ });
125
224
  const visibleConsoleLogs = (0, react_1.useMemo)(() => {
126
- return consoleLogs.filter(log => {
225
+ const filtered = consoleLogs.filter(log => {
127
226
  const type = log.type;
227
+ if (type === 'info' && !showConsoleLevels.info)
228
+ return false;
229
+ if (type === 'warn' && !showConsoleLevels.warn)
230
+ return false;
231
+ if (type === 'error' && !showConsoleLevels.error)
232
+ return false;
128
233
  const message = log.message || '';
129
234
  const allPrefixes = [
130
235
  ...((logFilters_1.IGNORED_LOG_PREFIXES && logFilters_1.IGNORED_LOG_PREFIXES.info) || []),
@@ -138,13 +243,79 @@ const NetworkInspector = () => {
138
243
  message.toLowerCase().trim().includes(prefix.toLowerCase().trim()));
139
244
  return !isIgnored;
140
245
  });
141
- }, [consoleLogs]);
246
+ return filtered.slice(0, maxConsoleLogs);
247
+ }, [consoleLogs, showConsoleLevels, maxConsoleLogs]);
142
248
  const [logSearch, setLogSearch] = (0, react_1.useState)('');
143
249
  const [logFilters, setLogFilters] = (0, react_1.useState)(new Set(['user-log']));
144
250
  // ─── WebView state ─────────────────────────────────────────────────────────
145
251
  const [webViewLogs, setWebViewLogs] = (0, react_1.useState)([]);
146
252
  const [webViewNavHistory, setWebViewNavHistory] = (0, react_1.useState)([]);
147
253
  const [webViewSubTab, setWebViewSubTab] = (0, react_1.useState)('html');
254
+ const [inspectedElement, setInspectedElement] = (0, react_1.useState)(null);
255
+ // ─── Settings state ──────────────────────────────────────────────────────────
256
+ const [settingsPage, setSettingsPage] = (0, react_1.useState)(null);
257
+ const [tabVisibility, setTabVisibility] = (0, react_1.useState)({
258
+ insights: true,
259
+ apis: true,
260
+ logs: true,
261
+ analytics: true,
262
+ webview: true,
263
+ redux: true,
264
+ });
265
+ const [maxNetworkLogs, setMaxNetworkLogs] = (0, react_1.useState)(100);
266
+ const [webViewCaptureCssJs, setWebViewCaptureCssJs] = (0, react_1.useState)(true);
267
+ const [reduxAutoRefresh, setReduxAutoRefreshState] = (0, react_1.useState)(true);
268
+ const [reduxExpandDepth, setReduxExpandDepth] = (0, react_1.useState)(1);
269
+ const [slowRequestThreshold, setSlowRequestThreshold] = (0, react_1.useState)(1000);
270
+ const [insightsShowConsoleAlerts, setInsightsShowConsoleAlerts] = (0, react_1.useState)(true);
271
+ (0, react_1.useEffect)(() => {
272
+ (0, reduxLogger_1.setReduxAutoRefresh)(reduxAutoRefresh);
273
+ }, [reduxAutoRefresh]);
274
+ const toggleTabVisibility = (key) => {
275
+ if (key === 'apis')
276
+ return;
277
+ setTabVisibility(prev => {
278
+ const nextVal = !prev[key];
279
+ const newVisibility = { ...prev, [key]: nextVal };
280
+ if (!nextVal && activeTab === key) {
281
+ setActiveTab('apis');
282
+ }
283
+ return newVisibility;
284
+ });
285
+ };
286
+ const navigateFromDashboard = (key) => {
287
+ setTabVisibility(prev => ({ ...prev, [key]: true }));
288
+ setActiveTab(key);
289
+ };
290
+ const getSearchTermForTab = () => {
291
+ if (!inspectedElement)
292
+ return '';
293
+ const { tagName, id, className, searchStr } = inspectedElement;
294
+ if (htmlSubTab === 'html') {
295
+ return searchStr;
296
+ }
297
+ if (htmlSubTab === 'css') {
298
+ if (className) {
299
+ const firstClass = className.trim().split(/\s+/)[0];
300
+ if (firstClass)
301
+ return `.${firstClass}`;
302
+ }
303
+ if (id)
304
+ return `#${id}`;
305
+ return tagName;
306
+ }
307
+ if (htmlSubTab === 'javascript') {
308
+ if (id)
309
+ return id;
310
+ if (className) {
311
+ const firstClass = className.trim().split(/\s+/)[0];
312
+ if (firstClass)
313
+ return firstClass;
314
+ }
315
+ return tagName;
316
+ }
317
+ return '';
318
+ };
148
319
  const [webViewSearch, setWebViewSearch] = (0, react_1.useState)('');
149
320
  const [webViewHtml, setWebViewHtml] = (0, react_1.useState)('');
150
321
  const [webViewCss, setWebViewCss] = (0, react_1.useState)('');
@@ -183,6 +354,8 @@ const NetworkInspector = () => {
183
354
  const [newLogIds, setNewLogIds] = (0, react_1.useState)(new Set());
184
355
  const pulseAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
185
356
  const badgeAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
357
+ const activePulseAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0.4)).current;
358
+ const unreadPulseAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
186
359
  (0, react_1.useEffect)(() => {
187
360
  const loop = react_native_1.Animated.loop(react_native_1.Animated.sequence([
188
361
  react_native_1.Animated.timing(pulseAnim, {
@@ -199,6 +372,38 @@ const NetworkInspector = () => {
199
372
  loop.start();
200
373
  return () => loop.stop();
201
374
  }, [pulseAnim]);
375
+ (0, react_1.useEffect)(() => {
376
+ const loop = react_native_1.Animated.loop(react_native_1.Animated.sequence([
377
+ react_native_1.Animated.timing(activePulseAnim, {
378
+ toValue: 1,
379
+ duration: 1200,
380
+ useNativeDriver: true,
381
+ }),
382
+ react_native_1.Animated.timing(activePulseAnim, {
383
+ toValue: 0.4,
384
+ duration: 1200,
385
+ useNativeDriver: true,
386
+ }),
387
+ ]));
388
+ loop.start();
389
+ return () => loop.stop();
390
+ }, [activePulseAnim]);
391
+ (0, react_1.useEffect)(() => {
392
+ const loop = react_native_1.Animated.loop(react_native_1.Animated.sequence([
393
+ react_native_1.Animated.timing(unreadPulseAnim, {
394
+ toValue: 1.3,
395
+ duration: 800,
396
+ useNativeDriver: true,
397
+ }),
398
+ react_native_1.Animated.timing(unreadPulseAnim, {
399
+ toValue: 0.8,
400
+ duration: 800,
401
+ useNativeDriver: true,
402
+ }),
403
+ ]));
404
+ loop.start();
405
+ return () => loop.stop();
406
+ }, [unreadPulseAnim]);
202
407
  (0, react_1.useEffect)(() => {
203
408
  if ((logs.length > 0 || analyticsEvents.length > 0) && newLogIds.size > 0) {
204
409
  badgeAnim.setValue(0.8);
@@ -357,8 +562,8 @@ const NetworkInspector = () => {
357
562
  if (sortOrder === 'oldest') {
358
563
  result = [...result].reverse();
359
564
  }
360
- return result;
361
- }, [logs, search, statusFilters, methodFilters, sortOrder]);
565
+ return result.slice(0, maxNetworkLogs);
566
+ }, [logs, search, statusFilters, methodFilters, sortOrder, maxNetworkLogs]);
362
567
  const availableMethods = (0, react_1.useMemo)(() => {
363
568
  const methods = new Set();
364
569
  logs.forEach(log => {
@@ -755,6 +960,574 @@ const NetworkInspector = () => {
755
960
  toggleSectionFilter,
756
961
  toggleSectionCollapse,
757
962
  ]);
963
+ const renderSettings = () => {
964
+ if (settingsPage === 'main') {
965
+ const settingsTabs = [
966
+ { key: 'insights', label: 'Insights', icon: 'insights' },
967
+ { key: 'apis', label: 'APIs', icon: 'apis' },
968
+ { key: 'logs', label: 'Logs', icon: 'logs' },
969
+ { key: 'analytics', label: 'Analytics', icon: 'analytics' },
970
+ { key: 'webview', label: 'WebView', icon: 'webview' },
971
+ { key: 'redux', label: 'Redux', icon: 'redux' },
972
+ ];
973
+ return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
974
+ {/* Settings Header with back button */}
975
+ <react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, '#6B4EFF']} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles_1.default.headerGradient}>
976
+ <react_native_1.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
977
+ <TouchableScale_1.default onPress={() => {
978
+ setSettingsPage(null);
979
+ setActiveTab('apis');
980
+ }} hitSlop={12} style={{
981
+ padding: 8,
982
+ borderRadius: 10,
983
+ backgroundColor: 'rgba(255, 255, 255, 0.15)',
984
+ borderWidth: 1,
985
+ borderColor: 'rgba(255, 255, 255, 0.08)',
986
+ }}>
987
+ <NetworkIcons_1.WhiteBackNavigation color="#FFFFFF" size={16}/>
988
+ </TouchableScale_1.default>
989
+ <react_native_1.View style={{ flex: 1 }}>
990
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 17, color: '#FFFFFF' }}>Settings</react_native_1.Text>
991
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 11, color: 'rgba(255,255,255,0.75)', marginTop: 1 }}>Manage modules and preferences</react_native_1.Text>
992
+ </react_native_1.View>
993
+ <react_native_1.View style={{
994
+ backgroundColor: 'rgba(255, 255, 255, 0.15)',
995
+ paddingHorizontal: 8,
996
+ paddingVertical: 4,
997
+ borderRadius: 8,
998
+ borderWidth: 1,
999
+ borderColor: 'rgba(255, 255, 255, 0.1)'
1000
+ }}>
1001
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10.5, color: '#FFFFFF' }}>v1.0.10</react_native_1.Text>
1002
+ </react_native_1.View>
1003
+ </react_native_1.View>
1004
+ </react_native_linear_gradient_1.default>
1005
+
1006
+ <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1007
+
1008
+ {/* Tab list */}
1009
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, overflow: 'hidden' }}>
1010
+ {/* Table Header */}
1011
+ <react_native_1.View style={{
1012
+ flexDirection: 'row',
1013
+ alignItems: 'center',
1014
+ paddingVertical: 8,
1015
+ paddingHorizontal: 14,
1016
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1017
+ borderBottomWidth: 1,
1018
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1019
+ gap: 12,
1020
+ }}>
1021
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.6, flex: 1 }}>MODULE</react_native_1.Text>
1022
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.6, width: 90, textAlign: 'right', paddingRight: 4 }}>VISIBILITY</react_native_1.Text>
1023
+ </react_native_1.View>
1024
+
1025
+ {settingsTabs.map((tab, idx) => {
1026
+ const isVisible = tab.key === 'apis' || tabVisibility[tab.key];
1027
+ const isLast = idx === settingsTabs.length - 1;
1028
+ const isLocked = tab.key === 'apis';
1029
+ return (<react_native_1.View key={tab.key} style={{
1030
+ flexDirection: 'row',
1031
+ alignItems: 'center',
1032
+ paddingVertical: 10,
1033
+ paddingHorizontal: 14,
1034
+ borderBottomWidth: isLast ? 0 : 1,
1035
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1036
+ gap: 12,
1037
+ }}>
1038
+ {/* Icon + Label — fills remaining space */}
1039
+ <react_native_1.View style={{ flex: 1, flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1040
+ {/* Small icon tile */}
1041
+ <react_native_1.View style={{
1042
+ width: 20, height: 20, borderRadius: 6,
1043
+ backgroundColor: isLocked ? AppColors_1.AppColors.grayBorderSecondary : AppColors_1.AppColors.purpleShade50,
1044
+ borderWidth: 1,
1045
+ borderColor: isLocked ? AppColors_1.AppColors.dividerColor : 'rgba(104,75,155,0.2)',
1046
+ alignItems: 'center', justifyContent: 'center',
1047
+ }}>
1048
+ {tab.icon === 'insights' && <NetworkIcons_1.InsightsIcon color={isLocked ? AppColors_1.AppColors.grayTextWeak : AppColors_1.AppColors.purple} size={11}/>}
1049
+ {tab.icon === 'apis' && <NetworkIcons_1.SignalIcon color={isLocked ? AppColors_1.AppColors.grayTextWeak : AppColors_1.AppColors.purple} size={11}/>}
1050
+ {tab.icon === 'logs' && <NetworkIcons_1.TerminalIcon color={isLocked ? AppColors_1.AppColors.grayTextWeak : AppColors_1.AppColors.purple} size={11}/>}
1051
+ {tab.icon === 'analytics' && <NetworkIcons_1.AnalyticsIcon color={isLocked ? AppColors_1.AppColors.grayTextWeak : AppColors_1.AppColors.purple} size={11}/>}
1052
+ {tab.icon === 'webview' && <NetworkIcons_1.GlobeIcon color={isLocked ? AppColors_1.AppColors.grayTextWeak : AppColors_1.AppColors.purple} size={11}/>}
1053
+ {tab.icon === 'redux' && <NetworkIcons_1.TerminalIcon color={isLocked ? AppColors_1.AppColors.grayTextWeak : AppColors_1.AppColors.purple} size={11}/>}
1054
+ </react_native_1.View>
1055
+ {/* Label + Required badge */}
1056
+ <react_native_1.Text style={{
1057
+ fontFamily: AppFonts_1.AppFonts.interBold,
1058
+ fontSize: 13,
1059
+ color: isLocked ? AppColors_1.AppColors.grayText : AppColors_1.AppColors.primaryBlack,
1060
+ }}>
1061
+ {tab.label}
1062
+ </react_native_1.Text>
1063
+ {isLocked && (<react_native_1.View style={{
1064
+ flexDirection: 'row',
1065
+ alignItems: 'center',
1066
+ backgroundColor: 'rgba(104,75,155,0.08)',
1067
+ borderRadius: 20,
1068
+ paddingHorizontal: 6,
1069
+ paddingVertical: 2,
1070
+ borderWidth: 1,
1071
+ borderColor: 'rgba(104,75,155,0.18)',
1072
+ gap: 3,
1073
+ }}>
1074
+ <react_native_1.View style={{ width: 4, height: 4, borderRadius: 2, backgroundColor: AppColors_1.AppColors.purple, opacity: 0.7 }}/>
1075
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 8.5, color: AppColors_1.AppColors.purple, letterSpacing: 0.4 }}>
1076
+ DEFAULT
1077
+ </react_native_1.Text>
1078
+ </react_native_1.View>)}
1079
+
1080
+ {/* Settings gear icon next to label */}
1081
+ <TouchableScale_1.default onPress={() => setSettingsPage(tab.key)} hitSlop={8} style={{
1082
+ marginLeft: 4,
1083
+ padding: 4,
1084
+ borderRadius: 6,
1085
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1086
+ borderWidth: 1,
1087
+ borderColor: 'rgba(104,75,155,0.15)',
1088
+ alignItems: 'center',
1089
+ justifyContent: 'center',
1090
+ }}>
1091
+ <NetworkIcons_1.SettingsIcon color={AppColors_1.AppColors.purple} size={10}/>
1092
+ </TouchableScale_1.default>
1093
+ </react_native_1.View>
1094
+
1095
+ {/* Visibility Switch in VISIBILITY column */}
1096
+ <react_native_1.View style={{ width: 90, alignItems: 'flex-end', justifyContent: 'center' }}>
1097
+ <TouchableScale_1.default disabled={isLocked} onPress={() => toggleTabVisibility(tab.key)} style={{
1098
+ width: 38,
1099
+ height: 22,
1100
+ borderRadius: 11,
1101
+ backgroundColor: isVisible ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayBorderSecondary,
1102
+ padding: 2,
1103
+ justifyContent: 'center',
1104
+ alignItems: isVisible ? 'flex-end' : 'flex-start',
1105
+ }}>
1106
+ <react_native_1.View style={{
1107
+ width: 18,
1108
+ height: 18,
1109
+ borderRadius: 9,
1110
+ backgroundColor: '#FFFFFF',
1111
+ shadowColor: '#000',
1112
+ shadowOpacity: 0.15,
1113
+ shadowRadius: 1.5,
1114
+ shadowOffset: { width: 0, height: 1 },
1115
+ }}/>
1116
+ </TouchableScale_1.default>
1117
+ </react_native_1.View>
1118
+ </react_native_1.View>);
1119
+ })}
1120
+ </react_native_1.View>
1121
+
1122
+ {/* Preferences Section */}
1123
+ <react_native_1.View style={{ marginTop: 8 }}>
1124
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.6, marginBottom: 8 }}>PREFERENCES</react_native_1.Text>
1125
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, overflow: 'hidden' }}>
1126
+ <react_native_1.View style={{
1127
+ flexDirection: 'row',
1128
+ alignItems: 'center',
1129
+ paddingVertical: 12,
1130
+ paddingHorizontal: 14,
1131
+ gap: 12,
1132
+ }}>
1133
+ {/* Icon + Label */}
1134
+ <react_native_1.View style={{ flex: 1, flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1135
+ <react_native_1.View style={{
1136
+ width: 20, height: 20, borderRadius: 6,
1137
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1138
+ borderWidth: 1,
1139
+ borderColor: 'rgba(104,75,155,0.2)',
1140
+ alignItems: 'center', justifyContent: 'center',
1141
+ }}>
1142
+ {isDark ? (<NetworkIcons_1.SunIcon color={AppColors_1.AppColors.purple} size={11}/>) : (<NetworkIcons_1.MoonIcon color={AppColors_1.AppColors.purple} size={11}/>)}
1143
+ </react_native_1.View>
1144
+ <react_native_1.View style={{ flex: 1 }}>
1145
+ <react_native_1.Text style={{
1146
+ fontFamily: AppFonts_1.AppFonts.interBold,
1147
+ fontSize: 13,
1148
+ color: AppColors_1.AppColors.primaryBlack,
1149
+ }}>
1150
+ Dark Theme
1151
+ </react_native_1.Text>
1152
+ </react_native_1.View>
1153
+ </react_native_1.View>
1154
+
1155
+ {/* Toggle Switch */}
1156
+ <TouchableScale_1.default onPress={() => {
1157
+ const newTheme = !isDark;
1158
+ setIsDark(newTheme);
1159
+ (0, styles_1.toggleGlobalTheme)(newTheme);
1160
+ }} style={{
1161
+ width: 38,
1162
+ height: 22,
1163
+ borderRadius: 11,
1164
+ backgroundColor: isDark ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayBorderSecondary,
1165
+ padding: 2,
1166
+ justifyContent: 'center',
1167
+ alignItems: isDark ? 'flex-end' : 'flex-start',
1168
+ }}>
1169
+ <react_native_1.View style={{
1170
+ width: 18,
1171
+ height: 18,
1172
+ borderRadius: 9,
1173
+ backgroundColor: '#FFFFFF',
1174
+ shadowColor: '#000',
1175
+ shadowOpacity: 0.15,
1176
+ shadowRadius: 1.5,
1177
+ shadowOffset: { width: 0, height: 1 },
1178
+ }}/>
1179
+ </TouchableScale_1.default>
1180
+ </react_native_1.View>
1181
+ </react_native_1.View>
1182
+ </react_native_1.View>
1183
+ </react_native_1.ScrollView>
1184
+ </react_native_1.View>);
1185
+ }
1186
+ const goBackToMain = () => setSettingsPage('main');
1187
+ const renderSubHeader = (title, icon, rightInfo) => (<react_native_1.View style={{
1188
+ flexDirection: 'row',
1189
+ alignItems: 'center',
1190
+ gap: 12,
1191
+ paddingBottom: 16,
1192
+ borderBottomWidth: 1,
1193
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1194
+ marginBottom: 16,
1195
+ }}>
1196
+ <TouchableScale_1.default onPress={goBackToMain} style={{
1197
+ width: 36,
1198
+ height: 36,
1199
+ borderRadius: 10,
1200
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1201
+ borderWidth: 1,
1202
+ borderColor: 'rgba(104,75,155,0.2)',
1203
+ alignItems: 'center',
1204
+ justifyContent: 'center',
1205
+ }}>
1206
+ <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.purple} size={16}/>
1207
+ </TouchableScale_1.default>
1208
+ {icon && (<react_native_1.View style={{
1209
+ width: 36, height: 36, borderRadius: 10,
1210
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1211
+ borderWidth: 1, borderColor: 'rgba(104,75,155,0.2)',
1212
+ alignItems: 'center', justifyContent: 'center',
1213
+ }}>
1214
+ {icon}
1215
+ </react_native_1.View>)}
1216
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 18, color: AppColors_1.AppColors.primaryBlack, flex: 1 }}>
1217
+ {title}
1218
+ </react_native_1.Text>
1219
+ {rightInfo ? (<react_native_1.View style={{
1220
+ backgroundColor: 'rgba(104,75,155,0.08)',
1221
+ paddingHorizontal: 10,
1222
+ paddingVertical: 5,
1223
+ borderRadius: 8,
1224
+ borderWidth: 1,
1225
+ borderColor: 'rgba(104,75,155,0.15)',
1226
+ }}>
1227
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 11, color: AppColors_1.AppColors.purple }}>
1228
+ {rightInfo}
1229
+ </react_native_1.Text>
1230
+ </react_native_1.View>) : null}
1231
+ </react_native_1.View>);
1232
+ // Helper: settings row with icon + label + optional description
1233
+ const renderSettingRow = (opts) => (<react_native_1.View style={{
1234
+ paddingVertical: 12,
1235
+ borderBottomWidth: opts.isLast ? 0 : 1,
1236
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1237
+ }}>
1238
+ <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
1239
+ flexDirection: 'row',
1240
+ alignItems: 'center',
1241
+ gap: 12,
1242
+ }}>
1243
+ <react_native_1.View style={{
1244
+ width: 36, height: 36, borderRadius: 10,
1245
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1246
+ borderWidth: 1, borderColor: 'rgba(104,75,155,0.18)',
1247
+ alignItems: 'center', justifyContent: 'center',
1248
+ }}>
1249
+ {opts.icon}
1250
+ </react_native_1.View>
1251
+ <react_native_1.View style={{ flex: 1 }}>
1252
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 14, color: AppColors_1.AppColors.primaryBlack }}>
1253
+ {opts.label}
1254
+ </react_native_1.Text>
1255
+ {opts.description ? (<react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 11, color: AppColors_1.AppColors.grayText, marginTop: 1 }}>
1256
+ {opts.description}
1257
+ </react_native_1.Text>) : null}
1258
+ </react_native_1.View>
1259
+ {opts.right || null}
1260
+ </TouchableScale_1.default>
1261
+ {opts.picker && (<react_native_1.View style={{
1262
+ flexDirection: 'row',
1263
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1264
+ borderRadius: 8,
1265
+ padding: 2.5,
1266
+ marginTop: 10,
1267
+ borderWidth: 1,
1268
+ borderColor: AppColors_1.AppColors.dividerColor,
1269
+ }}>
1270
+ {opts.picker.options.map(opt => {
1271
+ const isActive = opts.picker.selectedValue === opt;
1272
+ return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1273
+ flex: 1,
1274
+ paddingVertical: 6,
1275
+ alignItems: 'center',
1276
+ borderRadius: 6,
1277
+ backgroundColor: isActive ? AppColors_1.AppColors.purple : 'transparent',
1278
+ }}>
1279
+ <react_native_1.Text style={{
1280
+ fontFamily: AppFonts_1.AppFonts.interBold,
1281
+ fontSize: 11,
1282
+ color: isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText,
1283
+ }}>
1284
+ {typeof opt === 'number' && opt >= 500 && settingsPage === 'insights' ? `${opt}ms` : opt}
1285
+ </react_native_1.Text>
1286
+ </TouchableScale_1.default>);
1287
+ })}
1288
+ </react_native_1.View>)}
1289
+ </react_native_1.View>);
1290
+ if (settingsPage === 'apis') {
1291
+ return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1292
+ {renderSubHeader('APIs Settings', <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>, `Total: ${logs.length}`)}
1293
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, padding: 16, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, gap: 4 }}>
1294
+ {renderSettingRow({
1295
+ icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1296
+ label: 'Max Request Logs',
1297
+ description: 'How many network requests to keep in memory',
1298
+ picker: {
1299
+ options: [50, 100, 200, 500],
1300
+ selectedValue: maxNetworkLogs,
1301
+ onSelect: setMaxNetworkLogs,
1302
+ },
1303
+ isLast: true,
1304
+ })}
1305
+ </react_native_1.View>
1306
+
1307
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, padding: 16, marginTop: 12 }}>
1308
+ {renderSettingRow({
1309
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1310
+ label: 'Clear Network Logs',
1311
+ description: `${logs.length} requests stored`,
1312
+ isLast: true,
1313
+ onPress: () => {
1314
+ (0, networkLogger_1.clearNetworkLogs)();
1315
+ setSelected(null);
1316
+ react_native_1.Alert.alert('Success', 'Network logs cleared.');
1317
+ },
1318
+ right: (<react_native_1.View style={{ paddingHorizontal: 10, paddingVertical: 5, borderRadius: 7, backgroundColor: 'rgba(255,46,87,0.08)', borderWidth: 1, borderColor: 'rgba(255,46,87,0.2)' }}>
1319
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 11, color: AppColors_1.AppColors.errorColor }}>Clear</react_native_1.Text>
1320
+ </react_native_1.View>),
1321
+ })}
1322
+ </react_native_1.View>
1323
+ </react_native_1.ScrollView>);
1324
+ }
1325
+ if (settingsPage === 'logs') {
1326
+ return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1327
+ {renderSubHeader('Logs Settings', <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>, `Total: ${consoleLogs.length}`)}
1328
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, padding: 16, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, gap: 4 }}>
1329
+ {renderSettingRow({
1330
+ icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1331
+ label: 'Max Console Logs',
1332
+ description: 'How many console messages to retain',
1333
+ picker: {
1334
+ options: [100, 200, 500, 1000],
1335
+ selectedValue: maxConsoleLogs,
1336
+ onSelect: setMaxConsoleLogs,
1337
+ },
1338
+ })}
1339
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1340
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 13, color: AppColors_1.AppColors.primaryBlack, paddingTop: 4 }}>Log Levels</react_native_1.Text>
1341
+ {['info', 'warn', 'error'].map((level, li) => {
1342
+ const isLvlActive = showConsoleLevels[level];
1343
+ const levelColor = level === 'error' ? AppColors_1.AppColors.errorColor : level === 'warn' ? AppColors_1.AppColors.warningIconGold : AppColors_1.AppColors.skyBlue;
1344
+ return renderSettingRow({
1345
+ icon: <react_native_1.View style={{ width: 10, height: 10, borderRadius: 5, backgroundColor: levelColor }}/>,
1346
+ label: `Show ${level.charAt(0).toUpperCase() + level.slice(1)} logs`,
1347
+ description: level === 'info' ? 'Informational messages' : level === 'warn' ? 'Warning messages' : 'Error messages',
1348
+ isLast: level === 'error',
1349
+ onPress: () => setShowConsoleLevels(prev => ({ ...prev, [level]: !prev[level] })),
1350
+ right: (<react_native_1.View style={{
1351
+ width: 22, height: 22, borderRadius: 6,
1352
+ borderWidth: 2,
1353
+ borderColor: isLvlActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak,
1354
+ backgroundColor: isLvlActive ? 'rgba(104, 75, 155, 0.1)' : 'transparent',
1355
+ alignItems: 'center', justifyContent: 'center',
1356
+ }}>
1357
+ {isLvlActive && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.purple}/>}
1358
+ </react_native_1.View>),
1359
+ });
1360
+ })}
1361
+ </react_native_1.View>
1362
+
1363
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, padding: 16, marginTop: 12 }}>
1364
+ {renderSettingRow({
1365
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1366
+ label: 'Clear Console Logs',
1367
+ description: `${consoleLogs.length} logs stored`,
1368
+ isLast: true,
1369
+ onPress: () => {
1370
+ (0, consoleLogger_1.clearConsoleLogs)();
1371
+ react_native_1.Alert.alert('Success', 'Console logs cleared.');
1372
+ },
1373
+ right: (<react_native_1.View style={{ paddingHorizontal: 10, paddingVertical: 5, borderRadius: 7, backgroundColor: 'rgba(255,46,87,0.08)', borderWidth: 1, borderColor: 'rgba(255,46,87,0.2)' }}>
1374
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 11, color: AppColors_1.AppColors.errorColor }}>Clear</react_native_1.Text>
1375
+ </react_native_1.View>),
1376
+ })}
1377
+ </react_native_1.View>
1378
+ </react_native_1.ScrollView>);
1379
+ }
1380
+ if (settingsPage === 'analytics') {
1381
+ return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1382
+ {renderSubHeader('Analytics Settings', <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>, `Events: ${analyticsEvents.length}`)}
1383
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, padding: 16, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, gap: 4 }}>
1384
+ {renderSettingRow({
1385
+ icon: <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>,
1386
+ label: 'Events Captured',
1387
+ description: `${analyticsEvents.length} analytics events stored`,
1388
+ isLast: true,
1389
+ })}
1390
+ </react_native_1.View>
1391
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, padding: 16, marginTop: 12 }}>
1392
+ {renderSettingRow({
1393
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1394
+ label: 'Clear Analytics History',
1395
+ description: 'Remove all captured events',
1396
+ isLast: true,
1397
+ onPress: () => {
1398
+ (0, analyticsLogger_1.clearAnalyticsEvents)();
1399
+ setSelectedEvent(null);
1400
+ react_native_1.Alert.alert('Success', 'Analytics events cleared.');
1401
+ },
1402
+ right: (<react_native_1.View style={{ paddingHorizontal: 10, paddingVertical: 5, borderRadius: 7, backgroundColor: 'rgba(255,46,87,0.08)', borderWidth: 1, borderColor: 'rgba(255,46,87,0.2)' }}>
1403
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 11, color: AppColors_1.AppColors.errorColor }}>Clear</react_native_1.Text>
1404
+ </react_native_1.View>),
1405
+ })}
1406
+ </react_native_1.View>
1407
+ </react_native_1.ScrollView>);
1408
+ }
1409
+ if (settingsPage === 'webview') {
1410
+ return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1411
+ {renderSubHeader('WebView Settings', <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={16}/>, `History: ${webViewNavHistory.length}`)}
1412
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, padding: 16, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, gap: 4 }}>
1413
+ {renderSettingRow({
1414
+ icon: <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={16}/>,
1415
+ label: 'Capture CSS & JavaScript',
1416
+ description: 'Extract stylesheet and script source from pages',
1417
+ onPress: () => setWebViewCaptureCssJs(prev => !prev),
1418
+ right: (<react_native_1.View style={{
1419
+ width: 22, height: 22, borderRadius: 6,
1420
+ borderWidth: 2,
1421
+ borderColor: webViewCaptureCssJs ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak,
1422
+ backgroundColor: webViewCaptureCssJs ? 'rgba(104, 75, 155, 0.1)' : 'transparent',
1423
+ alignItems: 'center', justifyContent: 'center',
1424
+ }}>
1425
+ {webViewCaptureCssJs && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.purple}/>}
1426
+ </react_native_1.View>),
1427
+ isLast: true,
1428
+ })}
1429
+ </react_native_1.View>
1430
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, padding: 16, marginTop: 12 }}>
1431
+ {renderSettingRow({
1432
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1433
+ label: 'Clear WebView Data',
1434
+ description: 'Remove all captured source & navigation history',
1435
+ isLast: true,
1436
+ onPress: () => {
1437
+ (0, webViewLogger_1.clearWebViewData)();
1438
+ react_native_1.Alert.alert('Success', 'WebView source history cleared.');
1439
+ },
1440
+ right: (<react_native_1.View style={{ paddingHorizontal: 10, paddingVertical: 5, borderRadius: 7, backgroundColor: 'rgba(255,46,87,0.08)', borderWidth: 1, borderColor: 'rgba(255,46,87,0.2)' }}>
1441
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 11, color: AppColors_1.AppColors.errorColor }}>Clear</react_native_1.Text>
1442
+ </react_native_1.View>),
1443
+ })}
1444
+ </react_native_1.View>
1445
+ </react_native_1.ScrollView>);
1446
+ }
1447
+ if (settingsPage === 'redux') {
1448
+ return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1449
+ {renderSubHeader('Redux Settings', <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>, `Reducers: ${Object.keys(reduxState || {}).length}`)}
1450
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, padding: 16, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, gap: 4 }}>
1451
+ {renderSettingRow({
1452
+ icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1453
+ label: 'Auto-refresh Store',
1454
+ description: 'Automatically capture Redux store state updates',
1455
+ onPress: () => setReduxAutoRefreshState(prev => !prev),
1456
+ right: (<react_native_1.View style={{
1457
+ width: 22, height: 22, borderRadius: 6,
1458
+ borderWidth: 2,
1459
+ borderColor: reduxAutoRefresh ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak,
1460
+ backgroundColor: reduxAutoRefresh ? 'rgba(104, 75, 155, 0.1)' : 'transparent',
1461
+ alignItems: 'center', justifyContent: 'center',
1462
+ }}>
1463
+ {reduxAutoRefresh && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.purple}/>}
1464
+ </react_native_1.View>),
1465
+ })}
1466
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1467
+ {renderSettingRow({
1468
+ icon: <NetworkIcons_1.InsightsIcon color={AppColors_1.AppColors.purple} size={16}/>,
1469
+ label: 'Default JSON Expand Depth',
1470
+ description: 'Initial depth of Redux state tree to auto-expand',
1471
+ picker: {
1472
+ options: [1, 2, 3, 5],
1473
+ selectedValue: reduxExpandDepth,
1474
+ onSelect: setReduxExpandDepth,
1475
+ },
1476
+ isLast: true,
1477
+ })}
1478
+ </react_native_1.View>
1479
+
1480
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, padding: 16, marginTop: 12 }}>
1481
+ {renderSettingRow({
1482
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1483
+ label: 'Clear Redux State',
1484
+ description: reduxState ? 'Reset state snapshot in inspector' : 'No store snapshot stored',
1485
+ isLast: true,
1486
+ onPress: () => {
1487
+ setReduxState(null);
1488
+ react_native_1.Alert.alert('Success', 'Redux state snapshot cleared.');
1489
+ },
1490
+ right: (<react_native_1.View style={{ paddingHorizontal: 10, paddingVertical: 5, borderRadius: 7, backgroundColor: 'rgba(255,46,87,0.08)', borderWidth: 1, borderColor: 'rgba(255,46,87,0.2)' }}>
1491
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 11, color: AppColors_1.AppColors.errorColor }}>Clear</react_native_1.Text>
1492
+ </react_native_1.View>),
1493
+ })}
1494
+ </react_native_1.View>
1495
+ </react_native_1.ScrollView>);
1496
+ }
1497
+ // Default return page is Insights settings
1498
+ return (<react_native_1.ScrollView style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} contentContainerStyle={{ padding: 16 }}>
1499
+ {renderSubHeader('Insights Settings', <NetworkIcons_1.InsightsIcon color={AppColors_1.AppColors.purple} size={16}/>)}
1500
+ <react_native_1.View style={{ backgroundColor: AppColors_1.AppColors.primaryLight, padding: 16, borderRadius: 12, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary, gap: 4 }}>
1501
+ {renderSettingRow({
1502
+ icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1503
+ label: 'Slow Latency Warning',
1504
+ description: 'Alert threshold for slow API request duration',
1505
+ picker: {
1506
+ options: [500, 1000, 2000],
1507
+ selectedValue: slowRequestThreshold,
1508
+ onSelect: setSlowRequestThreshold,
1509
+ },
1510
+ })}
1511
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1512
+ {renderSettingRow({
1513
+ icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1514
+ label: 'Show Console Alerts',
1515
+ description: 'Flags critical warnings or crash events on dashboard',
1516
+ isLast: true,
1517
+ onPress: () => setInsightsShowConsoleAlerts(prev => !prev),
1518
+ right: (<react_native_1.View style={{
1519
+ width: 22, height: 22, borderRadius: 6,
1520
+ borderWidth: 2,
1521
+ borderColor: insightsShowConsoleAlerts ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak,
1522
+ backgroundColor: insightsShowConsoleAlerts ? 'rgba(104, 75, 155, 0.1)' : 'transparent',
1523
+ alignItems: 'center', justifyContent: 'center',
1524
+ }}>
1525
+ {insightsShowConsoleAlerts && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.purple}/>}
1526
+ </react_native_1.View>),
1527
+ })}
1528
+ </react_native_1.View>
1529
+ </react_native_1.ScrollView>);
1530
+ };
758
1531
  const renderInsightsDashboard = () => {
759
1532
  const apiTotal = logs.length;
760
1533
  const apiErrors = logs.filter(l => (l.status != null && l.status >= 400) || l.status === 0 || l.status == null).length;
@@ -774,168 +1547,168 @@ const NetworkInspector = () => {
774
1547
  const webviewTotal = webViewNavHistory.length;
775
1548
  return (<react_native_1.View style={styles_1.default.dashboardContainer}>
776
1549
  {/* Module 1: APIs */}
777
- <TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('apis')}>
778
- <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
779
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
780
- <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={18}/>
781
- <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>APIs & Network</react_native_1.Text>
782
- </react_native_1.View>
783
- <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
784
- </react_native_1.View>
785
- <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
786
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
787
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>{apiTotal}</react_native_1.Text>
788
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Requests</react_native_1.Text>
789
- </react_native_1.View>
790
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
791
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, apiSuccessRate < 90 && { color: AppColors_1.AppColors.warningIconGold }]}>
792
- {apiSuccessRate}%
793
- </react_native_1.Text>
794
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Success Rate</react_native_1.Text>
795
- </react_native_1.View>
796
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
797
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, apiErrors > 0 && { color: AppColors_1.AppColors.errorColor }]}>
798
- {apiErrors}
799
- </react_native_1.Text>
800
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Errors</react_native_1.Text>
1550
+ {tabVisibility.apis && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('apis')}>
1551
+ <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
1552
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1553
+ <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={18}/>
1554
+ <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>APIs & Network</react_native_1.Text>
1555
+ </react_native_1.View>
1556
+ <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
801
1557
  </react_native_1.View>
802
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
803
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>
804
- {avgTime != null ? `${avgTime}ms` : '—'}
805
- </react_native_1.Text>
806
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Avg Latency</react_native_1.Text>
1558
+ <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
1559
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1560
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>{apiTotal}</react_native_1.Text>
1561
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Requests</react_native_1.Text>
1562
+ </react_native_1.View>
1563
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1564
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, apiSuccessRate < 90 && { color: AppColors_1.AppColors.warningIconGold }]}>
1565
+ {apiSuccessRate}%
1566
+ </react_native_1.Text>
1567
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Success Rate</react_native_1.Text>
1568
+ </react_native_1.View>
1569
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1570
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, apiErrors > 0 && { color: AppColors_1.AppColors.errorColor }]}>
1571
+ {apiErrors}
1572
+ </react_native_1.Text>
1573
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Errors</react_native_1.Text>
1574
+ </react_native_1.View>
1575
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1576
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>
1577
+ {avgTime != null ? `${avgTime}ms` : '—'}
1578
+ </react_native_1.Text>
1579
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Avg Latency</react_native_1.Text>
1580
+ </react_native_1.View>
807
1581
  </react_native_1.View>
808
- </react_native_1.View>
809
- </TouchableScale_1.default>
1582
+ </TouchableScale_1.default>)}
810
1583
 
811
1584
  {/* Module 2: Logs */}
812
- <TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('logs')}>
813
- <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
814
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
815
- <NetworkIcons_1.TerminalIcon color="#0D9488" size={18}/>
816
- <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>Console Logs</react_native_1.Text>
1585
+ {tabVisibility.logs && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('logs')}>
1586
+ <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
1587
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1588
+ <NetworkIcons_1.TerminalIcon color="#0D9488" size={18}/>
1589
+ <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>Console Logs</react_native_1.Text>
1590
+ </react_native_1.View>
1591
+ <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
817
1592
  </react_native_1.View>
818
- <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
819
- </react_native_1.View>
820
- <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
821
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
822
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>{logTotal}</react_native_1.Text>
823
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Total Logs</react_native_1.Text>
824
- </react_native_1.View>
825
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
826
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, { color: '#0D9488' }]}>{logInfos}</react_native_1.Text>
827
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Info</react_native_1.Text>
828
- </react_native_1.View>
829
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
830
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, logWarns > 0 && { color: AppColors_1.AppColors.warningIconGold }]}>
831
- {logWarns}
832
- </react_native_1.Text>
833
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Warnings</react_native_1.Text>
834
- </react_native_1.View>
835
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
836
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, logErrors > 0 && { color: AppColors_1.AppColors.errorColor }]}>
837
- {logErrors}
838
- </react_native_1.Text>
839
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Errors</react_native_1.Text>
1593
+ <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
1594
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1595
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>{logTotal}</react_native_1.Text>
1596
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Total Logs</react_native_1.Text>
1597
+ </react_native_1.View>
1598
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1599
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, { color: '#0D9488' }]}>{logInfos}</react_native_1.Text>
1600
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Info</react_native_1.Text>
1601
+ </react_native_1.View>
1602
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1603
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, logWarns > 0 && { color: AppColors_1.AppColors.warningIconGold }]}>
1604
+ {logWarns}
1605
+ </react_native_1.Text>
1606
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Warnings</react_native_1.Text>
1607
+ </react_native_1.View>
1608
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1609
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, logErrors > 0 && { color: AppColors_1.AppColors.errorColor }]}>
1610
+ {logErrors}
1611
+ </react_native_1.Text>
1612
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Errors</react_native_1.Text>
1613
+ </react_native_1.View>
840
1614
  </react_native_1.View>
841
- </react_native_1.View>
842
- </TouchableScale_1.default>
1615
+ </TouchableScale_1.default>)}
843
1616
 
844
1617
  {/* Module 3: Analytics */}
845
- <TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('analytics')}>
846
- <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
847
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
848
- <NetworkIcons_1.AnalyticsIcon color="#EA580C" size={18}/>
849
- <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>Analytics Events</react_native_1.Text>
850
- </react_native_1.View>
851
- <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
852
- </react_native_1.View>
853
- <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
854
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
855
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>{analyticsTotal}</react_native_1.Text>
856
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Total Events</react_native_1.Text>
857
- </react_native_1.View>
858
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
859
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, { color: '#EA580C' }]}>{uniqueEvents}</react_native_1.Text>
860
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Unique Names</react_native_1.Text>
861
- </react_native_1.View>
862
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
863
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>{screenViews}</react_native_1.Text>
864
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Screen Views</react_native_1.Text>
1618
+ {tabVisibility.analytics && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('analytics')}>
1619
+ <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
1620
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1621
+ <NetworkIcons_1.AnalyticsIcon color="#EA580C" size={18}/>
1622
+ <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>Analytics Events</react_native_1.Text>
1623
+ </react_native_1.View>
1624
+ <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
865
1625
  </react_native_1.View>
866
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
867
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>
868
- {analyticsTotal > 0 ? Math.round(analyticsTotal / Math.max(1, logs.length / 5)) : 0}
869
- </react_native_1.Text>
870
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Events Ratio</react_native_1.Text>
1626
+ <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
1627
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1628
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>{analyticsTotal}</react_native_1.Text>
1629
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Total Events</react_native_1.Text>
1630
+ </react_native_1.View>
1631
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1632
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, { color: '#EA580C' }]}>{uniqueEvents}</react_native_1.Text>
1633
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Unique Names</react_native_1.Text>
1634
+ </react_native_1.View>
1635
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1636
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>{screenViews}</react_native_1.Text>
1637
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Screen Views</react_native_1.Text>
1638
+ </react_native_1.View>
1639
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1640
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>
1641
+ {analyticsTotal > 0 ? Math.round(analyticsTotal / Math.max(1, logs.length / 5)) : 0}
1642
+ </react_native_1.Text>
1643
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Events Ratio</react_native_1.Text>
1644
+ </react_native_1.View>
871
1645
  </react_native_1.View>
872
- </react_native_1.View>
873
- </TouchableScale_1.default>
1646
+ </TouchableScale_1.default>)}
874
1647
 
875
1648
  {/* Module 4: WebView */}
876
- <TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('webview')}>
877
- <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
878
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
879
- <NetworkIcons_1.GlobeIcon color="#2563EB" size={18}/>
880
- <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>WebView Captures</react_native_1.Text>
881
- </react_native_1.View>
882
- <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
883
- </react_native_1.View>
884
- <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
885
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
886
- <react_native_1.Text style={styles_1.default.dashboardGridVal}>{webviewTotal}</react_native_1.Text>
887
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>History Size</react_native_1.Text>
888
- </react_native_1.View>
889
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
890
- <react_native_1.Text style={[styles_1.default.dashboardGridVal, { color: '#16A34A' }]}>Active</react_native_1.Text>
891
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Status</react_native_1.Text>
1649
+ {tabVisibility.webview && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('webview')}>
1650
+ <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
1651
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1652
+ <NetworkIcons_1.GlobeIcon color="#2563EB" size={18}/>
1653
+ <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>WebView Captures</react_native_1.Text>
1654
+ </react_native_1.View>
1655
+ <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
892
1656
  </react_native_1.View>
893
- <react_native_1.View style={styles_1.default.dashboardGridItem}>
894
- <react_native_1.Text numberOfLines={1} style={styles_1.default.dashboardGridVal}>
895
- {webviewTotal > 0 ? `${webViewNavHistory[0]?.title?.substring(0, 10) ?? ''}...` : '—'}
896
- </react_native_1.Text>
897
- <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Last URL</react_native_1.Text>
1657
+ <react_native_1.View style={styles_1.default.dashboardModuleGrid}>
1658
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1659
+ <react_native_1.Text style={styles_1.default.dashboardGridVal}>{webviewTotal}</react_native_1.Text>
1660
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>History Size</react_native_1.Text>
1661
+ </react_native_1.View>
1662
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1663
+ <react_native_1.Text style={[styles_1.default.dashboardGridVal, { color: '#16A34A' }]}>Active</react_native_1.Text>
1664
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Status</react_native_1.Text>
1665
+ </react_native_1.View>
1666
+ <react_native_1.View style={styles_1.default.dashboardGridItem}>
1667
+ <react_native_1.Text numberOfLines={1} style={styles_1.default.dashboardGridVal}>
1668
+ {webviewTotal > 0 ? `${webViewNavHistory[0]?.title?.substring(0, 10) ?? ''}...` : '—'}
1669
+ </react_native_1.Text>
1670
+ <react_native_1.Text style={styles_1.default.dashboardGridLbl}>Last URL</react_native_1.Text>
1671
+ </react_native_1.View>
898
1672
  </react_native_1.View>
899
- </react_native_1.View>
900
- </TouchableScale_1.default>
1673
+ </TouchableScale_1.default>)}
901
1674
 
902
1675
  {/* Module 5: Redux Store */}
903
- <TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('redux')}>
904
- <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
905
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
906
- <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={18}/>
907
- <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>Redux Store State</react_native_1.Text>
1676
+ {tabVisibility.redux && (<TouchableScale_1.default style={styles_1.default.dashboardModuleCard} onPress={() => setActiveTab('redux')}>
1677
+ <react_native_1.View style={styles_1.default.dashboardModuleHeader}>
1678
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1679
+ <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={18}/>
1680
+ <react_native_1.Text style={styles_1.default.dashboardModuleTitle}>Redux Store State</react_native_1.Text>
1681
+ </react_native_1.View>
1682
+ <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
908
1683
  </react_native_1.View>
909
- <react_native_1.Text style={styles_1.default.dashboardModuleGoText}>View Details →</react_native_1.Text>
910
- </react_native_1.View>
911
- {reduxState ? (<react_native_1.View style={{ paddingHorizontal: 12, paddingBottom: 12, gap: 6 }}>
912
- <react_native_1.View style={{ flexDirection: 'row', justifyContent: 'space-between', marginBottom: 4 }}>
913
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.5 }}>
914
- REDUCER NAME
915
- </react_native_1.Text>
916
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.5 }}>
917
- SIZE / FIELDS
1684
+ {reduxState ? (<react_native_1.View style={{ paddingHorizontal: 12, paddingBottom: 12, gap: 6 }}>
1685
+ <react_native_1.View style={{ flexDirection: 'row', justifyContent: 'space-between', marginBottom: 4 }}>
1686
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.5 }}>
1687
+ REDUCER NAME
1688
+ </react_native_1.Text>
1689
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, letterSpacing: 0.5 }}>
1690
+ SIZE / FIELDS
1691
+ </react_native_1.Text>
1692
+ </react_native_1.View>
1693
+ {Object.keys(reduxState).map(key => {
1694
+ const val = reduxState[key];
1695
+ const fieldsCount = typeof val === 'object' && val !== null ? Object.keys(val).length : 0;
1696
+ const sizeStr = (0, helpers_1.getSize)(val);
1697
+ return (<react_native_1.View key={key} style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 2 }}>
1698
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interMedium, fontSize: 12, color: AppColors_1.AppColors.grayTextStrong }}>
1699
+ {key}
1700
+ </react_native_1.Text>
1701
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 11, color: AppColors_1.AppColors.grayTextWeak }}>
1702
+ {sizeStr} ({fieldsCount} fields)
1703
+ </react_native_1.Text>
1704
+ </react_native_1.View>);
1705
+ })}
1706
+ </react_native_1.View>) : (<react_native_1.View style={{ padding: 12, alignItems: 'center' }}>
1707
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 12, color: AppColors_1.AppColors.grayTextWeak }}>
1708
+ No connected Redux store.
918
1709
  </react_native_1.Text>
919
- </react_native_1.View>
920
- {Object.keys(reduxState).map(key => {
921
- const val = reduxState[key];
922
- const fieldsCount = typeof val === 'object' && val !== null ? Object.keys(val).length : 0;
923
- const sizeStr = (0, helpers_1.getSize)(val);
924
- return (<react_native_1.View key={key} style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingVertical: 2 }}>
925
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interMedium, fontSize: 12, color: AppColors_1.AppColors.grayTextStrong }}>
926
- {key}
927
- </react_native_1.Text>
928
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 11, color: AppColors_1.AppColors.grayTextWeak }}>
929
- {sizeStr} ({fieldsCount} fields)
930
- </react_native_1.Text>
931
- </react_native_1.View>);
932
- })}
933
- </react_native_1.View>) : (<react_native_1.View style={{ padding: 12, alignItems: 'center' }}>
934
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 12, color: AppColors_1.AppColors.grayTextWeak }}>
935
- No connected Redux store.
936
- </react_native_1.Text>
937
- </react_native_1.View>)}
938
- </TouchableScale_1.default>
1710
+ </react_native_1.View>)}
1711
+ </TouchableScale_1.default>)}
939
1712
  </react_native_1.View>);
940
1713
  };
941
1714
  const renderReduxTab = () => {
@@ -957,37 +1730,52 @@ const NetworkInspector = () => {
957
1730
  <react_native_1.Text style={styles_1.default.emptySub}>Connected store state is empty.</react_native_1.Text>
958
1731
  </react_native_1.View>);
959
1732
  }
1733
+ // Build hierarchical tree: Store -> Reducers -> Action -> Data
1734
+ const lastActionMap = (0, reduxLogger_1.getLastActionForReducer)();
960
1735
  return (<react_native_1.ScrollView style={styles_1.default.detailScroll} contentContainerStyle={{ paddingBottom: 24 }}>
1736
+ {/* Top Summary Card */}
961
1737
  <react_native_1.View style={{
1738
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1739
+ borderRadius: 12,
1740
+ borderWidth: 1,
1741
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1742
+ padding: 14,
1743
+ marginHorizontal: 16,
1744
+ marginTop: 12,
1745
+ marginBottom: 12,
962
1746
  flexDirection: 'row',
963
1747
  alignItems: 'center',
964
- justifyContent: 'space-between',
965
- paddingHorizontal: 16,
966
- paddingVertical: 12,
967
- borderBottomWidth: 1,
968
- borderBottomColor: AppColors_1.AppColors.dividerColor,
969
- backgroundColor: AppColors_1.AppColors.primaryLight,
1748
+ gap: 12,
970
1749
  }}>
971
- <react_native_1.Text style={{
972
- fontFamily: AppFonts_1.AppFonts.interBold,
973
- color: AppColors_1.AppColors.grayTextStrong,
974
- fontSize: 12,
975
- textTransform: 'uppercase',
976
- letterSpacing: 0.6,
1750
+ <react_native_1.View style={{
1751
+ width: 44,
1752
+ height: 44,
1753
+ borderRadius: 10,
1754
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1755
+ alignItems: 'center',
1756
+ justifyContent: 'center',
977
1757
  }}>
978
- Redux Store ({reducerKeys.length} Reducers)
979
- </react_native_1.Text>
1758
+ <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={20}/>
1759
+ </react_native_1.View>
1760
+ <react_native_1.View style={{ flex: 1 }}>
1761
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 13, color: AppColors_1.AppColors.primaryBlack }}>
1762
+ Redux Store Snapshot
1763
+ </react_native_1.Text>
1764
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 11, color: AppColors_1.AppColors.grayText, marginTop: 2 }}>
1765
+ Total size: {(0, helpers_1.getSize)(reduxState)} • {reducerKeys.length} Reducers
1766
+ </react_native_1.Text>
1767
+ </react_native_1.View>
980
1768
  <CopyButton_1.default value={() => reduxState} label="Overall Store"/>
981
1769
  </react_native_1.View>
982
1770
 
1771
+ {/* Search Bar */}
983
1772
  <react_native_1.View style={{
984
1773
  flexDirection: 'row',
985
1774
  alignItems: 'center',
986
1775
  backgroundColor: AppColors_1.AppColors.grayBackground,
987
1776
  borderRadius: 8,
988
1777
  marginHorizontal: 16,
989
- marginTop: 12,
990
- marginBottom: 8,
1778
+ marginBottom: 12,
991
1779
  paddingHorizontal: 10,
992
1780
  borderWidth: 1,
993
1781
  borderColor: AppColors_1.AppColors.dividerColor,
@@ -1005,68 +1793,24 @@ const NetworkInspector = () => {
1005
1793
  </react_native_1.Pressable>)}
1006
1794
  </react_native_1.View>
1007
1795
 
1008
- {reducerKeys.map(key => {
1009
- const isExpanded = expandedReducers[key];
1010
- const val = reduxState[key];
1011
- return (<react_native_1.View key={key} style={{
1012
- backgroundColor: AppColors_1.AppColors.primaryLight,
1013
- borderBottomWidth: 1,
1014
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1015
- }}>
1016
- <react_native_1.Pressable onPress={() => {
1017
- setExpandedReducers(prev => ({
1018
- ...prev,
1019
- [key]: !prev[key],
1020
- }));
1021
- }} style={{
1022
- flexDirection: 'row',
1023
- alignItems: 'center',
1024
- justifyContent: 'space-between',
1025
- paddingHorizontal: 16,
1026
- paddingVertical: 12,
1027
- }}>
1028
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8, flex: 1 }}>
1029
- <react_native_1.Animated.View style={{ transform: [{ rotate: isExpanded ? '0deg' : '-90deg' }] }}>
1030
- <NetworkIcons_1.ChevronIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
1031
- </react_native_1.Animated.View>
1032
- <react_native_1.Text style={{
1033
- fontFamily: AppFonts_1.AppFonts.interBold,
1034
- fontSize: 13,
1035
- color: AppColors_1.AppColors.purple,
1036
- }}>
1037
- {key}
1038
- </react_native_1.Text>
1039
- <react_native_1.Text style={{
1040
- fontFamily: AppFonts_1.AppFonts.interRegular,
1041
- fontSize: 11,
1042
- color: AppColors_1.AppColors.grayTextWeak,
1043
- }}>
1044
- ({typeof val === 'object' && val !== null ? `${Object.keys(val).length} fields` : typeof val})
1045
- </react_native_1.Text>
1046
- </react_native_1.View>
1047
- <CopyButton_1.default value={() => val} label={`${key} Reducer`}/>
1048
- </react_native_1.Pressable>
1049
-
1050
- {isExpanded && (<react_native_1.View style={{
1051
- backgroundColor: AppColors_1.AppColors.grayBackground,
1052
- paddingHorizontal: 12,
1053
- paddingVertical: 8,
1054
- borderTopWidth: 1,
1055
- borderTopColor: AppColors_1.AppColors.dividerColor,
1056
- }}>
1057
- <JsonViewer_1.default data={val} search={reduxSearch}/>
1058
- </react_native_1.View>)}
1059
- </react_native_1.View>);
1060
- })}
1796
+ {/* Main Tree Card */}
1797
+ <react_native_1.View style={{
1798
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1799
+ borderRadius: 12,
1800
+ borderWidth: 1,
1801
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1802
+ marginHorizontal: 16,
1803
+ padding: 12,
1804
+ }}>
1805
+ <ReduxTreeView_1.ReduxTreeView state={reduxState} lastActionMap={lastActionMap} search={reduxSearch}/>
1806
+ </react_native_1.View>
1061
1807
  </react_native_1.ScrollView>);
1062
1808
  };
1063
1809
  return (<>
1064
1810
  {hasNavigationContext && (<NavigationTracker onStateChange={setNavState}/>)}
1065
1811
  <TouchableScale_1.default style={styles_1.default.fabWrapper} onPress={() => setVisible(true)} hitSlop={10}>
1066
1812
  <react_native_1.Animated.View style={[styles_1.default.fabPulseRing, { transform: [{ scale: pulseAnim }] }]}/>
1067
- <react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, '#8F6EFF']} style={styles_1.default.fab}>
1068
- <NetworkIcons_1.DebugIcon color="#FFFFFF" size={28}/>
1069
- </react_native_linear_gradient_1.default>
1813
+ <NetworkIcons_1.BrandCircleIcon size={62}/>
1070
1814
  {(logs.length > 0 || analyticsEvents.length > 0) && (<react_native_1.Animated.View style={[
1071
1815
  styles_1.default.fabBadge,
1072
1816
  hasErrors ? styles_1.default.fabBadgeError : styles_1.default.fabBadgeNormal,
@@ -1111,7 +1855,33 @@ const NetworkInspector = () => {
1111
1855
  <NetworkIcons_1.WhiteBackNavigation />
1112
1856
  </TouchableScale_1.default>
1113
1857
 
1114
- {selected == null && selectedEvent == null ? (<react_native_1.Text style={styles_1.default.headerTitle}>RN-InApp-Inspector</react_native_1.Text>) : null}
1858
+ {selected == null && selectedEvent == null ? (<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 14, flex: 1 }}>
1859
+ <react_native_1.View style={{
1860
+ width: 42,
1861
+ height: 42,
1862
+ borderRadius: 10,
1863
+ backgroundColor: 'rgba(255,255,255,0.13)',
1864
+ borderWidth: 1.5,
1865
+ borderColor: 'rgba(255,255,255,0.25)',
1866
+ alignItems: 'center',
1867
+ justifyContent: 'center',
1868
+ shadowColor: '#000',
1869
+ shadowOpacity: 0.15,
1870
+ shadowRadius: 4,
1871
+ shadowOffset: { width: 0, height: 2 },
1872
+ }}>
1873
+ <NetworkIcons_1.BrandSquareIcon size={36}/>
1874
+ </react_native_1.View>
1875
+ <react_native_1.View style={{ gap: 3 }}>
1876
+ <react_native_1.Text style={[styles_1.default.headerTitle, { fontSize: 17, letterSpacing: 0.2 }]}>RN InApp Inspector</react_native_1.Text>
1877
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
1878
+ <react_native_1.Animated.View style={{ width: 6, height: 6, borderRadius: 3, backgroundColor: '#4ADE80', opacity: activePulseAnim }}/>
1879
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interMedium, fontSize: 10, color: 'rgba(255,255,255,0.78)', letterSpacing: 0.3 }}>
1880
+ Active • {react_native_1.Platform.OS === 'ios' ? 'iOS' : 'Android'} (v1.0.10)
1881
+ </react_native_1.Text>
1882
+ </react_native_1.View>
1883
+ </react_native_1.View>
1884
+ </react_native_1.View>) : null}
1115
1885
  </react_native_1.View>
1116
1886
 
1117
1887
  <react_native_1.View style={styles_1.default.headerCenter}>
@@ -1187,15 +1957,11 @@ const NetworkInspector = () => {
1187
1957
  </react_native_1.View>
1188
1958
 
1189
1959
  <react_native_1.View style={styles_1.default.headerRight}>
1190
- <TouchableScale_1.default onPress={() => {
1191
- const newTheme = !isDark;
1192
- setIsDark(newTheme);
1193
- (0, styles_1.toggleGlobalTheme)(newTheme);
1194
- }} hitSlop={15} style={[styles_1.default.closeButtonCircle, { marginRight: 8 }]}>
1195
- {isDark ? (<NetworkIcons_1.SunIcon color="#FFFFFF" size={16}/>) : (<NetworkIcons_1.MoonIcon color="#FFFFFF" size={16}/>)}
1196
- </TouchableScale_1.default>
1960
+ {selected == null && selectedEvent == null && (<TouchableScale_1.default onPress={() => setSettingsPage('main')} hitSlop={15} style={[styles_1.default.closeButtonSquare, { marginRight: 8, backgroundColor: 'rgba(255,255,255,0.15)' }]}>
1961
+ <NetworkIcons_1.SettingsIcon color="#FFFFFF" size={16}/>
1962
+ </TouchableScale_1.default>)}
1197
1963
 
1198
- <TouchableScale_1.default onPress={closeModal} hitSlop={15} style={styles_1.default.closeButtonCircle}>
1964
+ <TouchableScale_1.default onPress={closeModal} hitSlop={15} style={styles_1.default.closeButtonSquare}>
1199
1965
  <NetworkIcons_1.CloseWhite size={16}/>
1200
1966
  </TouchableScale_1.default>
1201
1967
  </react_native_1.View>
@@ -1203,7 +1969,7 @@ const NetworkInspector = () => {
1203
1969
  </react_native_linear_gradient_1.default>
1204
1970
 
1205
1971
  {/* ─── Horizontal Scrollable Tab Bar inside Content ─── */}
1206
- {selected == null && selectedEvent == null ? (<react_native_1.View style={styles_1.default.tabBarContainer}>
1972
+ {selected == null && selectedEvent == null && settingsPage === null ? (<react_native_1.View style={styles_1.default.tabBarContainer}>
1207
1973
  <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{ paddingRight: 16 }}>
1208
1974
  {[
1209
1975
  { key: 'insights', label: 'Insights', count: 0, icon: 'insights' },
@@ -1212,10 +1978,12 @@ const NetworkInspector = () => {
1212
1978
  { key: 'analytics', label: 'Analytics', count: analyticsEvents.length, icon: 'analytics' },
1213
1979
  { key: 'webview', label: 'WebView', count: webViewNavHistory.length, icon: 'webview' },
1214
1980
  { key: 'redux', label: 'Redux', count: 0, icon: 'redux' },
1215
- ].map(tab => {
1981
+ ].filter(tab => tabVisibility[tab.key]).map(tab => {
1216
1982
  const isActive = activeTab === tab.key;
1217
1983
  const iconColor = isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText;
1218
1984
  const countLabel = tab.count > 9 ? '9+' : String(tab.count);
1985
+ const hasUnreadApis = activeTab !== 'apis' && logs.length > lastReadApisCount;
1986
+ const hasUnreadLogs = activeTab !== 'logs' && consoleLogs.length > lastReadLogsCount;
1219
1987
  return (<TouchableScale_1.default key={tab.key} onPress={() => {
1220
1988
  requestAnimationFrame(() => {
1221
1989
  setActiveTab(tab.key);
@@ -1237,6 +2005,15 @@ const NetworkInspector = () => {
1237
2005
  ]}>
1238
2006
  {tab.label} {tab.count > 0 ? `(${countLabel})` : ''}
1239
2007
  </react_native_1.Text>
2008
+ {((tab.key === 'apis' && hasUnreadApis) || (tab.key === 'logs' && hasUnreadLogs)) && (<react_native_1.Animated.View style={{
2009
+ width: 6,
2010
+ height: 6,
2011
+ borderRadius: 3,
2012
+ backgroundColor: AppColors_1.AppColors.errorColor,
2013
+ marginLeft: 4,
2014
+ alignSelf: 'center',
2015
+ transform: [{ scale: unreadPulseAnim }],
2016
+ }}/>)}
1240
2017
  </react_native_1.View>
1241
2018
  </TouchableScale_1.default>);
1242
2019
  })}
@@ -1859,156 +2636,250 @@ const NetworkInspector = () => {
1859
2636
  styles_1.default.listContent,
1860
2637
  filteredConsoleLogs.length === 0 && { flexGrow: 1 },
1861
2638
  ]} keyboardShouldPersistTaps="handled"/>
1862
- </react_native_1.View>) : activeTab === 'webview' ? (<react_native_1.View style={{ flex: 1 }}>
2639
+ </react_native_1.View>) : activeTab === 'webview' ? (webViewNavHistory.length === 0 ? (<react_native_1.View style={styles_1.default.emptyContainer}>
2640
+ <react_native_1.View style={styles_1.default.emptyIconWrap}>
2641
+ <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={32}/>
2642
+ </react_native_1.View>
2643
+ <react_native_1.Text style={styles_1.default.emptyTitle}>No WebView Activity</react_native_1.Text>
2644
+ <react_native_1.Text style={styles_1.default.emptySub}>
2645
+ Load a webpage within a connected WebView component to inspect pages, page source, and console logs.
2646
+ </react_native_1.Text>
2647
+ </react_native_1.View>) : (<react_native_1.View style={{ flex: 1 }}>
2648
+ {/* ─── Current Page Address Bar (Now on top) ─── */}
2649
+ {(() => {
2650
+ const currentUrl = webViewNavHistory[0]?.url;
2651
+ if (!currentUrl)
2652
+ return null;
2653
+ return (<react_native_1.View style={{
2654
+ paddingHorizontal: 12,
2655
+ paddingTop: 6,
2656
+ paddingBottom: 6,
2657
+ backgroundColor: AppColors_1.AppColors.primaryLight,
2658
+ borderBottomWidth: 1,
2659
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
2660
+ }}>
2661
+ <react_native_1.View style={{
2662
+ flexDirection: 'row',
2663
+ alignItems: 'center',
2664
+ backgroundColor: AppColors_1.AppColors.grayBackground,
2665
+ borderRadius: 8,
2666
+ borderWidth: 1.5,
2667
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2668
+ paddingHorizontal: 10,
2669
+ paddingVertical: 5,
2670
+ gap: 8,
2671
+ }}>
2672
+ {/* Left: Lock and HTTPS label */}
2673
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
2674
+ <react_native_1.Text style={{ fontSize: 11 }}>🔒</react_native_1.Text>
2675
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 9.5, color: AppColors_1.AppColors.greenColor, letterSpacing: 0.5 }}>HTTPS</react_native_1.Text>
2676
+ </react_native_1.View>
2677
+ <react_native_1.View style={{ width: 1.5, height: 12, backgroundColor: AppColors_1.AppColors.grayBorderSecondary }}/>
2678
+
2679
+ {/* Middle: URL text (Address style) */}
2680
+ <react_native_1.View style={{ flex: 1 }}>
2681
+ <HighlightText_1.default text={currentUrl} search={webViewSearch} numberOfLines={1} ellipsizeMode="tail" style={{
2682
+ fontFamily: AppFonts_1.AppFonts.interMedium,
2683
+ fontSize: 11.5,
2684
+ color: AppColors_1.AppColors.primaryBlack,
2685
+ }} highlightStyle={styles_1.default.highlight} detectLinks={false}/>
2686
+ </react_native_1.View>
2687
+
2688
+ {/* Right: Copy Button */}
2689
+ <CopyButton_1.default value={currentUrl} label="URL"/>
2690
+
2691
+ {/* Right: Globe Icon button to open browser */}
2692
+ <TouchableScale_1.default onPress={() => react_native_1.Linking.openURL(currentUrl)} hitSlop={8} style={{
2693
+ width: 26,
2694
+ height: 26,
2695
+ borderRadius: 13,
2696
+ backgroundColor: AppColors_1.AppColors.grayBackground,
2697
+ borderWidth: 1,
2698
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2699
+ alignItems: 'center',
2700
+ justifyContent: 'center',
2701
+ }}>
2702
+ <NetworkIcons_1.GlobeIcon size={11} color={AppColors_1.AppColors.purple}/>
2703
+ </TouchableScale_1.default>
2704
+ </react_native_1.View>
2705
+ </react_native_1.View>);
2706
+ })()}
2707
+
2708
+ {/* ─── WebView Sub-Tabs (Now below Address Bar) ─── */}
1863
2709
  <react_native_1.View style={{
1864
- backgroundColor: '#FFFFFF',
2710
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1865
2711
  borderBottomWidth: 1,
1866
2712
  borderBottomColor: AppColors_1.AppColors.dividerColor,
1867
- paddingBottom: 6,
2713
+ paddingVertical: 6,
1868
2714
  }}>
1869
- {/* ─── WebView Sub-Tabs ─────────────────────────────────────── */}
1870
- <react_native_1.View style={{
1871
- marginHorizontal: 16,
1872
- marginTop: webViewSubTab === 'navigation' ? 12 : 4,
1873
- marginBottom: 8,
1874
- backgroundColor: AppColors_1.AppColors.grayBackground,
1875
- borderRadius: 8,
1876
- padding: 4,
2715
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
2716
+ paddingHorizontal: 12,
1877
2717
  flexDirection: 'row',
1878
- borderWidth: 1,
1879
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
2718
+ gap: 8,
1880
2719
  }}>
2720
+ {/* Sub-tab 1: Preview */}
1881
2721
  <react_native_1.Pressable style={[
1882
2722
  {
1883
- flex: 1,
1884
- paddingVertical: 8,
1885
- borderRadius: 6,
2723
+ paddingVertical: 6,
2724
+ paddingHorizontal: 14,
2725
+ borderRadius: 8,
1886
2726
  alignItems: 'center',
2727
+ flexDirection: 'row',
2728
+ gap: 6,
2729
+ backgroundColor: 'rgba(0, 0, 0, 0.03)',
2730
+ borderWidth: 1,
2731
+ borderColor: 'transparent',
1887
2732
  },
1888
- webViewSubTab === 'html' && {
1889
- backgroundColor: AppColors_1.AppColors.primaryLight,
1890
- shadowColor: '#000',
1891
- shadowOpacity: 0.1,
1892
- shadowRadius: 3,
1893
- shadowOffset: { width: 0, height: 1 },
1894
- elevation: 2,
2733
+ webViewSubTab === 'preview' && {
2734
+ backgroundColor: AppColors_1.AppColors.purple,
2735
+ borderColor: AppColors_1.AppColors.purple,
1895
2736
  },
1896
- ]} onPress={() => setWebViewSubTab('html')}>
1897
- <react_native_1.Text style={[
2737
+ ]} onPress={() => setWebViewSubTab('preview')}>
2738
+ <NetworkIcons_1.EyeIcon color={webViewSubTab === 'preview' ? '#FFFFFF' : AppColors_1.AppColors.grayTextWeak} size={13}/>
2739
+ <react_native_1.Text style={{
2740
+ fontFamily: webViewSubTab === 'preview' ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interMedium,
2741
+ fontSize: 12,
2742
+ color: webViewSubTab === 'preview' ? '#FFFFFF' : AppColors_1.AppColors.grayTextStrong,
2743
+ }}>
2744
+ Preview
2745
+ </react_native_1.Text>
2746
+ </react_native_1.Pressable>
2747
+
2748
+ {/* Sub-tab 2: Page Source */}
2749
+ <react_native_1.Pressable style={[
1898
2750
  {
1899
- fontFamily: AppFonts_1.AppFonts.interMedium,
1900
- fontSize: 12,
1901
- color: AppColors_1.AppColors.grayTextStrong,
2751
+ paddingVertical: 6,
2752
+ paddingHorizontal: 14,
2753
+ borderRadius: 8,
2754
+ alignItems: 'center',
2755
+ flexDirection: 'row',
2756
+ gap: 6,
2757
+ backgroundColor: 'rgba(0, 0, 0, 0.03)',
2758
+ borderWidth: 1,
2759
+ borderColor: 'transparent',
1902
2760
  },
1903
2761
  webViewSubTab === 'html' && {
1904
- fontFamily: AppFonts_1.AppFonts.interBold,
1905
- color: '#475569',
2762
+ backgroundColor: AppColors_1.AppColors.purple,
2763
+ borderColor: AppColors_1.AppColors.purple,
1906
2764
  },
1907
- ]}>
1908
- HTML Source
2765
+ ]} onPress={() => setWebViewSubTab('html')}>
2766
+ <NetworkIcons_1.HtmlIcon color={webViewSubTab === 'html' ? '#FFFFFF' : AppColors_1.AppColors.grayTextWeak} size={13}/>
2767
+ <react_native_1.Text style={{
2768
+ fontFamily: webViewSubTab === 'html' ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interMedium,
2769
+ fontSize: 12,
2770
+ color: webViewSubTab === 'html' ? '#FFFFFF' : AppColors_1.AppColors.grayTextStrong,
2771
+ }}>
2772
+ Page Source
1909
2773
  </react_native_1.Text>
1910
2774
  </react_native_1.Pressable>
2775
+
2776
+ {/* Sub-tab 3: History */}
1911
2777
  <react_native_1.Pressable style={[
1912
2778
  {
1913
- flex: 1,
1914
- paddingVertical: 8,
1915
- borderRadius: 6,
2779
+ paddingVertical: 6,
2780
+ paddingHorizontal: 14,
2781
+ borderRadius: 8,
1916
2782
  alignItems: 'center',
2783
+ flexDirection: 'row',
2784
+ gap: 6,
2785
+ backgroundColor: 'rgba(0, 0, 0, 0.03)',
2786
+ borderWidth: 1,
2787
+ borderColor: 'transparent',
1917
2788
  },
1918
2789
  webViewSubTab === 'navigation' && {
1919
- backgroundColor: AppColors_1.AppColors.primaryLight,
1920
- shadowColor: '#000',
1921
- shadowOpacity: 0.1,
1922
- shadowRadius: 3,
1923
- shadowOffset: { width: 0, height: 1 },
1924
- elevation: 2,
2790
+ backgroundColor: AppColors_1.AppColors.purple,
2791
+ borderColor: AppColors_1.AppColors.purple,
1925
2792
  },
1926
2793
  ]} onPress={() => setWebViewSubTab('navigation')}>
1927
- <react_native_1.Text style={[
2794
+ <NetworkIcons_1.ClockIcon color={webViewSubTab === 'navigation' ? '#FFFFFF' : AppColors_1.AppColors.grayTextWeak} size={13}/>
2795
+ <react_native_1.Text style={{
2796
+ fontFamily: webViewSubTab === 'navigation' ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interMedium,
2797
+ fontSize: 12,
2798
+ color: webViewSubTab === 'navigation' ? '#FFFFFF' : AppColors_1.AppColors.grayTextStrong,
2799
+ }}>
2800
+ History ({webViewNavHistory.length})
2801
+ </react_native_1.Text>
2802
+ </react_native_1.Pressable>
2803
+
2804
+ {/* Sub-tab 4: Console */}
2805
+ <react_native_1.Pressable style={[
1928
2806
  {
1929
- fontFamily: AppFonts_1.AppFonts.interMedium,
1930
- fontSize: 12,
1931
- color: AppColors_1.AppColors.grayTextStrong,
2807
+ paddingVertical: 6,
2808
+ paddingHorizontal: 14,
2809
+ borderRadius: 8,
2810
+ alignItems: 'center',
2811
+ flexDirection: 'row',
2812
+ gap: 6,
2813
+ backgroundColor: 'rgba(0, 0, 0, 0.03)',
2814
+ borderWidth: 1,
2815
+ borderColor: 'transparent',
1932
2816
  },
1933
- webViewSubTab === 'navigation' && {
1934
- fontFamily: AppFonts_1.AppFonts.interBold,
1935
- color: '#475569',
2817
+ webViewSubTab === 'console' && {
2818
+ backgroundColor: AppColors_1.AppColors.purple,
2819
+ borderColor: AppColors_1.AppColors.purple,
1936
2820
  },
1937
- ]}>
1938
- Nav History ({webViewNavHistory.length})
2821
+ ]} onPress={() => setWebViewSubTab('console')}>
2822
+ <NetworkIcons_1.TerminalIcon color={webViewSubTab === 'console' ? '#FFFFFF' : AppColors_1.AppColors.grayTextWeak} size={13}/>
2823
+ <react_native_1.Text style={{
2824
+ fontFamily: webViewSubTab === 'console' ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interMedium,
2825
+ fontSize: 12,
2826
+ color: webViewSubTab === 'console' ? '#FFFFFF' : AppColors_1.AppColors.grayTextStrong,
2827
+ }}>
2828
+ Console ({webViewLogs.length})
1939
2829
  </react_native_1.Text>
1940
2830
  </react_native_1.Pressable>
1941
- </react_native_1.View>
2831
+ </react_native_1.ScrollView>
1942
2832
  </react_native_1.View>
1943
2833
 
1944
- {/* ─── Current Page Address Bar (Always visible at the top) ─── */}
1945
- {(() => {
1946
- const currentUrl = webViewNavHistory[0]?.url;
1947
- if (!currentUrl)
1948
- return null;
1949
- return (<react_native_1.View style={{
1950
- paddingHorizontal: 16,
1951
- paddingTop: 10,
1952
- paddingBottom: 10,
1953
- backgroundColor: '#FFFFFF',
1954
- borderBottomWidth: 1,
1955
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1956
- }}>
1957
- <react_native_1.Text style={{
1958
- fontFamily: AppFonts_1.AppFonts.interBold,
1959
- fontSize: 10,
1960
- color: '#64748B',
1961
- textTransform: 'uppercase',
1962
- letterSpacing: 0.5,
1963
- marginBottom: 6,
1964
- }}>
1965
- Currently debugging for URL
1966
- </react_native_1.Text>
1967
- <react_native_1.View style={{
1968
- flexDirection: 'row',
1969
- alignItems: 'center',
1970
- backgroundColor: '#F1F5F9',
1971
- borderRadius: 20,
1972
- borderWidth: 1,
1973
- borderColor: '#E2E8F0',
1974
- paddingHorizontal: 12,
1975
- paddingVertical: 6,
1976
- gap: 8,
1977
- }}>
1978
- {/* Left: Clickable Globe Icon to open browser */}
1979
- <TouchableScale_1.default onPress={() => react_native_1.Linking.openURL(currentUrl)} hitSlop={8} style={{
1980
- width: 24,
1981
- height: 24,
1982
- borderRadius: 12,
1983
- backgroundColor: '#E2E8F0',
1984
- alignItems: 'center',
1985
- justifyContent: 'center',
1986
- }} children={<NetworkIcons_1.GlobeIcon size={12} color="#475569"/>}/>
1987
-
1988
- {/* Middle: URL text (Address style) */}
1989
- <react_native_1.View style={{ flex: 1 }}>
1990
- <HighlightText_1.default text={currentUrl} search={webViewSearch} numberOfLines={1} ellipsizeMode="tail" style={{
1991
- fontFamily: AppFonts_1.AppFonts.interMedium,
1992
- fontSize: 11,
1993
- color: '#475569',
1994
- }} highlightStyle={styles_1.default.highlight} detectLinks={false}/>
1995
- </react_native_1.View>
1996
-
1997
- {/* Right: Copy Button */}
1998
- <CopyButton_1.default value={currentUrl} label="URL"/>
1999
- </react_native_1.View>
2000
- </react_native_1.View>);
2001
- })()}
2002
-
2003
2834
  {webViewSubTab === 'html' ? (<react_native_1.View style={{ flex: 1 }}>
2004
2835
  {webViewHtml || webViewCss || webViewJs ? (<react_native_1.View style={{ flex: 1 }}>
2836
+ {/* Clear Inspect Banner */}
2837
+ {inspectedElement && (<react_native_1.View style={{
2838
+ flexDirection: 'row',
2839
+ alignItems: 'center',
2840
+ justifyContent: 'space-between',
2841
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
2842
+ paddingHorizontal: 12,
2843
+ paddingVertical: 6,
2844
+ borderBottomWidth: 1,
2845
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
2846
+ }}>
2847
+ <react_native_1.Text style={{
2848
+ fontFamily: AppFonts_1.AppFonts.interMedium,
2849
+ fontSize: 11.5,
2850
+ color: AppColors_1.AppColors.purple,
2851
+ flex: 1,
2852
+ }}>
2853
+ Inspecting element:{' '}
2854
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold }}>
2855
+ &lt;{inspectedElement.tagName}
2856
+ {inspectedElement.id ? ` id="${inspectedElement.id}"` : ''}
2857
+ {inspectedElement.className ? ` class="${inspectedElement.className.trim().split(/\s+/)[0]}"` : ''}
2858
+ &gt;
2859
+ </react_native_1.Text>
2860
+ </react_native_1.Text>
2861
+ <react_native_1.Pressable onPress={() => setInspectedElement(null)} style={{
2862
+ paddingHorizontal: 8,
2863
+ paddingVertical: 4,
2864
+ }}>
2865
+ <react_native_1.Text style={{
2866
+ fontFamily: AppFonts_1.AppFonts.interBold,
2867
+ fontSize: 11,
2868
+ color: AppColors_1.AppColors.purple,
2869
+ }}>
2870
+ Clear Inspect
2871
+ </react_native_1.Text>
2872
+ </react_native_1.Pressable>
2873
+ </react_native_1.View>)}
2874
+
2005
2875
  {/* Inner sub-tabs inside HTML source view */}
2006
2876
  <react_native_1.View style={{
2007
2877
  flexDirection: 'row',
2008
2878
  borderBottomWidth: 1,
2009
- borderBottomColor: '#E2E8F0',
2010
- backgroundColor: '#FFFFFF',
2011
- paddingHorizontal: 16,
2879
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
2880
+ backgroundColor: AppColors_1.AppColors.primaryLight,
2881
+ paddingHorizontal: 12,
2882
+ gap: 12,
2012
2883
  }}>
2013
2884
  {['html', 'css', 'javascript'].map(tab => {
2014
2885
  const active = htmlSubTab === tab;
@@ -2016,23 +2887,34 @@ const NetworkInspector = () => {
2016
2887
  ? 'HTML'
2017
2888
  : tab === 'css'
2018
2889
  ? 'CSS'
2019
- : 'Javascript';
2890
+ : 'JavaScript';
2891
+ const activeColor = tab === 'html'
2892
+ ? '#EA580C' // Orange
2893
+ : tab === 'css'
2894
+ ? '#2563EB' // Blue
2895
+ : '#D97706'; // Dark Yellow/Amber
2020
2896
  return (<react_native_1.Pressable key={tab} onPress={() => setHtmlSubTab(tab)} style={{
2021
- paddingVertical: 10,
2022
- marginRight: 16,
2897
+ paddingVertical: 8,
2898
+ paddingHorizontal: 4,
2023
2899
  borderBottomWidth: 2,
2024
2900
  borderBottomColor: active
2025
- ? AppColors_1.AppColors.purple
2901
+ ? activeColor
2026
2902
  : 'transparent',
2903
+ flexDirection: 'row',
2904
+ alignItems: 'center',
2905
+ gap: 4,
2027
2906
  }}>
2907
+ {tab === 'html' && (<NetworkIcons_1.HtmlIcon color={active ? activeColor : AppColors_1.AppColors.grayTextWeak} size={14}/>)}
2908
+ {tab === 'css' && (<NetworkIcons_1.CssIcon color={active ? activeColor : AppColors_1.AppColors.grayTextWeak} size={14}/>)}
2909
+ {tab === 'javascript' && (<NetworkIcons_1.JsIcon color={active ? activeColor : AppColors_1.AppColors.grayTextWeak} size={14}/>)}
2028
2910
  <react_native_1.Text style={{
2029
2911
  fontFamily: active
2030
2912
  ? AppFonts_1.AppFonts.interBold
2031
2913
  : AppFonts_1.AppFonts.interMedium,
2032
- fontSize: 12,
2914
+ fontSize: 13,
2033
2915
  color: active
2034
- ? AppColors_1.AppColors.purple
2035
- : '#64748B',
2916
+ ? activeColor
2917
+ : AppColors_1.AppColors.grayTextWeak,
2036
2918
  }}>
2037
2919
  {label}
2038
2920
  </react_native_1.Text>
@@ -2042,21 +2924,21 @@ const NetworkInspector = () => {
2042
2924
  <react_native_1.View style={{ flex: 1, padding: 12 }}>
2043
2925
  {!isHtmlTabReady ? (<react_native_1.View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', minHeight: 200 }}>
2044
2926
  <react_native_1.ActivityIndicator size="large" color={AppColors_1.AppColors.purple}/>
2045
- </react_native_1.View>) : htmlSubTab === 'html' ? (webViewHtml ? (<CodeSnippet_1.default code={webViewHtml} language="html"/>) : (<react_native_1.Text style={{
2927
+ </react_native_1.View>) : htmlSubTab === 'html' ? (webViewHtml ? (<CodeSnippet_1.default code={webViewHtml} language="html" search={getSearchTermForTab()}/>) : (<react_native_1.Text style={{
2046
2928
  fontFamily: 'monospace',
2047
2929
  fontSize: 11,
2048
2930
  color: '#94A3B8',
2049
2931
  padding: 12,
2050
2932
  }}>
2051
2933
  No HTML content captured.
2052
- </react_native_1.Text>)) : htmlSubTab === 'css' ? (webViewCss ? (<CodeSnippet_1.default code={webViewCss} language="css"/>) : (<react_native_1.Text style={{
2934
+ </react_native_1.Text>)) : htmlSubTab === 'css' ? (webViewCss ? (<CodeSnippet_1.default code={webViewCss} language="css" search={getSearchTermForTab()}/>) : (<react_native_1.Text style={{
2053
2935
  fontFamily: 'monospace',
2054
2936
  fontSize: 11,
2055
2937
  color: '#94A3B8',
2056
2938
  padding: 12,
2057
2939
  }}>
2058
2940
  No CSS styles detected on this page.
2059
- </react_native_1.Text>)) : webViewJs ? (<CodeSnippet_1.default code={webViewJs} language="javascript"/>) : (<react_native_1.Text style={{
2941
+ </react_native_1.Text>)) : webViewJs ? (<CodeSnippet_1.default code={webViewJs} language="javascript" search={getSearchTermForTab()}/>) : (<react_native_1.Text style={{
2060
2942
  fontFamily: 'monospace',
2061
2943
  fontSize: 11,
2062
2944
  color: '#94A3B8',
@@ -2077,7 +2959,7 @@ const NetworkInspector = () => {
2077
2959
  or Javascript source.
2078
2960
  </react_native_1.Text>
2079
2961
  </react_native_1.View>)}
2080
- </react_native_1.View>) : (<react_native_1.FlatList data={filteredNavHistory} keyExtractor={(item, index) => `${index}-${item.timestamp}`} ListHeaderComponent={<react_native_1.View style={{
2962
+ </react_native_1.View>) : webViewSubTab === 'navigation' ? (<react_native_1.FlatList data={filteredNavHistory} keyExtractor={(item, index) => `${index}-${item.timestamp}`} style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }} ListHeaderComponent={<react_native_1.View style={{
2081
2963
  paddingHorizontal: 16,
2082
2964
  paddingTop: 12,
2083
2965
  paddingBottom: 8,
@@ -2092,191 +2974,304 @@ const NetworkInspector = () => {
2092
2974
  return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`;
2093
2975
  };
2094
2976
  return (<react_native_1.View style={{
2095
- paddingHorizontal: 16,
2096
- paddingVertical: 8,
2097
- backgroundColor: isLatest ? '#F1F5F9' : '#FFFFFF',
2098
- borderBottomWidth: 1,
2099
- borderBottomColor: '#E2E8F0',
2977
+ marginHorizontal: 16,
2978
+ marginVertical: 6,
2979
+ borderRadius: 12,
2980
+ borderWidth: 1,
2981
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2982
+ backgroundColor: isLatest ? AppColors_1.AppColors.purpleShade50 : AppColors_1.AppColors.primaryLight,
2983
+ padding: 14,
2100
2984
  flexDirection: 'row',
2101
2985
  alignItems: 'center',
2102
2986
  justifyContent: 'space-between',
2103
2987
  gap: 12,
2988
+ shadowColor: '#000000',
2989
+ shadowOffset: { width: 0, height: 2 },
2990
+ shadowOpacity: isDark ? 0.2 : 0.04,
2991
+ shadowRadius: 4,
2992
+ elevation: 2,
2104
2993
  }}>
2105
- <react_native_1.View style={{ flex: 1, gap: 2 }}>
2994
+ <react_native_1.View style={{ flex: 1, gap: 8 }}>
2995
+ {/* Top row: Title and Badge */}
2106
2996
  <react_native_1.View style={{
2107
2997
  flexDirection: 'row',
2108
2998
  alignItems: 'center',
2109
- gap: 6,
2999
+ gap: 8,
2110
3000
  flexWrap: 'wrap',
2111
3001
  }}>
2112
3002
  <react_native_1.Text numberOfLines={1} ellipsizeMode="tail" style={{
2113
3003
  fontFamily: AppFonts_1.AppFonts.interBold,
2114
- fontSize: 13,
2115
- color: '#334155',
3004
+ fontSize: 14,
3005
+ color: AppColors_1.AppColors.primaryBlack,
2116
3006
  flexShrink: 1,
2117
3007
  }}>
2118
3008
  {item.title || 'Untitled Page'}
2119
3009
  </react_native_1.Text>
2120
3010
  {isLatest && (<react_native_1.View style={{
2121
- backgroundColor: '#E2E8F0',
2122
- paddingHorizontal: 6,
2123
- paddingVertical: 2,
2124
- borderRadius: 4,
3011
+ flexDirection: 'row',
3012
+ alignItems: 'center',
3013
+ gap: 4,
3014
+ backgroundColor: AppColors_1.AppColors.greenStatus,
3015
+ paddingHorizontal: 8,
3016
+ paddingVertical: 3,
3017
+ borderRadius: 12,
2125
3018
  }}>
3019
+ <react_native_1.View style={{
3020
+ width: 6,
3021
+ height: 6,
3022
+ borderRadius: 3,
3023
+ backgroundColor: AppColors_1.AppColors.greenBaggageText,
3024
+ }}/>
2126
3025
  <react_native_1.Text style={{
2127
3026
  fontFamily: AppFonts_1.AppFonts.interBold,
2128
- fontSize: 9,
2129
- color: '#475569',
3027
+ fontSize: 9.5,
3028
+ color: AppColors_1.AppColors.greenBaggageText,
2130
3029
  }}>
2131
3030
  Active
2132
3031
  </react_native_1.Text>
2133
3032
  </react_native_1.View>)}
2134
3033
  </react_native_1.View>
2135
- <HighlightText_1.default text={item.url} search={webViewSearch} numberOfLines={3} ellipsizeMode="tail" style={{
3034
+
3035
+ {/* Middle row: URL with Globe Icon */}
3036
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
3037
+ <NetworkIcons_1.GlobeIcon size={12} color={AppColors_1.AppColors.grayTextWeak}/>
3038
+ <HighlightText_1.default text={item.url} search={webViewSearch} numberOfLines={2} ellipsizeMode="tail" style={{
2136
3039
  fontFamily: AppFonts_1.AppFonts.interRegular,
2137
- fontSize: 11,
2138
- color: '#64748B',
2139
- flexShrink: 1,
3040
+ fontSize: 12,
3041
+ color: AppColors_1.AppColors.grayText,
3042
+ flex: 1,
2140
3043
  }} highlightStyle={styles_1.default.highlight} detectLinks={true}/>
2141
- <react_native_1.Text style={{
2142
- fontFamily: AppFonts_1.AppFonts.interRegular,
2143
- fontSize: 10,
2144
- color: '#94A3B8',
2145
- }}>
2146
- {formatNavTime(item.timestamp)}
2147
- </react_native_1.Text>
3044
+ </react_native_1.View>
3045
+
3046
+ {/* Bottom row: Time */}
3047
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
3048
+ <NetworkIcons_1.ClockIcon size={11} color={AppColors_1.AppColors.grayTextWeak}/>
3049
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 11, color: AppColors_1.AppColors.grayTextWeak }}>
3050
+ {formatNavTime(item.timestamp)}
3051
+ </react_native_1.Text>
3052
+ </react_native_1.View>
2148
3053
  </react_native_1.View>
2149
- <CopyButton_1.default value={item.url} label="Copy URL"/>
3054
+ <CopyButton_1.default value={item.url} label="URL"/>
2150
3055
  </react_native_1.View>);
2151
- }} initialNumToRender={15} maxToRenderPerBatch={15} windowSize={7} removeClippedSubviews={true} ListEmptyComponent={<EmptyState_1.default isSearch={false}/>} contentContainerStyle={[
3056
+ }} initialNumToRender={15} maxToRenderPerBatch={15} windowSize={7} removeClippedSubviews={true} ListEmptyComponent={<EmptyState_1.default isSearch={webViewSearch.length > 0}/>} contentContainerStyle={[
2152
3057
  styles_1.default.listContent,
2153
3058
  filteredNavHistory.length === 0 && { flexGrow: 1 },
2154
- ]} keyboardShouldPersistTaps="handled"/>)}
2155
- </react_native_1.View>) : activeTab === 'redux' ? (renderReduxTab()) : (<react_native_1.View style={{ flex: 1 }}>
3059
+ ]} keyboardShouldPersistTaps="handled"/>) : webViewSubTab === 'console' ? (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
3060
+ {webViewLogs.length > 0 ? (<react_native_1.FlatList data={webViewLogs} keyExtractor={(item) => String(item.id)} style={{ flex: 1 }} ListHeaderComponent={<react_native_1.View style={{ paddingHorizontal: 16, paddingTop: 12, paddingBottom: 8, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }}>
3061
+ <react_native_1.Text style={styles_1.default.resultCount}>
3062
+ Console Logs ({webViewLogs.length})
3063
+ </react_native_1.Text>
3064
+ <TouchableScale_1.default onPress={() => (0, webViewLogger_1.clearWebViewData)()} style={{ padding: 6, borderRadius: 6, backgroundColor: AppColors_1.AppColors.primaryLight, borderWidth: 1, borderColor: AppColors_1.AppColors.grayBorderSecondary }}>
3065
+ <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={14}/>
3066
+ </TouchableScale_1.default>
3067
+ </react_native_1.View>} renderItem={({ item }) => {
3068
+ const logColor = item.type === 'error' ? AppColors_1.AppColors.errorColor :
3069
+ item.type === 'warn' ? AppColors_1.AppColors.warningIconGold :
3070
+ item.type === 'info' ? AppColors_1.AppColors.skyBlue :
3071
+ AppColors_1.AppColors.grayTextWeak;
3072
+ const bgColor = item.type === 'error' ? 'rgba(255, 46, 87, 0.06)' :
3073
+ item.type === 'warn' ? 'rgba(191, 162, 82, 0.08)' :
3074
+ AppColors_1.AppColors.primaryLight;
3075
+ const d = new Date(item.timestamp);
3076
+ const timeStr = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`;
3077
+ return (<react_native_1.View style={{
3078
+ marginHorizontal: 12,
3079
+ marginVertical: 3,
3080
+ borderRadius: 8,
3081
+ borderWidth: 1,
3082
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
3083
+ borderLeftWidth: 3,
3084
+ borderLeftColor: logColor,
3085
+ backgroundColor: bgColor,
3086
+ padding: 10,
3087
+ flexDirection: 'row',
3088
+ gap: 8,
3089
+ alignItems: 'flex-start',
3090
+ }}>
3091
+ <react_native_1.View style={{ paddingTop: 1 }}>
3092
+ <NetworkIcons_1.TerminalIcon color={logColor} size={11}/>
3093
+ </react_native_1.View>
3094
+ <react_native_1.View style={{ flex: 1, gap: 3 }}>
3095
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>
3096
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 10, color: logColor, textTransform: 'uppercase', letterSpacing: 0.5 }}>
3097
+ {item.type}
3098
+ </react_native_1.Text>
3099
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak }}>
3100
+ {timeStr}
3101
+ </react_native_1.Text>
3102
+ </react_native_1.View>
3103
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 12, color: AppColors_1.AppColors.primaryBlack, lineHeight: 16 }}>
3104
+ {item.message}
3105
+ </react_native_1.Text>
3106
+ </react_native_1.View>
3107
+ </react_native_1.View>);
3108
+ }} initialNumToRender={20} maxToRenderPerBatch={20} windowSize={7} contentContainerStyle={[styles_1.default.listContent, webViewLogs.length === 0 && { flexGrow: 1 }]}/>) : (<react_native_1.View style={styles_1.default.emptyContainer}>
3109
+ <react_native_1.View style={styles_1.default.emptyIconWrap}>
3110
+ <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={32}/>
3111
+ </react_native_1.View>
3112
+ <react_native_1.Text style={styles_1.default.emptyTitle}>No Console Logs</react_native_1.Text>
3113
+ <react_native_1.Text style={styles_1.default.emptySub}>
3114
+ Console logs from the WebView will appear here.
3115
+ </react_native_1.Text>
3116
+ </react_native_1.View>)}
3117
+ </react_native_1.View>) : (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
3118
+ {webViewHtml ? (OriginalWebView ? (<OriginalWebView source={{ html: webViewHtml, baseUrl: webViewHtmlUrl }} injectedJavaScript={previewInspectScript} onMessage={(event) => {
3119
+ try {
3120
+ const data = JSON.parse(event.nativeEvent.data);
3121
+ if (data.type === 'preview-inspect') {
3122
+ setInspectedElement({
3123
+ tagName: data.tagName,
3124
+ id: data.id,
3125
+ className: data.className,
3126
+ searchStr: data.searchStr,
3127
+ });
3128
+ setWebViewSubTab('html');
3129
+ setHtmlSubTab('html');
3130
+ }
3131
+ }
3132
+ catch (err) { }
3133
+ }} style={{ flex: 1 }}/>) : (<react_native_1.View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 }}>
3134
+ <react_native_1.Text style={{ color: AppColors_1.AppColors.grayText, textAlign: 'center', fontFamily: AppFonts_1.AppFonts.interMedium }}>
3135
+ react-native-webview is not installed in the target project. Install it to enable Preview mode.
3136
+ </react_native_1.Text>
3137
+ </react_native_1.View>)) : (<react_native_1.View style={styles_1.default.emptyContainer}>
3138
+ <react_native_1.View style={styles_1.default.emptyIconWrap}>
3139
+ <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={32}/>
3140
+ </react_native_1.View>
3141
+ <react_native_1.Text style={styles_1.default.emptyTitle}>
3142
+ No Preview Available
3143
+ </react_native_1.Text>
3144
+ <react_native_1.Text style={styles_1.default.emptySub}>
3145
+ Load a page in the WebView to see its visual preview.
3146
+ </react_native_1.Text>
3147
+ </react_native_1.View>)}
3148
+ </react_native_1.View>)}
3149
+ </react_native_1.View>)) : activeTab === 'redux' ? (renderReduxTab()) : (<react_native_1.View style={{ flex: 1 }}>
2156
3150
  {/* Non-scrollable details header */}
2157
3151
  <react_native_1.View style={{ paddingHorizontal: 6, paddingTop: 4 }}>
2158
- {(() => {
2159
- const routeInfo = logRouteMapRef.current.get(selected.id);
2160
- const screenPath = routeInfo && routeInfo.path !== 'Navigators'
2161
- ? routeInfo.path.split(' ')
2162
- : [];
2163
- const parts = ['APIs', ...screenPath];
2164
- return (<react_native_1.View style={{
2165
- flexDirection: 'row',
2166
- alignItems: 'center',
2167
- backgroundColor: AppColors_1.AppColors.primaryLight,
2168
- borderRadius: 8,
2169
- paddingVertical: 8,
2170
- paddingHorizontal: 12,
2171
- borderWidth: 1,
2172
- borderColor: AppColors_1.AppColors.dividerColor,
2173
- marginBottom: 12,
2174
- marginTop: 4,
2175
- }}>
2176
- <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
3152
+ <react_native_1.View style={styles_1.default.detailInfoBar}>
3153
+ {(() => {
3154
+ let hostStr = '';
3155
+ let pathStr = detailDisplayUrl;
3156
+ let queryStr = '';
3157
+ try {
3158
+ // Simple parsing fallback for React Native environments
3159
+ const qIndex = detailDisplayUrl.indexOf('?');
3160
+ let cleanUrlForParsing = detailDisplayUrl;
3161
+ if (qIndex !== -1) {
3162
+ pathStr = detailDisplayUrl.substring(0, qIndex);
3163
+ queryStr = detailDisplayUrl.substring(qIndex);
3164
+ cleanUrlForParsing = pathStr;
3165
+ }
3166
+ const schemeIndex = cleanUrlForParsing.indexOf('://');
3167
+ if (schemeIndex !== -1) {
3168
+ const withoutScheme = cleanUrlForParsing.substring(schemeIndex + 3);
3169
+ const firstSlash = withoutScheme.indexOf('/');
3170
+ if (firstSlash !== -1) {
3171
+ hostStr = withoutScheme.substring(0, firstSlash);
3172
+ pathStr = withoutScheme.substring(firstSlash);
3173
+ }
3174
+ else {
3175
+ hostStr = withoutScheme;
3176
+ pathStr = '/';
3177
+ }
3178
+ }
3179
+ }
3180
+ catch (e) { }
3181
+ return (<>
3182
+ <react_native_1.View style={styles_1.default.detailInfoTop}>
3183
+ <react_native_1.View style={{
2177
3184
  flexDirection: 'row',
2178
3185
  alignItems: 'center',
2179
- gap: 6,
3186
+ gap: 8,
2180
3187
  }}>
2181
- {parts.map((part, index) => {
2182
- const isLast = index === parts.length - 1;
2183
- return (<react_1.default.Fragment key={index}>
2184
- {index > 0 && (<react_native_1.Text style={{ color: AppColors_1.AppColors.grayTextWeak, fontSize: 11, marginHorizontal: 2 }}>
2185
- /
2186
- </react_native_1.Text>)}
2187
- <react_native_1.View style={isLast
2188
- ? {
2189
- backgroundColor: `${AppColors_1.AppColors.purple}12`,
2190
- paddingHorizontal: 8,
2191
- paddingVertical: 3,
2192
- borderRadius: 6,
2193
- }
2194
- : {
2195
- paddingHorizontal: 4,
2196
- paddingVertical: 2,
2197
- }}>
2198
- <react_native_1.Text style={{
2199
- fontFamily: isLast ? AppFonts_1.AppFonts.interBold : AppFonts_1.AppFonts.interMedium,
2200
- fontSize: 11.5,
2201
- color: isLast ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayText,
2202
- }}>
2203
- {part}
3188
+ <react_native_1.View style={[
3189
+ styles_1.default.methodBadge,
3190
+ {
3191
+ backgroundColor: `${constants_1.METHOD_COLORS[selected.method] ??
3192
+ constants_1.METHOD_COLORS.ALL}15`,
3193
+ },
3194
+ ]}>
3195
+ <react_native_1.Text style={[
3196
+ styles_1.default.methodBadgeText,
3197
+ {
3198
+ color: constants_1.METHOD_COLORS[selected.method] ??
3199
+ constants_1.METHOD_COLORS.ALL,
3200
+ },
3201
+ ]}>
3202
+ {selected.method}
3203
+ </react_native_1.Text>
3204
+ </react_native_1.View>
3205
+
3206
+ {selected.status != null && (<react_native_1.View style={[
3207
+ styles_1.default.chip,
3208
+ {
3209
+ backgroundColor: selected.status === 0
3210
+ ? `${AppColors_1.AppColors.errorColor}15`
3211
+ : `${(0, helpers_1.getStatusColor)(selected.status)}15`,
3212
+ borderColor: selected.status === 0
3213
+ ? `${AppColors_1.AppColors.errorColor}40`
3214
+ : `${(0, helpers_1.getStatusColor)(selected.status)}40`,
3215
+ },
3216
+ ]}>
3217
+ {selected.status === 0 ? (<NetworkIcons_1.FailIcon size={8} color={AppColors_1.AppColors.errorColor}/>) : (<react_native_svg_1.default width={6} height={6} viewBox="0 0 10 10" fill="none">
3218
+ <react_native_svg_1.Circle cx="5" cy="5" r="5" fill={(0, helpers_1.getStatusColor)(selected.status)}/>
3219
+ </react_native_svg_1.default>)}
3220
+ <react_native_1.Text style={[
3221
+ styles_1.default.chipText,
3222
+ {
3223
+ color: selected.status === 0
3224
+ ? AppColors_1.AppColors.errorColor
3225
+ : (0, helpers_1.getStatusColor)(selected.status),
3226
+ },
3227
+ ]}>
3228
+ {selected.status === 0
3229
+ ? 'Failed'
3230
+ : String(selected.status)}
2204
3231
  </react_native_1.Text>
2205
- </react_native_1.View>
2206
- </react_1.default.Fragment>);
2207
- })}
2208
- </react_native_1.ScrollView>
2209
- </react_native_1.View>);
2210
- })()}
3232
+ </react_native_1.View>)}
2211
3233
 
2212
- <react_native_1.View style={styles_1.default.detailInfoBar}>
2213
- <react_native_1.View style={styles_1.default.detailInfoTop}>
2214
- <react_native_1.View style={{
2215
- flexDirection: 'row',
2216
- alignItems: 'center',
2217
- gap: 10,
2218
- }}>
2219
- <react_native_1.View style={[
2220
- styles_1.default.methodBadge,
2221
- {
2222
- backgroundColor: `${constants_1.METHOD_COLORS[selected.method] ??
2223
- constants_1.METHOD_COLORS.ALL}15`,
2224
- },
2225
- ]}>
2226
- <react_native_1.Text style={[
2227
- styles_1.default.methodBadgeText,
2228
- {
2229
- color: constants_1.METHOD_COLORS[selected.method] ??
2230
- constants_1.METHOD_COLORS.ALL,
2231
- },
2232
- ]}>
2233
- {selected.method}
2234
- </react_native_1.Text>
2235
- </react_native_1.View>
3234
+ {selected.duration != null && (<react_native_1.View style={[styles_1.default.chip, { backgroundColor: 'rgba(104,75,155,0.08)', borderColor: 'rgba(104,75,155,0.18)' }]}>
3235
+ <react_native_1.Text style={[styles_1.default.chipText, { color: AppColors_1.AppColors.purple }]}>
3236
+ {selected.duration}ms
3237
+ </react_native_1.Text>
3238
+ </react_native_1.View>)}
3239
+ </react_native_1.View>
3240
+ <react_native_1.View style={styles_1.default.detailInfoRight}>
3241
+ <TouchableScale_1.default style={styles_1.default.iconSquareBtn} onPress={() => react_native_1.Linking.openURL(detailDisplayUrl)} hitSlop={12}>
3242
+ <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
3243
+ </TouchableScale_1.default>
3244
+ <CopyButton_1.default value={(0, helpers_1.getFetchCommand)(selected)} label="fetch()" iconType="fetch"/>
3245
+ <CopyButton_1.default value={(0, helpers_1.getCurlCommand)(selected)} label="cURL" iconType="terminal"/>
3246
+ <CopyButton_1.default value={detailDisplayUrl} label="URL"/>
3247
+ </react_native_1.View>
3248
+ </react_native_1.View>
2236
3249
 
2237
- {selected.status != null && (<react_native_1.View style={[
2238
- styles_1.default.chip,
2239
- {
2240
- backgroundColor: selected.status === 0
2241
- ? `${AppColors_1.AppColors.errorColor}15`
2242
- : `${(0, helpers_1.getStatusColor)(selected.status)}15`,
2243
- borderColor: selected.status === 0
2244
- ? `${AppColors_1.AppColors.errorColor}40`
2245
- : `${(0, helpers_1.getStatusColor)(selected.status)}40`,
2246
- },
2247
- ]}>
2248
- {selected.status === 0 ? (<NetworkIcons_1.FailIcon size={8} color={AppColors_1.AppColors.errorColor}/>) : (<react_native_svg_1.default width={6} height={6} viewBox="0 0 10 10" fill="none">
2249
- <react_native_svg_1.Circle cx="5" cy="5" r="5" fill={(0, helpers_1.getStatusColor)(selected.status)}/>
2250
- </react_native_svg_1.default>)}
2251
- <react_native_1.Text style={[
2252
- styles_1.default.chipText,
2253
- {
2254
- color: selected.status === 0
2255
- ? AppColors_1.AppColors.errorColor
2256
- : (0, helpers_1.getStatusColor)(selected.status),
2257
- },
2258
- ]}>
2259
- {selected.status === 0
2260
- ? 'Failed'
2261
- : String(selected.status)}
3250
+ <react_native_1.Pressable style={{
3251
+ backgroundColor: AppColors_1.AppColors.grayBackground,
3252
+ borderRadius: 10,
3253
+ borderWidth: 1,
3254
+ borderColor: AppColors_1.AppColors.dividerColor,
3255
+ padding: 10,
3256
+ marginTop: 6,
3257
+ }} onPress={() => react_native_1.Linking.openURL(detailDisplayUrl)}>
3258
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 2 }}>
3259
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interMedium, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, flex: 1 }} numberOfLines={1}>
3260
+ {hostStr || 'API Endpoint'}
3261
+ </react_native_1.Text>
3262
+ {queryStr ? (<react_native_1.View style={{ backgroundColor: 'rgba(104,75,155,0.08)', paddingHorizontal: 5, paddingVertical: 1, borderRadius: 4 }}>
3263
+ <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 8.5, color: AppColors_1.AppColors.purple }}>Query Params</react_native_1.Text>
3264
+ </react_native_1.View>) : null}
3265
+ </react_native_1.View>
3266
+ <react_native_1.Text selectable={true} style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 12, color: AppColors_1.AppColors.primaryBlack, marginTop: 2 }} numberOfLines={2}>
3267
+ {pathStr}
2262
3268
  </react_native_1.Text>
2263
- </react_native_1.View>)}
2264
- </react_native_1.View>
2265
- <react_native_1.View style={styles_1.default.detailInfoRight}>
2266
- <TouchableScale_1.default style={styles_1.default.iconSquareBtn} onPress={() => react_native_1.Linking.openURL(detailDisplayUrl)} hitSlop={12}>
2267
- <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
2268
- </TouchableScale_1.default>
2269
- <CopyButton_1.default value={(0, helpers_1.getFetchCommand)(selected)} label="fetch()" iconType="fetch"/>
2270
- <CopyButton_1.default value={(0, helpers_1.getCurlCommand)(selected)} label="cURL" iconType="terminal"/>
2271
- <CopyButton_1.default value={detailDisplayUrl} label="URL"/>
2272
- </react_native_1.View>
2273
- </react_native_1.View>
2274
-
2275
- <react_native_1.Pressable style={styles_1.default.detailUrlContainer} onPress={() => react_native_1.Linking.openURL(detailDisplayUrl)}>
2276
- <react_native_1.Text selectable={true} style={styles_1.default.detailUrl}>
2277
- {detailDisplayUrl}
2278
- </react_native_1.Text>
2279
- </react_native_1.Pressable>
3269
+ {queryStr ? (<react_native_1.Text selectable={true} style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 10, color: AppColors_1.AppColors.grayTextWeak, marginTop: 4 }} numberOfLines={1}>
3270
+ {queryStr}
3271
+ </react_native_1.Text>) : null}
3272
+ </react_native_1.Pressable>
3273
+ </>);
3274
+ })()}
2280
3275
  </react_native_1.View>
2281
3276
  </react_native_1.View>
2282
3277
 
@@ -2305,16 +3300,30 @@ const NetworkInspector = () => {
2305
3300
  return 'Request';
2306
3301
  return 'Response';
2307
3302
  };
3303
+ const getIcon = () => {
3304
+ const iconColor = isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText;
3305
+ if (tab === 'metadata')
3306
+ return <NetworkIcons_1.StatusIcon color={iconColor}/>;
3307
+ if (tab === 'headers')
3308
+ return <NetworkIcons_1.HeadersIcon color={iconColor}/>;
3309
+ if (tab === 'request')
3310
+ return <NetworkIcons_1.RequestIcon color={iconColor}/>;
3311
+ return <NetworkIcons_1.ResponseIcon color={iconColor}/>;
3312
+ };
2308
3313
  return (<react_native_1.TouchableOpacity key={tab} onPress={() => setApiDetailActiveTab(tab)} style={{
2309
3314
  flex: 1,
2310
3315
  paddingVertical: 6,
3316
+ flexDirection: 'row',
2311
3317
  alignItems: 'center',
3318
+ justifyContent: 'center',
2312
3319
  borderRadius: 8,
2313
3320
  backgroundColor: isActive ? AppColors_1.AppColors.purple : 'transparent',
3321
+ gap: 4,
2314
3322
  }}>
3323
+ {getIcon()}
2315
3324
  <react_native_1.Text style={{
2316
3325
  fontFamily: AppFonts_1.AppFonts.interBold,
2317
- fontSize: 11,
3326
+ fontSize: 10,
2318
3327
  color: isActive ? '#FFFFFF' : AppColors_1.AppColors.grayText,
2319
3328
  }}>
2320
3329
  {getLabel()}
@@ -2326,7 +3335,8 @@ const NetworkInspector = () => {
2326
3335
  {/* Scrollable Tab Content */}
2327
3336
  <react_native_1.ScrollView style={styles_1.default.detailScroll} contentContainerStyle={{ paddingHorizontal: 6, paddingBottom: 24 }} showsVerticalScrollIndicator={true}>
2328
3337
  {apiDetailActiveTab === 'metadata' && (<>
2329
- <MetaAccordion_1.default status={selected.status} statusColor={(0, helpers_1.getStatusColor)(selected.status)} duration={selected.duration} size={(0, helpers_1.getSize)(selected.response)} triggeredAt={(0, helpers_1.formatDateTime)(selected.startTime)}/>
3338
+ <MetaAccordion_1.default status={selected.status} statusColor={(0, helpers_1.getStatusColor)(selected.status)} duration={selected.duration} size={(0, helpers_1.getSize)(selected.response)} triggeredAt={(0, helpers_1.formatDateTime)(selected.startTime)} method={selected.method} contentType={selected.responseHeaders?.['content-type'] ||
3339
+ selected.responseHeaders?.['Content-Type']} url={selected.url}/>
2330
3340
 
2331
3341
  {(() => {
2332
3342
  const routeInfo = logRouteMapRef.current.get(selected.id);
@@ -2410,6 +3420,10 @@ const NetworkInspector = () => {
2410
3420
  Loading logs...
2411
3421
  </react_native_1.Text>
2412
3422
  </react_native_1.View>)}
3423
+
3424
+ {settingsPage !== null && (<react_native_1.View style={[react_native_1.StyleSheet.absoluteFill, { backgroundColor: AppColors_1.AppColors.grayBackground, zIndex: 99999 }]}>
3425
+ {renderSettings()}
3426
+ </react_native_1.View>)}
2413
3427
  </react_native_1.View>
2414
3428
  </react_native_1.View>
2415
3429
  </ErrorBoundary_1.default>)}