react-native-inapp-inspector 2.3.19 → 2.3.21

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 (353) hide show
  1. package/README.md +14 -14
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +67 -0
  3. package/dist/commonjs/analytics.js +1 -24
  4. package/dist/commonjs/bundle.js +1 -16
  5. package/dist/commonjs/capture.js +1 -35
  6. package/dist/commonjs/components/AnalyticsDetail.js +92 -623
  7. package/dist/commonjs/components/AnalyticsEventCard.js +54 -350
  8. package/dist/commonjs/components/AnalyticsGraph.js +70 -370
  9. package/dist/commonjs/components/AnimatedEntrance.js +1 -11
  10. package/dist/commonjs/components/AppHeaderLogo.js +7 -134
  11. package/dist/commonjs/components/BrandCircleIcon.js +73 -118
  12. package/dist/commonjs/components/BrandSquareIcon.js +63 -108
  13. package/dist/commonjs/components/CodeSnippet.js +48 -623
  14. package/dist/commonjs/components/ConsoleLogCard.js +63 -537
  15. package/dist/commonjs/components/CopyButton.js +3 -89
  16. package/dist/commonjs/components/DiffViewer.js +19 -83
  17. package/dist/commonjs/components/DomainHeader.js +27 -127
  18. package/dist/commonjs/components/EmptyState.js +10 -87
  19. package/dist/commonjs/components/EndOfListFooter.js +7 -81
  20. package/dist/commonjs/components/ErrorBoundary.js +72 -566
  21. package/dist/commonjs/components/HeadersSection.js +31 -110
  22. package/dist/commonjs/components/HighlightText.js +17 -58
  23. package/dist/commonjs/components/Inspector/AboutModal.d.ts +6 -0
  24. package/dist/commonjs/components/Inspector/AboutModal.js +243 -0
  25. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +98 -797
  26. package/dist/commonjs/components/Inspector/AnalyticsTab.js +284 -930
  27. package/dist/commonjs/components/Inspector/BundleTab.js +551 -2918
  28. package/dist/commonjs/components/Inspector/ConsoleTab.js +79 -492
  29. package/dist/commonjs/components/Inspector/CrashDetail.js +123 -672
  30. package/dist/commonjs/components/Inspector/CrashFilterModal.js +66 -498
  31. package/dist/commonjs/components/Inspector/CrashTab.js +98 -670
  32. package/dist/commonjs/components/Inspector/DebuggingTab.js +74 -875
  33. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +143 -907
  34. package/dist/commonjs/components/Inspector/FabLauncher.js +42 -466
  35. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +6 -99
  36. package/dist/commonjs/components/Inspector/InspectorContext.js +1 -21
  37. package/dist/commonjs/components/Inspector/InspectorHeader.js +191 -1110
  38. package/dist/commonjs/components/Inspector/LogDetail.js +168 -994
  39. package/dist/commonjs/components/Inspector/MainScreen.js +52 -335
  40. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +97 -644
  41. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +90 -605
  42. package/dist/commonjs/components/Inspector/NavigationTracker.js +1 -12
  43. package/dist/commonjs/components/Inspector/NetworkDetail.js +89 -411
  44. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +60 -576
  45. package/dist/commonjs/components/Inspector/NetworkTab.js +84 -514
  46. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +18 -434
  47. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +25 -298
  48. package/dist/commonjs/components/Inspector/PerformanceTab.js +182 -1397
  49. package/dist/commonjs/components/Inspector/ReduxDetail.js +188 -1089
  50. package/dist/commonjs/components/Inspector/ReduxTab.js +85 -701
  51. package/dist/commonjs/components/Inspector/SettingsPanel.js +427 -3807
  52. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +11 -180
  53. package/dist/commonjs/components/Inspector/StorageTab.js +93 -826
  54. package/dist/commonjs/components/Inspector/TabBar.js +36 -334
  55. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +37 -412
  56. package/dist/commonjs/components/JsonViewer.js +168 -381
  57. package/dist/commonjs/components/LogCard.js +57 -567
  58. package/dist/commonjs/components/LogSyntaxHighlighter.js +11 -130
  59. package/dist/commonjs/components/MetaAccordion.js +69 -238
  60. package/dist/commonjs/components/MiniBarChart.js +3 -56
  61. package/dist/commonjs/components/MiniLineChart.js +3 -58
  62. package/dist/commonjs/components/NetworkIcons.d.ts +13 -0
  63. package/dist/commonjs/components/NetworkIcons.js +521 -1022
  64. package/dist/commonjs/components/QRCodeView.js +5 -79
  65. package/dist/commonjs/components/SectionHeader.js +15 -37
  66. package/dist/commonjs/components/SegmentedTabs.js +7 -62
  67. package/dist/commonjs/components/SkeletonPlaceholder.js +11 -180
  68. package/dist/commonjs/components/Slider.js +15 -243
  69. package/dist/commonjs/components/SourcePageCard.js +30 -89
  70. package/dist/commonjs/components/Toast.js +5 -147
  71. package/dist/commonjs/components/TouchableScale.js +3 -24
  72. package/dist/commonjs/components/TreeNode.js +55 -130
  73. package/dist/commonjs/console.js +1 -16
  74. package/dist/commonjs/constants/index.js +1 -32
  75. package/dist/commonjs/constants/telemetryConfig.js +1 -6
  76. package/dist/commonjs/constants/version.d.ts +1 -1
  77. package/dist/commonjs/constants/version.js +1 -4
  78. package/dist/commonjs/crash.js +1 -23
  79. package/dist/commonjs/customHooks/analyticsLogger.js +1 -250
  80. package/dist/commonjs/customHooks/bundleAnalyzer.js +1 -957
  81. package/dist/commonjs/customHooks/consoleLogger.js +6 -445
  82. package/dist/commonjs/customHooks/crashHandler.js +7 -656
  83. package/dist/commonjs/customHooks/logFilters.js +1 -23
  84. package/dist/commonjs/customHooks/networkLogger.js +2 -536
  85. package/dist/commonjs/customHooks/performanceTracker.js +63 -750
  86. package/dist/commonjs/customHooks/reduxLogger.js +2 -313
  87. package/dist/commonjs/customHooks/storageInspector.js +1 -435
  88. package/dist/commonjs/customHooks/useAccordion.js +1 -18
  89. package/dist/commonjs/decorators/index.js +1 -100
  90. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +1 -148
  91. package/dist/commonjs/helpers/index.d.ts +1 -0
  92. package/dist/commonjs/helpers/index.js +8 -921
  93. package/dist/commonjs/helpers/memoryManager.js +1 -99
  94. package/dist/commonjs/helpers/qrGenerator.js +1 -367
  95. package/dist/commonjs/helpers/remoteConfig.js +1 -165
  96. package/dist/commonjs/helpers/searchQueryParser.js +1 -62
  97. package/dist/commonjs/helpers/settingsStore.js +1 -144
  98. package/dist/commonjs/helpers/telemetry.js +1 -501
  99. package/dist/commonjs/helpers/toast.js +1 -20
  100. package/dist/commonjs/i18n/index.js +1 -90
  101. package/dist/commonjs/i18n/locales/en.json +1 -1140
  102. package/dist/commonjs/index.js +5 -2168
  103. package/dist/commonjs/metro.js +6 -468
  104. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  105. package/dist/commonjs/native/NativeInspector.js +1 -415
  106. package/dist/commonjs/native/NativeNetworkInspector.js +1 -4
  107. package/dist/commonjs/network.js +1 -13
  108. package/dist/commonjs/performance.js +1 -29
  109. package/dist/commonjs/redux.js +1 -20
  110. package/dist/commonjs/storage.js +1 -14
  111. package/dist/commonjs/styles/AppColors.js +1 -423
  112. package/dist/commonjs/styles/AppFonts.js +1 -17
  113. package/dist/commonjs/styles/common.js +1 -190
  114. package/dist/commonjs/styles/index.d.ts +6 -0
  115. package/dist/commonjs/styles/index.js +1 -1589
  116. package/dist/commonjs/types/enums.d.ts +0 -1
  117. package/dist/commonjs/types/enums.js +1 -152
  118. package/dist/commonjs/types/index.js +1 -18
  119. package/dist/commonjs/types/interfaces.d.ts +2 -2
  120. package/dist/commonjs/types/interfaces.js +1 -2
  121. package/dist/esm/analytics.js +1 -2
  122. package/dist/esm/bundle.js +1 -2
  123. package/dist/esm/capture.js +1 -32
  124. package/dist/esm/components/AnalyticsDetail.js +171 -664
  125. package/dist/esm/components/AnalyticsEventCard.js +77 -335
  126. package/dist/esm/components/AnalyticsGraph.js +95 -357
  127. package/dist/esm/components/AnimatedEntrance.js +1 -6
  128. package/dist/esm/components/AppHeaderLogo.js +7 -94
  129. package/dist/esm/components/BrandCircleIcon.js +114 -119
  130. package/dist/esm/components/BrandSquareIcon.js +73 -78
  131. package/dist/esm/components/CodeSnippet.js +58 -595
  132. package/dist/esm/components/ConsoleLogCard.js +91 -526
  133. package/dist/esm/components/CopyButton.js +3 -51
  134. package/dist/esm/components/DiffViewer.js +22 -48
  135. package/dist/esm/components/DomainHeader.js +43 -138
  136. package/dist/esm/components/EmptyState.js +17 -56
  137. package/dist/esm/components/EndOfListFooter.js +15 -83
  138. package/dist/esm/components/ErrorBoundary.js +125 -582
  139. package/dist/esm/components/HeadersSection.js +52 -93
  140. package/dist/esm/components/HighlightText.js +17 -53
  141. package/dist/esm/components/Inspector/AboutModal.d.ts +6 -0
  142. package/dist/esm/components/Inspector/AboutModal.js +243 -0
  143. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +225 -886
  144. package/dist/esm/components/Inspector/AnalyticsTab.js +296 -904
  145. package/dist/esm/components/Inspector/BundleTab.js +1175 -3502
  146. package/dist/esm/components/Inspector/ConsoleTab.js +113 -488
  147. package/dist/esm/components/Inspector/CrashDetail.js +236 -747
  148. package/dist/esm/components/Inspector/CrashFilterModal.js +149 -541
  149. package/dist/esm/components/Inspector/CrashTab.js +177 -711
  150. package/dist/esm/components/Inspector/DebuggingTab.js +164 -925
  151. package/dist/esm/components/Inspector/DeviceInfoTab.js +199 -924
  152. package/dist/esm/components/Inspector/FabLauncher.js +68 -454
  153. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +14 -70
  154. package/dist/esm/components/Inspector/InspectorContext.js +1 -12
  155. package/dist/esm/components/Inspector/InspectorHeader.js +282 -1163
  156. package/dist/esm/components/Inspector/LogDetail.js +235 -1023
  157. package/dist/esm/components/Inspector/MainScreen.js +78 -323
  158. package/dist/esm/components/Inspector/MediaGalleryTab.js +143 -650
  159. package/dist/esm/components/Inspector/MediaPreviewModal.js +138 -613
  160. package/dist/esm/components/Inspector/NavigationTracker.js +1 -10
  161. package/dist/esm/components/Inspector/NetworkDetail.js +138 -455
  162. package/dist/esm/components/Inspector/NetworkFilterModal.js +122 -597
  163. package/dist/esm/components/Inspector/NetworkTab.js +125 -517
  164. package/dist/esm/components/Inspector/NpmStarPrompt.js +58 -434
  165. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -281
  166. package/dist/esm/components/Inspector/PerformanceTab.js +393 -1570
  167. package/dist/esm/components/Inspector/ReduxDetail.js +307 -1170
  168. package/dist/esm/components/Inspector/ReduxTab.js +144 -722
  169. package/dist/esm/components/Inspector/SettingsPanel.js +643 -3985
  170. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +30 -163
  171. package/dist/esm/components/Inspector/StorageTab.js +172 -866
  172. package/dist/esm/components/Inspector/TabBar.js +45 -305
  173. package/dist/esm/components/Inspector/UpdateAvailableModal.js +80 -418
  174. package/dist/esm/components/JsonViewer.js +179 -354
  175. package/dist/esm/components/LogCard.js +93 -565
  176. package/dist/esm/components/LogSyntaxHighlighter.js +11 -123
  177. package/dist/esm/components/MetaAccordion.js +136 -267
  178. package/dist/esm/components/MiniBarChart.js +3 -18
  179. package/dist/esm/components/MiniLineChart.js +3 -20
  180. package/dist/esm/components/NetworkIcons.d.ts +13 -0
  181. package/dist/esm/components/NetworkIcons.js +523 -838
  182. package/dist/esm/components/QRCodeView.js +8 -45
  183. package/dist/esm/components/SectionHeader.js +22 -39
  184. package/dist/esm/components/SegmentedTabs.js +8 -58
  185. package/dist/esm/components/SkeletonPlaceholder.js +30 -163
  186. package/dist/esm/components/Slider.js +24 -213
  187. package/dist/esm/components/SourcePageCard.js +65 -86
  188. package/dist/esm/components/Toast.js +10 -117
  189. package/dist/esm/components/TouchableScale.js +3 -19
  190. package/dist/esm/components/TreeNode.js +58 -95
  191. package/dist/esm/console.js +1 -2
  192. package/dist/esm/constants/index.js +1 -28
  193. package/dist/esm/constants/telemetryConfig.js +1 -3
  194. package/dist/esm/constants/version.d.ts +1 -1
  195. package/dist/esm/constants/version.js +1 -1
  196. package/dist/esm/crash.js +1 -2
  197. package/dist/esm/customHooks/analyticsLogger.js +1 -230
  198. package/dist/esm/customHooks/bundleAnalyzer.js +1 -944
  199. package/dist/esm/customHooks/consoleLogger.js +6 -432
  200. package/dist/esm/customHooks/crashHandler.js +7 -630
  201. package/dist/esm/customHooks/logFilters.js +1 -20
  202. package/dist/esm/customHooks/networkLogger.js +2 -519
  203. package/dist/esm/customHooks/performanceTracker.js +63 -723
  204. package/dist/esm/customHooks/reduxLogger.js +2 -293
  205. package/dist/esm/customHooks/storageInspector.js +1 -418
  206. package/dist/esm/customHooks/useAccordion.js +1 -16
  207. package/dist/esm/decorators/index.js +1 -95
  208. package/dist/esm/helpers/gaAnalyticsRegistry.js +1 -143
  209. package/dist/esm/helpers/index.d.ts +1 -0
  210. package/dist/esm/helpers/index.js +8 -861
  211. package/dist/esm/helpers/memoryManager.js +1 -91
  212. package/dist/esm/helpers/qrGenerator.js +1 -364
  213. package/dist/esm/helpers/remoteConfig.js +1 -160
  214. package/dist/esm/helpers/searchQueryParser.js +1 -59
  215. package/dist/esm/helpers/settingsStore.js +1 -134
  216. package/dist/esm/helpers/telemetry.js +1 -489
  217. package/dist/esm/helpers/toast.js +1 -15
  218. package/dist/esm/i18n/index.js +1 -78
  219. package/dist/esm/i18n/locales/en.json +1 -1140
  220. package/dist/esm/index.js +7 -1982
  221. package/dist/esm/metro.js +6 -459
  222. package/dist/esm/native/NativeInspector.d.ts +1 -0
  223. package/dist/esm/native/NativeInspector.js +1 -382
  224. package/dist/esm/native/NativeNetworkInspector.js +1 -2
  225. package/dist/esm/network.js +1 -1
  226. package/dist/esm/performance.js +1 -2
  227. package/dist/esm/redux.js +1 -1
  228. package/dist/esm/storage.js +1 -1
  229. package/dist/esm/styles/AppColors.js +1 -417
  230. package/dist/esm/styles/AppFonts.js +1 -13
  231. package/dist/esm/styles/common.js +1 -186
  232. package/dist/esm/styles/index.d.ts +6 -0
  233. package/dist/esm/styles/index.js +1 -1551
  234. package/dist/esm/types/enums.d.ts +0 -1
  235. package/dist/esm/types/enums.js +1 -149
  236. package/dist/esm/types/index.js +1 -2
  237. package/dist/esm/types/interfaces.d.ts +2 -2
  238. package/dist/esm/types/interfaces.js +1 -1
  239. package/ios/NetworkInspectorModule.mm +60 -12
  240. package/package.json +5 -3
  241. package/src/native/NativeInspector.ts +18 -0
  242. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +0 -7
  243. package/dist/commonjs/components/Inspector/FeedbackModal.js +0 -552
  244. package/dist/esm/components/Inspector/FeedbackModal.d.ts +0 -7
  245. package/dist/esm/components/Inspector/FeedbackModal.js +0 -515
  246. package/src/analytics.ts +0 -35
  247. package/src/bundle.ts +0 -25
  248. package/src/capture.ts +0 -109
  249. package/src/components/AnalyticsDetail.tsx +0 -870
  250. package/src/components/AnalyticsEventCard.tsx +0 -444
  251. package/src/components/AnalyticsGraph.tsx +0 -583
  252. package/src/components/AnimatedEntrance.tsx +0 -20
  253. package/src/components/AppHeaderLogo.tsx +0 -143
  254. package/src/components/BrandCircleIcon.tsx +0 -144
  255. package/src/components/BrandSquareIcon.tsx +0 -184
  256. package/src/components/CodeSnippet.tsx +0 -725
  257. package/src/components/ConsoleLogCard.tsx +0 -679
  258. package/src/components/CopyButton.tsx +0 -87
  259. package/src/components/DiffViewer.tsx +0 -82
  260. package/src/components/DomainHeader.tsx +0 -224
  261. package/src/components/EmptyState.tsx +0 -97
  262. package/src/components/EndOfListFooter.tsx +0 -100
  263. package/src/components/ErrorBoundary.tsx +0 -688
  264. package/src/components/HeadersSection.tsx +0 -172
  265. package/src/components/HighlightText.tsx +0 -100
  266. package/src/components/Inspector/AnalyticsFilterModal.tsx +0 -1250
  267. package/src/components/Inspector/AnalyticsTab.tsx +0 -1362
  268. package/src/components/Inspector/BundleTab.tsx +0 -4768
  269. package/src/components/Inspector/ConsoleTab.tsx +0 -726
  270. package/src/components/Inspector/CrashDetail.tsx +0 -997
  271. package/src/components/Inspector/CrashFilterModal.tsx +0 -721
  272. package/src/components/Inspector/CrashTab.tsx +0 -933
  273. package/src/components/Inspector/DebuggingTab.tsx +0 -1103
  274. package/src/components/Inspector/DeviceInfoTab.tsx +0 -1397
  275. package/src/components/Inspector/FabLauncher.tsx +0 -590
  276. package/src/components/Inspector/FeatureUnderDevNotice.tsx +0 -94
  277. package/src/components/Inspector/FeedbackModal.tsx +0 -626
  278. package/src/components/Inspector/InspectorContext.tsx +0 -28
  279. package/src/components/Inspector/InspectorHeader.tsx +0 -1583
  280. package/src/components/Inspector/LogDetail.tsx +0 -1431
  281. package/src/components/Inspector/MainScreen.tsx +0 -460
  282. package/src/components/Inspector/MediaGalleryTab.tsx +0 -829
  283. package/src/components/Inspector/MediaPreviewModal.tsx +0 -783
  284. package/src/components/Inspector/NavigationTracker.tsx +0 -13
  285. package/src/components/Inspector/NetworkDetail.tsx +0 -778
  286. package/src/components/Inspector/NetworkFilterModal.tsx +0 -730
  287. package/src/components/Inspector/NetworkTab.tsx +0 -820
  288. package/src/components/Inspector/NpmStarPrompt.tsx +0 -532
  289. package/src/components/Inspector/NpmUpdateToast.tsx +0 -387
  290. package/src/components/Inspector/PerformanceTab.tsx +0 -1967
  291. package/src/components/Inspector/ReduxDetail.tsx +0 -1651
  292. package/src/components/Inspector/ReduxTab.tsx +0 -987
  293. package/src/components/Inspector/SettingsPanel.tsx +0 -5136
  294. package/src/components/Inspector/SkeletonPlaceholder.tsx +0 -206
  295. package/src/components/Inspector/StorageTab.tsx +0 -1159
  296. package/src/components/Inspector/TabBar.tsx +0 -431
  297. package/src/components/Inspector/UpdateAvailableModal.tsx +0 -555
  298. package/src/components/JsonViewer.tsx +0 -549
  299. package/src/components/LogCard.tsx +0 -694
  300. package/src/components/LogSyntaxHighlighter.tsx +0 -178
  301. package/src/components/MetaAccordion.tsx +0 -355
  302. package/src/components/MiniBarChart.tsx +0 -42
  303. package/src/components/MiniLineChart.tsx +0 -33
  304. package/src/components/NetworkIcons.tsx +0 -2655
  305. package/src/components/QRCodeView.tsx +0 -75
  306. package/src/components/SectionHeader.tsx +0 -101
  307. package/src/components/SegmentedTabs.tsx +0 -84
  308. package/src/components/SkeletonPlaceholder.tsx +0 -206
  309. package/src/components/Slider.tsx +0 -300
  310. package/src/components/SourcePageCard.tsx +0 -150
  311. package/src/components/Toast.tsx +0 -131
  312. package/src/components/TouchableScale.tsx +0 -61
  313. package/src/components/TreeNode.tsx +0 -171
  314. package/src/console.ts +0 -24
  315. package/src/constants/index.ts +0 -41
  316. package/src/constants/telemetryConfig.ts +0 -4
  317. package/src/constants/version.ts +0 -3
  318. package/src/crash.ts +0 -32
  319. package/src/customHooks/analyticsLogger.ts +0 -336
  320. package/src/customHooks/bundleAnalyzer.ts +0 -1256
  321. package/src/customHooks/consoleLogger.ts +0 -530
  322. package/src/customHooks/crashHandler.ts +0 -944
  323. package/src/customHooks/logFilters.ts +0 -32
  324. package/src/customHooks/networkLogger.ts +0 -624
  325. package/src/customHooks/performanceTracker.ts +0 -1014
  326. package/src/customHooks/reduxLogger.ts +0 -406
  327. package/src/customHooks/storageInspector.ts +0 -513
  328. package/src/customHooks/useAccordion.tsx +0 -27
  329. package/src/decorators/index.ts +0 -184
  330. package/src/helpers/gaAnalyticsRegistry.ts +0 -204
  331. package/src/helpers/index.ts +0 -1092
  332. package/src/helpers/memoryManager.ts +0 -138
  333. package/src/helpers/qrGenerator.ts +0 -430
  334. package/src/helpers/remoteConfig.ts +0 -212
  335. package/src/helpers/searchQueryParser.ts +0 -84
  336. package/src/helpers/settingsStore.ts +0 -171
  337. package/src/helpers/telemetry.ts +0 -568
  338. package/src/helpers/toast.ts +0 -17
  339. package/src/i18n/index.ts +0 -104
  340. package/src/i18n/locales/en.json +0 -1141
  341. package/src/index.tsx +0 -2650
  342. package/src/metro.ts +0 -598
  343. package/src/network.ts +0 -22
  344. package/src/performance.ts +0 -38
  345. package/src/redux.ts +0 -23
  346. package/src/storage.ts +0 -18
  347. package/src/styles/AppColors.ts +0 -455
  348. package/src/styles/AppFonts.ts +0 -26
  349. package/src/styles/common.ts +0 -209
  350. package/src/styles/index.ts +0 -1606
  351. package/src/types/enums.ts +0 -210
  352. package/src/types/index.ts +0 -34
  353. package/src/types/interfaces.ts +0 -535
