react-native-inapp-inspector 1.1.13 → 1.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +9 -34
  2. package/dist/commonjs/assets/svgAssets.d.ts +3 -0
  3. package/dist/commonjs/assets/svgAssets.js +17 -0
  4. package/dist/commonjs/components/AnalyticsEventCard.d.ts +1 -14
  5. package/dist/commonjs/components/AnalyticsEventCard.js +120 -50
  6. package/dist/commonjs/components/AnalyticsGraph.d.ts +2 -6
  7. package/dist/commonjs/components/AnalyticsGraph.js +8 -8
  8. package/dist/commonjs/components/AnalyticsTabView.d.ts +15 -0
  9. package/dist/commonjs/components/AnalyticsTabView.js +157 -0
  10. package/dist/commonjs/components/AnimatedEntrance.d.ts +1 -1
  11. package/dist/commonjs/components/AnimatedEntrance.js +2 -2
  12. package/dist/commonjs/components/ApiDetailView.d.ts +22 -0
  13. package/dist/commonjs/components/ApiDetailView.js +304 -0
  14. package/dist/commonjs/components/ApisTabView.d.ts +33 -0
  15. package/dist/commonjs/components/ApisTabView.js +235 -0
  16. package/dist/commonjs/components/CodeSnippet.d.ts +1 -5
  17. package/dist/commonjs/components/CodeSnippet.js +34 -34
  18. package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -8
  19. package/dist/commonjs/components/ConsoleLogCard.js +262 -442
  20. package/dist/commonjs/components/ConsoleLogDetailView.d.ts +9 -0
  21. package/dist/commonjs/components/ConsoleLogDetailView.js +278 -0
  22. package/dist/commonjs/components/ConsoleLogsTabView.d.ts +24 -0
  23. package/dist/commonjs/components/ConsoleLogsTabView.js +354 -0
  24. package/dist/commonjs/components/DiffViewer.js +4 -2
  25. package/dist/commonjs/components/DomainHeader.js +66 -41
  26. package/dist/commonjs/components/EmptyState.d.ts +2 -2
  27. package/dist/commonjs/components/EmptyState.js +2 -2
  28. package/dist/commonjs/components/EndOfListFooter.d.ts +8 -0
  29. package/dist/commonjs/components/EndOfListFooter.js +90 -0
  30. package/dist/commonjs/components/ErrorBoundary.d.ts +5 -14
  31. package/dist/commonjs/components/ErrorBoundary.js +28 -28
  32. package/dist/commonjs/components/FloatingBubble.d.ts +14 -0
  33. package/dist/commonjs/components/FloatingBubble.js +75 -0
  34. package/dist/commonjs/components/HeadersSection.js +5 -3
  35. package/dist/commonjs/components/HighlightText.d.ts +1 -1
  36. package/dist/commonjs/components/HighlightText.js +5 -7
  37. package/dist/commonjs/components/Inspector/AnalyticsTab.d.ts +3 -0
  38. package/dist/commonjs/components/Inspector/AnalyticsTab.js +232 -0
  39. package/dist/commonjs/components/Inspector/ConsoleTab.d.ts +3 -0
  40. package/dist/commonjs/components/Inspector/ConsoleTab.js +410 -0
  41. package/dist/commonjs/components/Inspector/FabLauncher.d.ts +3 -0
  42. package/dist/commonjs/components/Inspector/FabLauncher.js +54 -0
  43. package/dist/commonjs/components/Inspector/InsightsDashboard.d.ts +3 -0
  44. package/dist/commonjs/components/Inspector/InsightsDashboard.js +619 -0
  45. package/dist/commonjs/components/Inspector/InspectorContext.d.ts +5 -0
  46. package/dist/commonjs/components/Inspector/InspectorContext.js +18 -0
  47. package/dist/commonjs/components/Inspector/InspectorHeader.d.ts +3 -0
  48. package/dist/commonjs/components/Inspector/InspectorHeader.js +452 -0
  49. package/dist/commonjs/components/Inspector/LogDetail.d.ts +3 -0
  50. package/dist/commonjs/components/Inspector/LogDetail.js +963 -0
  51. package/dist/commonjs/components/Inspector/MainScreen.d.ts +3 -0
  52. package/dist/commonjs/components/Inspector/MainScreen.js +68 -0
  53. package/dist/commonjs/components/Inspector/NavigationTracker.d.ts +3 -0
  54. package/dist/commonjs/components/Inspector/NavigationTracker.js +12 -0
  55. package/dist/commonjs/components/Inspector/NetworkDetail.d.ts +3 -0
  56. package/dist/commonjs/components/Inspector/NetworkDetail.js +405 -0
  57. package/dist/commonjs/components/Inspector/NetworkTab.d.ts +3 -0
  58. package/dist/commonjs/components/Inspector/NetworkTab.js +281 -0
  59. package/dist/commonjs/components/Inspector/ReduxTab.d.ts +3 -0
  60. package/dist/commonjs/components/Inspector/ReduxTab.js +75 -0
  61. package/dist/commonjs/components/Inspector/SettingsPanel.d.ts +3 -0
  62. package/dist/commonjs/components/Inspector/SettingsPanel.js +1476 -0
  63. package/dist/commonjs/components/Inspector/TabBar.d.ts +3 -0
  64. package/dist/commonjs/components/Inspector/TabBar.js +95 -0
  65. package/dist/commonjs/components/Inspector/WebViewTab.d.ts +3 -0
  66. package/dist/commonjs/components/Inspector/WebViewTab.js +757 -0
  67. package/dist/commonjs/components/InspectorHeader.d.ts +19 -0
  68. package/dist/commonjs/components/InspectorHeader.js +329 -0
  69. package/dist/commonjs/components/InspectorTabBar.d.ts +16 -0
  70. package/dist/commonjs/components/InspectorTabBar.js +90 -0
  71. package/dist/commonjs/components/JsonViewer.d.ts +4 -1
  72. package/dist/commonjs/components/JsonViewer.js +110 -171
  73. package/dist/commonjs/components/LogCard.js +109 -86
  74. package/dist/commonjs/components/MetaAccordion.d.ts +1 -10
  75. package/dist/commonjs/components/MetaAccordion.js +23 -21
  76. package/dist/commonjs/components/NavigationTracker.d.ts +7 -0
  77. package/dist/commonjs/components/NavigationTracker.js +76 -0
  78. package/dist/commonjs/components/NetworkIcons.d.ts +6 -0
  79. package/dist/commonjs/components/NetworkIcons.js +54 -8
  80. package/dist/commonjs/components/ReduxTabView.d.ts +9 -0
  81. package/dist/commonjs/components/ReduxTabView.js +56 -0
  82. package/dist/commonjs/components/ReduxTreeView.js +241 -200
  83. package/dist/commonjs/components/SegmentedTabs.d.ts +15 -0
  84. package/dist/commonjs/components/SegmentedTabs.js +52 -0
  85. package/dist/commonjs/components/SettingsView.d.ts +13 -0
  86. package/dist/commonjs/components/SettingsView.js +328 -0
  87. package/dist/commonjs/components/TouchableScale.d.ts +2 -2
  88. package/dist/commonjs/components/TouchableScale.js +2 -2
  89. package/dist/commonjs/components/TreeNode.js +2 -2
  90. package/dist/commonjs/constants/index.js +1 -12
  91. package/dist/commonjs/constants/version.d.ts +1 -1
  92. package/dist/commonjs/constants/version.js +1 -1
  93. package/dist/commonjs/customHooks/analyticsLogger.d.ts +8 -0
  94. package/dist/commonjs/customHooks/analyticsLogger.js +42 -1
  95. package/dist/commonjs/customHooks/consoleLogger.js +137 -13
  96. package/dist/commonjs/customHooks/networkLogger.d.ts +0 -1
  97. package/dist/commonjs/customHooks/networkLogger.js +0 -1
  98. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -9
  99. package/dist/commonjs/enums/index.d.ts +39 -0
  100. package/dist/commonjs/enums/index.js +50 -0
  101. package/dist/commonjs/helpers/index.d.ts +27 -1
  102. package/dist/commonjs/helpers/index.js +187 -12
  103. package/dist/commonjs/helpers/settingsStore.d.ts +2 -24
  104. package/dist/commonjs/i18n/en.json +144 -0
  105. package/dist/commonjs/i18n/index.d.ts +2 -0
  106. package/dist/commonjs/i18n/index.js +27 -0
  107. package/dist/commonjs/i18n/locales/en.json +314 -0
  108. package/dist/commonjs/index.d.ts +2 -3
  109. package/dist/commonjs/index.js +207 -4927
  110. package/dist/commonjs/styles/AppColors.d.ts +148 -0
  111. package/dist/commonjs/styles/AppColors.js +176 -0
  112. package/dist/commonjs/styles/common.d.ts +3 -0
  113. package/dist/commonjs/styles/common.js +201 -0
  114. package/dist/commonjs/styles/index.d.ts +219 -435
  115. package/dist/commonjs/styles/index.js +312 -488
  116. package/dist/commonjs/types/enums.d.ts +9 -0
  117. package/dist/commonjs/types/enums.js +4 -0
  118. package/dist/commonjs/types/index.d.ts +4 -111
  119. package/dist/commonjs/types/index.js +16 -0
  120. package/dist/commonjs/types/interfaces.d.ts +337 -0
  121. package/dist/commonjs/types/interfaces.js +2 -0
  122. package/dist/esm/assets/svgAssets.d.ts +3 -0
  123. package/dist/esm/assets/svgAssets.js +14 -0
  124. package/dist/esm/components/AnalyticsEventCard.d.ts +1 -14
  125. package/dist/esm/components/AnalyticsEventCard.js +118 -48
  126. package/dist/esm/components/AnalyticsGraph.d.ts +2 -6
  127. package/dist/esm/components/AnalyticsGraph.js +8 -8
  128. package/dist/esm/components/AnalyticsTabView.d.ts +15 -0
  129. package/dist/esm/components/AnalyticsTabView.js +151 -0
  130. package/dist/esm/components/AnimatedEntrance.d.ts +1 -1
  131. package/dist/esm/components/AnimatedEntrance.js +2 -2
  132. package/dist/esm/components/ApiDetailView.d.ts +22 -0
  133. package/dist/esm/components/ApiDetailView.js +264 -0
  134. package/dist/esm/components/ApisTabView.d.ts +33 -0
  135. package/dist/esm/components/ApisTabView.js +196 -0
  136. package/dist/esm/components/CodeSnippet.d.ts +1 -5
  137. package/dist/esm/components/CodeSnippet.js +34 -34
  138. package/dist/esm/components/ConsoleLogCard.d.ts +1 -8
  139. package/dist/esm/components/ConsoleLogCard.js +262 -409
  140. package/dist/esm/components/ConsoleLogDetailView.d.ts +9 -0
  141. package/dist/esm/components/ConsoleLogDetailView.js +271 -0
  142. package/dist/esm/components/ConsoleLogsTabView.d.ts +24 -0
  143. package/dist/esm/components/ConsoleLogsTabView.js +348 -0
  144. package/dist/esm/components/DiffViewer.js +4 -2
  145. package/dist/esm/components/DomainHeader.js +66 -41
  146. package/dist/esm/components/EmptyState.d.ts +2 -2
  147. package/dist/esm/components/EmptyState.js +2 -2
  148. package/dist/esm/components/EndOfListFooter.d.ts +8 -0
  149. package/dist/esm/components/EndOfListFooter.js +83 -0
  150. package/dist/esm/components/ErrorBoundary.d.ts +5 -14
  151. package/dist/esm/components/ErrorBoundary.js +29 -29
  152. package/dist/esm/components/FloatingBubble.d.ts +14 -0
  153. package/dist/esm/components/FloatingBubble.js +68 -0
  154. package/dist/esm/components/HeadersSection.js +5 -3
  155. package/dist/esm/components/HighlightText.d.ts +1 -1
  156. package/dist/esm/components/HighlightText.js +5 -7
  157. package/dist/esm/components/Inspector/AnalyticsTab.d.ts +3 -0
  158. package/dist/esm/components/Inspector/AnalyticsTab.js +194 -0
  159. package/dist/esm/components/Inspector/ConsoleTab.d.ts +3 -0
  160. package/dist/esm/components/Inspector/ConsoleTab.js +372 -0
  161. package/dist/esm/components/Inspector/FabLauncher.d.ts +3 -0
  162. package/dist/esm/components/Inspector/FabLauncher.js +49 -0
  163. package/dist/esm/components/Inspector/InsightsDashboard.d.ts +3 -0
  164. package/dist/esm/components/Inspector/InsightsDashboard.js +614 -0
  165. package/dist/esm/components/Inspector/InspectorContext.d.ts +5 -0
  166. package/dist/esm/components/Inspector/InspectorContext.js +13 -0
  167. package/dist/esm/components/Inspector/InspectorHeader.d.ts +3 -0
  168. package/dist/esm/components/Inspector/InspectorHeader.js +447 -0
  169. package/dist/esm/components/Inspector/LogDetail.d.ts +3 -0
  170. package/dist/esm/components/Inspector/LogDetail.js +925 -0
  171. package/dist/esm/components/Inspector/MainScreen.d.ts +3 -0
  172. package/dist/esm/components/Inspector/MainScreen.js +63 -0
  173. package/dist/esm/components/Inspector/NavigationTracker.d.ts +3 -0
  174. package/dist/esm/components/Inspector/NavigationTracker.js +10 -0
  175. package/dist/esm/components/Inspector/NetworkDetail.d.ts +3 -0
  176. package/dist/esm/components/Inspector/NetworkDetail.js +367 -0
  177. package/dist/esm/components/Inspector/NetworkTab.d.ts +3 -0
  178. package/dist/esm/components/Inspector/NetworkTab.js +243 -0
  179. package/dist/esm/components/Inspector/ReduxTab.d.ts +3 -0
  180. package/dist/esm/components/Inspector/ReduxTab.js +70 -0
  181. package/dist/esm/components/Inspector/SettingsPanel.d.ts +3 -0
  182. package/dist/esm/components/Inspector/SettingsPanel.js +1438 -0
  183. package/dist/esm/components/Inspector/TabBar.d.ts +3 -0
  184. package/dist/esm/components/Inspector/TabBar.js +90 -0
  185. package/dist/esm/components/Inspector/WebViewTab.d.ts +3 -0
  186. package/dist/esm/components/Inspector/WebViewTab.js +752 -0
  187. package/dist/esm/components/InspectorHeader.d.ts +19 -0
  188. package/dist/esm/components/InspectorHeader.js +323 -0
  189. package/dist/esm/components/InspectorTabBar.d.ts +16 -0
  190. package/dist/esm/components/InspectorTabBar.js +84 -0
  191. package/dist/esm/components/JsonViewer.d.ts +4 -1
  192. package/dist/esm/components/JsonViewer.js +111 -172
  193. package/dist/esm/components/LogCard.js +111 -88
  194. package/dist/esm/components/MetaAccordion.d.ts +1 -10
  195. package/dist/esm/components/MetaAccordion.js +23 -21
  196. package/dist/esm/components/NavigationTracker.d.ts +7 -0
  197. package/dist/esm/components/NavigationTracker.js +39 -0
  198. package/dist/esm/components/NetworkIcons.d.ts +6 -0
  199. package/dist/esm/components/NetworkIcons.js +46 -6
  200. package/dist/esm/components/ReduxTabView.d.ts +9 -0
  201. package/dist/esm/components/ReduxTabView.js +50 -0
  202. package/dist/esm/components/ReduxTreeView.js +243 -202
  203. package/dist/esm/components/SegmentedTabs.d.ts +15 -0
  204. package/dist/esm/components/SegmentedTabs.js +47 -0
  205. package/dist/esm/components/SettingsView.d.ts +13 -0
  206. package/dist/esm/components/SettingsView.js +321 -0
  207. package/dist/esm/components/TouchableScale.d.ts +2 -2
  208. package/dist/esm/components/TouchableScale.js +2 -2
  209. package/dist/esm/components/TreeNode.js +2 -2
  210. package/dist/esm/constants/index.js +1 -12
  211. package/dist/esm/constants/version.d.ts +1 -1
  212. package/dist/esm/constants/version.js +1 -1
  213. package/dist/esm/customHooks/analyticsLogger.d.ts +8 -0
  214. package/dist/esm/customHooks/analyticsLogger.js +37 -0
  215. package/dist/esm/customHooks/consoleLogger.js +137 -13
  216. package/dist/esm/customHooks/networkLogger.d.ts +0 -1
  217. package/dist/esm/customHooks/networkLogger.js +0 -1
  218. package/dist/esm/customHooks/reduxLogger.d.ts +2 -9
  219. package/dist/esm/enums/index.d.ts +39 -0
  220. package/dist/esm/enums/index.js +47 -0
  221. package/dist/esm/helpers/index.d.ts +27 -1
  222. package/dist/esm/helpers/index.js +180 -11
  223. package/dist/esm/helpers/settingsStore.d.ts +2 -24
  224. package/dist/esm/i18n/en.json +144 -0
  225. package/dist/esm/i18n/index.d.ts +2 -0
  226. package/dist/esm/i18n/index.js +22 -0
  227. package/dist/esm/i18n/locales/en.json +314 -0
  228. package/dist/esm/index.d.ts +2 -3
  229. package/dist/esm/index.js +207 -4923
  230. package/dist/esm/styles/AppColors.d.ts +148 -0
  231. package/dist/esm/styles/AppColors.js +176 -0
  232. package/dist/esm/styles/common.d.ts +3 -0
  233. package/dist/esm/styles/common.js +197 -0
  234. package/dist/esm/styles/index.d.ts +219 -435
  235. package/dist/esm/styles/index.js +312 -488
  236. package/dist/esm/types/enums.d.ts +9 -0
  237. package/dist/esm/types/enums.js +3 -0
  238. package/dist/esm/types/index.d.ts +4 -111
  239. package/dist/esm/types/index.js +2 -1
  240. package/dist/esm/types/interfaces.d.ts +337 -0
  241. package/dist/esm/types/interfaces.js +1 -0
  242. package/example/App.tsx +88 -1
  243. package/example/android/app/build.gradle +29 -1
  244. package/example/android/app/src/main/java/com/example/MainApplication.kt +25 -0
  245. package/example/android/build.gradle +31 -4
  246. package/example/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  247. package/example/android/gradle.properties +1 -0
  248. package/example/android/settings.gradle +20 -1
  249. package/example/package-lock.json +1 -1
  250. package/package.json +3 -1