@@ -1,4068 +1,726 @@
1
- import React, { useMemo, useState, useEffect, useRef } from 'react';
2
- import { Alert, Animated, DevSettings, Dimensions, Linking, PixelRatio, Platform, ScrollView, StatusBar, StyleSheet, Text, TextInput, View, } from 'react-native';
3
- import Svg, { Path } from 'react-native-svg';
4
- import { animateNextLayout, useInspector } from './InspectorContext';
5
- import TouchableScale from '../TouchableScale';
6
- import Slider from '../Slider';
7
- import { toggleGlobalTheme } from '../../styles';
8
- import { AppColors } from '../../styles/AppColors';
9
- import { AppFonts } from '../../styles/AppFonts';
10
- import { isPersistentStorageAvailable, calculateRamBasedLimits, } from '../../helpers/settingsStore';
11
- import { clearNetworkLogs } from '../../customHooks/networkLogger';
12
- import { clearConsoleLogs } from '../../customHooks/consoleLogger';
13
- import { clearAnalyticsEvents } from '../../customHooks/analyticsLogger';
14
- import { clearCrashRecords } from '../../customHooks/crashHandler';
15
- import { clearCachedBundleAnalysis } from '../../customHooks/bundleAnalyzer';
16
- import { clearPerformanceEvents } from '../../customHooks/performanceTracker';
17
- import { isReduxConnected } from '../../customHooks/reduxLogger';
18
- import { isAnalyticsConnected } from '../../customHooks/analyticsLogger';
19
- import { useTranslation } from '../../i18n';
20
- import { SignalIcon, TerminalIcon, AnalyticsIcon, SettingsIcon, SunIcon, MoonIcon, ScreenIcon, MotionIcon, LayersIcon, EyeIcon, CheckIcon, TrashIcon, PackageIcon, ReduxIcon, PerformanceIcon, CrashIcon, ShieldAlertIcon, ForwardChevronIcon, ChevronDownIcon, NpmIcon, BoltIcon, BrainIcon, SmartphoneIcon, DatabaseIcon, QrCodeIcon, GitHubIcon, InfoCircleIcon, CopyIcon, FilmIcon, ScreencastIcon, CameraIcon, VideoCameraIcon, MicrophoneIcon, GifIcon, ImageIcon, } from '../NetworkIcons';
21
- import { ScreenCapture } from '../../capture';
22
- import { LIB_VERSION } from '../../constants';
23
- import { copyToClipboard, isLocalDebugEnvironment, getAppName, getBundleIdentifier, getAppVersionAndBuild, } from '../../helpers';
24
- import { showToast } from '../../helpers/toast';
25
- import { pruneAllLogs } from '../../helpers/memoryManager';
26
- const SettingsPanel = () => {
27
- const { t } = useTranslation();
28
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, closeModal, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, updateAvailable, latestNpmVersion, } = useInspector();
29
- const [stagedHeight, setStagedHeight] = useState(modalHeightPercent);
30
- useEffect(() => {
31
- setStagedHeight(modalHeightPercent);
32
- }, [modalHeightPercent]);
33
- const autoRamProfile = calculateRamBasedLimits(deviceFreeRamMb);
34
- const isPersistent = isPersistentStorageAvailable();
35
- const statusBarHeight = Platform.OS === 'android' ? StatusBar.currentHeight || 24 : 44;
36
- const headerTopPadding = modalHeightPercent >= 95 ? statusBarHeight : 0;
37
- const allModules = useMemo(() => [
38
- {
39
- id: 1,
40
- key: 'apis',
41
- label: 'APIs (Network)',
42
- category: 'core',
43
- icon: 'apis',
44
- desc: 'HTTP/HTTPS requests, GraphQL, Axios & WebSocket inspector',
45
- },
46
- {
47
- id: 2,
48
- key: 'logs',
49
- label: 'Console Logs',
50
- category: 'core',
51
- icon: 'logs',
52
- desc: 'Terminal console logs, warnings, errors & stack traces',
53
- },
54
- {
55
- id: 3,
56
- key: 'analytics',
57
- label: 'Analytics Logger',
58
- category: 'telemetry',
59
- icon: 'analytics',
60
- desc: 'Firebase & custom analytics events, user properties & params',
61
- },
62
- {
63
- id: 4,
64
- key: 'redux',
65
- label: 'Redux Inspector',
66
- category: 'telemetry',
67
- icon: 'redux',
68
- desc: 'Store state diffing, action history & reducer timeline',
69
- },
70
- {
71
- id: 5,
72
- key: 'storage',
73
- label: 'Storage Inspector',
74
- category: 'telemetry',
75
- icon: 'storage',
76
- desc: 'AsyncStorage & MMKV key-value store viewer with full CRUD support',
77
- },
78
- {
79
- id: 6,
80
- key: 'device',
81
- label: 'Device Info',
82
- category: 'diagnostic',
83
- icon: 'device',
84
- desc: 'Hardware specs, IP address, screen metrics, UDID & runtime stats',
85
- },
86
- {
87
- id: 7,
88
- key: 'crash',
89
- label: 'Crash Protection',
90
- category: 'diagnostic',
91
- icon: 'crash',
92
- desc: 'Runtime exception guard, breadcrumbs & memory snapshot',
93
- },
94
- {
95
- id: 8,
96
- key: 'bundle',
97
- label: 'Bundle Analyzer',
98
- category: 'diagnostic',
99
- icon: 'bundle',
100
- desc: 'Metro packager dependencies, source maps & asset breakdown',
101
- },
102
- {
103
- id: 9,
104
- key: 'performance',
105
- label: 'Performance & Tracker',
106
- category: 'diagnostic',
107
- icon: 'performance',
108
- desc: '60 FPS monitor, Hermes memory telemetry & re-render profiler',
109
- },
110
- {
111
- id: 10,
112
- key: 'debugging',
113
- label: 'Multi-Device Debugging',
114
- category: 'diagnostic',
115
- icon: 'debugging',
116
- desc: 'QR Code bridge for direct Debug APK download & Metro live-reload sync',
117
- },
118
- {
119
- id: 11,
120
- key: 'media',
121
- label: 'Screencast',
122
- category: 'diagnostic',
123
- icon: 'media',
124
- desc: 'Screenshots, video recordings, audio narration & animated GIFs',
125
- },
126
- ].filter(m => m.key === 'debugging'
127
- ? Platform.OS === 'android' && isLocalDebugEnvironment()
128
- : true), []);
129
- const [stagedTabVisibility, setStagedTabVisibility] = useState(() => ({
130
- apis: true,
131
- logs: Boolean(tabVisibility?.logs),
132
- analytics: Boolean(tabVisibility?.analytics),
133
- redux: Boolean(tabVisibility?.redux),
134
- storage: Boolean(tabVisibility?.storage),
135
- device: Boolean(tabVisibility?.device),
136
- crash: Boolean(tabVisibility?.crash),
137
- bundle: Boolean(tabVisibility?.bundle),
138
- performance: Boolean(tabVisibility?.performance),
139
- debugging: Boolean(tabVisibility?.debugging),
140
- media: Boolean(tabVisibility?.media ?? true),
141
- }));
142
- useEffect(() => {
143
- setStagedTabVisibility({
144
- apis: true,
145
- logs: Boolean(tabVisibility?.logs),
146
- analytics: Boolean(tabVisibility?.analytics),
147
- redux: Boolean(tabVisibility?.redux),
148
- storage: Boolean(tabVisibility?.storage),
149
- device: Boolean(tabVisibility?.device),
150
- crash: Boolean(tabVisibility?.crash),
151
- bundle: Boolean(tabVisibility?.bundle),
152
- performance: Boolean(tabVisibility?.performance),
153
- debugging: Boolean(tabVisibility?.debugging),
154
- media: Boolean(tabVisibility?.media ?? true),
155
- });
156
- }, [tabVisibility]);
157
- const hasUnsavedChanges = useMemo(() => {
158
- return allModules.some(m => Boolean(stagedTabVisibility[m.key]) !==
159
- Boolean(tabVisibility?.[m.key]));
160
- }, [stagedTabVisibility, tabVisibility, allModules]);
161
- const stagedActiveCount = allModules.filter(m => m.key === 'apis' || Boolean(stagedTabVisibility[m.key])).length;
162
- const handleSaveChanges = () => {
163
- if (!hasUnsavedChanges)
164
- return;
165
- Alert.alert('Apply Changes & Reload', 'Are you sure you want to save module changes? The inspector will close and reload the app to apply the new configuration.', [
166
- {
167
- text: 'Cancel',
168
- style: 'cancel',
169
- onPress: () => {
170
- setStagedTabVisibility({
171
- apis: true,
172
- logs: Boolean(tabVisibility?.logs),
173
- analytics: Boolean(tabVisibility?.analytics),
174
- redux: Boolean(tabVisibility?.redux),
175
- storage: Boolean(tabVisibility?.storage),
176
- device: Boolean(tabVisibility?.device),
177
- crash: Boolean(tabVisibility?.crash),
178
- bundle: Boolean(tabVisibility?.bundle),
179
- performance: Boolean(tabVisibility?.performance),
180
- debugging: Boolean(tabVisibility?.debugging),
181
- media: Boolean(tabVisibility?.media ?? true),
182
- });
183
- },
184
- },
185
- {
186
- text: 'Save & Reload',
187
- style: 'default',
188
- onPress: () => {
189
- animateNextLayout();
190
- allModules.forEach(m => {
191
- if (m.key !== 'apis') {
192
- const isStagedOn = Boolean(stagedTabVisibility[m.key]);
193
- const isCurrentOn = Boolean(tabVisibility?.[m.key]);
194
- if (isStagedOn !== isCurrentOn) {
195
- toggleTabVisibility(m.key);
196
- }
197
- }
198
- });
199
- closeModal();
200
- setTimeout(() => {
201
- if (__DEV__ && DevSettings && DevSettings.reload) {
202
- DevSettings.reload();
203
- }
204
- }, 350);
205
- },
206
- },
207
- ]);
208
- };
209
- const [isDefaultTabDropdownOpen, setIsDefaultTabDropdownOpen] = useState(false);
210
- const goBackToMain = () => {
211
- animateNextLayout();
212
- setSettingsPage('main');
213
- };
214
- const renderSettingRow = (opts) => {
215
- return (<View style={{
216
- paddingVertical: 12,
217
- borderBottomWidth: opts.isLast ? 0 : 1,
218
- borderBottomColor: AppColors.dividerColor,
219
- }}>
220
- <TouchableScale disabled={!opts.onPress} onPress={opts.onPress} style={{
221
- flexDirection: 'row',
222
- alignItems: 'center',
223
- gap: 12,
224
- }}>
225
- <View style={{
226
- width: 36,
227
- height: 36,
228
- borderRadius: 10,
229
- backgroundColor: AppColors.purpleShade50,
230
- borderWidth: 1,
231
- borderColor: `${AppColors.purple}2E`,
232
- alignItems: 'center',
233
- justifyContent: 'center',
234
- }}>
235
- {opts.icon}
236
- </View>
237
- <View style={{ flex: 1 }}>
238
- <Text style={{
239
- fontFamily: AppFonts.interBold,
240
- fontSize: 14,
241
- lineHeight: 18,
242
- color: AppColors.primaryBlack,
243
- }}>
244
- {opts.label}
245
- </Text>
246
- {opts.description ? (<Text style={{
247
- fontFamily: AppFonts.interRegular,
248
- fontSize: 11,
249
- lineHeight: 15,
250
- color: AppColors.grayText,
251
- marginTop: 1,
252
- }}>
253
- {opts.description}
254
- </Text>) : null}
255
- </View>
256
- {opts.right || null}
257
- </TouchableScale>
258
- {opts.numericInput && (<View style={{ marginTop: 10, gap: 6 }}>
259
- <View style={{
260
- flexDirection: 'row',
261
- alignItems: 'center',
262
- backgroundColor: AppColors.grayBackground,
263
- borderRadius: 8,
264
- borderWidth: 1,
265
- borderColor: AppColors.dividerColor,
266
- paddingHorizontal: 12,
267
- paddingVertical: 4,
268
- }}>
269
- <TextInput style={{
270
- flex: 1,
271
- fontFamily: AppFonts.interMedium,
272
- fontSize: 14,
273
- lineHeight: 18,
274
- color: AppColors.primaryBlack,
275
- paddingVertical: 6,
276
- }} value={String(opts.numericInput.value || '')} onChangeText={text => {
277
- const num = parseInt(text.replace(/[^0-9]/g, ''), 10);
278
- if (!isNaN(num)) {
279
- const clamped = Math.max(opts.numericInput?.min ?? 1, Math.min(opts.numericInput?.max ?? 10000, num));
280
- opts.numericInput?.onChange(clamped);
281
- }
282
- }} keyboardType={opts.numericInput.keyboardType ?? 'number-pad'} placeholder={opts.numericInput.placeholder} placeholderTextColor={AppColors.grayTextWeak} maxLength={6} selectTextOnFocus/>
283
- <Text style={{
284
- fontFamily: AppFonts.interBold,
285
- fontSize: 11,
286
- color: AppColors.purple,
287
- marginLeft: 6,
288
- }}>
1
+ import{useMemo as er,useState as $e,useEffect as Me,useRef as lo}from"react";import{Alert as W,Animated as Ee,DevSettings as Oe,Platform as je,ScrollView as A,StatusBar as ao,StyleSheet as rr,Text as S,TextInput as Co,View as C}from"react-native";import So,{Path as Cr}from"react-native-svg";import{animateNextLayout as Q,useInspector as To}from"./InspectorContext";import H from"../TouchableScale";import Vo from"../Slider";import{toggleGlobalTheme as Bo}from"../../styles";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as k}from"../../styles/AppFonts";import{isPersistentStorageAvailable as zo,calculateRamBasedLimits as Ro}from"../../helpers/settingsStore";import{clearNetworkLogs as vo}from"../../customHooks/networkLogger";import{clearConsoleLogs as Ho}from"../../customHooks/consoleLogger";import{clearAnalyticsEvents as Do}from"../../customHooks/analyticsLogger";import{clearCrashRecords as Lo}from"../../customHooks/crashHandler";import{clearCachedBundleAnalysis as Io}from"../../customHooks/bundleAnalyzer";import{clearPerformanceEvents as Fo}from"../../customHooks/performanceTracker";import{isReduxConnected as Wo}from"../../customHooks/reduxLogger";import{isAnalyticsConnected as Ao}from"../../customHooks/analyticsLogger";import{useTranslation as Po}from"../../i18n";import{SignalIcon as Z,TerminalIcon as Ne,AnalyticsIcon as Ge,SettingsIcon as $o,SunIcon as Mo,MoonIcon as Eo,ScreenIcon as Sr,MotionIcon as Oo,LayersIcon as Ce,EyeIcon as Tr,CheckIcon as N,TrashIcon as P,PackageIcon as Se,ReduxIcon as Ue,PerformanceIcon as Je,CrashIcon as Vr,ShieldAlertIcon as Br,ForwardChevronIcon as No,ChevronDownIcon as Go,BrainIcon as Rr,SmartphoneIcon as Uo,DatabaseIcon as Jo,QrCodeIcon as _o,FilmIcon as Ko,ScreencastIcon as Qo,CameraIcon as Hr,VideoCameraIcon as Xo,MicrophoneIcon as Yo,GifIcon as Zo,ImageIcon as Ct}from"../NetworkIcons";import{ScreenCapture as xt}from"../../capture";import{isLocalDebugEnvironment as kt}from"../../helpers";import{showToast as Dr}from"../../helpers/toast";import{pruneAllLogs as St}from"../../helpers/memoryManager";const Tt=()=>{const{t:x}=Po(),{settingsPage:F,setSettingsPage:Te,settingsActiveSubTab:G,setSettingsActiveSubTab:Lr,tabVisibility:T,toggleTabVisibility:Ir,defaultTab:U,setDefaultTab:Fr,isDark:J,setIsDark:Wr,modalHeightPercent:_,setModalHeightPercent:Ar,modalAnimationType:Pr,setModalAnimationType:$r,showDuplicateLogs:Ve,setShowDuplicateLogs:Mr,showUpdateToast:Be,setShowUpdateToast:Er,showConsoleLevels:Or,setShowConsoleLevels:jr,resetToDefaults:Vt,closeModal:Nr,storage:Bt,logs:ze,consoleLogs:Re,analyticsEvents:ve,reduxState:He,maxNetworkLogs:De,setMaxNetworkLogs:Gr,maxConsoleLogs:Le,setMaxConsoleLogs:Ur,maxAnalyticsEventsLimit:_e,setMaxAnalyticsEventsLimit:qr,isAutoRamLimitEnabled:R,setIsAutoRamLimitEnabled:Jr,deviceFreeRamMb:Ie,reduxAutoRefresh:Fe,setReduxAutoRefreshState:_r,reduxExpandDepth:Ke,setReduxExpandDepth:Kr,switchActiveTab:zt,setSelected:Qr,setSelectedEvent:Xr,setReduxState:Yr,crashRecords:We,maxCrashLogs:Qe,setMaxCrashLogs:Zr,updateAvailable:Rt,latestNpmVersion:vt}=To(),[X,Xe]=$e(_);Me(()=>{Xe(_)},[_]);const K=Ro(Ie),Ht=zo(),eo=je.OS==="android"?ao.currentHeight||24:44,Dt=_>=95?eo:0,L=er(()=>[{id:1,key:"apis",label:"APIs (Network)",category:"core",icon:"apis",desc:"HTTP/HTTPS requests, GraphQL, Axios & WebSocket inspector"},{id:2,key:"logs",label:"Console Logs",category:"core",icon:"logs",desc:"Terminal console logs, warnings, errors & stack traces"},{id:3,key:"analytics",label:"Analytics Logger",category:"telemetry",icon:"analytics",desc:"Firebase & custom analytics events, user properties & params"},{id:4,key:"redux",label:"Redux Inspector",category:"telemetry",icon:"redux",desc:"Store state diffing, action history & reducer timeline"},{id:5,key:"storage",label:"Storage Inspector",category:"telemetry",icon:"storage",desc:"AsyncStorage & MMKV key-value store viewer with full CRUD support"},{id:6,key:"device",label:"Device Info",category:"diagnostic",icon:"device",desc:"Hardware specs, IP address, screen metrics, UDID & runtime stats"},{id:7,key:"crash",label:"Crash Protection",category:"diagnostic",icon:"crash",desc:"Runtime exception guard, breadcrumbs & memory snapshot"},{id:8,key:"bundle",label:"Bundle Analyzer",category:"diagnostic",icon:"bundle",desc:"Metro packager dependencies, source maps & asset breakdown"},{id:9,key:"performance",label:"Performance & Tracker",category:"diagnostic",icon:"performance",desc:"60 FPS monitor, Hermes memory telemetry & re-render profiler"},{id:10,key:"debugging",label:"Multi-Device Debugging",category:"diagnostic",icon:"debugging",desc:"QR Code bridge for direct Debug APK download & Metro live-reload sync"},{id:11,key:"media",label:"Screencast",category:"diagnostic",icon:"media",desc:"Screenshots, video recordings, audio narration & animated GIFs"}].filter(r=>r.key==="debugging"?je.OS==="android"&&kt():!0),[]),[M,Ae]=$e(()=>({apis:!0,logs:!!T?.logs,analytics:!!T?.analytics,redux:!!T?.redux,storage:!!T?.storage,device:!!T?.device,crash:!!T?.crash,bundle:!!T?.bundle,performance:!!T?.performance,debugging:!!T?.debugging,media:!!(T?.media??!0)}));Me(()=>{Ae({apis:!0,logs:!!T?.logs,analytics:!!T?.analytics,redux:!!T?.redux,storage:!!T?.storage,device:!!T?.device,crash:!!T?.crash,bundle:!!T?.bundle,performance:!!T?.performance,debugging:!!T?.debugging,media:!!(T?.media??!0)})},[T]);const q=er(()=>L.some(r=>!!M[r.key]!=!!T?.[r.key]),[M,T,L]),ro=L.filter(r=>r.key==="apis"||!!M[r.key]).length,oo=()=>{q&&W.alert("Apply Changes & Reload","Are you sure you want to save module changes? The inspector will close and reload the app to apply the new configuration.",[{text:"Cancel",style:"cancel",onPress:()=>{Ae({apis:!0,logs:!!T?.logs,analytics:!!T?.analytics,redux:!!T?.redux,storage:!!T?.storage,device:!!T?.device,crash:!!T?.crash,bundle:!!T?.bundle,performance:!!T?.performance,debugging:!!T?.debugging,media:!!(T?.media??!0)})}},{text:"Save & Reload",style:"default",onPress:()=>{Q(),L.forEach(r=>{if(r.key!=="apis"){const V=!!M[r.key],D=!!T?.[r.key];V!==D&&Ir(r.key)}}),Nr(),setTimeout(()=>{__DEV__&&Oe&&Oe.reload&&Oe.reload()},350)}}])},[Pe,Ye]=$e(!1),Lt=()=>{Q(),Te("main")},z=r=><C style={{paddingVertical:12,borderBottomWidth:r.isLast?0:1,borderBottomColor:e.dividerColor}}>
2
+ <H disabled={!r.onPress}onPress={r.onPress}style={{flexDirection:"row",alignItems:"center",gap:12}}>
3
+ <C style={{width:36,height:36,borderRadius:10,backgroundColor:e.purpleShade50,borderWidth:1,borderColor:`${e.purple}2E`,alignItems:"center",justifyContent:"center"}}>
4
+ {r.icon}
5
+ </C>
6
+ <C style={{flex:1}}>
7
+ <S style={{fontFamily:k.interBold,fontSize:14,lineHeight:18,color:e.primaryBlack}}>
8
+ {r.label}
9
+ </S>
10
+ {r.description?<S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
11
+ {r.description}
12
+ </S>:null}
13
+ </C>
14
+ {r.right||null}
15
+ </H>
16
+ {r.numericInput&&<C style={{marginTop:10,gap:6}}>
17
+ <C style={{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:8,borderWidth:1,borderColor:e.dividerColor,paddingHorizontal:12,paddingVertical:4}}>
18
+ <Co style={{flex:1,fontFamily:k.interMedium,fontSize:14,lineHeight:18,color:e.primaryBlack,paddingVertical:6}}value={String(r.numericInput.value||"")}onChangeText={V=>{const D=parseInt(V.replace(/[^0-9]/g,""),10);if(!isNaN(D)){const v=Math.max(r.numericInput?.min??1,Math.min(r.numericInput?.max??1e4,D));r.numericInput?.onChange(v)}}}keyboardType={r.numericInput.keyboardType??"number-pad"}placeholder={r.numericInput.placeholder}placeholderTextColor={e.grayTextWeak}maxLength={6}selectTextOnFocus/>
19
+ <S style={{fontFamily:k.interBold,fontSize:11,color:e.purple,marginLeft:6}}>
289
20
  MAX
290
- </Text>
291
- </View>
292
- {opts.numericInput.min !== undefined ||
293
- opts.numericInput.max !== undefined ? (<Text style={{
294
- fontFamily: AppFonts.interRegular,
295
- fontSize: 10,
296
- lineHeight: 13,
297
- color: AppColors.grayTextWeak,
298
- }}>
299
- Range: {opts.numericInput.min ?? 1} -{' '}
300
- {opts.numericInput.max ?? '∞'}
301
- </Text>) : null}
302
- </View>)}
303
- {opts.picker && (<View style={{
304
- flexDirection: 'row',
305
- backgroundColor: AppColors.grayBackground,
306
- borderRadius: 8,
307
- padding: 2.5,
308
- marginTop: 10,
309
- borderWidth: 1,
310
- borderColor: AppColors.dividerColor,
311
- }}>
312
- {opts.picker.options.map(opt => {
313
- const isActive = opts.picker.selectedValue === opt;
314
- return (<TouchableScale key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
315
- flex: 1,
316
- paddingVertical: 6,
317
- alignItems: 'center',
318
- borderRadius: 6,
319
- backgroundColor: isActive
320
- ? AppColors.purple
321
- : 'transparent',
322
- }}>
323
- <Text style={{
324
- fontFamily: AppFonts.interBold,
325
- fontSize: 11,
326
- lineHeight: 14,
327
- color: isActive ? AppColors.white : AppColors.grayText,
328
- }}>
329
- {opts.picker.formatLabel
330
- ? opts.picker.formatLabel(opt)
331
- : opt}
332
- </Text>
333
- </TouchableScale>);
334
- })}
335
- </View>)}
336
- </View>);
337
- };
338
- const renderMainSettingsContent = () => (<View style={{
339
- flex: 1,
340
- backgroundColor: AppColors.grayBackground,
341
- }}>
342
- <ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 14 }} showsVerticalScrollIndicator={false}>
21
+ </S>
22
+ </C>
23
+ {r.numericInput.min!==void 0||r.numericInput.max!==void 0?<S style={{fontFamily:k.interRegular,fontSize:10,lineHeight:13,color:e.grayTextWeak}}>
24
+ Range: {r.numericInput.min??1} -{" "}
25
+ {r.numericInput.max??"\u221E"}
26
+ </S>:null}
27
+ </C>}
28
+ {r.picker&&<C style={{flexDirection:"row",backgroundColor:e.grayBackground,borderRadius:8,padding:2.5,marginTop:10,borderWidth:1,borderColor:e.dividerColor}}>
29
+ {r.picker.options.map(V=>{const D=r.picker.selectedValue===V;return<H key={String(V)}onPress={()=>r.picker.onSelect(V)}style={{flex:1,paddingVertical:6,alignItems:"center",borderRadius:6,backgroundColor:D?e.purple:"transparent"}}>
30
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:D?e.white:e.grayText}}>
31
+ {r.picker.formatLabel?r.picker.formatLabel(V):V}
32
+ </S>
33
+ </H>})}
34
+ </C>}
35
+ </C>,to=()=><C style={{flex:1,backgroundColor:e.grayBackground}}>
36
+ <A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:14}}showsVerticalScrollIndicator={!1}>
343
37
 
344
38
 
345
- <View style={{
346
- backgroundColor: AppColors.primaryLight,
347
- borderRadius: 13,
348
- paddingVertical: 4,
349
- paddingHorizontal: 4,
350
- borderWidth: 1,
351
- borderColor: AppColors.grayBorderSecondary,
352
- shadowColor: AppColors.black,
353
- shadowOpacity: 0.04,
354
- shadowRadius: 4,
355
- shadowOffset: { width: 0, height: 2 },
356
- }}>
357
- <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{
358
- flexDirection: 'row',
359
- alignItems: 'center',
360
- gap: 6,
361
- paddingHorizontal: 2,
362
- }}>
363
- {[
364
- {
365
- key: 'module',
366
- label: t('settings.modulesAndTools', 'Modules & Tools'),
367
- Icon: LayersIcon,
368
- badge: `${allModules.filter(m => stagedTabVisibility?.[m.key] ||
369
- m.key === 'apis').length}/${allModules.length}`,
370
- },
371
- {
372
- key: 'ui',
373
- label: t('settings.uiPreferences', 'UI Preferences'),
374
- Icon: ScreenIcon,
375
- },
376
- {
377
- key: 'limits',
378
- label: t('settings.ramLimits', 'RAM & Limits'),
379
- Icon: BrainIcon,
380
- },
381
- {
382
- key: 'capture',
383
- label: t('settings.screenVideoCapture', 'Screen & Video Capture'),
384
- Icon: CameraIcon,
385
- },
386
- {
387
- key: 'about',
388
- label: t('settings.aboutAndSpecs', 'About & Specs'),
389
- Icon: InfoCircleIcon,
390
- },
391
- ].map(tab => {
392
- const isActive = settingsActiveSubTab === tab.key;
393
- const IconComp = tab.Icon;
394
- return (<TouchableScale key={tab.key} accessible={true} accessibilityRole="tab" accessibilityLabel={tab.label} accessibilityState={{ selected: isActive }} onPress={() => {
395
- animateNextLayout();
396
- setSettingsActiveSubTab(tab.key);
397
- }} style={{
398
- paddingVertical: 8,
399
- paddingHorizontal: 14,
400
- flexDirection: 'row',
401
- alignItems: 'center',
402
- justifyContent: 'center',
403
- gap: 6,
404
- borderRadius: 9,
405
- backgroundColor: isActive
406
- ? AppColors.purple
407
- : 'transparent',
408
- }}>
409
- <IconComp color={isActive ? AppColors.white : AppColors.grayText} size={13}/>
410
- <Text style={{
411
- fontFamily: AppFonts.interBold,
412
- fontSize: 12.5,
413
- lineHeight: 16,
414
- color: isActive ? AppColors.white : AppColors.grayText,
415
- }}>
416
- {tab.label}
417
- </Text>
418
- {tab.badge && (<View style={{
419
- backgroundColor: isActive
420
- ? 'rgba(255,255,255,0.25)'
421
- : `${AppColors.purple}18`,
422
- paddingHorizontal: 5.5,
423
- paddingVertical: 1,
424
- borderRadius: 10,
425
- }}>
426
- <Text style={{
427
- fontFamily: AppFonts.interBold,
428
- fontSize: 9.5,
429
- color: isActive ? AppColors.white : AppColors.purple,
430
- }}>
431
- {tab.badge}
432
- </Text>
433
- </View>)}
434
- </TouchableScale>);
435
- })}
436
- </ScrollView>
437
- </View>
438
-
439
- {settingsActiveSubTab === 'module' && (<View style={{ gap: 12 }}>
39
+ <C style={{backgroundColor:e.primaryLight,borderRadius:13,paddingVertical:4,paddingHorizontal:4,borderWidth:1,borderColor:e.grayBorderSecondary,shadowColor:e.black,shadowOpacity:.04,shadowRadius:4,shadowOffset:{width:0,height:2}}}>
40
+ <A horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:2}}>
41
+ {[{key:"module",label:x("settings.modulesAndTools","Modules & Tools"),Icon:Ce,badge:`${L.filter(r=>M?.[r.key]||r.key==="apis").length}/${L.length}`},{key:"ui",label:x("settings.uiPreferences","UI Preferences"),Icon:Sr},{key:"limits",label:x("settings.ramLimits","RAM & Limits"),Icon:Rr},{key:"capture",label:x("settings.screenVideoCapture","Screen & Video Capture"),Icon:Hr}].map(r=>{const V=G===r.key,D=r.Icon;return<H key={r.key}accessible={!0}accessibilityRole="tab"accessibilityLabel={r.label}accessibilityState={{selected:V}}onPress={()=>{Q(),Lr(r.key)}}style={{paddingVertical:8,paddingHorizontal:14,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,borderRadius:9,backgroundColor:V?e.purple:"transparent"}}>
42
+ <D color={V?e.white:e.grayText}size={13}/>
43
+ <S style={{fontFamily:k.interBold,fontSize:12.5,lineHeight:16,color:V?e.white:e.grayText}}>
44
+ {r.label}
45
+ </S>
46
+ {r.badge&&<C style={{backgroundColor:V?"rgba(255,255,255,0.25)":`${e.purple}18`,paddingHorizontal:5.5,paddingVertical:1,borderRadius:10}}>
47
+ <S style={{fontFamily:k.interBold,fontSize:9.5,color:V?e.white:e.purple}}>
48
+ {r.badge}
49
+ </S>
50
+ </C>}
51
+ </H>})}
52
+ </A>
53
+ </C>
54
+
55
+ {G==="module"&&<C style={{gap:12}}>
440
56
 
441
- <View style={{ gap: 10 }}>
442
- {allModules.map(moduleItem => {
443
- const isReduxAvail = isReduxConnected();
444
- const isAnalyticsAvail = isAnalyticsConnected();
445
- const isUnavailable = (moduleItem.key === 'redux' && !isReduxAvail) ||
446
- (moduleItem.key === 'analytics' && !isAnalyticsAvail);
447
- const isLocked = moduleItem.key === 'apis' || isUnavailable;
448
- const isChecked = moduleItem.key === 'apis' ||
449
- (Boolean(stagedTabVisibility?.[moduleItem.key]) &&
450
- !isUnavailable);
451
- const liveStats = moduleItem.key === 'apis'
452
- ? `${logs.length} requests • Limit: ${maxNetworkLogs}`
453
- : moduleItem.key === 'logs'
454
- ? `${consoleLogs.length} logs • Limit: ${maxConsoleLogs}`
455
- : moduleItem.key === 'performance'
456
- ? '60 FPS Target • Memory Telemetry'
457
- : moduleItem.key === 'bundle'
458
- ? 'Metro Packager • Dependency Map'
459
- : moduleItem.key === 'crash'
460
- ? `${crashRecords?.length || 0} crashes recorded • Crash Guard`
461
- : moduleItem.key === 'analytics'
462
- ? `${analyticsEvents.length} events logged`
463
- : moduleItem.key === 'redux'
464
- ? `${Object.keys(reduxState || {}).length} slices • Depth: ${reduxExpandDepth}`
465
- : '';
466
- return (<View key={moduleItem.key} style={{
467
- backgroundColor: AppColors.primaryLight,
468
- borderRadius: 14,
469
- borderWidth: 1.5,
470
- borderColor: isChecked
471
- ? `${AppColors.purple}38`
472
- : AppColors.grayBorderSecondary,
473
- padding: 14,
474
- gap: 10,
475
- shadowColor: AppColors.black,
476
- shadowOpacity: isChecked ? 0.04 : 0.02,
477
- shadowRadius: 5,
478
- shadowOffset: { width: 0, height: 2 },
479
- }}>
57
+ <C style={{gap:10}}>
58
+ {L.map(r=>{const V=Wo(),D=Ao(),v=r.key==="redux"&&!V||r.key==="analytics"&&!D,I=r.key==="apis"||v,B=r.key==="apis"||!!M?.[r.key]&&!v,io=r.key==="apis"?`${ze.length} requests \u2022 Limit: ${De}`:r.key==="logs"?`${Re.length} logs \u2022 Limit: ${Le}`:r.key==="performance"?"60 FPS Target \u2022 Memory Telemetry":r.key==="bundle"?"Metro Packager \u2022 Dependency Map":r.key==="crash"?`${We?.length||0} crashes recorded \u2022 Crash Guard`:r.key==="analytics"?`${ve.length} events logged`:r.key==="redux"?`${Object.keys(He||{}).length} slices \u2022 Depth: ${Ke}`:"";return<C key={r.key}style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1.5,borderColor:B?`${e.purple}38`:e.grayBorderSecondary,padding:14,gap:10,shadowColor:e.black,shadowOpacity:B?.04:.02,shadowRadius:5,shadowOffset:{width:0,height:2}}}>
480
59
 
481
- <View style={{
482
- flexDirection: 'row',
483
- alignItems: 'flex-start',
484
- gap: 10,
485
- }}>
60
+ <C style={{flexDirection:"row",alignItems:"flex-start",gap:10}}>
486
61
 
487
- <TouchableScale accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Select ${moduleItem.label}`} accessibilityState={{
488
- checked: isChecked,
489
- disabled: isLocked,
490
- }} disabled={isLocked} onPress={() => {
491
- if (isLocked)
492
- return;
493
- setStagedTabVisibility(prev => ({
494
- ...prev,
495
- [moduleItem.key]: !prev[moduleItem.key],
496
- }));
497
- }} hitSlop={8} style={{
498
- width: 22,
499
- height: 22,
500
- borderRadius: 6,
501
- borderWidth: isChecked ? 0 : 1.8,
502
- borderColor: isLocked
503
- ? AppColors.dividerColor
504
- : AppColors.grayBorderSecondary,
505
- backgroundColor: moduleItem.key === 'apis'
506
- ? `${AppColors.blue500}22`
507
- : isChecked
508
- ? AppColors.purple
509
- : AppColors.grayBackground,
510
- alignItems: 'center',
511
- justifyContent: 'center',
512
- marginTop: 7,
513
- shadowColor: isChecked
514
- ? AppColors.purple
515
- : 'transparent',
516
- shadowOpacity: isChecked ? 0.25 : 0,
517
- shadowRadius: 2,
518
- elevation: isChecked ? 2 : 0,
519
- }}>
520
- {moduleItem.key === 'apis' ? (<CheckIcon size={12} color={AppColors.blue500}/>) : isChecked ? (<CheckIcon size={12} color={AppColors.white}/>) : isLocked ? (<Svg width={10} height={10} viewBox="0 0 24 24" fill="none">
521
- <Path d="M7 10V7a5 5 0 0 1 10 0v3" stroke={AppColors.grayText} strokeWidth="2.2" strokeLinecap="round"/>
522
- <Path d="M5 10h14v9a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1z" fill={AppColors.grayText}/>
523
- </Svg>) : null}
524
- </TouchableScale>
62
+ <H accessible={!0}accessibilityRole="checkbox"accessibilityLabel={`Select ${r.label}`}accessibilityState={{checked:B,disabled:I}}disabled={I}onPress={()=>{I||Ae(Ze=>({...Ze,[r.key]:!Ze[r.key]}))}}hitSlop={8}style={{width:22,height:22,borderRadius:6,borderWidth:B?0:1.8,borderColor:I?e.dividerColor:e.grayBorderSecondary,backgroundColor:r.key==="apis"?`${e.blue500}22`:B?e.purple:e.grayBackground,alignItems:"center",justifyContent:"center",marginTop:7,shadowColor:B?e.purple:"transparent",shadowOpacity:B?.25:0,shadowRadius:2,elevation:B?2:0}}>
63
+ {r.key==="apis"?<N size={12}color={e.blue500}/>:B?<N size={12}color={e.white}/>:I?<So width={10}height={10}viewBox="0 0 24 24"fill="none">
64
+ <Cr d="M7 10V7a5 5 0 0 1 10 0v3"stroke={e.grayText}strokeWidth="2.2"strokeLinecap="round"/>
65
+ <Cr d="M5 10h14v9a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1z"fill={e.grayText}/>
66
+ </So>:null}
67
+ </H>
525
68
 
526
69
 
527
- <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`${moduleItem.label} settings`} disabled={isUnavailable} onPress={() => {
528
- animateNextLayout();
529
- setSettingsPage(moduleItem.key);
530
- }} style={{
531
- flex: 1,
532
- flexDirection: 'row',
533
- alignItems: 'flex-start',
534
- gap: 10,
535
- }}>
70
+ <H accessible={!0}accessibilityRole="button"accessibilityLabel={`${r.label} settings`}disabled={v}onPress={()=>{Q(),Te(r.key)}}style={{flex:1,flexDirection:"row",alignItems:"flex-start",gap:10}}>
536
71
 
537
- <View style={{
538
- width: 36,
539
- height: 36,
540
- borderRadius: 10,
541
- backgroundColor: isLocked
542
- ? `${AppColors.grayBorderSecondary}4D`
543
- : isChecked
544
- ? `${AppColors.purple}14`
545
- : AppColors.grayBackground,
546
- borderWidth: 1,
547
- borderColor: isLocked
548
- ? AppColors.dividerColor
549
- : isChecked
550
- ? `${AppColors.purple}33`
551
- : AppColors.grayBorderSecondary,
552
- alignItems: 'center',
553
- justifyContent: 'center',
554
- marginTop: 1,
555
- }}>
556
- {moduleItem.icon === 'apis' && (<SignalIcon color={isChecked
557
- ? AppColors.purple
558
- : AppColors.grayTextWeak} size={16}/>)}
559
- {moduleItem.icon === 'logs' && (<TerminalIcon color={isChecked
560
- ? AppColors.purple
561
- : AppColors.grayTextWeak} size={16}/>)}
562
- {moduleItem.icon === 'performance' && (<PerformanceIcon color={isChecked
563
- ? AppColors.purple
564
- : AppColors.grayTextWeak} size={16}/>)}
565
- {moduleItem.icon === 'bundle' && (<PackageIcon color={isChecked
566
- ? AppColors.purple
567
- : AppColors.grayTextWeak} size={16}/>)}
568
- {moduleItem.icon === 'crash' && (<CrashIcon color={isChecked
569
- ? AppColors.purple
570
- : AppColors.grayTextWeak} size={16}/>)}
571
- {moduleItem.icon === 'analytics' && (<AnalyticsIcon color={isChecked
572
- ? AppColors.purple
573
- : AppColors.grayTextWeak} size={16}/>)}
574
- {moduleItem.icon === 'redux' && (<ReduxIcon color={isChecked
575
- ? AppColors.purple
576
- : AppColors.grayTextWeak} size={16}/>)}
577
- {moduleItem.icon === 'device' && (<SmartphoneIcon color={isChecked
578
- ? AppColors.purple
579
- : AppColors.grayTextWeak} size={16}/>)}
580
- {moduleItem.icon === 'storage' && (<DatabaseIcon color={isChecked
581
- ? AppColors.purple
582
- : AppColors.grayTextWeak} size={16}/>)}
583
- {moduleItem.icon === 'debugging' && (<QrCodeIcon color={isChecked
584
- ? AppColors.purple
585
- : AppColors.grayTextWeak} size={16}/>)}
586
- {moduleItem.icon === 'media' && (<ScreencastIcon color={isChecked
587
- ? AppColors.purple
588
- : AppColors.grayTextWeak} size={16}/>)}
589
- </View>
72
+ <C style={{width:36,height:36,borderRadius:10,backgroundColor:I?`${e.grayBorderSecondary}4D`:B?`${e.purple}14`:e.grayBackground,borderWidth:1,borderColor:I?e.dividerColor:B?`${e.purple}33`:e.grayBorderSecondary,alignItems:"center",justifyContent:"center",marginTop:1}}>
73
+ {r.icon==="apis"&&<Z color={B?e.purple:e.grayTextWeak}size={16}/>}
74
+ {r.icon==="logs"&&<Ne color={B?e.purple:e.grayTextWeak}size={16}/>}
75
+ {r.icon==="performance"&&<Je color={B?e.purple:e.grayTextWeak}size={16}/>}
76
+ {r.icon==="bundle"&&<Se color={B?e.purple:e.grayTextWeak}size={16}/>}
77
+ {r.icon==="crash"&&<Vr color={B?e.purple:e.grayTextWeak}size={16}/>}
78
+ {r.icon==="analytics"&&<Ge color={B?e.purple:e.grayTextWeak}size={16}/>}
79
+ {r.icon==="redux"&&<Ue color={B?e.purple:e.grayTextWeak}size={16}/>}
80
+ {r.icon==="device"&&<Uo color={B?e.purple:e.grayTextWeak}size={16}/>}
81
+ {r.icon==="storage"&&<Jo color={B?e.purple:e.grayTextWeak}size={16}/>}
82
+ {r.icon==="debugging"&&<_o color={B?e.purple:e.grayTextWeak}size={16}/>}
83
+ {r.icon==="media"&&<Qo color={B?e.purple:e.grayTextWeak}size={16}/>}
84
+ </C>
590
85
 
591
86
 
592
- <View style={{ flex: 1, gap: 2 }}>
593
- <View style={{
594
- flexDirection: 'row',
595
- alignItems: 'center',
596
- gap: 6,
597
- flexWrap: 'wrap',
598
- }}>
599
- <View style={{
600
- minWidth: 22,
601
- height: 22,
602
- paddingHorizontal: 5,
603
- borderRadius: 11,
604
- backgroundColor: isChecked
605
- ? `${AppColors.purple}1C`
606
- : `${AppColors.grayBorderSecondary}80`,
607
- borderWidth: 1,
608
- borderColor: isChecked
609
- ? `${AppColors.purple}44`
610
- : AppColors.grayBorderSecondary,
611
- alignItems: 'center',
612
- justifyContent: 'center',
613
- }}>
614
- <Text style={{
615
- fontFamily: AppFonts.interBold,
616
- fontSize: 10,
617
- lineHeight: 13,
618
- color: isChecked
619
- ? AppColors.purple
620
- : AppColors.grayText,
621
- }}>
622
- #{moduleItem.id}
623
- </Text>
624
- </View>
625
- <Text style={{
626
- fontFamily: AppFonts.interBold,
627
- fontSize: 14,
628
- lineHeight: 18,
629
- color: isLocked
630
- ? AppColors.grayText
631
- : AppColors.primaryBlack,
632
- }}>
633
- {moduleItem.label}
634
- </Text>
87
+ <C style={{flex:1,gap:2}}>
88
+ <C style={{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"}}>
89
+ <C style={{minWidth:22,height:22,paddingHorizontal:5,borderRadius:11,backgroundColor:B?`${e.purple}1C`:`${e.grayBorderSecondary}80`,borderWidth:1,borderColor:B?`${e.purple}44`:e.grayBorderSecondary,alignItems:"center",justifyContent:"center"}}>
90
+ <S style={{fontFamily:k.interBold,fontSize:10,lineHeight:13,color:B?e.purple:e.grayText}}>
91
+ #{r.id}
92
+ </S>
93
+ </C>
94
+ <S style={{fontFamily:k.interBold,fontSize:14,lineHeight:18,color:I?e.grayText:e.primaryBlack}}>
95
+ {r.label}
96
+ </S>
635
97
 
636
98
 
637
- {moduleItem.key === defaultTab &&
638
- !isUnavailable && (<View style={{
639
- flexDirection: 'row',
640
- alignItems: 'center',
641
- backgroundColor: `${AppColors.purple}14`,
642
- borderRadius: 12,
643
- paddingHorizontal: 5,
644
- paddingVertical: 1.5,
645
- borderWidth: 1,
646
- borderColor: `${AppColors.purple}2E`,
647
- gap: 3,
648
- }}>
649
- <View style={{
650
- width: 4,
651
- height: 4,
652
- borderRadius: 2,
653
- backgroundColor: AppColors.purple,
654
- }}/>
655
- <Text style={{
656
- fontFamily: AppFonts.interBold,
657
- fontSize: 8,
658
- lineHeight: 11,
659
- color: AppColors.purple,
660
- letterSpacing: 0.4,
661
- }}>
662
- {t('settings.defaultBadge')}
663
- </Text>
664
- </View>)}
99
+ {r.key===U&&!v&&<C style={{flexDirection:"row",alignItems:"center",backgroundColor:`${e.purple}14`,borderRadius:12,paddingHorizontal:5,paddingVertical:1.5,borderWidth:1,borderColor:`${e.purple}2E`,gap:3}}>
100
+ <C style={{width:4,height:4,borderRadius:2,backgroundColor:e.purple}}/>
101
+ <S style={{fontFamily:k.interBold,fontSize:8,lineHeight:11,color:e.purple,letterSpacing:.4}}>
102
+ {x("settings.defaultBadge")}
103
+ </S>
104
+ </C>}
665
105
 
666
106
 
667
- {moduleItem.key === 'apis' ? (<View style={{
668
- backgroundColor: `${AppColors.blue500}14`,
669
- borderRadius: 4,
670
- paddingHorizontal: 5,
671
- paddingVertical: 1.5,
672
- borderWidth: 1,
673
- borderColor: `${AppColors.blue500}33`,
674
- }}>
675
- <Text style={{
676
- fontFamily: AppFonts.interBold,
677
- fontSize: 8,
678
- lineHeight: 11,
679
- color: AppColors.blue500,
680
- letterSpacing: 0.3,
681
- }}>
682
- {t('settings.coreBadge')}
683
- </Text>
684
- </View>) : isUnavailable ? (<View style={{
685
- backgroundColor: `${AppColors.amber500}18`,
686
- borderRadius: 4,
687
- paddingHorizontal: 5,
688
- paddingVertical: 1.5,
689
- borderWidth: 1,
690
- borderColor: `${AppColors.amber500}35`,
691
- }}>
692
- <Text style={{
693
- fontFamily: AppFonts.interBold,
694
- fontSize: 8,
695
- lineHeight: 11,
696
- color: AppColors.amber700,
697
- letterSpacing: 0.3,
698
- }}>
699
- {moduleItem.key === 'redux'
700
- ? t('settings.notConnectedBadge')
701
- : t('settings.notDetectedBadge')}
702
- </Text>
703
- </View>) : isChecked ? (<View style={{
704
- backgroundColor: `${AppColors.liveGreen}18`,
705
- borderRadius: 4,
706
- paddingHorizontal: 5,
707
- paddingVertical: 1.5,
708
- borderWidth: 1,
709
- borderColor: `${AppColors.liveGreen}38`,
710
- }}>
711
- <Text style={{
712
- fontFamily: AppFonts.interBold,
713
- fontSize: 8,
714
- lineHeight: 11,
715
- color: AppColors.green700,
716
- letterSpacing: 0.3,
717
- }}>
718
- {t('settings.activeBadge')}
719
- </Text>
720
- </View>) : (<View style={{
721
- backgroundColor: `${AppColors.grayTextWeak}18`,
722
- borderRadius: 4,
723
- paddingHorizontal: 5,
724
- paddingVertical: 1.5,
725
- borderWidth: 1,
726
- borderColor: `${AppColors.grayTextWeak}2E`,
727
- }}>
728
- <Text style={{
729
- fontFamily: AppFonts.interBold,
730
- fontSize: 8,
731
- lineHeight: 11,
732
- color: AppColors.grayTextWeak,
733
- letterSpacing: 0.3,
734
- }}>
735
- {t('settings.dormantBadge')}
736
- </Text>
737
- </View>)}
738
- </View>
739
-
740
- <Text style={{
741
- fontFamily: AppFonts.interRegular,
742
- fontSize: 11,
743
- color: AppColors.grayText,
744
- lineHeight: 15,
745
- marginTop: 1,
746
- }}>
747
- {moduleItem.desc}
748
- </Text>
749
- </View>
750
- </TouchableScale>
751
- </View>
107
+ {r.key==="apis"?<C style={{backgroundColor:`${e.blue500}14`,borderRadius:4,paddingHorizontal:5,paddingVertical:1.5,borderWidth:1,borderColor:`${e.blue500}33`}}>
108
+ <S style={{fontFamily:k.interBold,fontSize:8,lineHeight:11,color:e.blue500,letterSpacing:.3}}>
109
+ {x("settings.coreBadge")}
110
+ </S>
111
+ </C>:v?<C style={{backgroundColor:`${e.amber500}18`,borderRadius:4,paddingHorizontal:5,paddingVertical:1.5,borderWidth:1,borderColor:`${e.amber500}35`}}>
112
+ <S style={{fontFamily:k.interBold,fontSize:8,lineHeight:11,color:e.amber700,letterSpacing:.3}}>
113
+ {r.key==="redux"?x("settings.notConnectedBadge"):x("settings.notDetectedBadge")}
114
+ </S>
115
+ </C>:B?<C style={{backgroundColor:`${e.liveGreen}18`,borderRadius:4,paddingHorizontal:5,paddingVertical:1.5,borderWidth:1,borderColor:`${e.liveGreen}38`}}>
116
+ <S style={{fontFamily:k.interBold,fontSize:8,lineHeight:11,color:e.green700,letterSpacing:.3}}>
117
+ {x("settings.activeBadge")}
118
+ </S>
119
+ </C>:<C style={{backgroundColor:`${e.grayTextWeak}18`,borderRadius:4,paddingHorizontal:5,paddingVertical:1.5,borderWidth:1,borderColor:`${e.grayTextWeak}2E`}}>
120
+ <S style={{fontFamily:k.interBold,fontSize:8,lineHeight:11,color:e.grayTextWeak,letterSpacing:.3}}>
121
+ {x("settings.dormantBadge")}
122
+ </S>
123
+ </C>}
124
+ </C>
125
+
126
+ <S style={{fontFamily:k.interRegular,fontSize:11,color:e.grayText,lineHeight:15,marginTop:1}}>
127
+ {r.desc}
128
+ </S>
129
+ </C>
130
+ </H>
131
+ </C>
752
132
 
753
133
 
754
- {!isUnavailable && (<View style={{
755
- flexDirection: 'row',
756
- alignItems: 'center',
757
- justifyContent: 'space-between',
758
- paddingTop: 8,
759
- borderTopWidth: 1,
760
- borderTopColor: AppColors.dividerColor,
761
- }}>
134
+ {!v&&<C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingTop:8,borderTopWidth:1,borderTopColor:e.dividerColor}}>
762
135
 
763
- <View style={{
764
- flexDirection: 'row',
765
- alignItems: 'center',
766
- gap: 6,
767
- flex: 1,
768
- }}>
769
- <View style={{
770
- width: 6,
771
- height: 6,
772
- borderRadius: 3,
773
- backgroundColor: isChecked
774
- ? AppColors.liveGreen
775
- : AppColors.grayTextWeak,
776
- }}/>
777
- <Text style={{
778
- fontFamily: AppFonts.interMedium,
779
- fontSize: 11,
780
- color: AppColors.grayText,
781
- lineHeight: 14,
782
- }}>
783
- {liveStats}
784
- </Text>
785
- </View>
136
+ <C style={{flexDirection:"row",alignItems:"center",gap:6,flex:1}}>
137
+ <C style={{width:6,height:6,borderRadius:3,backgroundColor:B?e.liveGreen:e.grayTextWeak}}/>
138
+ <S style={{fontFamily:k.interMedium,fontSize:11,color:e.grayText,lineHeight:14}}>
139
+ {io}
140
+ </S>
141
+ </C>
786
142
 
787
143
 
788
- <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`Configure ${moduleItem.label} settings`} onPress={() => {
789
- animateNextLayout();
790
- setSettingsPage(moduleItem.key);
791
- }} style={{
792
- flexDirection: 'row',
793
- alignItems: 'center',
794
- gap: 5,
795
- backgroundColor: `${AppColors.purple}12`,
796
- paddingHorizontal: 10,
797
- paddingVertical: 5,
798
- borderRadius: 8,
799
- borderWidth: 1,
800
- borderColor: `${AppColors.purple}26`,
801
- }}>
802
- <SettingsIcon color={AppColors.purple} size={11}/>
803
- <Text style={{
804
- fontFamily: AppFonts.interBold,
805
- fontSize: 11,
806
- lineHeight: 14,
807
- color: AppColors.purple,
808
- }}>
809
- {t('settings.configure')}
810
- </Text>
811
- <ForwardChevronIcon color={AppColors.purple} size={9}/>
812
- </TouchableScale>
813
- </View>)}
814
- </View>);
815
- })}
816
- </View>
817
- </View>)}
818
-
819
- {settingsActiveSubTab === 'ui' && (<View style={{ gap: 14 }}>
144
+ <H accessible={!0}accessibilityRole="button"accessibilityLabel={`Configure ${r.label} settings`}onPress={()=>{Q(),Te(r.key)}}style={{flexDirection:"row",alignItems:"center",gap:5,backgroundColor:`${e.purple}12`,paddingHorizontal:10,paddingVertical:5,borderRadius:8,borderWidth:1,borderColor:`${e.purple}26`}}>
145
+ <$o color={e.purple}size={11}/>
146
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.purple}}>
147
+ {x("settings.configure")}
148
+ </S>
149
+ <No color={e.purple}size={9}/>
150
+ </H>
151
+ </C>}
152
+ </C>})}
153
+ </C>
154
+ </C>}
155
+
156
+ {G==="ui"&&<C style={{gap:14}}>
820
157
 
821
- <View style={{
822
- backgroundColor: AppColors.primaryLight,
823
- borderRadius: 14,
824
- borderWidth: 1,
825
- borderColor: AppColors.grayBorderSecondary,
826
- overflow: 'hidden',
827
- padding: 14,
828
- gap: 12,
829
- }}>
830
- <Text style={{
831
- fontFamily: AppFonts.interBold,
832
- fontSize: 11,
833
- lineHeight: 14,
834
- color: AppColors.grayTextWeak,
835
- letterSpacing: 0.8,
836
- }}>
837
- {t('settings.appearanceTheme')}
838
- </Text>
839
-
840
- <View style={{
841
- flexDirection: 'row',
842
- alignItems: 'center',
843
- justifyContent: 'space-between',
844
- }}>
845
- <View style={{
846
- flexDirection: 'row',
847
- alignItems: 'center',
848
- gap: 10,
849
- flex: 1,
850
- }}>
851
- <View style={{
852
- width: 32,
853
- height: 32,
854
- borderRadius: 8,
855
- backgroundColor: AppColors.purpleShade50,
856
- alignItems: 'center',
857
- justifyContent: 'center',
858
- }}>
859
- {isDark ? (<SunIcon color={AppColors.purple} size={15}/>) : (<MoonIcon color={AppColors.purple} size={15}/>)}
860
- </View>
861
- <View style={{ flex: 1 }}>
862
- <Text style={{
863
- fontFamily: AppFonts.interBold,
864
- fontSize: 13.5,
865
- lineHeight: 18,
866
- color: AppColors.primaryBlack,
867
- }}>
868
- {t('settings.general.darkMode')}
869
- </Text>
870
- <Text style={{
871
- fontFamily: AppFonts.interRegular,
872
- fontSize: 11,
873
- lineHeight: 15,
874
- color: AppColors.grayText,
875
- marginTop: 1,
876
- }}>
877
- {t('settings.general.darkModeDescription')}
878
- </Text>
879
- </View>
880
- </View>
881
-
882
- <TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Dark Theme" accessibilityState={{ checked: isDark }} onPress={() => {
883
- const newTheme = !isDark;
884
- setIsDark(newTheme);
885
- toggleGlobalTheme(newTheme);
886
- }} style={{
887
- width: 42,
888
- height: 24,
889
- borderRadius: 12,
890
- backgroundColor: isDark
891
- ? AppColors.purple
892
- : AppColors.grayBorderSecondary,
893
- padding: 2,
894
- justifyContent: 'center',
895
- alignItems: isDark ? 'flex-end' : 'flex-start',
896
- }}>
897
- <View style={{
898
- width: 20,
899
- height: 20,
900
- borderRadius: 10,
901
- backgroundColor: AppColors.white,
902
- shadowColor: AppColors.black,
903
- shadowOpacity: 0.18,
904
- shadowRadius: 2,
905
- shadowOffset: { width: 0, height: 1 },
906
- }}/>
907
- </TouchableScale>
908
- </View>
909
- </View>
158
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:14,gap:12}}>
159
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
160
+ {x("settings.appearanceTheme")}
161
+ </S>
162
+
163
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
164
+ <C style={{flexDirection:"row",alignItems:"center",gap:10,flex:1}}>
165
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
166
+ {J?<Mo color={e.purple}size={15}/>:<Eo color={e.purple}size={15}/>}
167
+ </C>
168
+ <C style={{flex:1}}>
169
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
170
+ {x("settings.general.darkMode")}
171
+ </S>
172
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
173
+ {x("settings.general.darkModeDescription")}
174
+ </S>
175
+ </C>
176
+ </C>
177
+
178
+ <H accessible={!0}accessibilityRole="switch"accessibilityLabel="Toggle Dark Theme"accessibilityState={{checked:J}}onPress={()=>{const r=!J;Wr(r),Bo(r)}}style={{width:42,height:24,borderRadius:12,backgroundColor:J?e.purple:e.grayBorderSecondary,padding:2,justifyContent:"center",alignItems:J?"flex-end":"flex-start"}}>
179
+ <C style={{width:20,height:20,borderRadius:10,backgroundColor:e.white,shadowColor:e.black,shadowOpacity:.18,shadowRadius:2,shadowOffset:{width:0,height:1}}}/>
180
+ </H>
181
+ </C>
182
+ </C>
910
183
 
911
184
 
912
- <View style={{
913
- backgroundColor: AppColors.primaryLight,
914
- borderRadius: 14,
915
- borderWidth: 1,
916
- borderColor: AppColors.grayBorderSecondary,
917
- overflow: 'hidden',
918
- padding: 14,
919
- gap: 14,
920
- }}>
921
- <Text style={{
922
- fontFamily: AppFonts.interBold,
923
- fontSize: 11,
924
- lineHeight: 14,
925
- color: AppColors.grayTextWeak,
926
- letterSpacing: 0.8,
927
- }}>
928
- {t('settings.windowLayout')}
929
- </Text>
185
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:14,gap:14}}>
186
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
187
+ {x("settings.windowLayout")}
188
+ </S>
930
189
 
931
190
 
932
- <View style={{ gap: 8 }}>
933
- <View style={{
934
- flexDirection: 'row',
935
- alignItems: 'center',
936
- justifyContent: 'space-between',
937
- gap: 10,
938
- }}>
939
- <View style={{
940
- flexDirection: 'row',
941
- alignItems: 'center',
942
- gap: 10,
943
- flex: 1,
944
- }}>
945
- <View style={{
946
- width: 32,
947
- height: 32,
948
- borderRadius: 8,
949
- backgroundColor: AppColors.purpleShade50,
950
- alignItems: 'center',
951
- justifyContent: 'center',
952
- }}>
953
- <ScreenIcon color={AppColors.purple} size={15}/>
954
- </View>
955
- <View style={{ flex: 1 }}>
956
- <Text style={{
957
- fontFamily: AppFonts.interBold,
958
- fontSize: 13.5,
959
- lineHeight: 18,
960
- color: AppColors.primaryBlack,
961
- }}>
962
- {t('settings.general.modalHeight')}
963
- </Text>
964
- <Text style={{
965
- fontFamily: AppFonts.interRegular,
966
- fontSize: 11,
967
- lineHeight: 15,
968
- color: AppColors.grayText,
969
- marginTop: 1,
970
- }}>
971
- {t('settings.general.modalHeightDescription')}
972
- </Text>
973
- </View>
974
- </View>
975
-
976
- {stagedHeight !== modalHeightPercent && (<TouchableScale onPress={() => {
977
- setModalHeightPercent(stagedHeight);
978
- }} style={{
979
- flexDirection: 'row',
980
- alignItems: 'center',
981
- gap: 5,
982
- backgroundColor: AppColors.purple,
983
- paddingHorizontal: 10,
984
- paddingVertical: 5,
985
- borderRadius: 7,
986
- shadowColor: AppColors.purple,
987
- shadowOffset: { width: 0, height: 1 },
988
- shadowOpacity: 0.28,
989
- shadowRadius: 2,
990
- elevation: 2,
991
- }}>
992
- <CheckIcon size={11} color={AppColors.white}/>
993
- <Text style={{
994
- fontFamily: AppFonts.interBold,
995
- fontSize: 11,
996
- color: AppColors.white,
997
- }}>
998
- Save ({stagedHeight}%)
999
- </Text>
1000
- </TouchableScale>)}
1001
- </View>
1002
-
1003
- <View style={{ marginTop: 6 }}>
1004
- <Slider value={stagedHeight} onValueChange={setStagedHeight} min={50} max={90} step={5} quickPresets={[50, 60, 70, 80, 90]} formatLabel={val => `${Math.round(val)}%`}/>
1005
- </View>
1006
- </View>
1007
-
1008
- <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
191
+ <C style={{gap:8}}>
192
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:10}}>
193
+ <C style={{flexDirection:"row",alignItems:"center",gap:10,flex:1}}>
194
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
195
+ <Sr color={e.purple}size={15}/>
196
+ </C>
197
+ <C style={{flex:1}}>
198
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
199
+ {x("settings.general.modalHeight")}
200
+ </S>
201
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
202
+ {x("settings.general.modalHeightDescription")}
203
+ </S>
204
+ </C>
205
+ </C>
206
+
207
+ {X!==_&&<H onPress={()=>{Ar(X)}}style={{flexDirection:"row",alignItems:"center",gap:5,backgroundColor:e.purple,paddingHorizontal:10,paddingVertical:5,borderRadius:7,shadowColor:e.purple,shadowOffset:{width:0,height:1},shadowOpacity:.28,shadowRadius:2,elevation:2}}>
208
+ <N size={11}color={e.white}/>
209
+ <S style={{fontFamily:k.interBold,fontSize:11,color:e.white}}>
210
+ Save ({X}%)
211
+ </S>
212
+ </H>}
213
+ </C>
214
+
215
+ <C style={{marginTop:6}}>
216
+ <Vo value={X}onValueChange={Xe}min={50}max={90}step={5}quickPresets={[50,60,70,80,90]}formatLabel={r=>`${Math.round(r)}%`}/>
217
+ </C>
218
+ </C>
219
+
220
+ <C style={{height:1,backgroundColor:e.dividerColor}}/>
1009
221
 
1010
222
 
1011
- <View style={{ gap: 8 }}>
1012
- <View style={{
1013
- flexDirection: 'row',
1014
- alignItems: 'center',
1015
- gap: 10,
1016
- }}>
1017
- <View style={{
1018
- width: 32,
1019
- height: 32,
1020
- borderRadius: 8,
1021
- backgroundColor: AppColors.purpleShade50,
1022
- alignItems: 'center',
1023
- justifyContent: 'center',
1024
- }}>
1025
- <MotionIcon color={AppColors.purple} size={15}/>
1026
- </View>
1027
- <View style={{ flex: 1 }}>
1028
- <Text style={{
1029
- fontFamily: AppFonts.interBold,
1030
- fontSize: 13.5,
1031
- lineHeight: 18,
1032
- color: AppColors.primaryBlack,
1033
- }}>
1034
- {t('settings.general.modalAnimation')}
1035
- </Text>
1036
- <Text style={{
1037
- fontFamily: AppFonts.interRegular,
1038
- fontSize: 11,
1039
- lineHeight: 15,
1040
- color: AppColors.grayText,
1041
- marginTop: 1,
1042
- }}>
1043
- {t('settings.general.modalAnimationDescription')}
1044
- </Text>
1045
- </View>
1046
- </View>
1047
-
1048
- <View style={{
1049
- flexDirection: 'row',
1050
- backgroundColor: AppColors.grayBackground,
1051
- borderRadius: 10,
1052
- padding: 3,
1053
- borderWidth: 1,
1054
- borderColor: AppColors.dividerColor,
1055
- }}>
1056
- {[
1057
- { key: 'slide', label: 'Slide Up' },
1058
- { key: 'fade', label: 'Fade' },
1059
- { key: 'none', label: 'None' },
1060
- ].map(opt => {
1061
- const isActive = modalAnimationType === opt.key;
1062
- return (<TouchableScale key={opt.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Set transition animation to ${opt.label}`} accessibilityState={{ selected: isActive }} onPress={() => setModalAnimationType(opt.key)} style={{
1063
- flex: 1,
1064
- paddingVertical: 7,
1065
- alignItems: 'center',
1066
- borderRadius: 8,
1067
- backgroundColor: isActive
1068
- ? AppColors.purple
1069
- : 'transparent',
1070
- }}>
1071
- <Text style={{
1072
- fontFamily: AppFonts.interBold,
1073
- fontSize: 11.5,
1074
- lineHeight: 15,
1075
- color: isActive
1076
- ? AppColors.white
1077
- : AppColors.grayText,
1078
- }}>
1079
- {opt.label}
1080
- </Text>
1081
- </TouchableScale>);
1082
- })}
1083
- </View>
1084
- </View>
1085
- </View>
223
+ <C style={{gap:8}}>
224
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
225
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
226
+ <Oo color={e.purple}size={15}/>
227
+ </C>
228
+ <C style={{flex:1}}>
229
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
230
+ {x("settings.general.modalAnimation")}
231
+ </S>
232
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
233
+ {x("settings.general.modalAnimationDescription")}
234
+ </S>
235
+ </C>
236
+ </C>
237
+
238
+ <C style={{flexDirection:"row",backgroundColor:e.grayBackground,borderRadius:10,padding:3,borderWidth:1,borderColor:e.dividerColor}}>
239
+ {[{key:"slide",label:"Slide Up"},{key:"fade",label:"Fade"},{key:"none",label:"None"}].map(r=>{const V=Pr===r.key;return<H key={r.key}accessible={!0}accessibilityRole="button"accessibilityLabel={`Set transition animation to ${r.label}`}accessibilityState={{selected:V}}onPress={()=>$r(r.key)}style={{flex:1,paddingVertical:7,alignItems:"center",borderRadius:8,backgroundColor:V?e.purple:"transparent"}}>
240
+ <S style={{fontFamily:k.interBold,fontSize:11.5,lineHeight:15,color:V?e.white:e.grayText}}>
241
+ {r.label}
242
+ </S>
243
+ </H>})}
244
+ </C>
245
+ </C>
246
+ </C>
1086
247
 
1087
248
 
1088
- <View style={{
1089
- backgroundColor: AppColors.primaryLight,
1090
- borderRadius: 14,
1091
- borderWidth: 1,
1092
- borderColor: AppColors.grayBorderSecondary,
1093
- overflow: 'hidden',
1094
- padding: 14,
1095
- gap: 12,
1096
- }}>
1097
- <Text style={{
1098
- fontFamily: AppFonts.interBold,
1099
- fontSize: 11,
1100
- lineHeight: 14,
1101
- color: AppColors.grayTextWeak,
1102
- letterSpacing: 0.8,
1103
- }}>
1104
- {t('settings.startupDefault')}
1105
- </Text>
1106
-
1107
- <View style={{
1108
- flexDirection: 'row',
1109
- alignItems: 'center',
1110
- gap: 10,
1111
- }}>
1112
- <View style={{
1113
- width: 32,
1114
- height: 32,
1115
- borderRadius: 8,
1116
- backgroundColor: AppColors.purpleShade50,
1117
- alignItems: 'center',
1118
- justifyContent: 'center',
1119
- }}>
1120
- <LayersIcon color={AppColors.purple} size={15}/>
1121
- </View>
1122
- <View style={{ flex: 1 }}>
1123
- <Text style={{
1124
- fontFamily: AppFonts.interBold,
1125
- fontSize: 13.5,
1126
- lineHeight: 18,
1127
- color: AppColors.primaryBlack,
1128
- }}>
1129
- {t('settings.general.defaultOpeningTab')}
1130
- </Text>
1131
- <Text style={{
1132
- fontFamily: AppFonts.interRegular,
1133
- fontSize: 11,
1134
- lineHeight: 15,
1135
- color: AppColors.grayText,
1136
- marginTop: 1,
1137
- }}>
1138
- {t('settings.general.defaultOpeningTabDesc')}
1139
- </Text>
1140
- </View>
1141
- </View>
249
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:14,gap:12}}>
250
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
251
+ {x("settings.startupDefault")}
252
+ </S>
253
+
254
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
255
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
256
+ <Ce color={e.purple}size={15}/>
257
+ </C>
258
+ <C style={{flex:1}}>
259
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
260
+ {x("settings.general.defaultOpeningTab")}
261
+ </S>
262
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
263
+ {x("settings.general.defaultOpeningTabDesc")}
264
+ </S>
265
+ </C>
266
+ </C>
1142
267
 