@@ -0,0 +1,1438 @@
1
+ import React from 'react';
2
+ import { Alert, Platform, ScrollView, Text, TouchableOpacity, View, } from 'react-native';
3
+ import Svg, { Path } from 'react-native-svg';
4
+ import LinearGradient from 'react-native-linear-gradient';
5
+ import { animateNextLayout, useInspector } from './InspectorContext';
6
+ import TouchableScale from '../TouchableScale';
7
+ import styles, { toggleGlobalTheme } from '../../styles';
8
+ import { AppColors } from '../../styles/AppColors';
9
+ import { AppFonts } from '../../styles/AppFonts';
10
+ import { LIB_VERSION } from '../../constants';
11
+ import { isPersistentStorageAvailable } from '../../helpers/settingsStore';
12
+ import { clearNetworkLogs } from '../../customHooks/networkLogger';
13
+ import { clearConsoleLogs } from '../../customHooks/consoleLogger';
14
+ import { clearAnalyticsEvents } from '../../customHooks/analyticsLogger';
15
+ import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, WhiteBackNavigation, } from '../NetworkIcons';
16
+ const SettingsPanel = () => {
17
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, } = useInspector();
18
+ const headerTopPadding = Platform.OS === 'ios' && modalHeightPercent >= 95 ? 44 : 0;
19
+ if (settingsPage === 'main') {
20
+ const settingsTabs = [
21
+ { key: 'apis', label: 'APIs', icon: 'apis' },
22
+ { key: 'logs', label: 'Logs', icon: 'logs' },
23
+ { key: 'analytics', label: 'Analytics', icon: 'analytics' },
24
+ { key: 'redux', label: 'Redux', icon: 'redux' },
25
+ ];
26
+ return (<View style={{ flex: 1, backgroundColor: AppColors.grayBackground }}>
27
+ {/* Settings Header with back button */}
28
+ <LinearGradient colors={[AppColors.purple, AppColors.brandPurple]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles.headerGradient}>
29
+ <View style={{ paddingTop: headerTopPadding, width: '100%' }}>
30
+ <View style={[styles.header, { paddingHorizontal: 16, gap: 12 }]}>
31
+ <TouchableScale onPress={() => {
32
+ animateNextLayout();
33
+ setSettingsPage(null);
34
+ switchActiveTab('apis');
35
+ }} hitSlop={12} style={{
36
+ padding: 8,
37
+ borderRadius: 10,
38
+ backgroundColor: `${AppColors.white}26`,
39
+ borderWidth: 1,
40
+ borderColor: `${AppColors.white}14`,
41
+ }}>
42
+ <WhiteBackNavigation color={AppColors.white} size={16}/>
43
+ </TouchableScale>
44
+ <View style={{ flex: 1 }}>
45
+ <Text style={{
46
+ fontFamily: AppFonts.interBold,
47
+ fontSize: 17,
48
+ color: AppColors.white,
49
+ }}>
50
+ Settings
51
+ </Text>
52
+ <Text style={{
53
+ fontFamily: AppFonts.interRegular,
54
+ fontSize: 11,
55
+ color: `${AppColors.white}BF`,
56
+ marginTop: 1,
57
+ }}>
58
+ Manage modules and preferences
59
+ </Text>
60
+ </View>
61
+ <View style={{
62
+ backgroundColor: `${AppColors.white}26`,
63
+ paddingHorizontal: 8,
64
+ paddingVertical: 4,
65
+ borderRadius: 8,
66
+ borderWidth: 1,
67
+ borderColor: `${AppColors.white}1A`,
68
+ }}>
69
+ <Text style={{
70
+ fontFamily: AppFonts.interBold,
71
+ fontSize: 10.5,
72
+ color: AppColors.white,
73
+ }}>
74
+ v{LIB_VERSION}
75
+ </Text>
76
+ </View>
77
+ </View>
78
+ </View>
79
+ </LinearGradient>
80
+
81
+ <ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
82
+ {/* Sub Tabs */}
83
+ <View style={{
84
+ flexDirection: 'row',
85
+ backgroundColor: AppColors.primaryLight,
86
+ borderRadius: 10,
87
+ padding: 3,
88
+ borderWidth: 1,
89
+ borderColor: AppColors.grayBorderSecondary,
90
+ marginBottom: 4,
91
+ }}>
92
+ <TouchableOpacity onPress={() => {
93
+ animateNextLayout();
94
+ setSettingsActiveSubTab('module');
95
+ }} style={{
96
+ flex: 1,
97
+ paddingVertical: 8,
98
+ alignItems: 'center',
99
+ justifyContent: 'center',
100
+ borderRadius: 8,
101
+ backgroundColor: settingsActiveSubTab === 'module'
102
+ ? AppColors.purple
103
+ : 'transparent',
104
+ }}>
105
+ <Text style={{
106
+ fontFamily: AppFonts.interBold,
107
+ fontSize: 12,
108
+ color: settingsActiveSubTab === 'module'
109
+ ? AppColors.white
110
+ : AppColors.grayText,
111
+ }}>
112
+ Module
113
+ </Text>
114
+ </TouchableOpacity>
115
+ <TouchableOpacity onPress={() => {
116
+ animateNextLayout();
117
+ setSettingsActiveSubTab('ui');
118
+ }} style={{
119
+ flex: 1,
120
+ paddingVertical: 8,
121
+ alignItems: 'center',
122
+ justifyContent: 'center',
123
+ borderRadius: 8,
124
+ backgroundColor: settingsActiveSubTab === 'ui'
125
+ ? AppColors.purple
126
+ : 'transparent',
127
+ }}>
128
+ <Text style={{
129
+ fontFamily: AppFonts.interBold,
130
+ fontSize: 12,
131
+ color: settingsActiveSubTab === 'ui'
132
+ ? AppColors.white
133
+ : AppColors.grayText,
134
+ }}>
135
+ UI Preferences
136
+ </Text>
137
+ </TouchableOpacity>
138
+ </View>
139
+
140
+ {settingsActiveSubTab === 'module' ? (
141
+ /* Tab list */
142
+ <View style={{
143
+ backgroundColor: AppColors.primaryLight,
144
+ borderRadius: 12,
145
+ borderWidth: 1,
146
+ borderColor: AppColors.grayBorderSecondary,
147
+ overflow: 'hidden',
148
+ }}>
149
+ {/* Table Header */}
150
+ <View style={{
151
+ flexDirection: 'row',
152
+ alignItems: 'center',
153
+ paddingVertical: 8,
154
+ paddingHorizontal: 14,
155
+ backgroundColor: AppColors.grayBackground,
156
+ borderBottomWidth: 1,
157
+ borderBottomColor: AppColors.dividerColor,
158
+ gap: 12,
159
+ }}>
160
+ <Text style={{
161
+ fontFamily: AppFonts.interBold,
162
+ fontSize: 10,
163
+ color: AppColors.grayTextWeak,
164
+ letterSpacing: 0.6,
165
+ flex: 1,
166
+ }}>
167
+ MODULE
168
+ </Text>
169
+ <Text style={{
170
+ fontFamily: AppFonts.interBold,
171
+ fontSize: 10,
172
+ color: AppColors.grayTextWeak,
173
+ letterSpacing: 0.6,
174
+ width: 90,
175
+ textAlign: 'right',
176
+ paddingRight: 4,
177
+ }}>
178
+ VISIBILITY
179
+ </Text>
180
+ </View>
181
+
182
+ {settingsTabs.map((tab, idx) => {
183
+ const isVisible = tab.key === 'apis' || tabVisibility?.[tab.key];
184
+ const isLast = idx === settingsTabs.length - 1;
185
+ const isLocked = tab.key === 'apis';
186
+ return (<View key={tab.key} style={{
187
+ flexDirection: 'row',
188
+ alignItems: 'center',
189
+ paddingVertical: 10,
190
+ paddingHorizontal: 14,
191
+ borderBottomWidth: isLast ? 0 : 1,
192
+ borderBottomColor: AppColors.dividerColor,
193
+ gap: 12,
194
+ }}>
195
+ {/* Icon + Label — fills remaining space */}
196
+ <View style={{
197
+ flex: 1,
198
+ flexDirection: 'row',
199
+ alignItems: 'center',
200
+ gap: 8,
201
+ }}>
202
+ {/* Small icon tile */}
203
+ <View style={{
204
+ width: 20,
205
+ height: 20,
206
+ borderRadius: 6,
207
+ backgroundColor: isLocked
208
+ ? AppColors.grayBorderSecondary
209
+ : AppColors.purpleShade50,
210
+ borderWidth: 1,
211
+ borderColor: isLocked
212
+ ? AppColors.dividerColor
213
+ : `${AppColors.purple}33`,
214
+ alignItems: 'center',
215
+ justifyContent: 'center',
216
+ }}>
217
+ {tab.icon === 'apis' && (<SignalIcon color={isLocked
218
+ ? AppColors.grayTextWeak
219
+ : AppColors.purple} size={11}/>)}
220
+ {tab.icon === 'logs' && (<TerminalIcon color={isLocked
221
+ ? AppColors.grayTextWeak
222
+ : AppColors.purple} size={11}/>)}
223
+ {tab.icon === 'analytics' && (<AnalyticsIcon color={isLocked
224
+ ? AppColors.grayTextWeak
225
+ : AppColors.purple} size={11}/>)}
226
+ {tab.icon === 'redux' && (<TerminalIcon color={isLocked
227
+ ? AppColors.grayTextWeak
228
+ : AppColors.purple} size={11}/>)}
229
+ </View>
230
+ {/* Label + Required badge */}
231
+ <Text style={{
232
+ fontFamily: AppFonts.interBold,
233
+ fontSize: 13,
234
+ color: isLocked
235
+ ? AppColors.grayText
236
+ : AppColors.primaryBlack,
237
+ }}>
238
+ {tab.label}
239
+ </Text>
240
+ {/* #6 — badge marks the configured default tab */}
241
+ {tab.key === defaultTab && (<View style={{
242
+ flexDirection: 'row',
243
+ alignItems: 'center',
244
+ backgroundColor: `${AppColors.purple}14`,
245
+ borderRadius: 20,
246
+ paddingHorizontal: 6,
247
+ paddingVertical: 2,
248
+ borderWidth: 1,
249
+ borderColor: `${AppColors.purple}2E`,
250
+ gap: 3,
251
+ }}>
252
+ <View style={{
253
+ width: 4,
254
+ height: 4,
255
+ borderRadius: 2,
256
+ backgroundColor: AppColors.purple,
257
+ opacity: 0.7,
258
+ }}/>
259
+ <Text style={{
260
+ fontFamily: AppFonts.interBold,
261
+ fontSize: 8.5,
262
+ color: AppColors.purple,
263
+ letterSpacing: 0.4,
264
+ }}>
265
+ DEFAULT
266
+ </Text>
267
+ </View>)}
268
+
269
+ {/* Settings gear icon next to label */}
270
+ <TouchableScale onPress={() => {
271
+ animateNextLayout();
272
+ setSettingsPage(tab.key);
273
+ }} hitSlop={8} style={{
274
+ marginLeft: 4,
275
+ padding: 4,
276
+ borderRadius: 6,
277
+ backgroundColor: AppColors.purpleShade50,
278
+ borderWidth: 1,
279
+ borderColor: `${AppColors.purple}26`,
280
+ alignItems: 'center',
281
+ justifyContent: 'center',
282
+ }}>
283
+ <SettingsIcon color={AppColors.purple} size={10}/>
284
+ </TouchableScale>
285
+ </View>
286
+
287
+ {/* Visibility Switch in VISIBILITY column */}
288
+ <View style={{
289
+ width: 90,
290
+ alignItems: 'flex-end',
291
+ justifyContent: 'center',
292
+ }}>
293
+ <TouchableScale disabled={isLocked} onPress={() => toggleTabVisibility(tab.key)} style={{
294
+ width: 38,
295
+ height: 22,
296
+ borderRadius: 11,
297
+ backgroundColor: isLocked
298
+ ? AppColors.grayBackground
299
+ : isVisible
300
+ ? AppColors.purple
301
+ : AppColors.grayBorderSecondary,
302
+ borderWidth: isLocked ? 1.5 : 0,
303
+ borderColor: isLocked
304
+ ? AppColors.grayBorderSecondary
305
+ : 'transparent',
306
+ borderStyle: isLocked ? 'dashed' : 'solid',
307
+ padding: 2,
308
+ justifyContent: 'center',
309
+ alignItems: isVisible ? 'flex-end' : 'flex-start',
310
+ opacity: isLocked ? 0.9 : 1,
311
+ }}>
312
+ <View style={{
313
+ width: 18,
314
+ height: 18,
315
+ borderRadius: 9,
316
+ backgroundColor: isLocked
317
+ ? AppColors.grayBorderSecondary
318
+ : AppColors.white,
319
+ alignItems: 'center',
320
+ justifyContent: 'center',
321
+ shadowColor: AppColors.black,
322
+ shadowOpacity: isLocked ? 0 : 0.15,
323
+ shadowRadius: 1.5,
324
+ shadowOffset: { width: 0, height: 1 },
325
+ }}>
326
+ {isLocked && (<Svg width={10} height={10} viewBox="0 0 24 24" fill="none">
327
+ <Path d="M7 10V7a5 5 0 0 1 10 0v3" stroke={AppColors.grayText} strokeWidth="2.2" strokeLinecap="round"/>
328
+ <Path d="M5 10h14v9a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1z" fill={AppColors.grayText}/>
329
+ </Svg>)}
330
+ </View>
331
+ </TouchableScale>
332
+ {isLocked && (<Text style={{
333
+ fontFamily: AppFonts.interBold,
334
+ fontSize: 8,
335
+ color: AppColors.grayTextWeak,
336
+ letterSpacing: 0.4,
337
+ marginTop: 3,
338
+ }}>
339
+ REQUIRED
340
+ </Text>)}
341
+ </View>
342
+ </View>);
343
+ })}
344
+ </View>) : (
345
+ /* UI Preferences Section */
346
+ <View style={{
347
+ backgroundColor: AppColors.primaryLight,
348
+ borderRadius: 12,
349
+ borderWidth: 1,
350
+ borderColor: AppColors.grayBorderSecondary,
351
+ overflow: 'hidden',
352
+ }}>
353
+ <View style={{
354
+ flexDirection: 'row',
355
+ alignItems: 'center',
356
+ paddingVertical: 12,
357
+ paddingHorizontal: 14,
358
+ gap: 12,
359
+ }}>
360
+ {/* Icon + Label */}
361
+ <View style={{
362
+ flex: 1,
363
+ flexDirection: 'row',
364
+ alignItems: 'center',
365
+ gap: 8,
366
+ }}>
367
+ <View style={{
368
+ width: 20,
369
+ height: 20,
370
+ borderRadius: 6,
371
+ backgroundColor: AppColors.purpleShade50,
372
+ borderWidth: 1,
373
+ borderColor: `${AppColors.purple}33`,
374
+ alignItems: 'center',
375
+ justifyContent: 'center',
376
+ }}>
377
+ {isDark ? (<SunIcon color={AppColors.purple} size={11}/>) : (<MoonIcon color={AppColors.purple} size={11}/>)}
378
+ </View>
379
+ <View style={{ flex: 1 }}>
380
+ <Text style={{
381
+ fontFamily: AppFonts.interBold,
382
+ fontSize: 13,
383
+ color: AppColors.primaryBlack,
384
+ }}>
385
+ Dark Theme
386
+ </Text>
387
+ </View>
388
+ </View>
389
+
390
+ {/* Toggle Switch */}
391
+ <TouchableScale onPress={() => {
392
+ const newTheme = !isDark;
393
+ setIsDark(newTheme);
394
+ toggleGlobalTheme(newTheme);
395
+ }} style={{
396
+ width: 38,
397
+ height: 22,
398
+ borderRadius: 11,
399
+ backgroundColor: isDark
400
+ ? AppColors.purple
401
+ : AppColors.grayBorderSecondary,
402
+ padding: 2,
403
+ justifyContent: 'center',
404
+ alignItems: isDark ? 'flex-end' : 'flex-start',
405
+ }}>
406
+ <View style={{
407
+ width: 18,
408
+ height: 18,
409
+ borderRadius: 9,
410
+ backgroundColor: AppColors.white,
411
+ shadowColor: AppColors.black,
412
+ shadowOpacity: 0.15,
413
+ shadowRadius: 1.5,
414
+ shadowOffset: { width: 0, height: 1 },
415
+ }}/>
416
+ </TouchableScale>
417
+ </View>
418
+
419
+ {/* Divider */}
420
+ <View style={{
421
+ height: 1,
422
+ backgroundColor: AppColors.dividerColor,
423
+ }}/>
424
+
425
+ {/* Modal Height */}
426
+ <View style={{
427
+ paddingVertical: 12,
428
+ paddingHorizontal: 14,
429
+ }}>
430
+ <View style={{
431
+ flexDirection: 'row',
432
+ alignItems: 'center',
433
+ gap: 8,
434
+ }}>
435
+ <View style={{
436
+ width: 20,
437
+ height: 20,
438
+ borderRadius: 6,
439
+ backgroundColor: AppColors.purpleShade50,
440
+ borderWidth: 1,
441
+ borderColor: `${AppColors.purple}33`,
442
+ alignItems: 'center',
443
+ justifyContent: 'center',
444
+ }}>
445
+ <ScreenIcon color={AppColors.purple} size={11}/>
446
+ </View>
447
+ <View style={{ flex: 1 }}>
448
+ <Text style={{
449
+ fontFamily: AppFonts.interBold,
450
+ fontSize: 13,
451
+ color: AppColors.primaryBlack,
452
+ }}>
453
+ Modal Height
454
+ </Text>
455
+ <Text style={{
456
+ fontFamily: AppFonts.interRegular,
457
+ fontSize: 11,
458
+ color: AppColors.grayText,
459
+ marginTop: 1,
460
+ }}>
461
+ Height of the inspector panel relative to the screen
462
+ </Text>
463
+ </View>
464
+ </View>
465
+
466
+ {/* Segmented picker */}
467
+ <View style={{
468
+ flexDirection: 'row',
469
+ backgroundColor: AppColors.grayBackground,
470
+ borderRadius: 8,
471
+ padding: 2.5,
472
+ marginTop: 10,
473
+ borderWidth: 1,
474
+ borderColor: AppColors.dividerColor,
475
+ }}>
476
+ {[50, 70, 90, 100].map(opt => {
477
+ const isActive = modalHeightPercent === opt;
478
+ return (<TouchableScale key={opt} onPress={() => setModalHeightPercent(opt)} style={{
479
+ flex: 1,
480
+ paddingVertical: 6,
481
+ alignItems: 'center',
482
+ borderRadius: 6,
483
+ backgroundColor: isActive
484
+ ? AppColors.purple
485
+ : 'transparent',
486
+ }}>
487
+ <Text style={{
488
+ fontFamily: AppFonts.interBold,
489
+ fontSize: 11,
490
+ color: isActive ? AppColors.white : AppColors.grayText,
491
+ }}>
492
+ {opt}%
493
+ </Text>
494
+ </TouchableScale>);
495
+ })}
496
+ </View>
497
+ </View>
498
+
499
+ {/* Divider */}
500
+ <View style={{
501
+ height: 1,
502
+ backgroundColor: AppColors.dividerColor,
503
+ }}/>
504
+
505
+ {/* Modal Animation */}
506
+ <View style={{
507
+ paddingVertical: 12,
508
+ paddingHorizontal: 14,
509
+ }}>
510
+ <View style={{
511
+ flexDirection: 'row',
512
+ alignItems: 'center',
513
+ gap: 8,
514
+ }}>
515
+ <View style={{
516
+ width: 20,
517
+ height: 20,
518
+ borderRadius: 6,
519
+ backgroundColor: AppColors.purpleShade50,
520
+ borderWidth: 1,
521
+ borderColor: `${AppColors.purple}33`,
522
+ alignItems: 'center',
523
+ justifyContent: 'center',
524
+ }}>
525
+ <MotionIcon color={AppColors.purple} size={11}/>
526
+ </View>
527
+ <View style={{ flex: 1 }}>
528
+ <Text style={{
529
+ fontFamily: AppFonts.interBold,
530
+ fontSize: 13,
531
+ color: AppColors.primaryBlack,
532
+ }}>
533
+ Modal Animation
534
+ </Text>
535
+ <Text style={{
536
+ fontFamily: AppFonts.interRegular,
537
+ fontSize: 11,
538
+ color: AppColors.grayText,
539
+ marginTop: 1,
540
+ }}>
541
+ How the inspector panel enters and exits the screen
542
+ </Text>
543
+ </View>
544
+ </View>
545
+
546
+ {/* Segmented picker */}
547
+ <View style={{
548
+ flexDirection: 'row',
549
+ backgroundColor: AppColors.grayBackground,
550
+ borderRadius: 8,
551
+ padding: 2.5,
552
+ marginTop: 10,
553
+ borderWidth: 1,
554
+ borderColor: AppColors.dividerColor,
555
+ }}>
556
+ {([
557
+ { key: 'slide', label: 'Slide Up' },
558
+ { key: 'fade', label: 'Fade' },
559
+ { key: 'none', label: 'None' },
560
+ ]).map(opt => {
561
+ const isActive = modalAnimationType === opt.key;
562
+ return (<TouchableScale key={opt.key} onPress={() => setModalAnimationType(opt.key)} style={{
563
+ flex: 1,
564
+ paddingVertical: 6,
565
+ alignItems: 'center',
566
+ borderRadius: 6,
567
+ backgroundColor: isActive
568
+ ? AppColors.purple
569
+ : 'transparent',
570
+ }}>
571
+ <Text style={{
572
+ fontFamily: AppFonts.interBold,
573
+ fontSize: 11,
574
+ color: isActive ? AppColors.white : AppColors.grayText,
575
+ }}>
576
+ {opt.label}
577
+ </Text>
578
+ </TouchableScale>);
579
+ })}
580
+ </View>
581
+ </View>
582
+
583
+ {/* Divider */}
584
+ <View style={{
585
+ height: 1,
586
+ backgroundColor: AppColors.dividerColor,
587
+ }}/>
588
+
589
+ {/* #6 — Default Tab */}
590
+ <View style={{
591
+ paddingVertical: 12,
592
+ paddingHorizontal: 14,
593
+ }}>
594
+ <View style={{
595
+ flexDirection: 'row',
596
+ alignItems: 'center',
597
+ gap: 8,
598
+ }}>
599
+ <View style={{
600
+ width: 20,
601
+ height: 20,
602
+ borderRadius: 6,
603
+ backgroundColor: AppColors.purpleShade50,
604
+ borderWidth: 1,
605
+ borderColor: `${AppColors.purple}33`,
606
+ alignItems: 'center',
607
+ justifyContent: 'center',
608
+ }}>
609
+ <LayersIcon color={AppColors.purple} size={11}/>
610
+ </View>
611
+ <View style={{ flex: 1 }}>
612
+ <Text style={{
613
+ fontFamily: AppFonts.interBold,
614
+ fontSize: 13,
615
+ color: AppColors.primaryBlack,
616
+ }}>
617
+ Default Tab
618
+ </Text>
619
+ <Text style={{
620
+ fontFamily: AppFonts.interRegular,
621
+ fontSize: 11,
622
+ color: AppColors.grayText,
623
+ marginTop: 1,
624
+ }}>
625
+ Tab shown when the inspector opens
626
+ </Text>
627
+ </View>
628
+ </View>
629
+
630
+ {/* Grid of Default Tab Cards */}
631
+ <View style={{
632
+ flexDirection: 'row',
633
+ flexWrap: 'wrap',
634
+ gap: 8,
635
+ marginTop: 12,
636
+ }}>
637
+ {settingsTabs
638
+ .filter(tab => tab.key === 'apis' || tabVisibility?.[tab.key])
639
+ .map(tab => {
640
+ const isActive = defaultTab === tab.key;
641
+ return (<TouchableScale key={tab.key} onPress={() => setDefaultTab(tab.key)} style={{
642
+ flexDirection: 'row',
643
+ alignItems: 'center',
644
+ gap: 8,
645
+ paddingVertical: 10,
646
+ paddingHorizontal: 12,
647
+ borderRadius: 10,
648
+ borderWidth: 1.5,
649
+ borderColor: isActive ? AppColors.purple : AppColors.grayBorderSecondary,
650
+ backgroundColor: isActive ? `${AppColors.purple}0F` : AppColors.primaryLight,
651
+ minWidth: '47%',
652
+ flex: 1,
653
+ }}>
654
+ <View style={{
655
+ width: 22,
656
+ height: 22,
657
+ borderRadius: 6,
658
+ backgroundColor: isActive ? AppColors.purple : AppColors.purpleShade50,
659
+ alignItems: 'center',
660
+ justifyContent: 'center',
661
+ }}>
662
+ {tab.icon === 'apis' && (<SignalIcon color={isActive ? AppColors.white : AppColors.purple} size={11}/>)}
663
+ {tab.icon === 'logs' && (<TerminalIcon color={isActive ? AppColors.white : AppColors.purple} size={11}/>)}
664
+ {tab.icon === 'analytics' && (<AnalyticsIcon color={isActive ? AppColors.white : AppColors.purple} size={11}/>)}
665
+ {tab.icon === 'redux' && (<TerminalIcon color={isActive ? AppColors.white : AppColors.purple} size={11}/>)}
666
+ </View>
667
+ <Text style={{
668
+ fontFamily: AppFonts.interBold,
669
+ fontSize: 13,
670
+ color: isActive ? AppColors.purple : AppColors.primaryBlack,
671
+ flex: 1,
672
+ }}>
673
+ {tab.label}
674
+ </Text>
675
+ {isActive && (<View style={{
676
+ width: 14,
677
+ height: 14,
678
+ borderRadius: 7,
679
+ backgroundColor: AppColors.purple,
680
+ alignItems: 'center',
681
+ justifyContent: 'center',
682
+ }}>
683
+ <CheckIcon size={8} color={AppColors.white}/>
684
+ </View>)}
685
+ </TouchableScale>);
686
+ })}
687
+ </View>
688
+ </View>
689
+
690
+ {/* Divider */}
691
+ <View style={{
692
+ height: 1,
693
+ backgroundColor: AppColors.dividerColor,
694
+ }}/>
695
+
696
+ {/* #9 — Show Duplicate Logs */}
697
+ <View style={{
698
+ flexDirection: 'row',
699
+ alignItems: 'center',
700
+ paddingVertical: 12,
701
+ paddingHorizontal: 14,
702
+ gap: 12,
703
+ }}>
704
+ <View style={{
705
+ flex: 1,
706
+ flexDirection: 'row',
707
+ alignItems: 'center',
708
+ gap: 8,
709
+ }}>
710
+ <View style={{
711
+ width: 20,
712
+ height: 20,
713
+ borderRadius: 6,
714
+ backgroundColor: AppColors.purpleShade50,
715
+ borderWidth: 1,
716
+ borderColor: `${AppColors.purple}33`,
717
+ alignItems: 'center',
718
+ justifyContent: 'center',
719
+ }}>
720
+ <EyeIcon color={AppColors.purple} size={11}/>
721
+ </View>
722
+ <View style={{ flex: 1 }}>
723
+ <Text style={{
724
+ fontFamily: AppFonts.interBold,
725
+ fontSize: 13,
726
+ color: AppColors.primaryBlack,
727
+ }}>
728
+ Show Duplicate Logs
729
+ </Text>
730
+ <Text style={{
731
+ fontFamily: AppFonts.interRegular,
732
+ fontSize: 11,
733
+ color: AppColors.grayText,
734
+ marginTop: 1,
735
+ }}>
736
+ Off: repeated identical entries collapse into one row
737
+ with a ×N count
738
+ </Text>
739
+ </View>
740
+ </View>
741
+
742
+ {/* Toggle Switch */}
743
+ <TouchableScale onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
744
+ width: 38,
745
+ height: 22,
746
+ borderRadius: 11,
747
+ backgroundColor: showDuplicateLogs
748
+ ? AppColors.purple
749
+ : AppColors.grayBorderSecondary,
750
+ padding: 2,
751
+ justifyContent: 'center',
752
+ alignItems: showDuplicateLogs ? 'flex-end' : 'flex-start',
753
+ }}>
754
+ <View style={{
755
+ width: 18,
756
+ height: 18,
757
+ borderRadius: 9,
758
+ backgroundColor: AppColors.white,
759
+ shadowColor: AppColors.black,
760
+ shadowOpacity: 0.15,
761
+ shadowRadius: 1.5,
762
+ shadowOffset: { width: 0, height: 1 },
763
+ }}/>
764
+ </TouchableScale>
765
+ </View>
766
+
767
+ {/* Divider */}
768
+ <View style={{
769
+ height: 1,
770
+ backgroundColor: AppColors.dividerColor,
771
+ }}/>
772
+
773
+ {/* Logs Console Levels */}
774
+ <View style={{
775
+ paddingVertical: 12,
776
+ paddingHorizontal: 14,
777
+ }}>
778
+ <View style={{
779
+ flexDirection: 'row',
780
+ alignItems: 'center',
781
+ gap: 8,
782
+ }}>
783
+ <View style={{
784
+ width: 20,
785
+ height: 20,
786
+ borderRadius: 6,
787
+ backgroundColor: AppColors.purpleShade50,
788
+ borderWidth: 1,
789
+ borderColor: `${AppColors.purple}33`,
790
+ alignItems: 'center',
791
+ justifyContent: 'center',
792
+ }}>
793
+ <TerminalIcon color={AppColors.purple} size={11}/>
794
+ </View>
795
+ <View style={{ flex: 1 }}>
796
+ <Text style={{
797
+ fontFamily: AppFonts.interBold,
798
+ fontSize: 13,
799
+ color: AppColors.primaryBlack,
800
+ }}>
801
+ Logs Console Levels
802
+ </Text>
803
+ <Text style={{
804
+ fontFamily: AppFonts.interRegular,
805
+ fontSize: 11,
806
+ color: AppColors.grayText,
807
+ marginTop: 1,
808
+ }}>
809
+ Toggle which log levels are visible in the Logs tab
810
+ </Text>
811
+ </View>
812
+ </View>
813
+
814
+ <View style={{
815
+ flexDirection: 'row',
816
+ gap: 8,
817
+ marginTop: 10,
818
+ }}>
819
+ {([
820
+ { key: 'info', label: 'Info', color: AppColors.blue500 },
821
+ { key: 'warn', label: 'Warning', color: AppColors.amber500 },
822
+ { key: 'error', label: 'Error', color: AppColors.errorColor },
823
+ ]).map(level => {
824
+ const isActive = showConsoleLevels[level.key];
825
+ return (<TouchableScale key={level.key} onPress={() => setShowConsoleLevels(prev => ({
826
+ ...prev,
827
+ [level.key]: !prev[level.key],
828
+ }))} style={{
829
+ flex: 1,
830
+ flexDirection: 'row',
831
+ alignItems: 'center',
832
+ justifyContent: 'center',
833
+ gap: 6,
834
+ paddingVertical: 8,
835
+ borderRadius: 8,
836
+ borderWidth: 1.5,
837
+ borderColor: isActive ? level.color : AppColors.grayBorderSecondary,
838
+ backgroundColor: isActive ? `${level.color}0D` : AppColors.primaryLight,
839
+ }}>
840
+ <View style={{
841
+ width: 8,
842
+ height: 8,
843
+ borderRadius: 4,
844
+ backgroundColor: isActive ? level.color : AppColors.grayBorderSecondary,
845
+ }}/>
846
+ <Text style={{
847
+ fontFamily: AppFonts.interBold,
848
+ fontSize: 11,
849
+ color: isActive ? level.color : AppColors.grayText,
850
+ }}>
851
+ {level.label}
852
+ </Text>
853
+ </TouchableScale>);
854
+ })}
855
+ </View>
856
+ </View>
857
+
858
+ {/* Divider */}
859
+ <View style={{
860
+ height: 1,
861
+ backgroundColor: AppColors.dividerColor,
862
+ }}/>
863
+
864
+ {/* Reset Settings */}
865
+ <View style={{
866
+ flexDirection: 'row',
867
+ alignItems: 'center',
868
+ paddingVertical: 12,
869
+ paddingHorizontal: 14,
870
+ gap: 12,
871
+ }}>
872
+ <View style={{
873
+ flex: 1,
874
+ flexDirection: 'row',
875
+ alignItems: 'center',
876
+ gap: 8,
877
+ }}>
878
+ <View style={{
879
+ width: 20,
880
+ height: 20,
881
+ borderRadius: 6,
882
+ backgroundColor: `${AppColors.errorColor}14`,
883
+ borderWidth: 1,
884
+ borderColor: `${AppColors.errorColor}33`,
885
+ alignItems: 'center',
886
+ justifyContent: 'center',
887
+ }}>
888
+ <TrashIcon color={AppColors.errorColor} size={11}/>
889
+ </View>
890
+ <View style={{ flex: 1 }}>
891
+ <Text style={{
892
+ fontFamily: AppFonts.interBold,
893
+ fontSize: 13,
894
+ color: AppColors.primaryBlack,
895
+ }}>
896
+ Reset Settings
897
+ </Text>
898
+ <Text style={{
899
+ fontFamily: AppFonts.interRegular,
900
+ fontSize: 11,
901
+ color: AppColors.grayText,
902
+ marginTop: 1,
903
+ }}>
904
+ Wipe custom configurations and load package defaults
905
+ </Text>
906
+ </View>
907
+ </View>
908
+
909
+ <TouchableScale onPress={resetToDefaults} style={{
910
+ paddingHorizontal: 10,
911
+ paddingVertical: 5,
912
+ borderRadius: 7,
913
+ backgroundColor: `${AppColors.errorColor}14`,
914
+ borderWidth: 1,
915
+ borderColor: `${AppColors.errorColor}33`,
916
+ }}>
917
+ <Text style={{
918
+ fontFamily: AppFonts.interBold,
919
+ fontSize: 11,
920
+ color: AppColors.errorColor,
921
+ }}>
922
+ Reset
923
+ </Text>
924
+ </TouchableScale>
925
+ </View>
926
+ </View>)}
927
+
928
+
929
+ {/* Storage Status */}
930
+ <View style={{
931
+ backgroundColor: isPersistentStorageAvailable()
932
+ ? `${AppColors.liveGreen}14`
933
+ : `${AppColors.amber600}14`,
934
+ borderRadius: 12,
935
+ borderWidth: 1,
936
+ borderColor: isPersistentStorageAvailable()
937
+ ? `${AppColors.liveGreen}33`
938
+ : `${AppColors.amber600}33`,
939
+ padding: 12,
940
+ marginTop: 16,
941
+ flexDirection: 'row',
942
+ alignItems: 'center',
943
+ gap: 10,
944
+ }}>
945
+ <View style={{
946
+ width: 8,
947
+ height: 8,
948
+ borderRadius: 4,
949
+ backgroundColor: isPersistentStorageAvailable() ? AppColors.green500 : AppColors.amber600,
950
+ }}/>
951
+ <View style={{ flex: 1 }}>
952
+ <Text style={{
953
+ fontFamily: AppFonts.interBold,
954
+ fontSize: 12,
955
+ color: isPersistentStorageAvailable() ? AppColors.green700 : AppColors.amber800,
956
+ }}>
957
+ {isPersistentStorageAvailable()
958
+ ? `Storage: Persistent (${storage ? 'Custom' : 'iOS Settings'})`
959
+ : 'Storage: Temporary (In-Memory)'}
960
+ </Text>
961
+ <Text style={{
962
+ fontFamily: AppFonts.interRegular,
963
+ fontSize: 10.5,
964
+ color: isPersistentStorageAvailable() ? AppColors.green800 : AppColors.amber800,
965
+ marginTop: 2,
966
+ opacity: 0.8,
967
+ }}>
968
+ {isPersistentStorageAvailable()
969
+ ? 'Your settings are saved across app restarts.'
970
+ : 'Settings reset when closed. To persist settings, pass a storage object to <NetworkInspector storage={...} />.'}
971
+ </Text>
972
+ </View>
973
+ </View>
974
+ </ScrollView>
975
+ </View>);
976
+ }
977
+ const goBackToMain = () => {
978
+ animateNextLayout();
979
+ setSettingsPage('main');
980
+ };
981
+ // Helper: settings row with icon + label + optional description
982
+ const renderSettingRow = (opts) => (<View style={{
983
+ paddingVertical: 12,
984
+ borderBottomWidth: opts.isLast ? 0 : 1,
985
+ borderBottomColor: AppColors.dividerColor,
986
+ }}>
987
+ <TouchableScale disabled={!opts.onPress} onPress={opts.onPress} style={{
988
+ flexDirection: 'row',
989
+ alignItems: 'center',
990
+ gap: 12,
991
+ }}>
992
+ <View style={{
993
+ width: 36,
994
+ height: 36,
995
+ borderRadius: 10,
996
+ backgroundColor: AppColors.purpleShade50,
997
+ borderWidth: 1,
998
+ borderColor: `${AppColors.purple}2E`,
999
+ alignItems: 'center',
1000
+ justifyContent: 'center',
1001
+ }}>
1002
+ {opts.icon}
1003
+ </View>
1004
+ <View style={{ flex: 1 }}>
1005
+ <Text style={{
1006
+ fontFamily: AppFonts.interBold,
1007
+ fontSize: 14,
1008
+ color: AppColors.primaryBlack,
1009
+ }}>
1010
+ {opts.label}
1011
+ </Text>
1012
+ {opts.description ? (<Text style={{
1013
+ fontFamily: AppFonts.interRegular,
1014
+ fontSize: 11,
1015
+ color: AppColors.grayText,
1016
+ marginTop: 1,
1017
+ }}>
1018
+ {opts.description}
1019
+ </Text>) : null}
1020
+ </View>
1021
+ {opts.right || null}
1022
+ </TouchableScale>
1023
+ {opts.picker && (<View style={{
1024
+ flexDirection: 'row',
1025
+ backgroundColor: AppColors.grayBackground,
1026
+ borderRadius: 8,
1027
+ padding: 2.5,
1028
+ marginTop: 10,
1029
+ borderWidth: 1,
1030
+ borderColor: AppColors.dividerColor,
1031
+ }}>
1032
+ {opts.picker.options.map(opt => {
1033
+ const isActive = opts.picker.selectedValue === opt;
1034
+ return (<TouchableScale key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1035
+ flex: 1,
1036
+ paddingVertical: 6,
1037
+ alignItems: 'center',
1038
+ borderRadius: 6,
1039
+ backgroundColor: isActive
1040
+ ? AppColors.purple
1041
+ : 'transparent',
1042
+ }}>
1043
+ <Text style={{
1044
+ fontFamily: AppFonts.interBold,
1045
+ fontSize: 11,
1046
+ color: isActive ? AppColors.white : AppColors.grayText,
1047
+ }}>
1048
+ {opts.picker.formatLabel
1049
+ ? opts.picker.formatLabel(opt)
1050
+ : opt}
1051
+ </Text>
1052
+ </TouchableScale>);
1053
+ })}
1054
+ </View>)}
1055
+ </View>);
1056
+ let content = null;
1057
+ let title = '';
1058
+ let icon = null;
1059
+ let rightInfo = '';
1060
+ if (settingsPage === 'apis') {
1061
+ title = 'APIs Settings';
1062
+ icon = <SignalIcon color={AppColors.white} size={16}/>;
1063
+ rightInfo = `Total: ${logs.length}`;
1064
+ content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1065
+ <View style={{
1066
+ backgroundColor: AppColors.primaryLight,
1067
+ padding: 16,
1068
+ borderRadius: 12,
1069
+ borderWidth: 1,
1070
+ borderColor: AppColors.grayBorderSecondary,
1071
+ gap: 4,
1072
+ }}>
1073
+ {renderSettingRow({
1074
+ icon: <SignalIcon color={AppColors.purple} size={16}/>,
1075
+ label: 'Max Request Logs',
1076
+ description: 'How many network requests to keep in memory',
1077
+ picker: {
1078
+ options: [50, 100, 200, 500],
1079
+ selectedValue: maxNetworkLogs,
1080
+ onSelect: setMaxNetworkLogs,
1081
+ },
1082
+ isLast: true,
1083
+ })}
1084
+ </View>
1085
+
1086
+ <View style={{
1087
+ backgroundColor: AppColors.primaryLight,
1088
+ borderRadius: 12,
1089
+ borderWidth: 1,
1090
+ borderColor: AppColors.grayBorderSecondary,
1091
+ padding: 16,
1092
+ marginTop: 12,
1093
+ }}>
1094
+ {renderSettingRow({
1095
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1096
+ label: 'Clear Network Logs',
1097
+ description: `${logs.length} requests stored`,
1098
+ isLast: true,
1099
+ onPress: () => {
1100
+ clearNetworkLogs();
1101
+ setSelected(null);
1102
+ Alert.alert('Success', 'Network logs cleared.');
1103
+ },
1104
+ right: (<View style={{
1105
+ paddingHorizontal: 10,
1106
+ paddingVertical: 5,
1107
+ borderRadius: 7,
1108
+ backgroundColor: `${AppColors.errorColor}14`,
1109
+ borderWidth: 1,
1110
+ borderColor: `${AppColors.errorColor}33`,
1111
+ }}>
1112
+ <Text style={{
1113
+ fontFamily: AppFonts.interBold,
1114
+ fontSize: 11,
1115
+ color: AppColors.errorColor,
1116
+ }}>
1117
+ Clear
1118
+ </Text>
1119
+ </View>),
1120
+ })}
1121
+ </View>
1122
+ </ScrollView>);
1123
+ }
1124
+ else if (settingsPage === 'logs') {
1125
+ title = 'Logs Settings';
1126
+ icon = <TerminalIcon color={AppColors.white} size={16}/>;
1127
+ rightInfo = `Total: ${consoleLogs.length}`;
1128
+ content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1129
+ <View style={{
1130
+ backgroundColor: AppColors.primaryLight,
1131
+ padding: 16,
1132
+ borderRadius: 12,
1133
+ borderWidth: 1,
1134
+ borderColor: AppColors.grayBorderSecondary,
1135
+ gap: 4,
1136
+ }}>
1137
+ {renderSettingRow({
1138
+ icon: <TerminalIcon color={AppColors.purple} size={16}/>,
1139
+ label: 'Max Console Logs',
1140
+ description: 'How many console messages to retain',
1141
+ picker: {
1142
+ options: [100, 200, 500, 1000],
1143
+ selectedValue: maxConsoleLogs,
1144
+ onSelect: setMaxConsoleLogs,
1145
+ },
1146
+ })}
1147
+ <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
1148
+ <Text style={{
1149
+ fontFamily: AppFonts.interBold,
1150
+ fontSize: 13,
1151
+ color: AppColors.primaryBlack,
1152
+ paddingTop: 4,
1153
+ }}>
1154
+ Log Levels
1155
+ </Text>
1156
+ {['info', 'warn', 'error'].map(level => {
1157
+ const isLvlActive = showConsoleLevels?.[level];
1158
+ const levelColor = level === 'error'
1159
+ ? AppColors.errorColor
1160
+ : level === 'warn'
1161
+ ? AppColors.warningIconGold
1162
+ : AppColors.skyBlue;
1163
+ return renderSettingRow({
1164
+ icon: (<View style={{
1165
+ width: 10,
1166
+ height: 10,
1167
+ borderRadius: 5,
1168
+ backgroundColor: levelColor,
1169
+ }}/>),
1170
+ label: `Show ${level.charAt(0).toUpperCase() + level.slice(1)} logs`,
1171
+ description: level === 'info'
1172
+ ? 'Informational messages'
1173
+ : level === 'warn'
1174
+ ? 'Warning messages'
1175
+ : 'Error messages',
1176
+ isLast: level === 'error',
1177
+ onPress: () => setShowConsoleLevels(prev => ({
1178
+ ...prev,
1179
+ [level]: !prev[level],
1180
+ })),
1181
+ right: (<View style={{
1182
+ width: 22,
1183
+ height: 22,
1184
+ borderRadius: 6,
1185
+ borderWidth: 2,
1186
+ borderColor: isLvlActive
1187
+ ? AppColors.purple
1188
+ : AppColors.grayTextWeak,
1189
+ backgroundColor: isLvlActive
1190
+ ? `${AppColors.purple}1A`
1191
+ : 'transparent',
1192
+ alignItems: 'center',
1193
+ justifyContent: 'center',
1194
+ }}>
1195
+ {isLvlActive && (<CheckIcon size={12} color={AppColors.purple}/>)}
1196
+ </View>),
1197
+ });
1198
+ })}
1199
+ </View>
1200
+
1201
+ <View style={{
1202
+ backgroundColor: AppColors.primaryLight,
1203
+ borderRadius: 12,
1204
+ borderWidth: 1,
1205
+ borderColor: AppColors.grayBorderSecondary,
1206
+ padding: 16,
1207
+ marginTop: 12,
1208
+ }}>
1209
+ {renderSettingRow({
1210
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1211
+ label: 'Clear Console Logs',
1212
+ description: `${consoleLogs.length} logs stored`,
1213
+ isLast: true,
1214
+ onPress: () => {
1215
+ clearConsoleLogs();
1216
+ Alert.alert('Success', 'Console logs cleared.');
1217
+ },
1218
+ right: (<View style={{
1219
+ paddingHorizontal: 10,
1220
+ paddingVertical: 5,
1221
+ borderRadius: 7,
1222
+ backgroundColor: `${AppColors.errorColor}14`,
1223
+ borderWidth: 1,
1224
+ borderColor: `${AppColors.errorColor}33`,
1225
+ }}>
1226
+ <Text style={{
1227
+ fontFamily: AppFonts.interBold,
1228
+ fontSize: 11,
1229
+ color: AppColors.errorColor,
1230
+ }}>
1231
+ Clear
1232
+ </Text>
1233
+ </View>),
1234
+ })}
1235
+ </View>
1236
+ </ScrollView>);
1237
+ }
1238
+ else if (settingsPage === 'analytics') {
1239
+ title = 'Analytics Settings';
1240
+ icon = <AnalyticsIcon color={AppColors.white} size={16}/>;
1241
+ rightInfo = `Events: ${analyticsEvents.length}`;
1242
+ content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1243
+ <View style={{
1244
+ backgroundColor: AppColors.primaryLight,
1245
+ padding: 16,
1246
+ borderRadius: 12,
1247
+ borderWidth: 1,
1248
+ borderColor: AppColors.grayBorderSecondary,
1249
+ gap: 4,
1250
+ }}>
1251
+ {renderSettingRow({
1252
+ icon: <AnalyticsIcon color={AppColors.purple} size={16}/>,
1253
+ label: 'Events Captured',
1254
+ description: `${analyticsEvents.length} analytics events stored`,
1255
+ isLast: true,
1256
+ })}
1257
+ </View>
1258
+ <View style={{
1259
+ backgroundColor: AppColors.primaryLight,
1260
+ borderRadius: 12,
1261
+ borderWidth: 1,
1262
+ borderColor: AppColors.grayBorderSecondary,
1263
+ padding: 16,
1264
+ marginTop: 12,
1265
+ }}>
1266
+ {renderSettingRow({
1267
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1268
+ label: 'Clear Analytics History',
1269
+ description: 'Remove all captured events',
1270
+ isLast: true,
1271
+ onPress: () => {
1272
+ clearAnalyticsEvents();
1273
+ setSelectedEvent(null);
1274
+ Alert.alert('Success', 'Analytics events cleared.');
1275
+ },
1276
+ right: (<View style={{
1277
+ paddingHorizontal: 10,
1278
+ paddingVertical: 5,
1279
+ borderRadius: 7,
1280
+ backgroundColor: `${AppColors.errorColor}14`,
1281
+ borderWidth: 1,
1282
+ borderColor: `${AppColors.errorColor}33`,
1283
+ }}>
1284
+ <Text style={{
1285
+ fontFamily: AppFonts.interBold,
1286
+ fontSize: 11,
1287
+ color: AppColors.errorColor,
1288
+ }}>
1289
+ Clear
1290
+ </Text>
1291
+ </View>),
1292
+ })}
1293
+ </View>
1294
+ </ScrollView>);
1295
+ }
1296
+ else if (settingsPage === 'redux') {
1297
+ title = 'Redux Settings';
1298
+ icon = <TerminalIcon color={AppColors.white} size={16}/>;
1299
+ rightInfo = `Reducers: ${Object.keys(reduxState || {}).length}`;
1300
+ content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1301
+ <View style={{
1302
+ backgroundColor: AppColors.primaryLight,
1303
+ padding: 16,
1304
+ borderRadius: 12,
1305
+ borderWidth: 1,
1306
+ borderColor: AppColors.grayBorderSecondary,
1307
+ gap: 4,
1308
+ }}>
1309
+ {renderSettingRow({
1310
+ icon: <TerminalIcon color={AppColors.purple} size={16}/>,
1311
+ label: 'Auto-refresh Store',
1312
+ description: 'Automatically capture Redux store state updates',
1313
+ onPress: () => setReduxAutoRefreshState(prev => !prev),
1314
+ right: (<View style={{
1315
+ width: 22,
1316
+ height: 22,
1317
+ borderRadius: 6,
1318
+ borderWidth: 2,
1319
+ borderColor: reduxAutoRefresh
1320
+ ? AppColors.purple
1321
+ : AppColors.grayTextWeak,
1322
+ backgroundColor: reduxAutoRefresh
1323
+ ? `${AppColors.purple}1A`
1324
+ : 'transparent',
1325
+ alignItems: 'center',
1326
+ justifyContent: 'center',
1327
+ }}>
1328
+ {reduxAutoRefresh && (<CheckIcon size={12} color={AppColors.purple}/>)}
1329
+ </View>),
1330
+ })}
1331
+ <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
1332
+ {renderSettingRow({
1333
+ icon: <LayersIcon color={AppColors.purple} size={16}/>,
1334
+ label: 'Default JSON Expand Depth',
1335
+ description: 'Initial depth of Redux state tree to auto-expand',
1336
+ picker: {
1337
+ options: [1, 2, 3, 5],
1338
+ selectedValue: reduxExpandDepth,
1339
+ onSelect: setReduxExpandDepth,
1340
+ },
1341
+ isLast: true,
1342
+ })}
1343
+ </View>
1344
+
1345
+ <View style={{
1346
+ backgroundColor: AppColors.primaryLight,
1347
+ borderRadius: 12,
1348
+ borderWidth: 1,
1349
+ borderColor: AppColors.grayBorderSecondary,
1350
+ padding: 16,
1351
+ marginTop: 12,
1352
+ }}>
1353
+ {renderSettingRow({
1354
+ icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1355
+ label: 'Clear Redux State',
1356
+ description: reduxState
1357
+ ? 'Reset state snapshot in inspector'
1358
+ : 'No store snapshot stored',
1359
+ isLast: true,
1360
+ onPress: () => {
1361
+ setReduxState(null);
1362
+ Alert.alert('Success', 'Redux state snapshot cleared.');
1363
+ },
1364
+ right: (<View style={{
1365
+ paddingHorizontal: 10,
1366
+ paddingVertical: 5,
1367
+ borderRadius: 7,
1368
+ backgroundColor: `${AppColors.errorColor}14`,
1369
+ borderWidth: 1,
1370
+ borderColor: `${AppColors.errorColor}33`,
1371
+ }}>
1372
+ <Text style={{
1373
+ fontFamily: AppFonts.interBold,
1374
+ fontSize: 11,
1375
+ color: AppColors.errorColor,
1376
+ }}>
1377
+ Clear
1378
+ </Text>
1379
+ </View>),
1380
+ })}
1381
+ </View>
1382
+ </ScrollView>);
1383
+ }
1384
+ return (<View style={{ flex: 1, backgroundColor: AppColors.grayBackground }}>
1385
+ <LinearGradient colors={[AppColors.purple, AppColors.brandPurple]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles.headerGradient}>
1386
+ <View style={{ paddingTop: headerTopPadding, width: '100%' }}>
1387
+ <View style={[styles.header, { paddingHorizontal: 16, gap: 12 }]}>
1388
+ <TouchableScale onPress={goBackToMain} hitSlop={12} style={{
1389
+ padding: 8,
1390
+ borderRadius: 10,
1391
+ backgroundColor: `${AppColors.white}26`,
1392
+ borderWidth: 1,
1393
+ borderColor: `${AppColors.white}14`,
1394
+ }}>
1395
+ <WhiteBackNavigation color={AppColors.white} size={16}/>
1396
+ </TouchableScale>
1397
+ {icon && (<View style={{
1398
+ width: 30,
1399
+ height: 30,
1400
+ borderRadius: 8,
1401
+ backgroundColor: `${AppColors.white}26`,
1402
+ alignItems: 'center',
1403
+ justifyContent: 'center',
1404
+ }}>
1405
+ {icon}
1406
+ </View>)}
1407
+ <View style={{ flex: 1 }}>
1408
+ <Text style={{
1409
+ fontFamily: AppFonts.interBold,
1410
+ fontSize: 17,
1411
+ color: AppColors.white,
1412
+ }}>
1413
+ {title}
1414
+ </Text>
1415
+ </View>
1416
+ {rightInfo ? (<View style={{
1417
+ backgroundColor: `${AppColors.white}26`,
1418
+ paddingHorizontal: 8,
1419
+ paddingVertical: 4,
1420
+ borderRadius: 8,
1421
+ borderWidth: 1,
1422
+ borderColor: `${AppColors.white}1A`,
1423
+ }}>
1424
+ <Text style={{
1425
+ fontFamily: AppFonts.interBold,
1426
+ fontSize: 11,
1427
+ color: AppColors.white,
1428
+ }}>
1429
+ {rightInfo}
1430
+ </Text>
1431
+ </View>) : null}
1432
+ </View>
1433
+ </View>
1434
+ </LinearGradient>
1435
+ {content}
1436
+ </View>);
1437
+ };
1438
+ export default SettingsPanel;