1143
268
 
1144
- <View style={{ marginTop: 6, gap: 6 }}>
1145
- <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel={`Default opening tab: ${allModules.find(m => m.key === defaultTab)?.label || 'APIs'}`} onPress={() => setIsDefaultTabDropdownOpen(prev => !prev)} style={{
1146
- flexDirection: 'row',
1147
- alignItems: 'center',
1148
- justifyContent: 'space-between',
1149
- backgroundColor: AppColors.grayBackground,
1150
- borderRadius: 10,
1151
- borderWidth: 1.5,
1152
- borderColor: isDefaultTabDropdownOpen
1153
- ? AppColors.purple
1154
- : AppColors.grayBorderSecondary,
1155
- paddingHorizontal: 14,
1156
- paddingVertical: 11,
1157
- }}>
1158
- <View style={{
1159
- flexDirection: 'row',
1160
- alignItems: 'center',
1161
- gap: 10,
1162
- flex: 1,
1163
- }}>
1164
- <View style={{
1165
- width: 8,
1166
- height: 8,
1167
- borderRadius: 4,
1168
- backgroundColor: AppColors.purple,
1169
- }}/>
1170
- <Text style={{
1171
- fontFamily: AppFonts.interBold,
1172
- fontSize: 13.5,
1173
- lineHeight: 18,
1174
- color: AppColors.primaryBlack,
1175
- }}>
1176
- {allModules.find(m => m.key === defaultTab)
1177
- ? `#${allModules.find(m => m.key === defaultTab)?.id} ${allModules.find(m => m.key === defaultTab)?.label}`
1178
- : '#1 APIs (Network)'}
1179
- </Text>
1180
- <View style={{
1181
- backgroundColor: `${AppColors.purple}14`,
1182
- paddingHorizontal: 6,
1183
- paddingVertical: 1.5,
1184
- borderRadius: 6,
1185
- }}>
1186
- <Text style={{
1187
- fontFamily: AppFonts.interBold,
1188
- fontSize: 8.5,
1189
- color: AppColors.purple,
1190
- }}>
269
+ <C style={{marginTop:6,gap:6}}>
270
+ <H accessible={!0}accessibilityRole="button"accessibilityLabel={`Default opening tab: ${L.find(r=>r.key===U)?.label||"APIs"}`}onPress={()=>Ye(r=>!r)}style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:e.grayBackground,borderRadius:10,borderWidth:1.5,borderColor:Pe?e.purple:e.grayBorderSecondary,paddingHorizontal:14,paddingVertical:11}}>
271
+ <C style={{flexDirection:"row",alignItems:"center",gap:10,flex:1}}>
272
+ <C style={{width:8,height:8,borderRadius:4,backgroundColor:e.purple}}/>
273
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
274
+ {L.find(r=>r.key===U)?`#${L.find(r=>r.key===U)?.id} ${L.find(r=>r.key===U)?.label}`:"#1 APIs (Network)"}
275
+ </S>
276
+ <C style={{backgroundColor:`${e.purple}14`,paddingHorizontal:6,paddingVertical:1.5,borderRadius:6}}>
277
+ <S style={{fontFamily:k.interBold,fontSize:8.5,color:e.purple}}>
1191
278
  DEFAULT
1192
- </Text>
1193
- </View>
1194
- </View>
279
+ </S>
280
+ </C>
281
+ </C>
1195
282
 
1196
- <View style={{
1197
- transform: [
1198
- { rotate: isDefaultTabDropdownOpen ? '180deg' : '0deg' },
1199
- ],
1200
- }}>
1201
- <ChevronDownIcon color={AppColors.grayText} size={15}/>
1202
- </View>
1203
- </TouchableScale>
283
+ <C style={{transform:[{rotate:Pe?"180deg":"0deg"}]}}>
284
+ <Go color={e.grayText}size={15}/>
285
+ </C>
286
+ </H>
1204
287
 
1205
288
 
1206
- {isDefaultTabDropdownOpen && (<View style={{
1207
- backgroundColor: AppColors.primaryLight,
1208
- borderRadius: 10,
1209
- borderWidth: 1,
1210
- borderColor: AppColors.grayBorderSecondary,
1211
- overflow: 'hidden',
1212
- shadowColor: AppColors.black,
1213
- shadowOpacity: 0.08,
1214
- shadowRadius: 6,
1215
- shadowOffset: { width: 0, height: 3 },
1216
- elevation: 4,
1217
- }}>
1218
- {allModules
1219
- .filter(tab => tab.key === 'apis' ||
1220
- stagedTabVisibility?.[tab.key] ||
1221
- tabVisibility?.[tab.key])
1222
- .map((tab, idx, arr) => {
1223
- const isActive = defaultTab === tab.key;
1224
- const isLast = idx === arr.length - 1;
1225
- return (<TouchableScale key={tab.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Select ${tab.label} as default tab`} onPress={() => {
1226
- setDefaultTab(tab.key);
1227
- setIsDefaultTabDropdownOpen(false);
1228
- }} style={{
1229
- flexDirection: 'row',
1230
- alignItems: 'center',
1231
- justifyContent: 'space-between',
1232
- paddingHorizontal: 14,
1233
- paddingVertical: 11,
1234
- backgroundColor: isActive
1235
- ? `${AppColors.purple}0F`
1236
- : 'transparent',
1237
- borderBottomWidth: isLast ? 0 : 1,
1238
- borderBottomColor: AppColors.dividerColor,
1239
- }}>
1240
- <View style={{
1241
- flexDirection: 'row',
1242
- alignItems: 'center',
1243
- gap: 10,
1244
- }}>
1245
- <View style={{
1246
- width: 6,
1247
- height: 6,
1248
- borderRadius: 3,
1249
- backgroundColor: isActive
1250
- ? AppColors.purple
1251
- : AppColors.grayTextWeak,
1252
- }}/>
1253
- <Text style={{
1254
- fontFamily: isActive
1255
- ? AppFonts.interBold
1256
- : AppFonts.interMedium,
1257
- fontSize: 13,
1258
- color: isActive
1259
- ? AppColors.purple
1260
- : AppColors.primaryBlack,
1261
- }}>
1262
- #{tab.id} {tab.label}
1263
- </Text>
1264
- </View>
1265
- {isActive && (<CheckIcon size={14} color={AppColors.purple}/>)}
1266
- </TouchableScale>);
1267
- })}
1268
- </View>)}
1269
- </View>
1270
- </View>
289
+ {Pe&&<C style={{backgroundColor:e.primaryLight,borderRadius:10,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",shadowColor:e.black,shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:3},elevation:4}}>
290
+ {L.filter(r=>r.key==="apis"||M?.[r.key]||T?.[r.key]).map((r,V,D)=>{const v=U===r.key,I=V===D.length-1;return<H key={r.key}accessible={!0}accessibilityRole="button"accessibilityLabel={`Select ${r.label} as default tab`}onPress={()=>{Fr(r.key),Ye(!1)}}style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:14,paddingVertical:11,backgroundColor:v?`${e.purple}0F`:"transparent",borderBottomWidth:I?0:1,borderBottomColor:e.dividerColor}}>
291
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
292
+ <C style={{width:6,height:6,borderRadius:3,backgroundColor:v?e.purple:e.grayTextWeak}}/>
293
+ <S style={{fontFamily:v?k.interBold:k.interMedium,fontSize:13,color:v?e.purple:e.primaryBlack}}>
294
+ #{r.id} {r.label}
295
+ </S>
296
+ </C>
297
+ {v&&<N size={14}color={e.purple}/>}
298
+ </H>})}
299
+ </C>}
300
+ </C>
301
+ </C>
1271
302
 
1272
303
 
1273
- <View style={{
1274
- backgroundColor: AppColors.primaryLight,
1275
- borderRadius: 14,
1276
- borderWidth: 1,
1277
- borderColor: AppColors.grayBorderSecondary,
1278
- overflow: 'hidden',
1279
- padding: 14,
1280
- gap: 12,
1281
- }}>
1282
- <Text style={{
1283
- fontFamily: AppFonts.interBold,
1284
- fontSize: 11,
1285
- lineHeight: 14,
1286
- color: AppColors.grayTextWeak,
1287
- letterSpacing: 0.8,
1288
- }}>
304
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:14,gap:12}}>
305
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
1289
306
  NOTIFICATIONS & TOASTS
1290
- </Text>
1291
-
1292
- <View style={{
1293
- flexDirection: 'row',
1294
- alignItems: 'center',
1295
- justifyContent: 'space-between',
1296
- }}>
1297
- <View style={{
1298
- flexDirection: 'row',
1299
- alignItems: 'center',
1300
- gap: 10,
1301
- flex: 1,
1302
- marginRight: 10,
1303
- }}>
1304
- <View style={{
1305
- width: 32,
1306
- height: 32,
1307
- borderRadius: 8,
1308
- backgroundColor: AppColors.purpleShade50,
1309
- alignItems: 'center',
1310
- justifyContent: 'center',
1311
- }}>
1312
- <PackageIcon color={AppColors.purple} size={15}/>
1313
- </View>
1314
- <View style={{ flex: 1 }}>
1315
- <Text style={{
1316
- fontFamily: AppFonts.interBold,
1317
- fontSize: 13.5,
1318
- lineHeight: 18,
1319
- color: AppColors.primaryBlack,
1320
- }}>
307
+ </S>
308
+
309
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
310
+ <C style={{flexDirection:"row",alignItems:"center",gap:10,flex:1,marginRight:10}}>
311
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
312
+ <Se color={e.purple}size={15}/>
313
+ </C>
314
+ <C style={{flex:1}}>
315
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
1321
316
  NPM Update Toast
1322
- </Text>
1323
- <Text style={{
1324
- fontFamily: AppFonts.interRegular,
1325
- fontSize: 11,
1326
- lineHeight: 15,
1327
- color: AppColors.grayText,
1328
- marginTop: 1,
1329
- }}>
317
+ </S>
318
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
1330
319
  Show a floating toast banner with countdown progress when
1331
320
  a newer release is published on npm.
1332
- </Text>
1333
- </View>
1334
- </View>
1335
-
1336
- <TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle NPM Update Toast" accessibilityState={{ checked: showUpdateToast }} onPress={() => setShowUpdateToast(prev => !prev)} style={{
1337
- width: 42,
1338
- height: 24,
1339
- borderRadius: 12,
1340
- backgroundColor: showUpdateToast
1341
- ? AppColors.purple
1342
- : AppColors.grayBorderSecondary,
1343
- padding: 2,
1344
- justifyContent: 'center',
1345
- alignItems: showUpdateToast ? 'flex-end' : 'flex-start',
1346
- }}>
1347
- <View style={{
1348
- width: 20,
1349
- height: 20,
1350
- borderRadius: 10,
1351
- backgroundColor: AppColors.white,
1352
- shadowColor: AppColors.black,
1353
- shadowOpacity: 0.18,
1354
- shadowRadius: 2,
1355
- shadowOffset: { width: 0, height: 1 },
1356
- }}/>
1357
- </TouchableScale>
1358
- </View>
1359
- </View>
1360
- </View>)}
1361
-
1362
- {settingsActiveSubTab === 'limits' && (<View style={{ gap: 14 }}>
321
+ </S>
322
+ </C>
323
+ </C>
324
+
325
+ <H accessible={!0}accessibilityRole="switch"accessibilityLabel="Toggle NPM Update Toast"accessibilityState={{checked:Be}}onPress={()=>Er(r=>!r)}style={{width:42,height:24,borderRadius:12,backgroundColor:Be?e.purple:e.grayBorderSecondary,padding:2,justifyContent:"center",alignItems:Be?"flex-end":"flex-start"}}>
326
+ <C style={{width:20,height:20,borderRadius:10,backgroundColor:e.white,shadowColor:e.black,shadowOpacity:.18,shadowRadius:2,shadowOffset:{width:0,height:1}}}/>
327
+ </H>
328
+ </C>
329
+ </C>
330
+ </C>}
331
+
332
+ {G==="limits"&&<C style={{gap:14}}>
1363
333
 
1364
- <View style={{
1365
- backgroundColor: AppColors.primaryLight,
1366
- borderRadius: 14,
1367
- borderWidth: 1,
1368
- borderColor: AppColors.grayBorderSecondary,
1369
- overflow: 'hidden',
1370
- padding: 14,
1371
- gap: 12,
1372
- }}>
1373
- <Text style={{
1374
- fontFamily: AppFonts.interBold,
1375
- fontSize: 11,
1376
- lineHeight: 14,
1377
- color: AppColors.grayTextWeak,
1378
- letterSpacing: 0.8,
1379
- }}>
334
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:14,gap:12}}>
335
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
1380
336
  DEVICE MEMORY & AUTO PROFILES
1381
- </Text>
337
+ </S>
1382
338
 
1383
339
 
1384
- <View style={{
1385
- flexDirection: 'row',
1386
- alignItems: 'center',
1387
- justifyContent: 'space-between',
1388
- }}>
1389
- <View style={{
1390
- flexDirection: 'row',
1391
- alignItems: 'center',
1392
- gap: 10,
1393
- flex: 1,
1394
- }}>
1395
- <View style={{
1396
- width: 32,
1397
- height: 32,
1398
- borderRadius: 8,
1399
- backgroundColor: AppColors.purpleShade50,
1400
- alignItems: 'center',
1401
- justifyContent: 'center',
1402
- }}>
1403
- <BrainIcon color={AppColors.purple} size={16}/>
1404
- </View>
1405
- <View style={{ flex: 1 }}>
1406
- <Text style={{
1407
- fontFamily: AppFonts.interBold,
1408
- fontSize: 13.5,
1409
- lineHeight: 18,
1410
- color: AppColors.primaryBlack,
1411
- }}>
340
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
341
+ <C style={{flexDirection:"row",alignItems:"center",gap:10,flex:1}}>
342
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
343
+ <Rr color={e.purple}size={16}/>
344
+ </C>
345
+ <C style={{flex:1}}>
346
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
1412
347
  Auto-Calculate Limits from RAM
1413
- </Text>
1414
- <Text style={{
1415
- fontFamily: AppFonts.interRegular,
1416
- fontSize: 11,
1417
- lineHeight: 15,
1418
- color: AppColors.grayText,
1419
- marginTop: 1,
1420
- }}>
348
+ </S>
349
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
1421
350
  Dynamically sets log limits according to available device
1422
351
  memory
1423
- </Text>
1424
- </View>
1425
- </View>
352
+ </S>
353
+ </C>
354
+ </C>
1426
355
 
1427
- <TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle auto RAM limit calculation" accessibilityState={{ checked: isAutoRamLimitEnabled }} onPress={() => setIsAutoRamLimitEnabled(prev => !prev)} style={{
1428
- width: 42,
1429
- height: 24,
1430
- borderRadius: 12,
1431
- backgroundColor: isAutoRamLimitEnabled
1432
- ? AppColors.purple
1433
- : AppColors.grayBorderSecondary,
1434
- padding: 2,
1435
- justifyContent: 'center',
1436
- alignItems: isAutoRamLimitEnabled
1437
- ? 'flex-end'
1438
- : 'flex-start',
1439
- }}>
1440
- <View style={{
1441
- width: 20,
1442
- height: 20,
1443
- borderRadius: 10,
1444
- backgroundColor: AppColors.white,
1445
- shadowColor: AppColors.black,
1446
- shadowOpacity: 0.18,
1447
- shadowRadius: 2,
1448
- shadowOffset: { width: 0, height: 1 },
1449
- }}/>
1450
- </TouchableScale>
1451
- </View>
356
+ <H accessible={!0}accessibilityRole="switch"accessibilityLabel="Toggle auto RAM limit calculation"accessibilityState={{checked:R}}onPress={()=>Jr(r=>!r)}style={{width:42,height:24,borderRadius:12,backgroundColor:R?e.purple:e.grayBorderSecondary,padding:2,justifyContent:"center",alignItems:R?"flex-end":"flex-start"}}>
357
+ <C style={{width:20,height:20,borderRadius:10,backgroundColor:e.white,shadowColor:e.black,shadowOpacity:.18,shadowRadius:2,shadowOffset:{width:0,height:1}}}/>
358
+ </H>
359
+ </C>
1452
360
 
1453
- <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
361
+ <C style={{height:1,backgroundColor:e.dividerColor}}/>
1454
362
 
1455
363
 
1456
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
1457
- <View style={{
1458
- width: 32,
1459
- height: 32,
1460
- borderRadius: 8,
1461
- backgroundColor: isAutoRamLimitEnabled
1462
- ? `${AppColors.purple}14`
1463
- : AppColors.grayBackground,
1464
- alignItems: 'center',
1465
- justifyContent: 'center',
1466
- }}>
1467
- <SignalIcon color={isAutoRamLimitEnabled
1468
- ? AppColors.purple
1469
- : AppColors.grayTextWeak} size={15}/>
1470
- </View>
1471
- <View style={{ flex: 1 }}>
1472
- <Text style={{
1473
- fontFamily: AppFonts.interBold,
1474
- fontSize: 13.5,
1475
- lineHeight: 18,
1476
- color: isAutoRamLimitEnabled
1477
- ? AppColors.primaryBlack
1478
- : AppColors.grayText,
1479
- }}>
364
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
365
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:R?`${e.purple}14`:e.grayBackground,alignItems:"center",justifyContent:"center"}}>
366
+ <Z color={R?e.purple:e.grayTextWeak}size={15}/>
367
+ </C>
368
+ <C style={{flex:1}}>
369
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:R?e.primaryBlack:e.grayText}}>
1480
370
  Detected Available RAM
1481
- </Text>
1482
- <Text style={{
1483
- fontFamily: AppFonts.interRegular,
1484
- fontSize: 11,
1485
- lineHeight: 15,
1486
- color: AppColors.grayText,
1487
- marginTop: 1,
1488
- }}>
1489
- {deviceFreeRamMb} MB available on device
1490
- </Text>
1491
- </View>
1492
- <View style={{
1493
- paddingHorizontal: 10,
1494
- paddingVertical: 5,
1495
- borderRadius: 8,
1496
- backgroundColor: isAutoRamLimitEnabled
1497
- ? `${AppColors.purple}12`
1498
- : AppColors.grayBackground,
1499
- borderWidth: 1,
1500
- borderColor: isAutoRamLimitEnabled
1501
- ? `${AppColors.purple}26`
1502
- : AppColors.dividerColor,
1503
- }}>
1504
- <Text style={{
1505
- fontFamily: AppFonts.interBold,
1506
- fontSize: 12,
1507
- lineHeight: 15,
1508
- color: isAutoRamLimitEnabled
1509
- ? AppColors.purple
1510
- : AppColors.grayText,
1511
- }}>
1512
- {deviceFreeRamMb} MB
1513
- </Text>
1514
- </View>
1515
- </View>
371
+ </S>
372
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
373
+ {Ie} MB available on device
374
+ </S>
375
+ </C>
376
+ <C style={{paddingHorizontal:10,paddingVertical:5,borderRadius:8,backgroundColor:R?`${e.purple}12`:e.grayBackground,borderWidth:1,borderColor:R?`${e.purple}26`:e.dividerColor}}>
377
+ <S style={{fontFamily:k.interBold,fontSize:12,lineHeight:15,color:R?e.purple:e.grayText}}>
378
+ {Ie} MB
379
+ </S>
380
+ </C>
381
+ </C>
1516
382
 
1517
383
 
1518
- <View style={{
1519
- marginTop: 4,
1520
- paddingTop: 8,
1521
- borderTopWidth: 1,
1522
- borderTopColor: AppColors.dividerColor,
1523
- gap: 6,
1524
- }}>
1525
- <View style={{
1526
- flexDirection: 'row',
1527
- alignItems: 'center',
1528
- justifyContent: 'space-between',
1529
- }}>
1530
- <Text style={{
1531
- fontFamily: AppFonts.interBold,
1532
- fontSize: 11.5,
1533
- lineHeight: 15,
1534
- color: AppColors.purple,
1535
- }}>
1536
- Profile: {autoRamProfile.profileName}
1537
- </Text>
1538
- <View style={{
1539
- backgroundColor: isAutoRamLimitEnabled
1540
- ? `${AppColors.emerald500}18`
1541
- : `${AppColors.purple}18`,
1542
- paddingHorizontal: 7,
1543
- paddingVertical: 2.5,
1544
- borderRadius: 4,
1545
- }}>
1546
- <Text style={{
1547
- fontFamily: AppFonts.interBold,
1548
- fontSize: 9.5,
1549
- color: isAutoRamLimitEnabled
1550
- ? AppColors.emerald500
1551
- : AppColors.purple,
1552
- }}>
1553
- {isAutoRamLimitEnabled ? 'AUTO-TUNED' : 'MANUAL'}
1554
- </Text>
1555
- </View>
1556
- </View>
1557
-
1558
- <View style={{
1559
- flexDirection: 'row',
1560
- flexWrap: 'wrap',
1561
- gap: 8,
1562
- marginTop: 4,
1563
- }}>
1564
- {[
1565
- {
1566
- label: 'APIs',
1567
- value: isAutoRamLimitEnabled
1568
- ? autoRamProfile.maxNetworkLogs
1569
- : maxNetworkLogs,
1570
- color: AppColors.blue500,
1571
- },
1572
- {
1573
- label: 'Logs',
1574
- value: isAutoRamLimitEnabled
1575
- ? autoRamProfile.maxConsoleLogs
1576
- : maxConsoleLogs,
1577
- color: AppColors.sky500,
1578
- },
1579
- {
1580
- label: 'Analytics',
1581
- value: isAutoRamLimitEnabled
1582
- ? autoRamProfile.maxAnalyticsEvents
1583
- : maxAnalyticsEventsLimit,
1584
- color: AppColors.purple,
1585
- },
1586
- {
1587
- label: 'Crash',
1588
- value: isAutoRamLimitEnabled
1589
- ? autoRamProfile.maxCrashRecords
1590
- : maxCrashLogs,
1591
- color: AppColors.errorColor,
1592
- },
1593
- ].map(item => (<View key={item.label} style={{
1594
- flexDirection: 'row',
1595
- alignItems: 'center',
1596
- gap: 4,
1597
- paddingHorizontal: 8,
1598
- paddingVertical: 4,
1599
- borderRadius: 6,
1600
- backgroundColor: `${item.color}14`,
1601
- borderWidth: 1,
1602
- borderColor: `${item.color}33`,
1603
- }}>
1604
- <Text style={{
1605
- fontFamily: AppFonts.interBold,
1606
- fontSize: 10.5,
1607
- lineHeight: 14,
1608
- color: item.color,
1609
- }}>
1610
- {item.label}:
1611
- </Text>
1612
- <Text style={{
1613
- fontFamily: AppFonts.interBold,
1614
- fontSize: 10.5,
1615
- lineHeight: 14,
1616
- color: item.color,
1617
- }}>
1618
- {item.value} max
1619
- </Text>
1620
- </View>))}
1621
- </View>
1622
- </View>
1623
- </View>
384
+ <C style={{marginTop:4,paddingTop:8,borderTopWidth:1,borderTopColor:e.dividerColor,gap:6}}>
385
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
386
+ <S style={{fontFamily:k.interBold,fontSize:11.5,lineHeight:15,color:e.purple}}>
387
+ Profile: {K.profileName}
388
+ </S>
389
+ <C style={{backgroundColor:R?`${e.emerald500}18`:`${e.purple}18`,paddingHorizontal:7,paddingVertical:2.5,borderRadius:4}}>
390
+ <S style={{fontFamily:k.interBold,fontSize:9.5,color:R?e.emerald500:e.purple}}>
391
+ {R?"AUTO-TUNED":"MANUAL"}
392
+ </S>
393
+ </C>
394
+ </C>
395
+
396
+ <C style={{flexDirection:"row",flexWrap:"wrap",gap:8,marginTop:4}}>
397
+ {[{label:"APIs",value:R?K.maxNetworkLogs:De,color:e.blue500},{label:"Logs",value:R?K.maxConsoleLogs:Le,color:e.sky500},{label:"Analytics",value:R?K.maxAnalyticsEvents:_e,color:e.purple},{label:"Crash",value:R?K.maxCrashRecords:Qe,color:e.errorColor}].map(r=><C key={r.label}style={{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${r.color}14`,borderWidth:1,borderColor:`${r.color}33`}}>
398
+ <S style={{fontFamily:k.interBold,fontSize:10.5,lineHeight:14,color:r.color}}>
399
+ {r.label}:
400
+ </S>
401
+ <S style={{fontFamily:k.interBold,fontSize:10.5,lineHeight:14,color:r.color}}>
402
+ {r.value} max
403
+ </S>
404
+ </C>)}
405
+ </C>
406
+ </C>
407
+ </C>
1624
408
 
1625
409
 
1626
- <View style={{
1627
- backgroundColor: AppColors.primaryLight,
1628
- borderRadius: 14,
1629
- borderWidth: 1,
1630
- borderColor: AppColors.grayBorderSecondary,
1631
- overflow: 'hidden',
1632
- padding: 14,
1633
- gap: 12,
1634
- }}>
1635
- <Text style={{
1636
- fontFamily: AppFonts.interBold,
1637
- fontSize: 11,
1638
- lineHeight: 14,
1639
- color: AppColors.grayTextWeak,
1640
- letterSpacing: 0.8,
1641
- }}>
410
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:14,gap:12}}>
411
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
1642
412
  LOW MEMORY PRESSURE PROTECTION
1643
- </Text>
1644
-
1645
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
1646
- <View style={{
1647
- width: 32,
1648
- height: 32,
1649
- borderRadius: 8,
1650
- backgroundColor: `${AppColors.emerald500}14`,
1651
- alignItems: 'center',
1652
- justifyContent: 'center',
1653
- }}>
1654
- <ShieldAlertIcon color={AppColors.emerald500} size={15}/>
1655
- </View>
1656
- <View style={{ flex: 1 }}>
1657
- <Text style={{
1658
- fontFamily: AppFonts.interBold,
1659
- fontSize: 13.5,
1660
- lineHeight: 18,
1661
- color: AppColors.primaryBlack,
1662
- }}>
413
+ </S>
414
+
415
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
416
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:`${e.emerald500}14`,alignItems:"center",justifyContent:"center"}}>
417
+ <Br color={e.emerald500}size={15}/>
418
+ </C>
419
+ <C style={{flex:1}}>
420
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
1663
421
  OS Memory Warning Guard
1664
- </Text>
1665
- <Text style={{
1666
- fontFamily: AppFonts.interRegular,
1667
- fontSize: 11,
1668
- lineHeight: 15,
1669
- color: AppColors.grayText,
1670
- marginTop: 1,
1671
- }}>
422
+ </S>
423
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
1672
424
  Automatically prunes in-memory buffers by 50% when the OS
1673
425
  signals low memory
1674
- </Text>
1675
- </View>
1676
- <View style={{
1677
- paddingHorizontal: 8,
1678
- paddingVertical: 3,
1679
- borderRadius: 6,
1680
- backgroundColor: `${AppColors.emerald500}18`,
1681
- }}>
1682
- <Text style={{
1683
- fontFamily: AppFonts.interBold,
1684
- fontSize: 10,
1685
- color: AppColors.emerald500,
1686
- }}>
426
+ </S>
427
+ </C>
428
+ <C style={{paddingHorizontal:8,paddingVertical:3,borderRadius:6,backgroundColor:`${e.emerald500}18`}}>
429
+ <S style={{fontFamily:k.interBold,fontSize:10,color:e.emerald500}}>
1687
430
  ACTIVE
1688
- </Text>
1689
- </View>
1690
- </View>
431
+ </S>
432
+ </C>
433
+ </C>
1691
434
 
1692
- <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
435
+ <C style={{height:1,backgroundColor:e.dividerColor}}/>
1693
436
 
1694
437
 
1695
- <View style={{
1696
- flexDirection: 'row',
1697
- alignItems: 'center',
1698
- justifyContent: 'space-between',
1699
- gap: 10,
1700
- }}>
1701
- <View style={{ flex: 1 }}>
1702
- <Text style={{
1703
- fontFamily: AppFonts.interBold,
1704
- fontSize: 13,
1705
- color: AppColors.primaryBlack,
1706
- }}>
438
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:10}}>
439
+ <C style={{flex:1}}>
440
+ <S style={{fontFamily:k.interBold,fontSize:13,color:e.primaryBlack}}>
1707
441
  Manual Memory Cleanup
1708
- </Text>
1709
- <Text style={{
1710
- fontFamily: AppFonts.interRegular,
1711
- fontSize: 11,
1712
- color: AppColors.grayText,
1713
- marginTop: 1,
1714
- }}>
442
+ </S>
443
+ <S style={{fontFamily:k.interRegular,fontSize:11,color:e.grayText,marginTop:1}}>
1715
444
  Prune older entries across all log stores and free RAM
1716
- </Text>
1717
- </View>
1718
- <TouchableScale onPress={() => {
1719
- const summary = pruneAllLogs('manual', 0.5);
1720
- showToast(`Pruned ${summary.totalPruned} items from memory`);
1721
- }} style={{
1722
- backgroundColor: AppColors.purple,
1723
- paddingHorizontal: 12,
1724
- paddingVertical: 8,
1725
- borderRadius: 8,
1726
- flexDirection: 'row',
1727
- alignItems: 'center',
1728
- gap: 5,
1729
- }}>
1730
- <TrashIcon size={13} color={AppColors.white}/>
1731
- <Text style={{
1732
- fontFamily: AppFonts.interBold,
1733
- fontSize: 11.5,
1734
- color: AppColors.white,
1735
- }}>
445
+ </S>
446
+ </C>
447
+ <H onPress={()=>{const r=St("manual",.5);Dr(`Pruned ${r.totalPruned} items from memory`)}}style={{backgroundColor:e.purple,paddingHorizontal:12,paddingVertical:8,borderRadius:8,flexDirection:"row",alignItems:"center",gap:5}}>
448
+ <P size={13}color={e.white}/>
449
+ <S style={{fontFamily:k.interBold,fontSize:11.5,color:e.white}}>
1736
450
  Prune Now
1737
- </Text>
1738
- </TouchableScale>
1739
- </View>
1740
- </View>
1741
- </View>)}
1742
- {settingsActiveSubTab === 'capture' && (<View style={{ gap: 12 }}>
451
+ </S>
452
+ </H>
453
+ </C>
454
+ </C>
455
+ </C>}
456
+ {G==="capture"&&<C style={{gap:12}}>
1743
457
 
1744
- <View style={{
1745
- backgroundColor: AppColors.primaryLight,
1746
- padding: 16,
1747
- borderRadius: 14,
1748
- borderWidth: 1,
1749
- borderColor: AppColors.grayBorderSecondary,
1750
- gap: 12,
1751
- }}>
1752
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
1753
- <View style={{
1754
- width: 36,
1755
- height: 36,
1756
- borderRadius: 10,
1757
- backgroundColor: AppColors.purpleShade50,
1758
- alignItems: 'center',
1759
- justifyContent: 'center',
1760
- }}>
1761
- <CameraIcon color={AppColors.purple} size={16}/>
1762
- </View>
1763
- <View style={{ flex: 1 }}>
1764
- <Text style={{
1765
- fontFamily: AppFonts.interBold,
1766
- fontSize: 14,
1767
- lineHeight: 18,
1768
- color: AppColors.primaryBlack,
1769
- }}>
1770
- {t('settings.media.screenshotCardTitle', 'Screenshot Capture Settings')}
1771
- </Text>
1772
- <Text style={{
1773
- fontFamily: AppFonts.interRegular,
1774
- fontSize: 11,
1775
- lineHeight: 15,
1776
- color: AppColors.grayText,
1777
- marginTop: 1,
1778
- }}>
1779
- {t('settings.media.screenshotCardDesc', 'Image encoding format, compression quality and overlay auto-hide')}
1780
- </Text>
1781
- </View>
1782
- </View>
1783
-
1784
- {renderSettingRow({
1785
- icon: <ImageIcon color={AppColors.purple} size={16}/>,
1786
- label: t('settings.media.imageFormat', 'Image Format'),
1787
- description: t('settings.media.imageFormatDesc', 'Export formats (PNG lossless, JPEG lossy, WebP)'),
1788
- right: (<View style={{ flexDirection: 'row', gap: 4 }}>
1789
- {['PNG', 'JPEG', 'WEBP'].map(fmt => (<View key={fmt} style={{
1790
- paddingHorizontal: 8,
1791
- paddingVertical: 4,
1792
- borderRadius: 6,
1793
- backgroundColor: fmt === 'PNG'
1794
- ? AppColors.purple
1795
- : `${AppColors.purple}1A`,
1796
- }}>
1797
- <Text style={{
1798
- fontFamily: AppFonts.interBold,
1799
- fontSize: 10,
1800
- color: fmt === 'PNG'
1801
- ? AppColors.white
1802
- : AppColors.purple,
1803
- }}>
1804
- {fmt}
1805
- </Text>
1806
- </View>))}
1807
- </View>),
1808
- })}
1809
-
1810
- {renderSettingRow({
1811
- icon: <EyeIcon color={AppColors.purple} size={16}/>,
1812
- label: t('settings.media.autoHide', 'Auto-Hide Inspector During Capture'),
1813
- description: t('settings.media.autoHideDesc', 'Temporarily hides the inspector overlay during screen capture'),
1814
- isLast: true,
1815
- right: (<View style={{
1816
- paddingHorizontal: 8,
1817
- paddingVertical: 4,
1818
- borderRadius: 6,
1819
- backgroundColor: `${AppColors.emerald500}26`,
1820
- }}>
1821
- <Text style={{
1822
- fontFamily: AppFonts.interBold,
1823
- fontSize: 10,
1824
- color: AppColors.emerald500,
1825
- }}>
1826
- {t('settings.media.enabled', 'ON')}
1827
- </Text>
1828
- </View>),
1829
- })}
1830
- </View>
458
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:12}}>
459
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
460
+ <C style={{width:36,height:36,borderRadius:10,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
461
+ <Hr color={e.purple}size={16}/>
462
+ </C>
463
+ <C style={{flex:1}}>
464
+ <S style={{fontFamily:k.interBold,fontSize:14,lineHeight:18,color:e.primaryBlack}}>
465
+ {x("settings.media.screenshotCardTitle","Screenshot Capture Settings")}
466
+ </S>
467
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
468
+ {x("settings.media.screenshotCardDesc","Image encoding format, compression quality and overlay auto-hide")}
469
+ </S>
470
+ </C>
471
+ </C>
472
+
473
+ {z({icon:<Ct color={e.purple}size={16}/>,label:x("settings.media.imageFormat","Image Format"),description:x("settings.media.imageFormatDesc","Export formats (PNG lossless, JPEG lossy, WebP)"),right:<C style={{flexDirection:"row",gap:4}}>
474
+ {["PNG","JPEG","WEBP"].map(r=><C key={r}style={{paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:r==="PNG"?e.purple:`${e.purple}1A`}}>
475
+ <S style={{fontFamily:k.interBold,fontSize:10,color:r==="PNG"?e.white:e.purple}}>
476
+ {r}
477
+ </S>
478
+ </C>)}
479
+ </C>})}
480
+
481
+ {z({icon:<Tr color={e.purple}size={16}/>,label:x("settings.media.autoHide","Auto-Hide Inspector During Capture"),description:x("settings.media.autoHideDesc","Temporarily hides the inspector overlay during screen capture"),isLast:!0,right:<C style={{paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${e.emerald500}26`}}>
482
+ <S style={{fontFamily:k.interBold,fontSize:10,color:e.emerald500}}>
483
+ {x("settings.media.enabled","ON")}
484
+ </S>
485
+ </C>})}
486
+ </C>
1831
487
 
1832
488
 
1833
- <View style={{
1834
- backgroundColor: AppColors.primaryLight,
1835
- padding: 16,
1836
- borderRadius: 14,
1837
- borderWidth: 1,
1838
- borderColor: AppColors.grayBorderSecondary,
1839
- gap: 12,
1840
- }}>
1841
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
1842
- <View style={{
1843
- width: 36,
1844
- height: 36,
1845
- borderRadius: 10,
1846
- backgroundColor: AppColors.purpleShade50,
1847
- alignItems: 'center',
1848
- justifyContent: 'center',
1849
- }}>
1850
- <VideoCameraIcon color={AppColors.purple} size={16}/>
1851
- </View>
1852
- <View style={{ flex: 1 }}>
1853
- <Text style={{
1854
- fontFamily: AppFonts.interBold,
1855
- fontSize: 14,
1856
- lineHeight: 18,
1857
- color: AppColors.primaryBlack,
1858
- }}>
1859
- {t('settings.media.videoCardTitle', 'Video Recording & GIF Conversion')}
1860
- </Text>
1861
- <Text style={{
1862
- fontFamily: AppFonts.interRegular,
1863
- fontSize: 11,
1864
- lineHeight: 15,
1865
- color: AppColors.grayText,
1866
- marginTop: 1,
1867
- }}>
1868
- {t('settings.media.videoCardDesc', 'ReplayKit hardware encoding, frame capture fallback and GIF generation')}
1869
- </Text>
1870
- </View>
1871
- </View>
1872
-
1873
- {renderSettingRow({
1874
- icon: <MicrophoneIcon color={AppColors.purple} size={16}/>,
1875
- label: t('settings.media.audioMode', 'Audio Source'),
1876
- description: t('settings.media.audioModeDesc', 'Record video with muted, app audio, or microphone commentary'),
1877
- right: (<View style={{ flexDirection: 'row', gap: 4 }}>
1878
- {['Muted', 'App', 'Mic'].map((aud, i) => (<View key={aud} style={{
1879
- paddingHorizontal: 7,
1880
- paddingVertical: 4,
1881
- borderRadius: 6,
1882
- backgroundColor: i === 0
1883
- ? AppColors.purple
1884
- : `${AppColors.purple}1A`,
1885
- }}>
1886
- <Text style={{
1887
- fontFamily: AppFonts.interBold,
1888
- fontSize: 10,
1889
- color: i === 0 ? AppColors.white : AppColors.purple,
1890
- }}>
1891
- {aud}
1892
- </Text>
1893
- </View>))}
1894
- </View>),
1895
- })}
1896
-
1897
- {renderSettingRow({
1898
- icon: <FilmIcon color={AppColors.purple} size={16}/>,
1899
- label: t('settings.media.frameRate', 'Recording Frame Rate (FPS)'),
1900
- description: t('settings.media.frameRateDesc', 'Target video smoothness: 15, 24, 30, or 60 FPS'),
1901
- right: (<View style={{ flexDirection: 'row', gap: 4 }}>
1902
- {['15', '24', '30', '60'].map(fps => (<View key={fps} style={{
1903
- paddingHorizontal: 6,
1904
- paddingVertical: 4,
1905
- borderRadius: 6,
1906
- backgroundColor: fps === '24'
1907
- ? AppColors.purple
1908
- : `${AppColors.purple}1A`,
1909
- }}>
1910
- <Text style={{
1911
- fontFamily: AppFonts.interBold,
1912
- fontSize: 10,
1913
- color: fps === '24' ? AppColors.white : AppColors.purple,
1914
- }}>
1915
- {fps}fps
1916
- </Text>
1917
- </View>))}
1918
- </View>),
1919
- })}
1920
-
1921
- {renderSettingRow({
1922
- icon: <GifIcon color={AppColors.purple} size={16}/>,
1923
- label: t('settings.media.gifAutoOpt', 'Auto GIF Optimization'),
1924
- description: t('settings.media.gifAutoOptDesc', 'Automatic palette reduction and frame skip for lightweight animated GIFs'),
1925
- isLast: true,
1926
- right: (<View style={{
1927
- paddingHorizontal: 8,
1928
- paddingVertical: 4,
1929
- borderRadius: 6,
1930
- backgroundColor: `${AppColors.emerald500}26`,
1931
- }}>
1932
- <Text style={{
1933
- fontFamily: AppFonts.interBold,
1934
- fontSize: 10,
1935
- color: AppColors.emerald500,
1936
- }}>
489
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:12}}>
490
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
491
+ <C style={{width:36,height:36,borderRadius:10,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
492
+ <Xo color={e.purple}size={16}/>
493
+ </C>
494
+ <C style={{flex:1}}>
495
+ <S style={{fontFamily:k.interBold,fontSize:14,lineHeight:18,color:e.primaryBlack}}>
496
+ {x("settings.media.videoCardTitle","Video Recording & GIF Conversion")}
497
+ </S>
498
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
499
+ {x("settings.media.videoCardDesc","ReplayKit hardware encoding, frame capture fallback and GIF generation")}
500
+ </S>
501
+ </C>
502
+ </C>
503
+
504
+ {z({icon:<Yo color={e.purple}size={16}/>,label:x("settings.media.audioMode","Audio Source"),description:x("settings.media.audioModeDesc","Record video with muted, app audio, or microphone commentary"),right:<C style={{flexDirection:"row",gap:4}}>
505
+ {["Muted","App","Mic"].map((r,V)=><C key={r}style={{paddingHorizontal:7,paddingVertical:4,borderRadius:6,backgroundColor:V===0?e.purple:`${e.purple}1A`}}>
506
+ <S style={{fontFamily:k.interBold,fontSize:10,color:V===0?e.white:e.purple}}>
507
+ {r}
508
+ </S>
509
+ </C>)}
510
+ </C>})}
511
+
512
+ {z({icon:<Ko color={e.purple}size={16}/>,label:x("settings.media.frameRate","Recording Frame Rate (FPS)"),description:x("settings.media.frameRateDesc","Target video smoothness: 15, 24, 30, or 60 FPS"),right:<C style={{flexDirection:"row",gap:4}}>
513
+ {["15","24","30","60"].map(r=><C key={r}style={{paddingHorizontal:6,paddingVertical:4,borderRadius:6,backgroundColor:r==="24"?e.purple:`${e.purple}1A`}}>
514
+ <S style={{fontFamily:k.interBold,fontSize:10,color:r==="24"?e.white:e.purple}}>
515
+ {r}fps
516
+ </S>
517
+ </C>)}
518
+ </C>})}
519
+
520
+ {z({icon:<Zo color={e.purple}size={16}/>,label:x("settings.media.gifAutoOpt","Auto GIF Optimization"),description:x("settings.media.gifAutoOptDesc","Automatic palette reduction and frame skip for lightweight animated GIFs"),isLast:!0,right:<C style={{paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${e.emerald500}26`}}>
521
+ <S style={{fontFamily:k.interBold,fontSize:10,color:e.emerald500}}>
1937
522
  ON
1938
- </Text>
1939
- </View>),
1940
- })}
1941
- </View>
523
+ </S>
524
+ </C>})}
525
+ </C>
1942
526
 
1943
527
 
1944
- <View style={{
1945
- backgroundColor: AppColors.primaryLight,
1946
- borderRadius: 14,
1947
- borderWidth: 1,
1948
- borderColor: AppColors.grayBorderSecondary,
1949
- padding: 16,
1950
- }}>
1951
- {renderSettingRow({
1952
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
1953
- label: t('settings.media.purgeAll', 'Purge Captured Media Cache'),
1954
- description: t('settings.media.purgeAllDesc', 'Delete all local screenshots, screen recordings and converted GIFs'),
1955
- isLast: true,
1956
- onPress: () => {
1957
- Alert.alert(t('settings.media.purgeConfirmTitle', 'Purge Media Storage?'), t('settings.media.purgeConfirmMessage', 'This will permanently delete all captured screenshots and videos from disk.'), [
1958
- { text: t('common.cancel', 'Cancel'), style: 'cancel' },
1959
- {
1960
- text: t('settings.media.purgeCacheBtn', 'Purge All'),
1961
- style: 'destructive',
1962
- onPress: async () => {
1963
- await ScreenCapture.clearAllMedia();
1964
- showToast(t('settings.media.purgedSuccess', 'Media cache cleared successfully'));
1965
- },
1966
- },
1967
- ]);
1968
- },
1969
- right: (<View style={{
1970
- paddingHorizontal: 12,
1971
- paddingVertical: 6,
1972
- borderRadius: 8,
1973
- backgroundColor: `${AppColors.errorColor}14`,
1974
- borderWidth: 1,
1975
- borderColor: `${AppColors.errorColor}33`,
1976
- }}>
1977
- <Text style={{
1978
- fontFamily: AppFonts.interBold,
1979
- fontSize: 11,
1980
- lineHeight: 14,
1981
- color: AppColors.errorColor,
1982
- }}>
1983
- {t('settings.media.purgeCacheBtn', 'Purge All')}
1984
- </Text>
1985
- </View>),
1986
- })}
1987
- </View>
1988
- </View>)}
1989
- {settingsActiveSubTab === 'about' && (<View style={{ gap: 14 }}>
1990
-
1991
- <View style={{
1992
- backgroundColor: AppColors.primaryLight,
1993
- borderRadius: 14,
1994
- borderWidth: 1,
1995
- borderColor: AppColors.grayBorderSecondary,
1996
- padding: 16,
1997
- gap: 12,
1998
- }}>
1999
- <View style={{
2000
- flexDirection: 'row',
2001
- alignItems: 'center',
2002
- justifyContent: 'space-between',
2003
- }}>
2004
- <View style={{
2005
- flexDirection: 'row',
2006
- alignItems: 'center',
2007
- gap: 12,
2008
- flex: 1,
2009
- }}>
2010
- <View style={{
2011
- width: 44,
2012
- height: 44,
2013
- borderRadius: 12,
2014
- backgroundColor: `${AppColors.purple}1A`,
2015
- alignItems: 'center',
2016
- justifyContent: 'center',
2017
- borderWidth: 1,
2018
- borderColor: `${AppColors.purple}33`,
2019
- }}>
2020
- <PackageIcon color={AppColors.purple} size={22}/>
2021
- </View>
2022
- <View style={{ flex: 1 }}>
2023
- <View style={{
2024
- flexDirection: 'row',
2025
- alignItems: 'center',
2026
- gap: 8,
2027
- flexWrap: 'wrap',
2028
- }}>
2029
- <Text style={{
2030
- fontFamily: AppFonts.interBold,
2031
- fontSize: 15,
2032
- lineHeight: 20,
2033
- color: AppColors.primaryBlack,
2034
- }}>
2035
- In-App Inspector
2036
- </Text>
2037
- <View style={{
2038
- backgroundColor: `${AppColors.purple}18`,
2039
- paddingHorizontal: 7,
2040
- paddingVertical: 2,
2041
- borderRadius: 6,
2042
- borderWidth: 1,
2043
- borderColor: `${AppColors.purple}33`,
2044
- }}>
2045
- <Text style={{
2046
- fontFamily: AppFonts.interBold,
2047
- fontSize: 10,
2048
- color: AppColors.purple,
2049
- }}>
2050
- v{LIB_VERSION}
2051
- </Text>
2052
- </View>
2053
- {updateAvailable ? (<View style={{
2054
- flexDirection: 'row',
2055
- alignItems: 'center',
2056
- gap: 3,
2057
- backgroundColor: '#F59E0B20',
2058
- paddingHorizontal: 6,
2059
- paddingVertical: 2,
2060
- borderRadius: 6,
2061
- borderWidth: 1,
2062
- borderColor: '#F59E0B60',
2063
- }}>
2064
- <Text style={{
2065
- fontFamily: AppFonts.interBold,
2066
- fontSize: 9.5,
2067
- color: '#D97706',
2068
- }}>
2069
- v{latestNpmVersion} Available
2070
- </Text>
2071
- <BoltIcon size={9} color="#D97706"/>
2072
- </View>) : (<View style={{
2073
- backgroundColor: `${AppColors.emerald500}20`,
2074
- paddingHorizontal: 6,
2075
- paddingVertical: 2,
2076
- borderRadius: 6,
2077
- borderWidth: 1,
2078
- borderColor: `${AppColors.emerald500}50`,
2079
- }}>
2080
- <Text style={{
2081
- fontFamily: AppFonts.interBold,
2082
- fontSize: 9.5,
2083
- color: AppColors.emerald600,
2084
- }}>
2085
- Up to date
2086
- </Text>
2087
- </View>)}
2088
- </View>
2089
- <Text style={{
2090
- fontFamily: AppFonts.interRegular,
2091
- fontSize: 11,
2092
- lineHeight: 15,
2093
- color: AppColors.grayText,
2094
- marginTop: 2,
2095
- }}>
2096
- react-native-inapp-inspector
2097
- </Text>
2098
- </View>
2099
- </View>
2100
- </View>
2101
-
2102
- <Text style={{
2103
- fontFamily: AppFonts.interRegular,
2104
- fontSize: 11.5,
2105
- lineHeight: 16,
2106
- color: AppColors.grayText,
2107
- }}>
2108
- High-performance in-app debugging, network logging, console
2109
- inspection, performance profiling, storage viewer & telemetry
2110
- diagnostics for React Native.
2111
- </Text>
2112
-
2113
- {updateAvailable && (<TouchableScale onPress={() => {
2114
- copyToClipboard('npm install react-native-inapp-inspector@latest', 'Install Command');
2115
- showToast('Copied npm upgrade command!');
2116
- }} style={{
2117
- backgroundColor: AppColors.purple,
2118
- paddingVertical: 8,
2119
- paddingHorizontal: 12,
2120
- borderRadius: 8,
2121
- flexDirection: 'row',
2122
- alignItems: 'center',
2123
- justifyContent: 'center',
2124
- gap: 6,
2125
- }}>
2126
- <BoltIcon size={12} color={AppColors.white}/>
2127
- <Text style={{
2128
- fontFamily: AppFonts.interBold,
2129
- fontSize: 12,
2130
- color: AppColors.white,
2131
- }}>
2132
- Copy Upgrade Command (v{latestNpmVersion})
2133
- </Text>
2134
- </TouchableScale>)}
2135
- </View>
2136
-
2137
-
2138
- <View style={{
2139
- flexDirection: 'row',
2140
- flexWrap: 'wrap',
2141
- gap: 8,
2142
- }}>
2143
- <TouchableScale onPress={() => {
2144
- Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector').catch(() => { });
2145
- }} style={{
2146
- flex: 1,
2147
- minWidth: '47%',
2148
- backgroundColor: `${AppColors.purple}0F`,
2149
- borderRadius: 12,
2150
- borderWidth: 1,
2151
- borderColor: `${AppColors.purple}30`,
2152
- paddingVertical: 10,
2153
- paddingHorizontal: 12,
2154
- flexDirection: 'row',
2155
- alignItems: 'center',
2156
- gap: 8,
2157
- }}>
2158
- <GitHubIcon color={AppColors.purple} size={18}/>
2159
- <View style={{ flex: 1 }}>
2160
- <Text style={{
2161
- fontFamily: AppFonts.interBold,
2162
- fontSize: 11.5,
2163
- color: AppColors.primaryBlack,
2164
- }}>
2165
- ⭐ Star on GitHub
2166
- </Text>
2167
- <Text style={{
2168
- fontFamily: AppFonts.interRegular,
2169
- fontSize: 9.5,
2170
- color: AppColors.grayText,
2171
- }}>
2172
- Support open source
2173
- </Text>
2174
- </View>
2175
- </TouchableScale>
2176
-
2177
- <TouchableScale onPress={() => {
2178
- Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { });
2179
- }} style={{
2180
- flex: 1,
2181
- minWidth: '47%',
2182
- backgroundColor: AppColors.primaryLight,
2183
- borderRadius: 12,
2184
- borderWidth: 1,
2185
- borderColor: AppColors.grayBorderSecondary,
2186
- paddingVertical: 10,
2187
- paddingHorizontal: 12,
2188
- flexDirection: 'row',
2189
- alignItems: 'center',
2190
- gap: 8,
2191
- }}>
2192
- <NpmIcon color="#CB3837" size={18}/>
2193
- <View style={{ flex: 1 }}>
2194
- <Text style={{
2195
- fontFamily: AppFonts.interBold,
2196
- fontSize: 11.5,
2197
- color: AppColors.primaryBlack,
2198
- }}>
2199
- NPM Registry
2200
- </Text>
2201
- <Text style={{
2202
- fontFamily: AppFonts.interRegular,
2203
- fontSize: 9.5,
2204
- color: AppColors.grayText,
2205
- }}>
2206
- Package repository
2207
- </Text>
2208
- </View>
2209
- </TouchableScale>
2210
-
2211
- <TouchableScale onPress={() => {
2212
- Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector#readme').catch(() => { });
2213
- }} style={{
2214
- flex: 1,
2215
- minWidth: '47%',
2216
- backgroundColor: AppColors.primaryLight,
2217
- borderRadius: 12,
2218
- borderWidth: 1,
2219
- borderColor: AppColors.grayBorderSecondary,
2220
- paddingVertical: 10,
2221
- paddingHorizontal: 12,
2222
- flexDirection: 'row',
2223
- alignItems: 'center',
2224
- gap: 8,
2225
- }}>
2226
- <Text style={{ fontSize: 16 }}>📖</Text>
2227
- <View style={{ flex: 1 }}>
2228
- <Text style={{
2229
- fontFamily: AppFonts.interBold,
2230
- fontSize: 11.5,
2231
- color: AppColors.primaryBlack,
2232
- }}>
2233
- Documentation
2234
- </Text>
2235
- <Text style={{
2236
- fontFamily: AppFonts.interRegular,
2237
- fontSize: 9.5,
2238
- color: AppColors.grayText,
2239
- }}>
2240
- Setup & API guide
2241
- </Text>
2242
- </View>
2243
- </TouchableScale>
2244
-
2245
- <TouchableScale onPress={() => {
2246
- Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector/issues').catch(() => { });
2247
- }} style={{
2248
- flex: 1,
2249
- minWidth: '47%',
2250
- backgroundColor: AppColors.primaryLight,
2251
- borderRadius: 12,
2252
- borderWidth: 1,
2253
- borderColor: AppColors.grayBorderSecondary,
2254
- paddingVertical: 10,
2255
- paddingHorizontal: 12,
2256
- flexDirection: 'row',
2257
- alignItems: 'center',
2258
- gap: 8,
2259
- }}>
2260
- <Text style={{ fontSize: 16 }}>🐞</Text>
2261
- <View style={{ flex: 1 }}>
2262
- <Text style={{
2263
- fontFamily: AppFonts.interBold,
2264
- fontSize: 11.5,
2265
- color: AppColors.primaryBlack,
2266
- }}>
2267
- Report Issue
2268
- </Text>
2269
- <Text style={{
2270
- fontFamily: AppFonts.interRegular,
2271
- fontSize: 9.5,
2272
- color: AppColors.grayText,
2273
- }}>
2274
- Bugs & feature requests
2275
- </Text>
2276
- </View>
2277
- </TouchableScale>
2278
-
2279
- <TouchableScale onPress={() => {
2280
- Linking.openURL('https://github.com/vengatmacuser/react-native-inapp-inspector/releases').catch(() => { });
2281
- }} style={{
2282
- flex: 1,
2283
- minWidth: '47%',
2284
- backgroundColor: AppColors.primaryLight,
2285
- borderRadius: 12,
2286
- borderWidth: 1,
2287
- borderColor: AppColors.grayBorderSecondary,
2288
- paddingVertical: 10,
2289
- paddingHorizontal: 12,
2290
- flexDirection: 'row',
2291
- alignItems: 'center',
2292
- gap: 8,
2293
- }}>
2294
- <Text style={{ fontSize: 16 }}>🏷️</Text>
2295
- <View style={{ flex: 1 }}>
2296
- <Text style={{
2297
- fontFamily: AppFonts.interBold,
2298
- fontSize: 11.5,
2299
- color: AppColors.primaryBlack,
2300
- }}>
2301
- Release Notes
2302
- </Text>
2303
- <Text style={{
2304
- fontFamily: AppFonts.interRegular,
2305
- fontSize: 9.5,
2306
- color: AppColors.grayText,
2307
- }}>
2308
- Version changelog
2309
- </Text>
2310
- </View>
2311
- </TouchableScale>
2312
-
2313
- <TouchableScale onPress={() => {
2314
- const win = Dimensions.get('window');
2315
- const scr = Dimensions.get('screen');
2316
- const rnVer = Platform.constants?.reactNativeVersion;
2317
- const specsPayload = {
2318
- package: {
2319
- name: 'react-native-inapp-inspector',
2320
- version: `v${LIB_VERSION}`,
2321
- latestNpmVersion: latestNpmVersion
2322
- ? `v${latestNpmVersion}`
2323
- : 'Checking...',
2324
- license: 'MIT',
2325
- repository: 'https://github.com/vengatmacuser/react-native-inapp-inspector',
2326
- },
2327
- hostApp: {
2328
- name: getAppName(),
2329
- bundleId: getBundleIdentifier(),
2330
- versionAndBuild: getAppVersionAndBuild().formatted,
2331
- buildVariant: __DEV__
2332
- ? 'Development (Debug)'
2333
- : 'Production (Release)',
2334
- metroConnected: isLocalDebugEnvironment(),
2335
- },
2336
- runtime: {
2337
- reactNativeVersion: rnVer
2338
- ? `${rnVer.major}.${rnVer.minor}.${rnVer.patch}`
2339
- : '0.74+',
2340
- reactVersion: React.version,
2341
- jsEngine: Boolean(global?.HermesInternal)
2342
- ? 'Hermes'
2343
- : 'JavaScriptCore (JSC)',
2344
- architecture: Boolean(global?.nativeFabricUIManager)
2345
- ? 'Fabric (New Architecture)'
2346
- : 'Paper (Legacy Bridge)',
2347
- turboModules: Boolean(global?.__turboModuleProxy ||
2348
- global?.TurboModuleRegistry),
2349
- },
2350
- device: {
2351
- platform: Platform.OS,
2352
- osVersion: Platform.Version,
2353
- deviceModel: Platform.constants?.Model || 'Unknown Device',
2354
- windowDimensions: `${Math.round(win.width)}x${Math.round(win.height)} pt`,
2355
- screenDimensions: `${Math.round(scr.width)}x${Math.round(scr.height)} pt`,
2356
- pixelRatio: PixelRatio.get(),
2357
- fontScale: PixelRatio.getFontScale(),
2358
- timezone: Intl.DateTimeFormat().resolvedOptions().timeZone ||
2359
- 'Unknown',
2360
- locale: Intl.DateTimeFormat().resolvedOptions().locale || 'en',
2361
- },
2362
- storageAndCapabilities: {
2363
- storageEngine: isPersistentStorageAvailable()
2364
- ? 'MMKV (Fast Native Storage)'
2365
- : 'In-Memory State',
2366
- hasNativeModule: Boolean(global?.NativeInspectorModule ||
2367
- global?.__IN_APP_INSPECTOR_NATIVE__),
2368
- reduxConnected: isReduxConnected(),
2369
- analyticsConnected: isAnalyticsConnected(),
2370
- },
2371
- };
2372
- copyToClipboard(JSON.stringify(specsPayload, null, 2), 'Diagnostic Specifications');
2373
- showToast('Copied full diagnostic specs to clipboard!');
2374
- }} style={{
2375
- flex: 1,
2376
- minWidth: '47%',
2377
- backgroundColor: AppColors.primaryLight,
2378
- borderRadius: 12,
2379
- borderWidth: 1,
2380
- borderColor: AppColors.grayBorderSecondary,
2381
- paddingVertical: 10,
2382
- paddingHorizontal: 12,
2383
- flexDirection: 'row',
2384
- alignItems: 'center',
2385
- gap: 8,
2386
- }}>
2387
- <CopyIcon color={AppColors.purple} size={16}/>
2388
- <View style={{ flex: 1 }}>
2389
- <Text style={{
2390
- fontFamily: AppFonts.interBold,
2391
- fontSize: 11.5,
2392
- color: AppColors.primaryBlack,
2393
- }}>
2394
- Copy Specs JSON
2395
- </Text>
2396
- <Text style={{
2397
- fontFamily: AppFonts.interRegular,
2398
- fontSize: 9.5,
2399
- color: AppColors.grayText,
2400
- }}>
2401
- Diagnostics payload
2402
- </Text>
2403
- </View>
2404
- </TouchableScale>
2405
- </View>
2406
-
2407
-
2408
- <View style={{
2409
- backgroundColor: AppColors.primaryLight,
2410
- borderRadius: 14,
2411
- borderWidth: 1,
2412
- borderColor: AppColors.grayBorderSecondary,
2413
- overflow: 'hidden',
2414
- padding: 14,
2415
- gap: 12,
2416
- }}>
2417
- <Text style={{
2418
- fontFamily: AppFonts.interBold,
2419
- fontSize: 11,
2420
- lineHeight: 14,
2421
- color: AppColors.grayTextWeak,
2422
- letterSpacing: 0.8,
2423
- }}>
2424
- PACKAGE VERSION & UPGRADES
2425
- </Text>
2426
-
2427
- <View style={{
2428
- flexDirection: 'row',
2429
- alignItems: 'center',
2430
- justifyContent: 'space-between',
2431
- }}>
2432
- <View style={{
2433
- flexDirection: 'row',
2434
- alignItems: 'center',
2435
- gap: 10,
2436
- flex: 1,
2437
- marginRight: 8,
2438
- }}>
2439
- <View style={{
2440
- width: 34,
2441
- height: 34,
2442
- borderRadius: 9,
2443
- backgroundColor: '#CB383715',
2444
- alignItems: 'center',
2445
- justifyContent: 'center',
2446
- }}>
2447
- <NpmIcon color="#CB3837" size={17}/>
2448
- </View>
2449
- <View style={{ flex: 1 }}>
2450
- <View style={{
2451
- flexDirection: 'row',
2452
- alignItems: 'center',
2453
- gap: 6,
2454
- }}>
2455
- <Text style={{
2456
- fontFamily: AppFonts.interBold,
2457
- fontSize: 14,
2458
- lineHeight: 18,
2459
- color: AppColors.primaryBlack,
2460
- }}>
2461
- v{LIB_VERSION}
2462
- </Text>
2463
- {updateAvailable ? (<View style={{
2464
- flexDirection: 'row',
2465
- alignItems: 'center',
2466
- gap: 3,
2467
- backgroundColor: '#F59E0B20',
2468
- paddingHorizontal: 6,
2469
- paddingVertical: 1.5,
2470
- borderRadius: 5,
2471
- borderWidth: 1,
2472
- borderColor: '#F59E0B60',
2473
- }}>
2474
- <Text style={{
2475
- fontFamily: AppFonts.interBold,
2476
- fontSize: 9.5,
2477
- color: '#D97706',
2478
- }}>
2479
- v{latestNpmVersion} Available
2480
- </Text>
2481
- <BoltIcon size={9} color="#D97706"/>
2482
- </View>) : (<View style={{
2483
- backgroundColor: `${AppColors.emerald500}20`,
2484
- paddingHorizontal: 6,
2485
- paddingVertical: 1.5,
2486
- borderRadius: 5,
2487
- borderWidth: 1,
2488
- borderColor: `${AppColors.emerald500}50`,
2489
- }}>
2490
- <Text style={{
2491
- fontFamily: AppFonts.interBold,
2492
- fontSize: 9.5,
2493
- color: AppColors.emerald600,
2494
- }}>
2495
- Up to date
2496
- </Text>
2497
- </View>)}
2498
- </View>
2499
- <Text style={{
2500
- fontFamily: AppFonts.interRegular,
2501
- fontSize: 11,
2502
- lineHeight: 15,
2503
- color: AppColors.grayText,
2504
- marginTop: 1,
2505
- }}>
2506
- {updateAvailable
2507
- ? `A newer release (v${latestNpmVersion}) is available on npm registry.`
2508
- : 'You are running the latest version from npm registry.'}
2509
- </Text>
2510
- </View>
2511
- </View>
2512
-
2513
- <TouchableScale onPress={() => {
2514
- copyToClipboard('npm install react-native-inapp-inspector@latest', 'Install Command');
2515
- showToast('Copied npm install command!');
2516
- }} style={{
2517
- backgroundColor: updateAvailable
2518
- ? AppColors.purple
2519
- : `${AppColors.purple}18`,
2520
- paddingVertical: 7,
2521
- paddingHorizontal: 11,
2522
- borderRadius: 8,
2523
- flexDirection: 'row',
2524
- alignItems: 'center',
2525
- gap: 5,
2526
- }}>
2527
- <CopyIcon color={updateAvailable ? AppColors.white : AppColors.purple} size={12}/>
2528
- <Text style={{
2529
- fontFamily: AppFonts.interBold,
2530
- fontSize: 11,
2531
- color: updateAvailable
2532
- ? AppColors.white
2533
- : AppColors.purple,
2534
- }}>
2535
- {updateAvailable ? 'Copy Upgrade' : 'Copy Install'}
2536
- </Text>
2537
- </TouchableScale>
2538
- </View>
2539
- </View>
2540
-
2541
-
2542
- <View style={{
2543
- backgroundColor: AppColors.primaryLight,
2544
- borderRadius: 14,
2545
- borderWidth: 1,
2546
- borderColor: AppColors.grayBorderSecondary,
2547
- padding: 14,
2548
- gap: 10,
2549
- }}>
2550
- <Text style={{
2551
- fontFamily: AppFonts.interBold,
2552
- fontSize: 11,
2553
- lineHeight: 14,
2554
- color: AppColors.grayTextWeak,
2555
- letterSpacing: 0.8,
2556
- }}>
2557
- HOST APPLICATION & BUILD
2558
- </Text>
2559
-
2560
- <View style={{ gap: 8 }}>
2561
- <View style={{
2562
- flexDirection: 'row',
2563
- justifyContent: 'space-between',
2564
- alignItems: 'center',
2565
- }}>
2566
- <Text style={{
2567
- fontFamily: AppFonts.interRegular,
2568
- fontSize: 11.5,
2569
- color: AppColors.grayText,
2570
- }}>
2571
- Application Name
2572
- </Text>
2573
- <Text style={{
2574
- fontFamily: AppFonts.interBold,
2575
- fontSize: 11.5,
2576
- color: AppColors.primaryBlack,
2577
- }}>
2578
- {getAppName()}
2579
- </Text>
2580
- </View>
2581
-
2582
- <View style={{
2583
- flexDirection: 'row',
2584
- justifyContent: 'space-between',
2585
- alignItems: 'center',
2586
- }}>
2587
- <Text style={{
2588
- fontFamily: AppFonts.interRegular,
2589
- fontSize: 11.5,
2590
- color: AppColors.grayText,
2591
- }}>
2592
- Bundle ID / Package
2593
- </Text>
2594
- <Text style={{
2595
- fontFamily: AppFonts.interRegular,
2596
- fontSize: 11,
2597
- color: AppColors.primaryBlack,
2598
- }}>
2599
- {getBundleIdentifier()}
2600
- </Text>
2601
- </View>
2602
-
2603
- <View style={{
2604
- flexDirection: 'row',
2605
- justifyContent: 'space-between',
2606
- alignItems: 'center',
2607
- }}>
2608
- <Text style={{
2609
- fontFamily: AppFonts.interRegular,
2610
- fontSize: 11.5,
2611
- color: AppColors.grayText,
2612
- }}>
2613
- Version & Build Number
2614
- </Text>
2615
- <Text style={{
2616
- fontFamily: AppFonts.interBold,
2617
- fontSize: 11.5,
2618
- color: AppColors.primaryBlack,
2619
- }}>
2620
- {getAppVersionAndBuild().formatted}
2621
- </Text>
2622
- </View>
2623
-
2624
- <View style={{
2625
- flexDirection: 'row',
2626
- justifyContent: 'space-between',
2627
- alignItems: 'center',
2628
- }}>
2629
- <Text style={{
2630
- fontFamily: AppFonts.interRegular,
2631
- fontSize: 11.5,
2632
- color: AppColors.grayText,
2633
- }}>
2634
- Build Variant
2635
- </Text>
2636
- <View style={{
2637
- backgroundColor: __DEV__
2638
- ? `${AppColors.amber500}20`
2639
- : `${AppColors.emerald500}20`,
2640
- paddingHorizontal: 6,
2641
- paddingVertical: 1.5,
2642
- borderRadius: 5,
2643
- borderWidth: 1,
2644
- borderColor: __DEV__
2645
- ? `${AppColors.amber500}50`
2646
- : `${AppColors.emerald500}50`,
2647
- }}>
2648
- <Text style={{
2649
- fontFamily: AppFonts.interBold,
2650
- fontSize: 10,
2651
- color: __DEV__
2652
- ? AppColors.amber500
2653
- : AppColors.emerald600,
2654
- }}>
2655
- {__DEV__ ? 'Development (Debug)' : 'Production (Release)'}
2656
- </Text>
2657
- </View>
2658
- </View>
2659
-
2660
- <View style={{
2661
- flexDirection: 'row',
2662
- justifyContent: 'space-between',
2663
- alignItems: 'center',
2664
- }}>
2665
- <Text style={{
2666
- fontFamily: AppFonts.interRegular,
2667
- fontSize: 11.5,
2668
- color: AppColors.grayText,
2669
- }}>
2670
- Metro Bundler Connection
2671
- </Text>
2672
- <Text style={{
2673
- fontFamily: AppFonts.interBold,
2674
- fontSize: 11.5,
2675
- color: isLocalDebugEnvironment()
2676
- ? AppColors.emerald600
2677
- : AppColors.grayText,
2678
- }}>
2679
- {isLocalDebugEnvironment()
2680
- ? 'Connected (Hot Reload Active)'
2681
- : 'Offline / Standalone'}
2682
- </Text>
2683
- </View>
2684
- </View>
2685
- </View>
2686
-
2687
-
2688
- <View style={{
2689
- backgroundColor: AppColors.primaryLight,
2690
- borderRadius: 14,
2691
- borderWidth: 1,
2692
- borderColor: AppColors.grayBorderSecondary,
2693
- padding: 14,
2694
- gap: 10,
2695
- }}>
2696
- <Text style={{
2697
- fontFamily: AppFonts.interBold,
2698
- fontSize: 11,
2699
- lineHeight: 14,
2700
- color: AppColors.grayTextWeak,
2701
- letterSpacing: 0.8,
2702
- }}>
2703
- FRAMEWORK & RUNTIME ENGINE
2704
- </Text>
2705
-
2706
- <View style={{ gap: 8 }}>
2707
- <View style={{
2708
- flexDirection: 'row',
2709
- justifyContent: 'space-between',
2710
- alignItems: 'center',
2711
- }}>
2712
- <Text style={{
2713
- fontFamily: AppFonts.interRegular,
2714
- fontSize: 11.5,
2715
- color: AppColors.grayText,
2716
- }}>
2717
- React Native Version
2718
- </Text>
2719
- <Text style={{
2720
- fontFamily: AppFonts.interBold,
2721
- fontSize: 11.5,
2722
- color: AppColors.primaryBlack,
2723
- }}>
2724
- v
2725
- {Platform.constants?.reactNativeVersion?.major !=
2726
- null
2727
- ? `${Platform.constants.reactNativeVersion.major}.${Platform.constants.reactNativeVersion.minor}.${Platform.constants.reactNativeVersion.patch}`
2728
- : '0.74+'}
2729
- </Text>
2730
- </View>
2731
-
2732
- <View style={{
2733
- flexDirection: 'row',
2734
- justifyContent: 'space-between',
2735
- alignItems: 'center',
2736
- }}>
2737
- <Text style={{
2738
- fontFamily: AppFonts.interRegular,
2739
- fontSize: 11.5,
2740
- color: AppColors.grayText,
2741
- }}>
2742
- React Core Version
2743
- </Text>
2744
- <Text style={{
2745
- fontFamily: AppFonts.interBold,
2746
- fontSize: 11.5,
2747
- color: AppColors.primaryBlack,
2748
- }}>
2749
- v{React.version}
2750
- </Text>
2751
- </View>
2752
-
2753
- <View style={{
2754
- flexDirection: 'row',
2755
- justifyContent: 'space-between',
2756
- alignItems: 'center',
2757
- }}>
2758
- <Text style={{
2759
- fontFamily: AppFonts.interRegular,
2760
- fontSize: 11.5,
2761
- color: AppColors.grayText,
2762
- }}>
2763
- JavaScript Engine
2764
- </Text>
2765
- <View style={{
2766
- backgroundColor: `${AppColors.purple}15`,
2767
- paddingHorizontal: 6,
2768
- paddingVertical: 1.5,
2769
- borderRadius: 5,
2770
- borderWidth: 1,
2771
- borderColor: `${AppColors.purple}40`,
2772
- }}>
2773
- <Text style={{
2774
- fontFamily: AppFonts.interBold,
2775
- fontSize: 10.5,
2776
- color: AppColors.purple,
2777
- }}>
2778
- {Boolean(global?.HermesInternal)
2779
- ? 'Hermes Engine (Active)'
2780
- : 'JavaScriptCore (JSC)'}
2781
- </Text>
2782
- </View>
2783
- </View>
2784
-
2785
- <View style={{
2786
- flexDirection: 'row',
2787
- justifyContent: 'space-between',
2788
- alignItems: 'center',
2789
- }}>
2790
- <Text style={{
2791
- fontFamily: AppFonts.interRegular,
2792
- fontSize: 11.5,
2793
- color: AppColors.grayText,
2794
- }}>
2795
- Rendering Architecture
2796
- </Text>
2797
- <Text style={{
2798
- fontFamily: AppFonts.interBold,
2799
- fontSize: 11.5,
2800
- color: AppColors.primaryBlack,
2801
- }}>
2802
- {Boolean(global?.nativeFabricUIManager)
2803
- ? 'Fabric (New Architecture)'
2804
- : 'Paper (Legacy Bridge)'}
2805
- </Text>
2806
- </View>
2807
-
2808
- <View style={{
2809
- flexDirection: 'row',
2810
- justifyContent: 'space-between',
2811
- alignItems: 'center',
2812
- }}>
2813
- <Text style={{
2814
- fontFamily: AppFonts.interRegular,
2815
- fontSize: 11.5,
2816
- color: AppColors.grayText,
2817
- }}>
2818
- TurboModules Support
2819
- </Text>
2820
- <Text style={{
2821
- fontFamily: AppFonts.interBold,
2822
- fontSize: 11.5,
2823
- color: AppColors.primaryBlack,
2824
- }}>
2825
- {Boolean(global?.__turboModuleProxy ||
2826
- global?.TurboModuleRegistry)
2827
- ? 'Enabled (C++ JSI)'
2828
- : 'Standard Bridge'}
2829
- </Text>
2830
- </View>
2831
- </View>
2832
- </View>
2833
-
2834
-
2835
- <View style={{
2836
- backgroundColor: AppColors.primaryLight,
2837
- borderRadius: 14,
2838
- borderWidth: 1,
2839
- borderColor: AppColors.grayBorderSecondary,
2840
- padding: 14,
2841
- gap: 10,
2842
- }}>
2843
- <Text style={{
2844
- fontFamily: AppFonts.interBold,
2845
- fontSize: 11,
2846
- lineHeight: 14,
2847
- color: AppColors.grayTextWeak,
2848
- letterSpacing: 0.8,
2849
- }}>
2850
- DEVICE & DISPLAY METRICS
2851
- </Text>
2852
-
2853
- <View style={{ gap: 8 }}>
2854
- <View style={{
2855
- flexDirection: 'row',
2856
- justifyContent: 'space-between',
2857
- alignItems: 'center',
2858
- }}>
2859
- <Text style={{
2860
- fontFamily: AppFonts.interRegular,
2861
- fontSize: 11.5,
2862
- color: AppColors.grayText,
2863
- }}>
2864
- Operating System
2865
- </Text>
2866
- <Text style={{
2867
- fontFamily: AppFonts.interBold,
2868
- fontSize: 11.5,
2869
- color: AppColors.primaryBlack,
2870
- }}>
2871
- {Platform.OS === 'ios'
2872
- ? 'Apple iOS'
2873
- : Platform.OS === 'android'
2874
- ? 'Google Android'
2875
- : Platform.OS}{' '}
2876
- {Platform.Version}
2877
- </Text>
2878
- </View>
2879
-
2880
- <View style={{
2881
- flexDirection: 'row',
2882
- justifyContent: 'space-between',
2883
- alignItems: 'center',
2884
- }}>
2885
- <Text style={{
2886
- fontFamily: AppFonts.interRegular,
2887
- fontSize: 11.5,
2888
- color: AppColors.grayText,
2889
- }}>
2890
- Device Hardware Model
2891
- </Text>
2892
- <Text style={{
2893
- fontFamily: AppFonts.interBold,
2894
- fontSize: 11.5,
2895
- color: AppColors.primaryBlack,
2896
- }}>
2897
- {Platform.constants?.Model ||
2898
- (Platform.OS === 'ios'
2899
- ? 'Apple Device'
2900
- : 'Android Device')}
2901
- </Text>
2902
- </View>
2903
-
2904
- <View style={{
2905
- flexDirection: 'row',
2906
- justifyContent: 'space-between',
2907
- alignItems: 'center',
2908
- }}>
2909
- <Text style={{
2910
- fontFamily: AppFonts.interRegular,
2911
- fontSize: 11.5,
2912
- color: AppColors.grayText,
2913
- }}>
2914
- Window Viewport (Points)
2915
- </Text>
2916
- <Text style={{
2917
- fontFamily: AppFonts.interBold,
2918
- fontSize: 11.5,
2919
- color: AppColors.primaryBlack,
2920
- }}>
2921
- {Math.round(Dimensions.get('window').width)} ×{' '}
2922
- {Math.round(Dimensions.get('window').height)} pt
2923
- </Text>
2924
- </View>
2925
-
2926
- <View style={{
2927
- flexDirection: 'row',
2928
- justifyContent: 'space-between',
2929
- alignItems: 'center',
2930
- }}>
2931
- <Text style={{
2932
- fontFamily: AppFonts.interRegular,
2933
- fontSize: 11.5,
2934
- color: AppColors.grayText,
2935
- }}>
2936
- Native Physical Resolution
2937
- </Text>
2938
- <Text style={{
2939
- fontFamily: AppFonts.interBold,
2940
- fontSize: 11.5,
2941
- color: AppColors.primaryBlack,
2942
- }}>
2943
- {Math.round(Dimensions.get('screen').width * PixelRatio.get())}{' '}
2944
- ×{' '}
2945
- {Math.round(Dimensions.get('screen').height * PixelRatio.get())}{' '}
2946
- px
2947
- </Text>
2948
- </View>
2949
-
2950
- <View style={{
2951
- flexDirection: 'row',
2952
- justifyContent: 'space-between',
2953
- alignItems: 'center',
2954
- }}>
2955
- <Text style={{
2956
- fontFamily: AppFonts.interRegular,
2957
- fontSize: 11.5,
2958
- color: AppColors.grayText,
2959
- }}>
2960
- Pixel Density & Font Scale
2961
- </Text>
2962
- <Text style={{
2963
- fontFamily: AppFonts.interBold,
2964
- fontSize: 11.5,
2965
- color: AppColors.primaryBlack,
2966
- }}>
2967
- {PixelRatio.get().toFixed(1)}x (
2968
- {PixelRatio.get() >= 3
2969
- ? '@3x'
2970
- : PixelRatio.get() >= 2
2971
- ? '@2x'
2972
- : '@1x'}
2973
- ) • Font: {PixelRatio.getFontScale().toFixed(2)}x
2974
- </Text>
2975
- </View>
2976
-
2977
- <View style={{
2978
- flexDirection: 'row',
2979
- justifyContent: 'space-between',
2980
- alignItems: 'center',
2981
- }}>
2982
- <Text style={{
2983
- fontFamily: AppFonts.interRegular,
2984
- fontSize: 11.5,
2985
- color: AppColors.grayText,
2986
- }}>
2987
- Timezone & Locale
2988
- </Text>
2989
- <Text style={{
2990
- fontFamily: AppFonts.interBold,
2991
- fontSize: 11.5,
2992
- color: AppColors.primaryBlack,
2993
- }}>
2994
- {Intl.DateTimeFormat().resolvedOptions().timeZone ||
2995
- 'System'}{' '}
2996
- ({Intl.DateTimeFormat().resolvedOptions().locale || 'en'})
2997
- </Text>
2998
- </View>
2999
- </View>
3000
- </View>
3001
-
3002
-
3003
- <View style={{
3004
- backgroundColor: AppColors.primaryLight,
3005
- borderRadius: 14,
3006
- borderWidth: 1,
3007
- borderColor: AppColors.grayBorderSecondary,
3008
- padding: 14,
3009
- gap: 10,
3010
- }}>
3011
- <Text style={{
3012
- fontFamily: AppFonts.interBold,
3013
- fontSize: 11,
3014
- lineHeight: 14,
3015
- color: AppColors.grayTextWeak,
3016
- letterSpacing: 0.8,
3017
- }}>
3018
- INSPECTOR STORAGE & CAPABILITIES
3019
- </Text>
3020
-
3021
- <View style={{ gap: 8 }}>
3022
- <View style={{
3023
- flexDirection: 'row',
3024
- justifyContent: 'space-between',
3025
- alignItems: 'center',
3026
- }}>
3027
- <Text style={{
3028
- fontFamily: AppFonts.interRegular,
3029
- fontSize: 11.5,
3030
- color: AppColors.grayText,
3031
- }}>
3032
- Storage Persistence Engine
3033
- </Text>
3034
- <View style={{
3035
- backgroundColor: isPersistentStorageAvailable()
3036
- ? `${AppColors.emerald500}18`
3037
- : `${AppColors.amber500}18`,
3038
- paddingHorizontal: 6,
3039
- paddingVertical: 1.5,
3040
- borderRadius: 5,
3041
- borderWidth: 1,
3042
- borderColor: isPersistentStorageAvailable()
3043
- ? `${AppColors.emerald500}50`
3044
- : `${AppColors.amber500}50`,
3045
- }}>
3046
- <Text style={{
3047
- fontFamily: AppFonts.interBold,
3048
- fontSize: 10.5,
3049
- color: isPersistentStorageAvailable()
3050
- ? AppColors.emerald600
3051
- : AppColors.amber500,
3052
- }}>
3053
- {isPersistentStorageAvailable()
3054
- ? 'MMKV Fast Native Storage'
3055
- : 'In-Memory State'}
3056
- </Text>
3057
- </View>
3058
- </View>
3059
-
3060
- <View style={{
3061
- flexDirection: 'row',
3062
- justifyContent: 'space-between',
3063
- alignItems: 'center',
3064
- }}>
3065
- <Text style={{
3066
- fontFamily: AppFonts.interRegular,
3067
- fontSize: 11.5,
3068
- color: AppColors.grayText,
3069
- }}>
3070
- Native Module Status
3071
- </Text>
3072
- <Text style={{
3073
- fontFamily: AppFonts.interBold,
3074
- fontSize: 11.5,
3075
- color: Boolean(global?.NativeInspectorModule)
3076
- ? AppColors.emerald600
3077
- : AppColors.grayText,
3078
- }}>
3079
- {Boolean(global?.NativeInspectorModule)
3080
- ? 'Linked & Active'
3081
- : 'JavaScript Only'}
3082
- </Text>
3083
- </View>
3084
-
3085
- <View style={{
3086
- flexDirection: 'row',
3087
- justifyContent: 'space-between',
3088
- alignItems: 'center',
3089
- }}>
3090
- <Text style={{
3091
- fontFamily: AppFonts.interRegular,
3092
- fontSize: 11.5,
3093
- color: AppColors.grayText,
3094
- }}>
3095
- Network Logger Interceptor
3096
- </Text>
3097
- <Text style={{
3098
- fontFamily: AppFonts.interBold,
3099
- fontSize: 11.5,
3100
- color: AppColors.emerald600,
3101
- }}>
3102
- Active (XMLHttpRequest & Fetch Hooked)
3103
- </Text>
3104
- </View>
3105
-
3106
- <View style={{
3107
- flexDirection: 'row',
3108
- justifyContent: 'space-between',
3109
- alignItems: 'center',
3110
- }}>
3111
- <Text style={{
3112
- fontFamily: AppFonts.interRegular,
3113
- fontSize: 11.5,
3114
- color: AppColors.grayText,
3115
- }}>
3116
- Redux & Analytics Watchers
3117
- </Text>
3118
- <Text style={{
3119
- fontFamily: AppFonts.interBold,
3120
- fontSize: 11.5,
3121
- color: AppColors.primaryBlack,
3122
- }}>
3123
- Redux: {isReduxConnected() ? 'Connected' : 'Listening'} •
3124
- Analytics:{' '}
3125
- {isAnalyticsConnected() ? 'Connected' : 'Listening'}
3126
- </Text>
3127
- </View>
3128
-
3129
- <View style={{
3130
- flexDirection: 'row',
3131
- justifyContent: 'space-between',
3132
- alignItems: 'center',
3133
- }}>
3134
- <Text style={{
3135
- fontFamily: AppFonts.interRegular,
3136
- fontSize: 11.5,
3137
- color: AppColors.grayText,
3138
- }}>
3139
- Crash & Exception Boundary
3140
- </Text>
3141
- <Text style={{
3142
- fontFamily: AppFonts.interBold,
3143
- fontSize: 11.5,
3144
- color: AppColors.emerald600,
3145
- }}>
3146
- Global JS Exception Handler Active
3147
- </Text>
3148
- </View>
3149
-
3150
- <View style={{
3151
- flexDirection: 'row',
3152
- justifyContent: 'space-between',
3153
- alignItems: 'center',
3154
- }}>
3155
- <Text style={{
3156
- fontFamily: AppFonts.interRegular,
3157
- fontSize: 11.5,
3158
- color: AppColors.grayText,
3159
- }}>
3160
- Memory Management
3161
- </Text>
3162
- <Text style={{
3163
- fontFamily: AppFonts.interBold,
3164
- fontSize: 11.5,
3165
- color: AppColors.emerald600,
3166
- }}>
3167
- Dynamic Auto RAM Tiering Active
3168
- </Text>
3169
- </View>
3170
- </View>
3171
- </View>
3172
-
3173
-
3174
- <View style={{
3175
- backgroundColor: AppColors.primaryLight,
3176
- borderRadius: 14,
3177
- borderWidth: 1,
3178
- borderColor: AppColors.grayBorderSecondary,
3179
- padding: 14,
3180
- gap: 8,
3181
- }}>
3182
- <Text style={{
3183
- fontFamily: AppFonts.interBold,
3184
- fontSize: 11,
3185
- lineHeight: 14,
3186
- color: AppColors.grayTextWeak,
3187
- letterSpacing: 0.8,
3188
- }}>
3189
- LICENSE & CREDITS
3190
- </Text>
3191
-
3192
- <View style={{
3193
- flexDirection: 'row',
3194
- justifyContent: 'space-between',
3195
- alignItems: 'center',
3196
- }}>
3197
- <Text style={{
3198
- fontFamily: AppFonts.interRegular,
3199
- fontSize: 11.5,
3200
- color: AppColors.grayText,
3201
- }}>
3202
- License
3203
- </Text>
3204
- <Text style={{
3205
- fontFamily: AppFonts.interBold,
3206
- fontSize: 11.5,
3207
- color: AppColors.emerald600,
3208
- }}>
3209
- MIT Permissive Open Source
3210
- </Text>
3211
- </View>
3212
-
3213
- <View style={{
3214
- flexDirection: 'row',
3215
- justifyContent: 'space-between',
3216
- alignItems: 'center',
3217
- }}>
3218
- <Text style={{
3219
- fontFamily: AppFonts.interRegular,
3220
- fontSize: 11.5,
3221
- color: AppColors.grayText,
3222
- }}>
3223
- Created & Maintained By
3224
- </Text>
3225
- <Text style={{
3226
- fontFamily: AppFonts.interBold,
3227
- fontSize: 11.5,
3228
- color: AppColors.primaryBlack,
3229
- }}>
3230
- Vengateswaran
3231
- </Text>
3232
- </View>
3233
-
3234
- <View style={{
3235
- flexDirection: 'row',
3236
- justifyContent: 'space-between',
3237
- alignItems: 'center',
3238
- }}>
3239
- <Text style={{
3240
- fontFamily: AppFonts.interRegular,
3241
- fontSize: 11.5,
3242
- color: AppColors.grayText,
3243
- }}>
3244
- Repository
3245
- </Text>
3246
- <Text style={{
3247
- fontFamily: AppFonts.interRegular,
3248
- fontSize: 11,
3249
- color: AppColors.purple,
3250
- }}>
3251
- github.com/vengatmacuser/react-native-inapp-inspector
3252
- </Text>
3253
- </View>
3254
- </View>
3255
- </View>)}
3256
- <View style={{ height: 48 }}/>
3257
- </ScrollView>
528
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
529
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.media.purgeAll","Purge Captured Media Cache"),description:x("settings.media.purgeAllDesc","Delete all local screenshots, screen recordings and converted GIFs"),isLast:!0,onPress:()=>{W.alert(x("settings.media.purgeConfirmTitle","Purge Media Storage?"),x("settings.media.purgeConfirmMessage","This will permanently delete all captured screenshots and videos from disk."),[{text:x("common.cancel","Cancel"),style:"cancel"},{text:x("settings.media.purgeCacheBtn","Purge All"),style:"destructive",onPress:async()=>{await xt.clearAllMedia(),Dr(x("settings.media.purgedSuccess","Media cache cleared successfully"))}}])},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
530
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
531
+ {x("settings.media.purgeCacheBtn","Purge All")}
532
+ </S>
533
+ </C>})}
534
+ </C>
535
+ </C>}
536
+ <C style={{height:48}}/>
537
+ </A>
3258
538
 
3259
539
 
3260
- {settingsActiveSubTab === 'module' && (<View style={{
3261
- paddingHorizontal: 16,
3262
- paddingTop: 12,
3263
- paddingBottom: Platform.OS === 'ios' ? 36 : 24,
3264
- backgroundColor: AppColors.primaryLight,
3265
- borderTopWidth: 1,
3266
- borderTopColor: AppColors.dividerColor,
3267
- flexDirection: 'row',
3268
- alignItems: 'center',
3269
- gap: 12,
3270
- shadowColor: AppColors.black,
3271
- shadowOpacity: 0.08,
3272
- shadowRadius: 8,
3273
- shadowOffset: { width: 0, height: -3 },
3274
- elevation: 8,
3275
- }}>
3276
- <View style={{ flex: 1 }}>
3277
- <Text style={{
3278
- fontFamily: AppFonts.interBold,
3279
- fontSize: 13,
3280
- lineHeight: 17,
3281
- color: AppColors.primaryBlack,
3282
- }}>
3283
- {stagedActiveCount} of {allModules.length} Modules Active
3284
- </Text>
3285
- <Text style={{
3286
- fontFamily: AppFonts.interRegular,
3287
- fontSize: 11,
3288
- lineHeight: 15,
3289
- color: hasUnsavedChanges
3290
- ? AppColors.purple
3291
- : AppColors.grayText,
3292
- marginTop: 1,
3293
- }}>
3294
- {hasUnsavedChanges
3295
- ? t('settings.unsavedPending')
3296
- : t('settings.allSynchronized')}
3297
- </Text>
3298
- </View>
3299
-
3300
- <TouchableScale accessible={true} accessibilityRole="button" accessibilityLabel="Save Changes" onPress={handleSaveChanges} style={{
3301
- flexDirection: 'row',
3302
- alignItems: 'center',
3303
- gap: 6,
3304
- backgroundColor: hasUnsavedChanges
3305
- ? AppColors.purple
3306
- : `${AppColors.purple}22`,
3307
- paddingHorizontal: 18,
3308
- paddingVertical: 10,
3309
- borderRadius: 10,
3310
- }}>
3311
- <CheckIcon size={14} color={hasUnsavedChanges ? AppColors.white : AppColors.purple}/>
3312
- <Text style={{
3313
- fontFamily: AppFonts.interBold,
3314
- fontSize: 13,
3315
- lineHeight: 17,
3316
- color: hasUnsavedChanges ? AppColors.white : AppColors.purple,
3317
- }}>
3318
- {t('settings.saveChanges')}
3319
- </Text>
3320
- </TouchableScale>
3321
- </View>)}
3322
- </View>);
3323
- let content = null;
3324
- let title = '';
3325
- let icon = null;
3326
- let rightInfo = '';
3327
- if (settingsPage === 'apis') {
3328
- title = t('settings.apis.title');
3329
- icon = <SignalIcon color={AppColors.white} size={16}/>;
3330
- rightInfo = t('settings.apis.total', { count: logs.length });
3331
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3332
- <View style={{
3333
- backgroundColor: AppColors.primaryLight,
3334
- padding: 16,
3335
- borderRadius: 14,
3336
- borderWidth: 1,
3337
- borderColor: AppColors.grayBorderSecondary,
3338
- }}>
3339
- {renderSettingRow({
3340
- icon: <SignalIcon color={AppColors.purple} size={16}/>,
3341
- label: t('settings.apis.maxRequestLogs'),
3342
- description: t('settings.apis.maxRequestLogsDescription'),
3343
- numericInput: {
3344
- value: maxNetworkLogs,
3345
- onChange: setMaxNetworkLogs,
3346
- min: 10,
3347
- max: 100,
3348
- placeholder: 'Enter max requests (10-100)',
3349
- },
3350
- isLast: true,
3351
- })}
3352
- </View>
3353
-
3354
- <View style={{
3355
- backgroundColor: AppColors.primaryLight,
3356
- borderRadius: 14,
3357
- borderWidth: 1,
3358
- borderColor: AppColors.grayBorderSecondary,
3359
- padding: 16,
3360
- }}>
3361
- {renderSettingRow({
3362
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3363
- label: t('settings.apis.clearNetworkLogs'),
3364
- description: t('settings.apis.clearNetworkLogsDescription', {
3365
- count: logs.length,
3366
- }),
3367
- isLast: true,
3368
- onPress: () => {
3369
- clearNetworkLogs();
3370
- setSelected(null);
3371
- Alert.alert(t('common.success'), t('settings.apis.networkLogsCleared'));
3372
- },
3373
- right: (<View style={{
3374
- paddingHorizontal: 12,
3375
- paddingVertical: 6,
3376
- borderRadius: 8,
3377
- backgroundColor: `${AppColors.errorColor}14`,
3378
- borderWidth: 1,
3379
- borderColor: `${AppColors.errorColor}33`,
3380
- }}>
3381
- <Text style={{
3382
- fontFamily: AppFonts.interBold,
3383
- fontSize: 11,
3384
- lineHeight: 14,
3385
- color: AppColors.errorColor,
3386
- }}>
3387
- {t('common.clear')}
3388
- </Text>
3389
- </View>),
3390
- })}
3391
- </View>
3392
- <View style={{ height: 48 }}/>
3393
- </ScrollView>);
3394
- }
3395
- else if (settingsPage === 'logs') {
3396
- title = t('settings.logs.title');
3397
- icon = <TerminalIcon color={AppColors.white} size={16}/>;
3398
- rightInfo = t('settings.logs.total', { count: consoleLogs.length });
3399
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3400
- <View style={{
3401
- backgroundColor: AppColors.primaryLight,
3402
- padding: 16,
3403
- borderRadius: 14,
3404
- borderWidth: 1,
3405
- borderColor: AppColors.grayBorderSecondary,
3406
- gap: 4,
3407
- }}>
3408
- {renderSettingRow({
3409
- icon: <TerminalIcon color={AppColors.purple} size={16}/>,
3410
- label: t('settings.logs.maxConsoleLogs'),
3411
- description: t('settings.logs.maxConsoleLogsDescription'),
3412
- numericInput: {
3413
- value: maxConsoleLogs,
3414
- onChange: setMaxConsoleLogs,
3415
- min: 10,
3416
- max: 100,
3417
- placeholder: 'Enter max logs (10-100)',
3418
- },
3419
- })}
3420
- <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
3421
- <Text style={{
3422
- fontFamily: AppFonts.interBold,
3423
- fontSize: 13,
3424
- lineHeight: 17,
3425
- color: AppColors.primaryBlack,
3426
- paddingTop: 6,
3427
- }}>
3428
- {t('settings.logs.logLevels')}
3429
- </Text>
3430
- {['info', 'warn', 'error'].map(level => {
3431
- const isLvlActive = showConsoleLevels?.[level];
3432
- const levelColor = level === 'error'
3433
- ? AppColors.errorColor
3434
- : level === 'warn'
3435
- ? AppColors.warningIconGold
3436
- : AppColors.skyBlue;
3437
- const label = level === 'info'
3438
- ? t('settings.logs.showInfo')
3439
- : level === 'warn'
3440
- ? t('settings.logs.showWarn')
3441
- : t('settings.logs.showError');
3442
- const desc = level === 'info'
3443
- ? t('settings.logs.showInfoDesc')
3444
- : level === 'warn'
3445
- ? t('settings.logs.showWarnDesc')
3446
- : t('settings.logs.showErrorDesc');
3447
- return renderSettingRow({
3448
- icon: (<View style={{
3449
- width: 12,
3450
- height: 12,
3451
- borderRadius: 6,
3452
- backgroundColor: levelColor,
3453
- }}/>),
3454
- label,
3455
- description: desc,
3456
- isLast: level === 'error',
3457
- onPress: () => setShowConsoleLevels(prev => ({
3458
- ...prev,
3459
- [level]: !prev[level],
3460
- })),
3461
- right: (<View style={{
3462
- width: 22,
3463
- height: 22,
3464
- borderRadius: 6,
3465
- borderWidth: 2,
3466
- borderColor: isLvlActive
3467
- ? AppColors.purple
3468
- : AppColors.grayTextWeak,
3469
- backgroundColor: isLvlActive
3470
- ? `${AppColors.purple}1A`
3471
- : 'transparent',
3472
- alignItems: 'center',
3473
- justifyContent: 'center',
3474
- }}>
3475
- {isLvlActive && (<CheckIcon size={12} color={AppColors.purple}/>)}
3476
- </View>),
3477
- });
3478
- })}
3479
- </View>
540
+ {G==="module"&&<C style={{paddingHorizontal:16,paddingTop:12,paddingBottom:je.OS==="ios"?36:24,backgroundColor:e.primaryLight,borderTopWidth:1,borderTopColor:e.dividerColor,flexDirection:"row",alignItems:"center",gap:12,shadowColor:e.black,shadowOpacity:.08,shadowRadius:8,shadowOffset:{width:0,height:-3},elevation:8}}>
541
+ <C style={{flex:1}}>
542
+ <S style={{fontFamily:k.interBold,fontSize:13,lineHeight:17,color:e.primaryBlack}}>
543
+ {ro} of {L.length} Modules Active
544
+ </S>
545
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:q?e.purple:e.grayText,marginTop:1}}>
546
+ {x(q?"settings.unsavedPending":"settings.allSynchronized")}
547
+ </S>
548
+ </C>
549
+
550
+ <H accessible={!0}accessibilityRole="button"accessibilityLabel="Save Changes"onPress={oo}style={{flexDirection:"row",alignItems:"center",gap:6,backgroundColor:q?e.purple:`${e.purple}22`,paddingHorizontal:18,paddingVertical:10,borderRadius:10}}>
551
+ <N size={14}color={q?e.white:e.purple}/>
552
+ <S style={{fontFamily:k.interBold,fontSize:13,lineHeight:17,color:q?e.white:e.purple}}>
553
+ {x("settings.saveChanges")}
554
+ </S>
555
+ </H>
556
+ </C>}
557
+ </C>;let $=null,E="",O=null,j="";F==="apis"?(E=x("settings.apis.title"),O=<Z color={e.white}size={16}/>,j=x("settings.apis.total",{count:ze.length}),$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
558
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary}}>
559
+ {z({icon:<Z color={e.purple}size={16}/>,label:x("settings.apis.maxRequestLogs"),description:x("settings.apis.maxRequestLogsDescription"),numericInput:{value:De,onChange:Gr,min:10,max:100,placeholder:"Enter max requests (10-100)"},isLast:!0})}
560
+ </C>
561
+
562
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
563
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.apis.clearNetworkLogs"),description:x("settings.apis.clearNetworkLogsDescription",{count:ze.length}),isLast:!0,onPress:()=>{vo(),Qr(null),W.alert(x("common.success"),x("settings.apis.networkLogsCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
564
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
565
+ {x("common.clear")}
566
+ </S>
567
+ </C>})}
568
+ </C>
569
+ <C style={{height:48}}/>
570
+ </A>):F==="logs"?(E=x("settings.logs.title"),O=<Ne color={e.white}size={16}/>,j=x("settings.logs.total",{count:Re.length}),$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
571
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4}}>
572
+ {z({icon:<Ne color={e.purple}size={16}/>,label:x("settings.logs.maxConsoleLogs"),description:x("settings.logs.maxConsoleLogsDescription"),numericInput:{value:Le,onChange:Ur,min:10,max:100,placeholder:"Enter max logs (10-100)"}})}
573
+ <C style={{height:1,backgroundColor:e.dividerColor}}/>
574
+ <S style={{fontFamily:k.interBold,fontSize:13,lineHeight:17,color:e.primaryBlack,paddingTop:6}}>
575
+ {x("settings.logs.logLevels")}
576
+ </S>
577
+ {["info","warn","error"].map(r=>{const V=Or?.[r],D=r==="error"?e.errorColor:r==="warn"?e.warningIconGold:e.skyBlue,v=x(r==="info"?"settings.logs.showInfo":r==="warn"?"settings.logs.showWarn":"settings.logs.showError"),I=x(r==="info"?"settings.logs.showInfoDesc":r==="warn"?"settings.logs.showWarnDesc":"settings.logs.showErrorDesc");return z({icon:<C style={{width:12,height:12,borderRadius:6,backgroundColor:D}}/>,label:v,description:I,isLast:r==="error",onPress:()=>jr(B=>({...B,[r]:!B[r]})),right:<C style={{width:22,height:22,borderRadius:6,borderWidth:2,borderColor:V?e.purple:e.grayTextWeak,backgroundColor:V?`${e.purple}1A`:"transparent",alignItems:"center",justifyContent:"center"}}>
578
+ {V&&<N size={12}color={e.purple}/>}
579
+ </C>})})}
580
+ </C>
3480
581
 
3481
582
 
3482
- <View style={{
3483
- backgroundColor: AppColors.primaryLight,
3484
- borderRadius: 14,
3485
- borderWidth: 1,
3486
- borderColor: AppColors.grayBorderSecondary,
3487
- overflow: 'hidden',
3488
- padding: 16,
3489
- gap: 14,
3490
- }}>
3491
- <Text style={{
3492
- fontFamily: AppFonts.interBold,
3493
- fontSize: 11,
3494
- lineHeight: 14,
3495
- color: AppColors.grayTextWeak,
3496
- letterSpacing: 0.8,
3497
- }}>
3498
- {t('settings.logFiltersDeduplication')}
3499
- </Text>
583
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,overflow:"hidden",padding:16,gap:14}}>
584
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.grayTextWeak,letterSpacing:.8}}>
585
+ {x("settings.logFiltersDeduplication")}
586
+ </S>
3500
587
 
3501
588
 
3502
- <View style={{
3503
- flexDirection: 'row',
3504
- alignItems: 'center',
3505
- justifyContent: 'space-between',
3506
- }}>
3507
- <View style={{
3508
- flexDirection: 'row',
3509
- alignItems: 'center',
3510
- gap: 10,
3511
- flex: 1,
3512
- }}>
3513
- <View style={{
3514
- width: 32,
3515
- height: 32,
3516
- borderRadius: 8,
3517
- backgroundColor: AppColors.purpleShade50,
3518
- alignItems: 'center',
3519
- justifyContent: 'center',
3520
- }}>
3521
- <EyeIcon color={AppColors.purple} size={15}/>
3522
- </View>
3523
- <View style={{ flex: 1 }}>
3524
- <Text style={{
3525
- fontFamily: AppFonts.interBold,
3526
- fontSize: 13.5,
3527
- lineHeight: 18,
3528
- color: AppColors.primaryBlack,
3529
- }}>
3530
- {t('settings.general.duplicateLogs')}
3531
- </Text>
3532
- <Text style={{
3533
- fontFamily: AppFonts.interRegular,
3534
- fontSize: 11,
3535
- lineHeight: 15,
3536
- color: AppColors.grayText,
3537
- marginTop: 1,
3538
- }}>
3539
- {t('settings.general.duplicateLogsDescription')}
3540
- </Text>
3541
- </View>
3542
- </View>
3543
-
3544
- <TouchableScale accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle show duplicate logs" accessibilityState={{ checked: showDuplicateLogs }} onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
3545
- width: 42,
3546
- height: 24,
3547
- borderRadius: 12,
3548
- backgroundColor: showDuplicateLogs
3549
- ? AppColors.purple
3550
- : AppColors.grayBorderSecondary,
3551
- padding: 2,
3552
- justifyContent: 'center',
3553
- alignItems: showDuplicateLogs ? 'flex-end' : 'flex-start',
3554
- }}>
3555
- <View style={{
3556
- width: 20,
3557
- height: 20,
3558
- borderRadius: 10,
3559
- backgroundColor: AppColors.white,
3560
- shadowColor: AppColors.black,
3561
- shadowOpacity: 0.18,
3562
- shadowRadius: 2,
3563
- shadowOffset: { width: 0, height: 1 },
3564
- }}/>
3565
- </TouchableScale>
3566
- </View>
3567
- </View>
3568
-
3569
- <View style={{
3570
- backgroundColor: AppColors.primaryLight,
3571
- borderRadius: 14,
3572
- borderWidth: 1,
3573
- borderColor: AppColors.grayBorderSecondary,
3574
- padding: 16,
3575
- }}>
3576
- {renderSettingRow({
3577
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3578
- label: t('settings.logs.clearConsoleLogs'),
3579
- description: t('settings.logs.clearConsoleLogsDescription', {
3580
- count: consoleLogs.length,
3581
- }),
3582
- isLast: true,
3583
- onPress: () => {
3584
- clearConsoleLogs();
3585
- Alert.alert(t('common.success'), t('settings.logs.consoleLogsCleared'));
3586
- },
3587
- right: (<View style={{
3588
- paddingHorizontal: 12,
3589
- paddingVertical: 6,
3590
- borderRadius: 8,
3591
- backgroundColor: `${AppColors.errorColor}14`,
3592
- borderWidth: 1,
3593
- borderColor: `${AppColors.errorColor}33`,
3594
- }}>
3595
- <Text style={{
3596
- fontFamily: AppFonts.interBold,
3597
- fontSize: 11,
3598
- lineHeight: 14,
3599
- color: AppColors.errorColor,
3600
- }}>
3601
- {t('common.clear')}
3602
- </Text>
3603
- </View>),
3604
- })}
3605
- </View>
3606
- <View style={{ height: 48 }}/>
3607
- </ScrollView>);
3608
- }
3609
- else if (settingsPage === 'analytics') {
3610
- title = t('settings.analytics.title');
3611
- icon = <AnalyticsIcon color={AppColors.white} size={16}/>;
3612
- rightInfo = t('settings.analytics.total', { count: analyticsEvents.length });
3613
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3614
- <View style={{
3615
- backgroundColor: AppColors.primaryLight,
3616
- padding: 16,
3617
- borderRadius: 14,
3618
- borderWidth: 1,
3619
- borderColor: AppColors.grayBorderSecondary,
3620
- }}>
3621
- {renderSettingRow({
3622
- icon: <AnalyticsIcon color={AppColors.purple} size={16}/>,
3623
- label: t('settings.analytics.maxAnalyticsEvents'),
3624
- description: t('settings.analytics.maxAnalyticsEventsDescription', {
3625
- count: analyticsEvents.length,
3626
- }),
3627
- numericInput: {
3628
- value: maxAnalyticsEventsLimit,
3629
- onChange: setMaxAnalyticsEventsLimit,
3630
- min: 10,
3631
- max: 75,
3632
- placeholder: 'Enter max events (10-75)',
3633
- },
3634
- isLast: true,
3635
- })}
3636
- </View>
3637
- <View style={{
3638
- backgroundColor: AppColors.primaryLight,
3639
- borderRadius: 14,
3640
- borderWidth: 1,
3641
- borderColor: AppColors.grayBorderSecondary,
3642
- padding: 16,
3643
- }}>
3644
- {renderSettingRow({
3645
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3646
- label: t('settings.analytics.clearAnalyticsEvents'),
3647
- description: t('settings.analytics.clearAnalyticsEventsDescription'),
3648
- isLast: true,
3649
- onPress: () => {
3650
- clearAnalyticsEvents();
3651
- setSelectedEvent(null);
3652
- Alert.alert(t('common.success'), t('settings.analytics.analyticsEventsCleared'));
3653
- },
3654
- right: (<View style={{
3655
- paddingHorizontal: 12,
3656
- paddingVertical: 6,
3657
- borderRadius: 8,
3658
- backgroundColor: `${AppColors.errorColor}14`,
3659
- borderWidth: 1,
3660
- borderColor: `${AppColors.errorColor}33`,
3661
- }}>
3662
- <Text style={{
3663
- fontFamily: AppFonts.interBold,
3664
- fontSize: 11,
3665
- lineHeight: 14,
3666
- color: AppColors.errorColor,
3667
- }}>
3668
- {t('common.clear')}
3669
- </Text>
3670
- </View>),
3671
- })}
3672
- </View>
3673
- <View style={{ height: 48 }}/>
3674
- </ScrollView>);
3675
- }
3676
- else if (settingsPage === 'redux') {
3677
- title = t('settings.redux.title');
3678
- icon = <ReduxIcon color={AppColors.white} size={16}/>;
3679
- rightInfo = t('settings.redux.reducers', {
3680
- count: Object.keys(reduxState || {}).length,
3681
- });
3682
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3683
- <View style={{
3684
- backgroundColor: AppColors.primaryLight,
3685
- padding: 16,
3686
- borderRadius: 14,
3687
- borderWidth: 1,
3688
- borderColor: AppColors.grayBorderSecondary,
3689
- gap: 4,
3690
- }}>
3691
- {renderSettingRow({
3692
- icon: <ReduxIcon color={AppColors.purple} size={16}/>,
3693
- label: t('settings.redux.autoRefresh'),
3694
- description: t('settings.redux.autoRefreshDescription'),
3695
- onPress: () => setReduxAutoRefreshState(prev => !prev),
3696
- right: (<View style={{
3697
- width: 22,
3698
- height: 22,
3699
- borderRadius: 6,
3700
- borderWidth: 2,
3701
- borderColor: reduxAutoRefresh
3702
- ? AppColors.purple
3703
- : AppColors.grayTextWeak,
3704
- backgroundColor: reduxAutoRefresh
3705
- ? `${AppColors.purple}1A`
3706
- : 'transparent',
3707
- alignItems: 'center',
3708
- justifyContent: 'center',
3709
- }}>
3710
- {reduxAutoRefresh && (<CheckIcon size={12} color={AppColors.purple}/>)}
3711
- </View>),
3712
- })}
3713
- <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
3714
- {renderSettingRow({
3715
- icon: <LayersIcon color={AppColors.purple} size={16}/>,
3716
- label: t('settings.redux.defaultJsonExpandDepth'),
3717
- description: t('settings.redux.defaultJsonExpandDepthDescription'),
3718
- picker: {
3719
- options: [1, 2, 3, 5],
3720
- selectedValue: reduxExpandDepth,
3721
- onSelect: setReduxExpandDepth,
3722
- },
3723
- isLast: true,
3724
- })}
3725
- </View>
3726
-
3727
- <View style={{
3728
- backgroundColor: AppColors.primaryLight,
3729
- borderRadius: 14,
3730
- borderWidth: 1,
3731
- borderColor: AppColors.grayBorderSecondary,
3732
- padding: 16,
3733
- }}>
3734
- {renderSettingRow({
3735
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3736
- label: t('settings.redux.clearReduxState'),
3737
- description: reduxState
3738
- ? t('settings.redux.clearReduxStateDescription')
3739
- : t('settings.redux.clearReduxStateEmpty'),
3740
- isLast: true,
3741
- onPress: () => {
3742
- setReduxState(null);
3743
- Alert.alert(t('common.success'), t('settings.redux.reduxStateCleared'));
3744
- },
3745
- right: (<View style={{
3746
- paddingHorizontal: 12,
3747
- paddingVertical: 6,
3748
- borderRadius: 8,
3749
- backgroundColor: `${AppColors.errorColor}14`,
3750
- borderWidth: 1,
3751
- borderColor: `${AppColors.errorColor}33`,
3752
- }}>
3753
- <Text style={{
3754
- fontFamily: AppFonts.interBold,
3755
- fontSize: 11,
3756
- lineHeight: 14,
3757
- color: AppColors.errorColor,
3758
- }}>
3759
- {t('common.clear')}
3760
- </Text>
3761
- </View>),
3762
- })}
3763
- </View>
3764
- <View style={{ height: 48 }}/>
3765
- </ScrollView>);
3766
- }
3767
- else if (settingsPage === 'crash') {
3768
- title = t('settings.crash.title');
3769
- icon = <CrashIcon color={AppColors.white} size={16}/>;
3770
- rightInfo = `Total: ${crashRecords?.length || 0}`;
3771
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3772
- <View style={{
3773
- backgroundColor: AppColors.primaryLight,
3774
- padding: 16,
3775
- borderRadius: 14,
3776
- borderWidth: 1,
3777
- borderColor: AppColors.grayBorderSecondary,
3778
- gap: 4,
3779
- }}>
3780
- {renderSettingRow({
3781
- icon: <LayersIcon color={AppColors.purple} size={16}/>,
3782
- label: t('settings.crash.maxCrashLogs'),
3783
- description: t('settings.crash.maxCrashLogsDesc'),
3784
- numericInput: {
3785
- value: maxCrashLogs,
3786
- onChange: setMaxCrashLogs,
3787
- min: 5,
3788
- max: 50,
3789
- placeholder: 'Enter max crashes (5-50)',
3790
- },
3791
- })}
3792
- <View style={{ height: 1, backgroundColor: AppColors.dividerColor }}/>
3793
- {renderSettingRow({
3794
- icon: <ShieldAlertIcon color={AppColors.greenColor} size={16}/>,
3795
- label: t('settings.crash.globalGuard'),
3796
- description: t('settings.crash.globalGuardDesc'),
3797
- isLast: true,
3798
- right: (<View style={{
3799
- paddingHorizontal: 8,
3800
- paddingVertical: 4,
3801
- borderRadius: 6,
3802
- backgroundColor: `${AppColors.greenColor}1F`,
3803
- }}>
3804
- <Text style={{
3805
- fontFamily: AppFonts.interBold,
3806
- fontSize: 10,
3807
- lineHeight: 13,
3808
- color: AppColors.greenColor,
3809
- }}>
3810
- {t('settings.protectedBadge')}
3811
- </Text>
3812
- </View>),
3813
- })}
3814
- </View>
3815
-
3816
- <View style={{
3817
- backgroundColor: AppColors.primaryLight,
3818
- borderRadius: 14,
3819
- borderWidth: 1,
3820
- borderColor: AppColors.grayBorderSecondary,
3821
- padding: 16,
3822
- }}>
3823
- {renderSettingRow({
3824
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3825
- label: t('settings.crash.clearHistory'),
3826
- description: t('settings.crash.clearHistoryDesc', {
3827
- count: crashRecords?.length || 0,
3828
- }),
3829
- isLast: true,
3830
- onPress: () => {
3831
- clearCrashRecords();
3832
- Alert.alert(t('common.success'), t('settings.crash.historyCleared'));
3833
- },
3834
- right: (<View style={{
3835
- paddingHorizontal: 12,
3836
- paddingVertical: 6,
3837
- borderRadius: 8,
3838
- backgroundColor: `${AppColors.errorColor}14`,
3839
- borderWidth: 1,
3840
- borderColor: `${AppColors.errorColor}33`,
3841
- }}>
3842
- <Text style={{
3843
- fontFamily: AppFonts.interBold,
3844
- fontSize: 11,
3845
- lineHeight: 14,
3846
- color: AppColors.errorColor,
3847
- }}>
3848
- {t('common.clear')}
3849
- </Text>
3850
- </View>),
3851
- })}
3852
- </View>
3853
- <View style={{ height: 48 }}/>
3854
- </ScrollView>);
3855
- }
3856
- else if (settingsPage === 'bundle') {
3857
- title = t('settings.bundle.title');
3858
- icon = <PackageIcon color={AppColors.white} size={16}/>;
3859
- rightInfo = 'Metro';
3860
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3861
- <View style={{
3862
- backgroundColor: AppColors.primaryLight,
3863
- padding: 16,
3864
- borderRadius: 14,
3865
- borderWidth: 1,
3866
- borderColor: AppColors.grayBorderSecondary,
3867
- gap: 8,
3868
- }}>
3869
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
3870
- <View style={{
3871
- width: 36,
3872
- height: 36,
3873
- borderRadius: 10,
3874
- backgroundColor: AppColors.purpleShade50,
3875
- alignItems: 'center',
3876
- justifyContent: 'center',
3877
- }}>
3878
- <PackageIcon color={AppColors.purple} size={16}/>
3879
- </View>
3880
- <View style={{ flex: 1 }}>
3881
- <Text style={{
3882
- fontFamily: AppFonts.interBold,
3883
- fontSize: 14,
3884
- lineHeight: 18,
3885
- color: AppColors.primaryBlack,
3886
- }}>
3887
- {t('settings.bundle.sourceBundler')}
3888
- </Text>
3889
- <Text style={{
3890
- fontFamily: AppFonts.interRegular,
3891
- fontSize: 11,
3892
- lineHeight: 15,
3893
- color: AppColors.grayText,
3894
- marginTop: 1,
3895
- }}>
3896
- {t('settings.bundle.sourceBundlerDesc')}
3897
- </Text>
3898
- </View>
3899
- </View>
3900
- </View>
3901
-
3902
- <View style={{
3903
- backgroundColor: AppColors.primaryLight,
3904
- borderRadius: 14,
3905
- borderWidth: 1,
3906
- borderColor: AppColors.grayBorderSecondary,
3907
- padding: 16,
3908
- }}>
3909
- {renderSettingRow({
3910
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3911
- label: t('settings.bundle.clearCache'),
3912
- description: t('settings.bundle.clearCacheDesc'),
3913
- isLast: true,
3914
- onPress: () => {
3915
- clearCachedBundleAnalysis();
3916
- Alert.alert(t('common.success'), t('settings.bundle.cacheCleared'));
3917
- },
3918
- right: (<View style={{
3919
- paddingHorizontal: 12,
3920
- paddingVertical: 6,
3921
- borderRadius: 8,
3922
- backgroundColor: `${AppColors.errorColor}14`,
3923
- borderWidth: 1,
3924
- borderColor: `${AppColors.errorColor}33`,
3925
- }}>
3926
- <Text style={{
3927
- fontFamily: AppFonts.interBold,
3928
- fontSize: 11,
3929
- lineHeight: 14,
3930
- color: AppColors.errorColor,
3931
- }}>
3932
- {t('common.clear')}
3933
- </Text>
3934
- </View>),
3935
- })}
3936
- </View>
3937
- <View style={{ height: 48 }}/>
3938
- </ScrollView>);
3939
- }
3940
- else if (settingsPage === 'performance') {
3941
- title = t('settings.performance.title');
3942
- icon = <PerformanceIcon color={AppColors.white} size={16}/>;
3943
- rightInfo = '60 FPS Target';
3944
- content = (<ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
3945
- <View style={{
3946
- backgroundColor: AppColors.primaryLight,
3947
- padding: 16,
3948
- borderRadius: 14,
3949
- borderWidth: 1,
3950
- borderColor: AppColors.grayBorderSecondary,
3951
- gap: 8,
3952
- }}>
3953
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
3954
- <View style={{
3955
- width: 36,
3956
- height: 36,
3957
- borderRadius: 10,
3958
- backgroundColor: AppColors.purpleShade50,
3959
- alignItems: 'center',
3960
- justifyContent: 'center',
3961
- }}>
3962
- <PerformanceIcon color={AppColors.purple} size={16}/>
3963
- </View>
3964
- <View style={{ flex: 1 }}>
3965
- <Text style={{
3966
- fontFamily: AppFonts.interBold,
3967
- fontSize: 14,
3968
- lineHeight: 18,
3969
- color: AppColors.primaryBlack,
3970
- }}>
3971
- {t('settings.performance.frameMeasurement')}
3972
- </Text>
3973
- <Text style={{
3974
- fontFamily: AppFonts.interRegular,
3975
- fontSize: 11,
3976
- lineHeight: 15,
3977
- color: AppColors.grayText,
3978
- marginTop: 1,
3979
- }}>
3980
- {t('settings.performance.frameMeasurementDesc')}
3981
- </Text>
3982
- </View>
3983
- </View>
3984
- </View>
3985
-
3986
- <View style={{
3987
- backgroundColor: AppColors.primaryLight,
3988
- borderRadius: 14,
3989
- borderWidth: 1,
3990
- borderColor: AppColors.grayBorderSecondary,
3991
- padding: 16,
3992
- }}>
3993
- {renderSettingRow({
3994
- icon: <TrashIcon color={AppColors.errorColor} size={16}/>,
3995
- label: t('settings.performance.clearEvents'),
3996
- description: t('settings.performance.clearEventsDesc'),
3997
- isLast: true,
3998
- onPress: () => {
3999
- clearPerformanceEvents();
4000
- Alert.alert(t('common.success'), t('settings.performance.eventsCleared'));
4001
- },
4002
- right: (<View style={{
4003
- paddingHorizontal: 12,
4004
- paddingVertical: 6,
4005
- borderRadius: 8,
4006
- backgroundColor: `${AppColors.errorColor}14`,
4007
- borderWidth: 1,
4008
- borderColor: `${AppColors.errorColor}33`,
4009
- }}>
4010
- <Text style={{
4011
- fontFamily: AppFonts.interBold,
4012
- fontSize: 11,
4013
- lineHeight: 14,
4014
- color: AppColors.errorColor,
4015
- }}>
4016
- {t('common.clear')}
4017
- </Text>
4018
- </View>),
4019
- })}
4020
- </View>
4021
- <View style={{ height: 48 }}/>
4022
- </ScrollView>);
4023
- }
4024
- const subPageAnim = useRef(new Animated.Value(0)).current;
4025
- useEffect(() => {
4026
- if (settingsPage !== 'main') {
4027
- subPageAnim.setValue(0);
4028
- Animated.spring(subPageAnim, {
4029
- toValue: 1,
4030
- friction: 8,
4031
- tension: 65,
4032
- useNativeDriver: true,
4033
- }).start();
4034
- }
4035
- }, [settingsPage]);
4036
- return (<View style={{
4037
- flex: 1,
4038
- backgroundColor: AppColors.grayBackground,
4039
- }}>
589
+ <C style={{flexDirection:"row",alignItems:"center",justifyContent:"space-between"}}>
590
+ <C style={{flexDirection:"row",alignItems:"center",gap:10,flex:1}}>
591
+ <C style={{width:32,height:32,borderRadius:8,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
592
+ <Tr color={e.purple}size={15}/>
593
+ </C>
594
+ <C style={{flex:1}}>
595
+ <S style={{fontFamily:k.interBold,fontSize:13.5,lineHeight:18,color:e.primaryBlack}}>
596
+ {x("settings.general.duplicateLogs")}
597
+ </S>
598
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
599
+ {x("settings.general.duplicateLogsDescription")}
600
+ </S>
601
+ </C>
602
+ </C>
603
+
604
+ <H accessible={!0}accessibilityRole="switch"accessibilityLabel="Toggle show duplicate logs"accessibilityState={{checked:Ve}}onPress={()=>Mr(r=>!r)}style={{width:42,height:24,borderRadius:12,backgroundColor:Ve?e.purple:e.grayBorderSecondary,padding:2,justifyContent:"center",alignItems:Ve?"flex-end":"flex-start"}}>
605
+ <C style={{width:20,height:20,borderRadius:10,backgroundColor:e.white,shadowColor:e.black,shadowOpacity:.18,shadowRadius:2,shadowOffset:{width:0,height:1}}}/>
606
+ </H>
607
+ </C>
608
+ </C>
609
+
610
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
611
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.logs.clearConsoleLogs"),description:x("settings.logs.clearConsoleLogsDescription",{count:Re.length}),isLast:!0,onPress:()=>{Ho(),W.alert(x("common.success"),x("settings.logs.consoleLogsCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
612
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
613
+ {x("common.clear")}
614
+ </S>
615
+ </C>})}
616
+ </C>
617
+ <C style={{height:48}}/>
618
+ </A>):F==="analytics"?(E=x("settings.analytics.title"),O=<Ge color={e.white}size={16}/>,j=x("settings.analytics.total",{count:ve.length}),$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
619
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary}}>
620
+ {z({icon:<Ge color={e.purple}size={16}/>,label:x("settings.analytics.maxAnalyticsEvents"),description:x("settings.analytics.maxAnalyticsEventsDescription",{count:ve.length}),numericInput:{value:_e,onChange:qr,min:10,max:75,placeholder:"Enter max events (10-75)"},isLast:!0})}
621
+ </C>
622
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
623
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.analytics.clearAnalyticsEvents"),description:x("settings.analytics.clearAnalyticsEventsDescription"),isLast:!0,onPress:()=>{Do(),Xr(null),W.alert(x("common.success"),x("settings.analytics.analyticsEventsCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
624
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
625
+ {x("common.clear")}
626
+ </S>
627
+ </C>})}
628
+ </C>
629
+ <C style={{height:48}}/>
630
+ </A>):F==="redux"?(E=x("settings.redux.title"),O=<Ue color={e.white}size={16}/>,j=x("settings.redux.reducers",{count:Object.keys(He||{}).length}),$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
631
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4}}>
632
+ {z({icon:<Ue color={e.purple}size={16}/>,label:x("settings.redux.autoRefresh"),description:x("settings.redux.autoRefreshDescription"),onPress:()=>_r(r=>!r),right:<C style={{width:22,height:22,borderRadius:6,borderWidth:2,borderColor:Fe?e.purple:e.grayTextWeak,backgroundColor:Fe?`${e.purple}1A`:"transparent",alignItems:"center",justifyContent:"center"}}>
633
+ {Fe&&<N size={12}color={e.purple}/>}
634
+ </C>})}
635
+ <C style={{height:1,backgroundColor:e.dividerColor}}/>
636
+ {z({icon:<Ce color={e.purple}size={16}/>,label:x("settings.redux.defaultJsonExpandDepth"),description:x("settings.redux.defaultJsonExpandDepthDescription"),picker:{options:[1,2,3,5],selectedValue:Ke,onSelect:Kr},isLast:!0})}
637
+ </C>
638
+
639
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
640
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.redux.clearReduxState"),description:x(He?"settings.redux.clearReduxStateDescription":"settings.redux.clearReduxStateEmpty"),isLast:!0,onPress:()=>{Yr(null),W.alert(x("common.success"),x("settings.redux.reduxStateCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
641
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
642
+ {x("common.clear")}
643
+ </S>
644
+ </C>})}
645
+ </C>
646
+ <C style={{height:48}}/>
647
+ </A>):F==="crash"?(E=x("settings.crash.title"),O=<Vr color={e.white}size={16}/>,j=`Total: ${We?.length||0}`,$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
648
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:4}}>
649
+ {z({icon:<Ce color={e.purple}size={16}/>,label:x("settings.crash.maxCrashLogs"),description:x("settings.crash.maxCrashLogsDesc"),numericInput:{value:Qe,onChange:Zr,min:5,max:50,placeholder:"Enter max crashes (5-50)"}})}
650
+ <C style={{height:1,backgroundColor:e.dividerColor}}/>
651
+ {z({icon:<Br color={e.greenColor}size={16}/>,label:x("settings.crash.globalGuard"),description:x("settings.crash.globalGuardDesc"),isLast:!0,right:<C style={{paddingHorizontal:8,paddingVertical:4,borderRadius:6,backgroundColor:`${e.greenColor}1F`}}>
652
+ <S style={{fontFamily:k.interBold,fontSize:10,lineHeight:13,color:e.greenColor}}>
653
+ {x("settings.protectedBadge")}
654
+ </S>
655
+ </C>})}
656
+ </C>
657
+
658
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
659
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.crash.clearHistory"),description:x("settings.crash.clearHistoryDesc",{count:We?.length||0}),isLast:!0,onPress:()=>{Lo(),W.alert(x("common.success"),x("settings.crash.historyCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
660
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
661
+ {x("common.clear")}
662
+ </S>
663
+ </C>})}
664
+ </C>
665
+ <C style={{height:48}}/>
666
+ </A>):F==="bundle"?(E=x("settings.bundle.title"),O=<Se color={e.white}size={16}/>,j="Metro",$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
667
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:8}}>
668
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
669
+ <C style={{width:36,height:36,borderRadius:10,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
670
+ <Se color={e.purple}size={16}/>
671
+ </C>
672
+ <C style={{flex:1}}>
673
+ <S style={{fontFamily:k.interBold,fontSize:14,lineHeight:18,color:e.primaryBlack}}>
674
+ {x("settings.bundle.sourceBundler")}
675
+ </S>
676
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
677
+ {x("settings.bundle.sourceBundlerDesc")}
678
+ </S>
679
+ </C>
680
+ </C>
681
+ </C>
682
+
683
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
684
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.bundle.clearCache"),description:x("settings.bundle.clearCacheDesc"),isLast:!0,onPress:()=>{Io(),W.alert(x("common.success"),x("settings.bundle.cacheCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
685
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
686
+ {x("common.clear")}
687
+ </S>
688
+ </C>})}
689
+ </C>
690
+ <C style={{height:48}}/>
691
+ </A>):F==="performance"&&(E=x("settings.performance.title"),O=<Je color={e.white}size={16}/>,j="60 FPS Target",$=<A style={{flex:1}}contentContainerStyle={{padding:16,paddingBottom:100,gap:12}}>
692
+ <C style={{backgroundColor:e.primaryLight,padding:16,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,gap:8}}>
693
+ <C style={{flexDirection:"row",alignItems:"center",gap:10}}>
694
+ <C style={{width:36,height:36,borderRadius:10,backgroundColor:e.purpleShade50,alignItems:"center",justifyContent:"center"}}>
695
+ <Je color={e.purple}size={16}/>
696
+ </C>
697
+ <C style={{flex:1}}>
698
+ <S style={{fontFamily:k.interBold,fontSize:14,lineHeight:18,color:e.primaryBlack}}>
699
+ {x("settings.performance.frameMeasurement")}
700
+ </S>
701
+ <S style={{fontFamily:k.interRegular,fontSize:11,lineHeight:15,color:e.grayText,marginTop:1}}>
702
+ {x("settings.performance.frameMeasurementDesc")}
703
+ </S>
704
+ </C>
705
+ </C>
706
+ </C>
707
+
708
+ <C style={{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:16}}>
709
+ {z({icon:<P color={e.errorColor}size={16}/>,label:x("settings.performance.clearEvents"),description:x("settings.performance.clearEventsDesc"),isLast:!0,onPress:()=>{Fo(),W.alert(x("common.success"),x("settings.performance.eventsCleared"))},right:<C style={{paddingHorizontal:12,paddingVertical:6,borderRadius:8,backgroundColor:`${e.errorColor}14`,borderWidth:1,borderColor:`${e.errorColor}33`}}>
710
+ <S style={{fontFamily:k.interBold,fontSize:11,lineHeight:14,color:e.errorColor}}>
711
+ {x("common.clear")}
712
+ </S>
713
+ </C>})}
714
+ </C>
715
+ <C style={{height:48}}/>
716
+ </A>);const Y=lo(new Ee.Value(0)).current;return Me(()=>{F!=="main"&&(Y.setValue(0),Ee.spring(Y,{toValue:1,friction:8,tension:65,useNativeDriver:!0}).start())},[F]),<C style={{flex:1,backgroundColor:e.grayBackground}}>
4040
717
 
4041
- <View style={[
4042
- StyleSheet.absoluteFill,
4043
- settingsPage !== 'main' && { pointerEvents: 'none' },
4044
- ]}>
4045
- {renderMainSettingsContent()}
4046
- </View>
718
+ <C style={[rr.absoluteFill,F!=="main"&&{pointerEvents:"none"}]}>
719
+ {to()}
720
+ </C>
4047
721
 
4048
722
 
4049
- {settingsPage !== 'main' && (<Animated.View style={[
4050
- StyleSheet.absoluteFill,
4051
- {
4052
- backgroundColor: AppColors.grayBackground,
4053
- opacity: subPageAnim,
4054
- transform: [
4055
- {
4056
- translateX: subPageAnim.interpolate({
4057
- inputRange: [0, 1],
4058
- outputRange: [30, 0],
4059
- }),
4060
- },
4061
- ],
4062
- },
4063
- ]}>
4064
- {content}
4065
- </Animated.View>)}
4066
- </View>);
4067
- };
4068
- export default SettingsPanel;
723
+ {F!=="main"&&<Ee.View style={[rr.absoluteFill,{backgroundColor:e.grayBackground,opacity:Y,transform:[{translateX:Y.interpolate({inputRange:[0,1],outputRange:[30,0]})}]}]}>
724
+ {$}
725
+ </Ee.View>}
726
+ </C>};export default Tt;