@oxyhq/services 5.14.0 → 5.15.0

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 (1157) hide show
  1. package/README.md +130 -54
  2. package/lib/commonjs/assets/assets/lottie/welcomeheader_background_op1.json +1 -0
  3. package/lib/commonjs/assets/lottie/welcomeheader_background_op1.json +1 -0
  4. package/lib/commonjs/core/HttpService.js +94 -4
  5. package/lib/commonjs/core/HttpService.js.map +1 -1
  6. package/lib/commonjs/core/OxyServices.base.js +3 -1
  7. package/lib/commonjs/core/OxyServices.base.js.map +1 -1
  8. package/lib/commonjs/core/mixins/OxyServices.assets.js +213 -22
  9. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
  10. package/lib/commonjs/core/mixins/OxyServices.auth.js +70 -99
  11. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
  12. package/lib/commonjs/crypto/index.js +33 -0
  13. package/lib/commonjs/crypto/index.js.map +1 -0
  14. package/lib/commonjs/crypto/keyManager.js +208 -0
  15. package/lib/commonjs/crypto/keyManager.js.map +1 -0
  16. package/lib/commonjs/crypto/recoveryPhrase.js +137 -0
  17. package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
  18. package/lib/commonjs/crypto/signatureService.js +230 -0
  19. package/lib/commonjs/crypto/signatureService.js.map +1 -0
  20. package/lib/commonjs/i18n/locales/en-US.json +4 -0
  21. package/lib/commonjs/index.js +22 -0
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/ui/components/ActivityIndicator.js +203 -0
  24. package/lib/commonjs/ui/components/ActivityIndicator.js.map +1 -0
  25. package/lib/commonjs/ui/components/AutoHeightScrollView.js +46 -0
  26. package/lib/commonjs/ui/components/AutoHeightScrollView.js.map +1 -0
  27. package/lib/commonjs/ui/components/BottomSheet.js +407 -0
  28. package/lib/commonjs/ui/components/BottomSheet.js.map +1 -0
  29. package/lib/commonjs/ui/components/BottomSheetRouter.js +366 -0
  30. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -0
  31. package/lib/commonjs/ui/components/CrossFadeIcon.js +106 -0
  32. package/lib/commonjs/ui/components/CrossFadeIcon.js.map +1 -0
  33. package/lib/commonjs/ui/components/EmptyState.js +41 -0
  34. package/lib/commonjs/ui/components/EmptyState.js.map +1 -0
  35. package/lib/commonjs/ui/components/GroupedItem.js +87 -82
  36. package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
  37. package/lib/commonjs/ui/components/GroupedSection.js +25 -25
  38. package/lib/commonjs/ui/components/GroupedSection.js.map +1 -1
  39. package/lib/commonjs/ui/components/Header.js +111 -47
  40. package/lib/commonjs/ui/components/Header.js.map +1 -1
  41. package/lib/commonjs/ui/components/HelperText.js +103 -0
  42. package/lib/commonjs/ui/components/HelperText.js.map +1 -0
  43. package/lib/commonjs/ui/components/Icon.js +109 -0
  44. package/lib/commonjs/ui/components/Icon.js.map +1 -0
  45. package/lib/commonjs/ui/components/IconButton/IconButton.js +159 -0
  46. package/lib/commonjs/ui/components/IconButton/IconButton.js.map +1 -0
  47. package/lib/commonjs/ui/components/IconButton/utils.js +155 -0
  48. package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -0
  49. package/lib/commonjs/ui/components/LoadingState.js +47 -0
  50. package/lib/commonjs/ui/components/LoadingState.js.map +1 -0
  51. package/lib/commonjs/ui/components/OxyPayButton.js +1 -14
  52. package/lib/commonjs/ui/components/OxyPayButton.js.map +1 -1
  53. package/lib/commonjs/ui/components/OxyProvider.js +41 -391
  54. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  55. package/lib/commonjs/ui/components/OxySignInButton.js +9 -13
  56. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  57. package/lib/commonjs/ui/components/ProfileCard.js +7 -4
  58. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  59. package/lib/commonjs/ui/components/QuickActions.js +7 -4
  60. package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
  61. package/lib/commonjs/ui/components/Section.js +4 -1
  62. package/lib/commonjs/ui/components/Section.js.map +1 -1
  63. package/lib/commonjs/ui/components/SectionTitle.js +6 -3
  64. package/lib/commonjs/ui/components/SectionTitle.js.map +1 -1
  65. package/lib/commonjs/ui/components/SettingRow.js +77 -0
  66. package/lib/commonjs/ui/components/SettingRow.js.map +1 -0
  67. package/lib/commonjs/ui/components/StepBasedScreen.js +188 -172
  68. package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
  69. package/lib/commonjs/ui/components/Surface.js +258 -0
  70. package/lib/commonjs/ui/components/Surface.js.map +1 -0
  71. package/lib/commonjs/ui/components/TextField/Addons/Outline.js +46 -0
  72. package/lib/commonjs/ui/components/TextField/Addons/Outline.js.map +1 -0
  73. package/lib/commonjs/ui/components/TextField/Addons/Underline.js +53 -0
  74. package/lib/commonjs/ui/components/TextField/Addons/Underline.js.map +1 -0
  75. package/lib/commonjs/ui/components/TextField/Adornment/TextFieldAdornment.js +155 -0
  76. package/lib/commonjs/ui/components/TextField/Adornment/TextFieldAdornment.js.map +1 -0
  77. package/lib/commonjs/ui/components/TextField/Adornment/TextFieldAffix.js +144 -0
  78. package/lib/commonjs/ui/components/TextField/Adornment/TextFieldAffix.js.map +1 -0
  79. package/lib/commonjs/ui/components/TextField/Adornment/TextFieldIcon.js +137 -0
  80. package/lib/commonjs/ui/components/TextField/Adornment/TextFieldIcon.js.map +1 -0
  81. package/lib/commonjs/ui/components/TextField/Adornment/enums.js +22 -0
  82. package/lib/commonjs/ui/components/TextField/Adornment/enums.js.map +1 -0
  83. package/lib/commonjs/ui/components/TextField/Adornment/types.js +6 -0
  84. package/lib/commonjs/ui/components/TextField/Adornment/types.js.map +1 -0
  85. package/lib/commonjs/ui/components/TextField/Adornment/utils.js +62 -0
  86. package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -0
  87. package/lib/commonjs/ui/components/TextField/Label/InputLabel.js +176 -0
  88. package/lib/commonjs/ui/components/TextField/Label/InputLabel.js.map +1 -0
  89. package/lib/commonjs/ui/components/TextField/Label/LabelBackground.js +84 -0
  90. package/lib/commonjs/ui/components/TextField/Label/LabelBackground.js.map +1 -0
  91. package/lib/commonjs/ui/components/TextField/TextFieldFlat.js +377 -0
  92. package/lib/commonjs/ui/components/TextField/TextFieldFlat.js.map +1 -0
  93. package/lib/commonjs/ui/components/TextField/TextFieldOutlined.js +361 -0
  94. package/lib/commonjs/ui/components/TextField/TextFieldOutlined.js.map +1 -0
  95. package/lib/commonjs/ui/components/TextField/constants.js +50 -0
  96. package/lib/commonjs/ui/components/TextField/constants.js.map +1 -0
  97. package/lib/commonjs/ui/components/TextField/helpers.js +490 -0
  98. package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -0
  99. package/lib/commonjs/ui/components/TextField/types.js +6 -0
  100. package/lib/commonjs/ui/components/TextField/types.js.map +1 -0
  101. package/lib/commonjs/ui/components/TextField.js +339 -0
  102. package/lib/commonjs/ui/components/TextField.js.map +1 -0
  103. package/lib/commonjs/ui/components/TouchableRipple/Pressable.js +12 -0
  104. package/lib/commonjs/ui/components/TouchableRipple/Pressable.js.map +1 -0
  105. package/lib/commonjs/ui/components/TouchableRipple/TouchableRipple.js +258 -0
  106. package/lib/commonjs/ui/components/TouchableRipple/TouchableRipple.js.map +1 -0
  107. package/lib/commonjs/ui/components/TouchableRipple/TouchableRipple.native.js +107 -0
  108. package/lib/commonjs/ui/components/TouchableRipple/TouchableRipple.native.js.map +1 -0
  109. package/lib/commonjs/ui/components/TouchableRipple/utils.js +56 -0
  110. package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -0
  111. package/lib/commonjs/ui/components/Typography/AnimatedText.js +62 -0
  112. package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -0
  113. package/lib/commonjs/ui/components/Typography/types.js +26 -0
  114. package/lib/commonjs/ui/components/Typography/types.js.map +1 -0
  115. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +171 -0
  116. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -0
  117. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +409 -0
  118. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -0
  119. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +181 -0
  120. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -0
  121. package/lib/commonjs/ui/components/fileManagement/styles.js +868 -0
  122. package/lib/commonjs/ui/components/fileManagement/styles.js.map +1 -0
  123. package/lib/commonjs/ui/components/index.js +29 -1
  124. package/lib/commonjs/ui/components/index.js.map +1 -1
  125. package/lib/commonjs/ui/components/profile/EditBioModal.js +181 -0
  126. package/lib/commonjs/ui/components/profile/EditBioModal.js.map +1 -0
  127. package/lib/commonjs/ui/components/profile/EditDisplayNameModal.js +207 -0
  128. package/lib/commonjs/ui/components/profile/EditDisplayNameModal.js.map +1 -0
  129. package/lib/commonjs/ui/components/profile/EditEmailModal.js +184 -0
  130. package/lib/commonjs/ui/components/profile/EditEmailModal.js.map +1 -0
  131. package/lib/commonjs/ui/components/profile/EditLinksModal.js +315 -0
  132. package/lib/commonjs/ui/components/profile/EditLinksModal.js.map +1 -0
  133. package/lib/commonjs/ui/components/profile/EditLocationModal.js +273 -0
  134. package/lib/commonjs/ui/components/profile/EditLocationModal.js.map +1 -0
  135. package/lib/commonjs/ui/components/profile/EditUsernameModal.js +180 -0
  136. package/lib/commonjs/ui/components/profile/EditUsernameModal.js.map +1 -0
  137. package/lib/commonjs/ui/components/profile/TwoFactorSetupModal.js +467 -0
  138. package/lib/commonjs/ui/components/profile/TwoFactorSetupModal.js.map +1 -0
  139. package/lib/commonjs/ui/components/styles/overlay.js +85 -0
  140. package/lib/commonjs/ui/components/styles/overlay.js.map +1 -0
  141. package/lib/commonjs/ui/components/styles/shadow.js +132 -0
  142. package/lib/commonjs/ui/components/styles/shadow.js.map +1 -0
  143. package/lib/commonjs/ui/components/theming.js +116 -0
  144. package/lib/commonjs/ui/components/theming.js.map +1 -0
  145. package/lib/commonjs/ui/components/types.js +2 -0
  146. package/lib/commonjs/ui/components/types.js.map +1 -0
  147. package/lib/commonjs/ui/components/utils/forwardRef.js +18 -0
  148. package/lib/commonjs/ui/components/utils/forwardRef.js.map +1 -0
  149. package/lib/commonjs/ui/components/utils/hasTouchHandler.js +13 -0
  150. package/lib/commonjs/ui/components/utils/hasTouchHandler.js.map +1 -0
  151. package/lib/commonjs/ui/components/utils/roundLayoutSize.js +9 -0
  152. package/lib/commonjs/ui/components/utils/roundLayoutSize.js.map +1 -0
  153. package/lib/commonjs/ui/components/utils/splitStyles.js +50 -0
  154. package/lib/commonjs/ui/components/utils/splitStyles.js.map +1 -0
  155. package/lib/commonjs/ui/constants/iconColors.js +84 -0
  156. package/lib/commonjs/ui/constants/iconColors.js.map +1 -0
  157. package/lib/commonjs/ui/constants/spacing.js +50 -0
  158. package/lib/commonjs/ui/constants/spacing.js.map +1 -0
  159. package/lib/commonjs/ui/constants/theme.js +123 -0
  160. package/lib/commonjs/ui/constants/theme.js.map +1 -0
  161. package/lib/commonjs/ui/context/OxyContext.js +198 -853
  162. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  163. package/lib/commonjs/ui/context/ThemeContext.js +36 -0
  164. package/lib/commonjs/ui/context/ThemeContext.js.map +1 -0
  165. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +349 -0
  166. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -0
  167. package/lib/commonjs/ui/context/hooks/useDeviceManagement.js +73 -0
  168. package/lib/commonjs/ui/context/hooks/useDeviceManagement.js.map +1 -0
  169. package/lib/commonjs/ui/context/hooks/useLanguageManagement.js +112 -0
  170. package/lib/commonjs/ui/context/hooks/useLanguageManagement.js.map +1 -0
  171. package/lib/commonjs/ui/context/hooks/useSessionManagement.js +261 -0
  172. package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
  173. package/lib/commonjs/ui/context/hooks/useStorage.js +79 -0
  174. package/lib/commonjs/ui/context/hooks/useStorage.js.map +1 -0
  175. package/lib/commonjs/ui/context/utils/errorHandlers.js +90 -0
  176. package/lib/commonjs/ui/context/utils/errorHandlers.js.map +1 -0
  177. package/lib/commonjs/ui/context/utils/sessionHelpers.js +103 -0
  178. package/lib/commonjs/ui/context/utils/sessionHelpers.js.map +1 -0
  179. package/lib/commonjs/ui/context/utils/storageHelpers.js +119 -0
  180. package/lib/commonjs/ui/context/utils/storageHelpers.js.map +1 -0
  181. package/lib/commonjs/ui/hooks/index.js +14 -0
  182. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  183. package/lib/commonjs/ui/hooks/use-color-scheme.js +29 -0
  184. package/lib/commonjs/ui/hooks/use-color-scheme.js.map +1 -0
  185. package/lib/commonjs/ui/hooks/use-haptic-press.js +21 -0
  186. package/lib/commonjs/ui/hooks/use-haptic-press.js.map +1 -0
  187. package/lib/commonjs/ui/hooks/useAssets.js.map +1 -1
  188. package/lib/commonjs/ui/hooks/useDeviceManagement.js +73 -0
  189. package/lib/commonjs/ui/hooks/useDeviceManagement.js.map +1 -0
  190. package/lib/commonjs/ui/hooks/useLanguageManagement.js +112 -0
  191. package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -0
  192. package/lib/commonjs/ui/hooks/useProfileEditing.js +123 -0
  193. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -0
  194. package/lib/commonjs/ui/hooks/useSessionManagement.js +261 -0
  195. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -0
  196. package/lib/commonjs/ui/hooks/useStorage.js +79 -0
  197. package/lib/commonjs/ui/hooks/useStorage.js.map +1 -0
  198. package/lib/commonjs/ui/hooks/useThemeColors.js +31 -0
  199. package/lib/commonjs/ui/hooks/useThemeColors.js.map +1 -0
  200. package/lib/commonjs/ui/hooks/useThemeStyles.js +69 -0
  201. package/lib/commonjs/ui/hooks/useThemeStyles.js.map +1 -0
  202. package/lib/commonjs/ui/index.js +1 -4
  203. package/lib/commonjs/ui/index.js.map +1 -1
  204. package/lib/commonjs/ui/navigation/bottomSheetManager.js +180 -0
  205. package/lib/commonjs/ui/navigation/bottomSheetManager.js.map +1 -0
  206. package/lib/commonjs/ui/navigation/routes.js +80 -154
  207. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  208. package/lib/commonjs/ui/screens/AccountCenterScreen.js +67 -67
  209. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  210. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +217 -98
  211. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  212. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +514 -429
  213. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  214. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +44 -59
  215. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  216. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +12 -19
  217. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  218. package/lib/commonjs/ui/screens/AppInfoScreen.js +36 -43
  219. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  220. package/lib/commonjs/ui/screens/FeedbackScreen.js +14 -14
  221. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  222. package/lib/commonjs/ui/screens/FileManagementScreen.js +674 -1968
  223. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  224. package/lib/commonjs/ui/screens/HelpSupportScreen.js +26 -23
  225. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  226. package/lib/commonjs/ui/screens/HistoryViewScreen.js +19 -59
  227. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  228. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +79 -170
  229. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  230. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +13 -40
  231. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  232. package/lib/commonjs/ui/screens/OxyAuthScreen.js +436 -0
  233. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -0
  234. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +18 -24
  235. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  236. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +21 -9
  237. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  238. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +180 -252
  239. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  240. package/lib/commonjs/ui/screens/ProfileScreen.js +7 -5
  241. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  242. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +32 -70
  243. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  244. package/lib/commonjs/ui/screens/SearchSettingsScreen.js +26 -99
  245. package/lib/commonjs/ui/screens/SearchSettingsScreen.js.map +1 -1
  246. package/lib/commonjs/ui/screens/SessionManagementScreen.js +24 -16
  247. package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
  248. package/lib/commonjs/ui/screens/UserLinksScreen.js +8 -10
  249. package/lib/commonjs/ui/screens/UserLinksScreen.js.map +1 -1
  250. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +64 -67
  251. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  252. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +11 -8
  253. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  254. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +124 -122
  255. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  256. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +99 -112
  257. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  258. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +12 -9
  259. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  260. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +552 -79
  261. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  262. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +12 -8
  263. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  264. package/lib/commonjs/ui/styles/authStyles.js +5 -11
  265. package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
  266. package/lib/commonjs/ui/styles/spacing.js +60 -2
  267. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  268. package/lib/commonjs/ui/styles/theme.js +1 -1
  269. package/lib/commonjs/ui/types/fileManagement.js +6 -0
  270. package/lib/commonjs/ui/types/fileManagement.js.map +1 -0
  271. package/lib/commonjs/ui/types/navigation.js +6 -0
  272. package/lib/commonjs/ui/types/navigation.js.map +1 -0
  273. package/lib/commonjs/ui/utils/colorUtils.js +52 -0
  274. package/lib/commonjs/ui/utils/colorUtils.js.map +1 -0
  275. package/lib/commonjs/ui/utils/errorHandlers.js +90 -0
  276. package/lib/commonjs/ui/utils/errorHandlers.js.map +1 -0
  277. package/lib/commonjs/ui/utils/fileManagement.js +181 -0
  278. package/lib/commonjs/ui/utils/fileManagement.js.map +1 -0
  279. package/lib/commonjs/ui/utils/sessionHelpers.js +103 -0
  280. package/lib/commonjs/ui/utils/sessionHelpers.js.map +1 -0
  281. package/lib/commonjs/ui/utils/storageHelpers.js +119 -0
  282. package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -0
  283. package/lib/commonjs/ui/utils/themeUtils.js +47 -0
  284. package/lib/commonjs/ui/utils/themeUtils.js.map +1 -0
  285. package/lib/commonjs/ui/utils/user-utils.js +53 -0
  286. package/lib/commonjs/ui/utils/user-utils.js.map +1 -0
  287. package/lib/commonjs/utils/errorUtils.js +14 -4
  288. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  289. package/lib/module/assets/assets/lottie/welcomeheader_background_op1.json +1 -0
  290. package/lib/module/assets/lottie/welcomeheader_background_op1.json +1 -0
  291. package/lib/module/core/HttpService.js +94 -4
  292. package/lib/module/core/HttpService.js.map +1 -1
  293. package/lib/module/core/OxyServices.base.js +3 -1
  294. package/lib/module/core/OxyServices.base.js.map +1 -1
  295. package/lib/module/core/mixins/OxyServices.assets.js +212 -20
  296. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  297. package/lib/module/core/mixins/OxyServices.auth.js +70 -99
  298. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
  299. package/lib/module/crypto/index.js +16 -0
  300. package/lib/module/crypto/index.js.map +1 -0
  301. package/lib/module/crypto/keyManager.js +204 -0
  302. package/lib/module/crypto/keyManager.js.map +1 -0
  303. package/lib/module/crypto/recoveryPhrase.js +131 -0
  304. package/lib/module/crypto/recoveryPhrase.js.map +1 -0
  305. package/lib/module/crypto/signatureService.js +227 -0
  306. package/lib/module/crypto/signatureService.js.map +1 -0
  307. package/lib/module/i18n/locales/en-US.json +4 -0
  308. package/lib/module/index.js +2 -0
  309. package/lib/module/index.js.map +1 -1
  310. package/lib/module/ui/components/ActivityIndicator.js +198 -0
  311. package/lib/module/ui/components/ActivityIndicator.js.map +1 -0
  312. package/lib/module/ui/components/AutoHeightScrollView.js +41 -0
  313. package/lib/module/ui/components/AutoHeightScrollView.js.map +1 -0
  314. package/lib/module/ui/components/BottomSheet.js +402 -0
  315. package/lib/module/ui/components/BottomSheet.js.map +1 -0
  316. package/lib/module/ui/components/BottomSheetRouter.js +356 -0
  317. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -0
  318. package/lib/module/ui/components/CrossFadeIcon.js +101 -0
  319. package/lib/module/ui/components/CrossFadeIcon.js.map +1 -0
  320. package/lib/module/ui/components/EmptyState.js +36 -0
  321. package/lib/module/ui/components/EmptyState.js.map +1 -0
  322. package/lib/module/ui/components/GroupedItem.js +88 -82
  323. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  324. package/lib/module/ui/components/GroupedSection.js +23 -23
  325. package/lib/module/ui/components/GroupedSection.js.map +1 -1
  326. package/lib/module/ui/components/Header.js +109 -46
  327. package/lib/module/ui/components/Header.js.map +1 -1
  328. package/lib/module/ui/components/HelperText.js +99 -0
  329. package/lib/module/ui/components/HelperText.js.map +1 -0
  330. package/lib/module/ui/components/Icon.js +102 -0
  331. package/lib/module/ui/components/Icon.js.map +1 -0
  332. package/lib/module/ui/components/IconButton/IconButton.js +153 -0
  333. package/lib/module/ui/components/IconButton/IconButton.js.map +1 -0
  334. package/lib/module/ui/components/IconButton/utils.js +149 -0
  335. package/lib/module/ui/components/IconButton/utils.js.map +1 -0
  336. package/lib/module/ui/components/LoadingState.js +42 -0
  337. package/lib/module/ui/components/LoadingState.js.map +1 -0
  338. package/lib/module/ui/components/OxyPayButton.js +1 -14
  339. package/lib/module/ui/components/OxyPayButton.js.map +1 -1
  340. package/lib/module/ui/components/OxyProvider.js +45 -396
  341. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  342. package/lib/module/ui/components/OxySignInButton.js +9 -13
  343. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  344. package/lib/module/ui/components/ProfileCard.js +7 -4
  345. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  346. package/lib/module/ui/components/QuickActions.js +7 -4
  347. package/lib/module/ui/components/QuickActions.js.map +1 -1
  348. package/lib/module/ui/components/Section.js +4 -1
  349. package/lib/module/ui/components/Section.js.map +1 -1
  350. package/lib/module/ui/components/SectionTitle.js +6 -3
  351. package/lib/module/ui/components/SectionTitle.js.map +1 -1
  352. package/lib/module/ui/components/SettingRow.js +72 -0
  353. package/lib/module/ui/components/SettingRow.js.map +1 -0
  354. package/lib/module/ui/components/StepBasedScreen.js +190 -174
  355. package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
  356. package/lib/module/ui/components/Surface.js +252 -0
  357. package/lib/module/ui/components/Surface.js.map +1 -0
  358. package/lib/module/ui/components/TextField/Addons/Outline.js +40 -0
  359. package/lib/module/ui/components/TextField/Addons/Outline.js.map +1 -0
  360. package/lib/module/ui/components/TextField/Addons/Underline.js +47 -0
  361. package/lib/module/ui/components/TextField/Addons/Underline.js.map +1 -0
  362. package/lib/module/ui/components/TextField/Adornment/TextFieldAdornment.js +148 -0
  363. package/lib/module/ui/components/TextField/Adornment/TextFieldAdornment.js.map +1 -0
  364. package/lib/module/ui/components/TextField/Adornment/TextFieldAffix.js +141 -0
  365. package/lib/module/ui/components/TextField/Adornment/TextFieldAffix.js.map +1 -0
  366. package/lib/module/ui/components/TextField/Adornment/TextFieldIcon.js +135 -0
  367. package/lib/module/ui/components/TextField/Adornment/TextFieldIcon.js.map +1 -0
  368. package/lib/module/ui/components/TextField/Adornment/enums.js +18 -0
  369. package/lib/module/ui/components/TextField/Adornment/enums.js.map +1 -0
  370. package/lib/module/ui/components/TextField/Adornment/types.js +4 -0
  371. package/lib/module/ui/components/TextField/Adornment/types.js.map +1 -0
  372. package/lib/module/ui/components/TextField/Adornment/utils.js +57 -0
  373. package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -0
  374. package/lib/module/ui/components/TextField/Label/InputLabel.js +171 -0
  375. package/lib/module/ui/components/TextField/Label/InputLabel.js.map +1 -0
  376. package/lib/module/ui/components/TextField/Label/LabelBackground.js +78 -0
  377. package/lib/module/ui/components/TextField/Label/LabelBackground.js.map +1 -0
  378. package/lib/module/ui/components/TextField/TextFieldFlat.js +372 -0
  379. package/lib/module/ui/components/TextField/TextFieldFlat.js.map +1 -0
  380. package/lib/module/ui/components/TextField/TextFieldOutlined.js +355 -0
  381. package/lib/module/ui/components/TextField/TextFieldOutlined.js.map +1 -0
  382. package/lib/module/ui/components/TextField/constants.js +46 -0
  383. package/lib/module/ui/components/TextField/constants.js.map +1 -0
  384. package/lib/module/ui/components/TextField/helpers.js +472 -0
  385. package/lib/module/ui/components/TextField/helpers.js.map +1 -0
  386. package/lib/module/ui/components/TextField/types.js +4 -0
  387. package/lib/module/ui/components/TextField/types.js.map +1 -0
  388. package/lib/module/ui/components/TextField.js +333 -0
  389. package/lib/module/ui/components/TextField.js.map +1 -0
  390. package/lib/module/ui/components/TouchableRipple/Pressable.js +9 -0
  391. package/lib/module/ui/components/TouchableRipple/Pressable.js.map +1 -0
  392. package/lib/module/ui/components/TouchableRipple/TouchableRipple.js +253 -0
  393. package/lib/module/ui/components/TouchableRipple/TouchableRipple.js.map +1 -0
  394. package/lib/module/ui/components/TouchableRipple/TouchableRipple.native.js +101 -0
  395. package/lib/module/ui/components/TouchableRipple/TouchableRipple.native.js.map +1 -0
  396. package/lib/module/ui/components/TouchableRipple/utils.js +50 -0
  397. package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -0
  398. package/lib/module/ui/components/Typography/AnimatedText.js +56 -0
  399. package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -0
  400. package/lib/module/ui/components/Typography/types.js +22 -0
  401. package/lib/module/ui/components/Typography/types.js.map +1 -0
  402. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +165 -0
  403. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -0
  404. package/lib/module/ui/components/fileManagement/FileViewer.js +402 -0
  405. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -0
  406. package/lib/module/ui/components/fileManagement/UploadPreview.js +175 -0
  407. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -0
  408. package/lib/module/ui/components/fileManagement/styles.js +864 -0
  409. package/lib/module/ui/components/fileManagement/styles.js.map +1 -0
  410. package/lib/module/ui/components/index.js +4 -1
  411. package/lib/module/ui/components/index.js.map +1 -1
  412. package/lib/module/ui/components/profile/EditBioModal.js +175 -0
  413. package/lib/module/ui/components/profile/EditBioModal.js.map +1 -0
  414. package/lib/module/ui/components/profile/EditDisplayNameModal.js +201 -0
  415. package/lib/module/ui/components/profile/EditDisplayNameModal.js.map +1 -0
  416. package/lib/module/ui/components/profile/EditEmailModal.js +178 -0
  417. package/lib/module/ui/components/profile/EditEmailModal.js.map +1 -0
  418. package/lib/module/ui/components/profile/EditLinksModal.js +309 -0
  419. package/lib/module/ui/components/profile/EditLinksModal.js.map +1 -0
  420. package/lib/module/ui/components/profile/EditLocationModal.js +267 -0
  421. package/lib/module/ui/components/profile/EditLocationModal.js.map +1 -0
  422. package/lib/module/ui/components/profile/EditUsernameModal.js +174 -0
  423. package/lib/module/ui/components/profile/EditUsernameModal.js.map +1 -0
  424. package/lib/module/ui/components/profile/TwoFactorSetupModal.js +460 -0
  425. package/lib/module/ui/components/profile/TwoFactorSetupModal.js.map +1 -0
  426. package/lib/module/ui/components/styles/overlay.js +80 -0
  427. package/lib/module/ui/components/styles/overlay.js.map +1 -0
  428. package/lib/module/ui/components/styles/shadow.js +128 -0
  429. package/lib/module/ui/components/styles/shadow.js.map +1 -0
  430. package/lib/module/ui/components/theming.js +111 -0
  431. package/lib/module/ui/components/theming.js.map +1 -0
  432. package/lib/module/ui/components/types.js +2 -0
  433. package/lib/module/ui/components/types.js.map +1 -0
  434. package/lib/module/ui/components/utils/forwardRef.js +13 -0
  435. package/lib/module/ui/components/utils/forwardRef.js.map +1 -0
  436. package/lib/module/ui/components/utils/hasTouchHandler.js +9 -0
  437. package/lib/module/ui/components/utils/hasTouchHandler.js.map +1 -0
  438. package/lib/module/ui/components/utils/roundLayoutSize.js +4 -0
  439. package/lib/module/ui/components/utils/roundLayoutSize.js.map +1 -0
  440. package/lib/module/ui/components/utils/splitStyles.js +46 -0
  441. package/lib/module/ui/components/utils/splitStyles.js.map +1 -0
  442. package/lib/module/ui/constants/iconColors.js +78 -0
  443. package/lib/module/ui/constants/iconColors.js.map +1 -0
  444. package/lib/module/ui/constants/spacing.js +45 -0
  445. package/lib/module/ui/constants/spacing.js.map +1 -0
  446. package/lib/module/ui/constants/theme.js +119 -0
  447. package/lib/module/ui/constants/theme.js.map +1 -0
  448. package/lib/module/ui/context/OxyContext.js +199 -855
  449. package/lib/module/ui/context/OxyContext.js.map +1 -1
  450. package/lib/module/ui/context/ThemeContext.js +29 -0
  451. package/lib/module/ui/context/ThemeContext.js.map +1 -0
  452. package/lib/module/ui/context/hooks/useAuthOperations.js +344 -0
  453. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -0
  454. package/lib/module/ui/context/hooks/useDeviceManagement.js +68 -0
  455. package/lib/module/ui/context/hooks/useDeviceManagement.js.map +1 -0
  456. package/lib/module/ui/context/hooks/useLanguageManagement.js +107 -0
  457. package/lib/module/ui/context/hooks/useLanguageManagement.js.map +1 -0
  458. package/lib/module/ui/context/hooks/useSessionManagement.js +256 -0
  459. package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
  460. package/lib/module/ui/context/hooks/useStorage.js +74 -0
  461. package/lib/module/ui/context/hooks/useStorage.js.map +1 -0
  462. package/lib/module/ui/context/utils/errorHandlers.js +83 -0
  463. package/lib/module/ui/context/utils/errorHandlers.js.map +1 -0
  464. package/lib/module/ui/context/utils/sessionHelpers.js +96 -0
  465. package/lib/module/ui/context/utils/sessionHelpers.js.map +1 -0
  466. package/lib/module/ui/context/utils/storageHelpers.js +111 -0
  467. package/lib/module/ui/context/utils/storageHelpers.js.map +1 -0
  468. package/lib/module/ui/hooks/index.js +2 -0
  469. package/lib/module/ui/hooks/index.js.map +1 -1
  470. package/lib/module/ui/hooks/use-color-scheme.js +26 -0
  471. package/lib/module/ui/hooks/use-color-scheme.js.map +1 -0
  472. package/lib/module/ui/hooks/use-haptic-press.js +17 -0
  473. package/lib/module/ui/hooks/use-haptic-press.js.map +1 -0
  474. package/lib/module/ui/hooks/useAssets.js.map +1 -1
  475. package/lib/module/ui/hooks/useDeviceManagement.js +68 -0
  476. package/lib/module/ui/hooks/useDeviceManagement.js.map +1 -0
  477. package/lib/module/ui/hooks/useLanguageManagement.js +107 -0
  478. package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -0
  479. package/lib/module/ui/hooks/useProfileEditing.js +118 -0
  480. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -0
  481. package/lib/module/ui/hooks/useSessionManagement.js +256 -0
  482. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -0
  483. package/lib/module/ui/hooks/useStorage.js +74 -0
  484. package/lib/module/ui/hooks/useStorage.js.map +1 -0
  485. package/lib/module/ui/hooks/useThemeColors.js +27 -0
  486. package/lib/module/ui/hooks/useThemeColors.js.map +1 -0
  487. package/lib/module/ui/hooks/useThemeStyles.js +64 -0
  488. package/lib/module/ui/hooks/useThemeStyles.js.map +1 -0
  489. package/lib/module/ui/index.js +2 -4
  490. package/lib/module/ui/index.js.map +1 -1
  491. package/lib/module/ui/navigation/bottomSheetManager.js +168 -0
  492. package/lib/module/ui/navigation/bottomSheetManager.js.map +1 -0
  493. package/lib/module/ui/navigation/routes.js +77 -152
  494. package/lib/module/ui/navigation/routes.js.map +1 -1
  495. package/lib/module/ui/screens/AccountCenterScreen.js +67 -67
  496. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  497. package/lib/module/ui/screens/AccountOverviewScreen.js +218 -100
  498. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  499. package/lib/module/ui/screens/AccountSettingsScreen.js +515 -430
  500. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  501. package/lib/module/ui/screens/AccountSwitcherScreen.js +45 -60
  502. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  503. package/lib/module/ui/screens/AccountVerificationScreen.js +12 -19
  504. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  505. package/lib/module/ui/screens/AppInfoScreen.js +36 -43
  506. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  507. package/lib/module/ui/screens/FeedbackScreen.js +14 -14
  508. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  509. package/lib/module/ui/screens/FileManagementScreen.js +670 -1965
  510. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  511. package/lib/module/ui/screens/HelpSupportScreen.js +26 -23
  512. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  513. package/lib/module/ui/screens/HistoryViewScreen.js +22 -62
  514. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  515. package/lib/module/ui/screens/LanguageSelectorScreen.js +80 -171
  516. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  517. package/lib/module/ui/screens/LegalDocumentsScreen.js +16 -43
  518. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  519. package/lib/module/ui/screens/OxyAuthScreen.js +432 -0
  520. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -0
  521. package/lib/module/ui/screens/PaymentGatewayScreen.js +18 -24
  522. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  523. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +21 -9
  524. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  525. package/lib/module/ui/screens/PrivacySettingsScreen.js +167 -239
  526. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  527. package/lib/module/ui/screens/ProfileScreen.js +7 -5
  528. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  529. package/lib/module/ui/screens/SavesCollectionsScreen.js +35 -73
  530. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  531. package/lib/module/ui/screens/SearchSettingsScreen.js +29 -102
  532. package/lib/module/ui/screens/SearchSettingsScreen.js.map +1 -1
  533. package/lib/module/ui/screens/SessionManagementScreen.js +24 -16
  534. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  535. package/lib/module/ui/screens/UserLinksScreen.js +8 -10
  536. package/lib/module/ui/screens/UserLinksScreen.js.map +1 -1
  537. package/lib/module/ui/screens/WelcomeNewUserScreen.js +65 -68
  538. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  539. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +11 -8
  540. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  541. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +124 -121
  542. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  543. package/lib/module/ui/screens/karma/KarmaFAQScreen.js +101 -114
  544. package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  545. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +12 -9
  546. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  547. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +554 -81
  548. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  549. package/lib/module/ui/screens/karma/KarmaRulesScreen.js +12 -8
  550. package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  551. package/lib/module/ui/styles/authStyles.js +5 -11
  552. package/lib/module/ui/styles/authStyles.js.map +1 -1
  553. package/lib/module/ui/styles/spacing.js +12 -2
  554. package/lib/module/ui/styles/spacing.js.map +1 -1
  555. package/lib/module/ui/styles/theme.js +1 -1
  556. package/lib/module/ui/types/fileManagement.js +4 -0
  557. package/lib/module/ui/types/fileManagement.js.map +1 -0
  558. package/lib/module/ui/types/navigation.js +4 -0
  559. package/lib/module/ui/types/navigation.js.map +1 -0
  560. package/lib/module/ui/utils/colorUtils.js +46 -0
  561. package/lib/module/ui/utils/colorUtils.js.map +1 -0
  562. package/lib/module/ui/utils/errorHandlers.js +83 -0
  563. package/lib/module/ui/utils/errorHandlers.js.map +1 -0
  564. package/lib/module/ui/utils/fileManagement.js +172 -0
  565. package/lib/module/ui/utils/fileManagement.js.map +1 -0
  566. package/lib/module/ui/utils/sessionHelpers.js +96 -0
  567. package/lib/module/ui/utils/sessionHelpers.js.map +1 -0
  568. package/lib/module/ui/utils/storageHelpers.js +111 -0
  569. package/lib/module/ui/utils/storageHelpers.js.map +1 -0
  570. package/lib/module/ui/utils/themeUtils.js +41 -0
  571. package/lib/module/ui/utils/themeUtils.js.map +1 -0
  572. package/lib/module/ui/utils/user-utils.js +46 -0
  573. package/lib/module/ui/utils/user-utils.js.map +1 -0
  574. package/lib/module/utils/errorUtils.js +14 -4
  575. package/lib/module/utils/errorUtils.js.map +1 -1
  576. package/lib/typescript/core/HttpService.d.ts +48 -0
  577. package/lib/typescript/core/HttpService.d.ts.map +1 -1
  578. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  579. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  580. package/lib/typescript/core/mixins/OxyServices.assets.d.ts +23 -1
  581. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  582. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +70 -42
  583. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  584. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  585. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  586. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  587. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  588. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  589. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  590. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  591. package/lib/typescript/core/mixins/OxyServices.totp.d.ts.map +1 -1
  592. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  593. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  594. package/lib/typescript/core/mixins/index.d.ts +26 -34
  595. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  596. package/lib/typescript/crypto/index.d.ts +11 -0
  597. package/lib/typescript/crypto/index.d.ts.map +1 -0
  598. package/lib/typescript/crypto/keyManager.d.ts +73 -0
  599. package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
  600. package/lib/typescript/crypto/recoveryPhrase.d.ts +57 -0
  601. package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
  602. package/lib/typescript/crypto/signatureService.d.ts +80 -0
  603. package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
  604. package/lib/typescript/index.d.ts +2 -0
  605. package/lib/typescript/index.d.ts.map +1 -1
  606. package/lib/typescript/models/interfaces.d.ts +1 -0
  607. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  608. package/lib/typescript/types/bip39.d.ts +28 -0
  609. package/lib/typescript/types/color.d.ts +18 -0
  610. package/lib/typescript/types/elliptic.d.ts +60 -0
  611. package/lib/typescript/types/expo-crypto.d.ts +28 -0
  612. package/lib/typescript/types/expo-random.d.ts +8 -0
  613. package/lib/typescript/types/expo-secure-store.d.ts +20 -0
  614. package/lib/typescript/types/expo-vector-icons.d.ts +9 -0
  615. package/lib/typescript/ui/components/ActivityIndicator.d.ts +45 -0
  616. package/lib/typescript/ui/components/ActivityIndicator.d.ts.map +1 -0
  617. package/lib/typescript/ui/components/AutoHeightScrollView.d.ts +23 -0
  618. package/lib/typescript/ui/components/AutoHeightScrollView.d.ts.map +1 -0
  619. package/lib/typescript/ui/components/BottomSheet.d.ts +29 -0
  620. package/lib/typescript/ui/components/BottomSheet.d.ts.map +1 -0
  621. package/lib/typescript/ui/components/BottomSheetRouter.d.ts +14 -0
  622. package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -0
  623. package/lib/typescript/ui/components/CrossFadeIcon.d.ts +27 -0
  624. package/lib/typescript/ui/components/CrossFadeIcon.d.ts.map +1 -0
  625. package/lib/typescript/ui/components/EmptyState.d.ts +8 -0
  626. package/lib/typescript/ui/components/EmptyState.d.ts.map +1 -0
  627. package/lib/typescript/ui/components/GroupedItem.d.ts +5 -9
  628. package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
  629. package/lib/typescript/ui/components/GroupedSection.d.ts +6 -7
  630. package/lib/typescript/ui/components/GroupedSection.d.ts.map +1 -1
  631. package/lib/typescript/ui/components/Header.d.ts +6 -1
  632. package/lib/typescript/ui/components/Header.d.ts.map +1 -1
  633. package/lib/typescript/ui/components/HelperText.d.ts +47 -0
  634. package/lib/typescript/ui/components/HelperText.d.ts.map +1 -0
  635. package/lib/typescript/ui/components/Icon.d.ts +60 -0
  636. package/lib/typescript/ui/components/Icon.d.ts.map +1 -0
  637. package/lib/typescript/ui/components/IconButton/IconButton.d.ts +99 -0
  638. package/lib/typescript/ui/components/IconButton/IconButton.d.ts.map +1 -0
  639. package/lib/typescript/ui/components/IconButton/utils.d.ts +19 -0
  640. package/lib/typescript/ui/components/IconButton/utils.d.ts.map +1 -0
  641. package/lib/typescript/ui/components/LoadingState.d.ts +9 -0
  642. package/lib/typescript/ui/components/LoadingState.d.ts.map +1 -0
  643. package/lib/typescript/ui/components/OxyPayButton.d.ts.map +1 -1
  644. package/lib/typescript/ui/components/OxyProvider.d.ts +4 -5
  645. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  646. package/lib/typescript/ui/components/OxySignInButton.d.ts +3 -8
  647. package/lib/typescript/ui/components/OxySignInButton.d.ts.map +1 -1
  648. package/lib/typescript/ui/components/ProfileCard.d.ts.map +1 -1
  649. package/lib/typescript/ui/components/QuickActions.d.ts.map +1 -1
  650. package/lib/typescript/ui/components/Section.d.ts +1 -1
  651. package/lib/typescript/ui/components/Section.d.ts.map +1 -1
  652. package/lib/typescript/ui/components/SectionTitle.d.ts +1 -1
  653. package/lib/typescript/ui/components/SectionTitle.d.ts.map +1 -1
  654. package/lib/typescript/ui/components/SettingRow.d.ts +14 -0
  655. package/lib/typescript/ui/components/SettingRow.d.ts.map +1 -0
  656. package/lib/typescript/ui/components/StepBasedScreen.d.ts +3 -2
  657. package/lib/typescript/ui/components/StepBasedScreen.d.ts.map +1 -1
  658. package/lib/typescript/ui/components/Surface.d.ts +76 -0
  659. package/lib/typescript/ui/components/Surface.d.ts.map +1 -0
  660. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +16 -0
  661. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts.map +1 -0
  662. package/lib/typescript/ui/components/TextField/Addons/Underline.d.ts +19 -0
  663. package/lib/typescript/ui/components/TextField/Addons/Underline.d.ts.map +1 -0
  664. package/lib/typescript/ui/components/TextField/Adornment/TextFieldAdornment.d.ts +45 -0
  665. package/lib/typescript/ui/components/TextField/Adornment/TextFieldAdornment.d.ts.map +1 -0
  666. package/lib/typescript/ui/components/TextField/Adornment/TextFieldAffix.d.ts +73 -0
  667. package/lib/typescript/ui/components/TextField/Adornment/TextFieldAffix.d.ts.map +1 -0
  668. package/lib/typescript/ui/components/TextField/Adornment/TextFieldIcon.d.ts +78 -0
  669. package/lib/typescript/ui/components/TextField/Adornment/TextFieldIcon.d.ts.map +1 -0
  670. package/lib/typescript/ui/components/TextField/Adornment/enums.d.ts +13 -0
  671. package/lib/typescript/ui/components/TextField/Adornment/enums.d.ts.map +1 -0
  672. package/lib/typescript/ui/components/TextField/Adornment/types.d.ts +12 -0
  673. package/lib/typescript/ui/components/TextField/Adornment/types.d.ts.map +1 -0
  674. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +12 -0
  675. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -0
  676. package/lib/typescript/ui/components/TextField/Label/InputLabel.d.ts +5 -0
  677. package/lib/typescript/ui/components/TextField/Label/InputLabel.d.ts.map +1 -0
  678. package/lib/typescript/ui/components/TextField/Label/LabelBackground.d.ts +4 -0
  679. package/lib/typescript/ui/components/TextField/Label/LabelBackground.d.ts.map +1 -0
  680. package/lib/typescript/ui/components/TextField/TextFieldFlat.d.ts +4 -0
  681. package/lib/typescript/ui/components/TextField/TextFieldFlat.d.ts.map +1 -0
  682. package/lib/typescript/ui/components/TextField/TextFieldOutlined.d.ts +4 -0
  683. package/lib/typescript/ui/components/TextField/TextFieldOutlined.d.ts.map +1 -0
  684. package/lib/typescript/ui/components/TextField/constants.d.ts +32 -0
  685. package/lib/typescript/ui/components/TextField/constants.d.ts.map +1 -0
  686. package/lib/typescript/ui/components/TextField/helpers.d.ts +97 -0
  687. package/lib/typescript/ui/components/TextField/helpers.d.ts.map +1 -0
  688. package/lib/typescript/ui/components/TextField/types.d.ts +156 -0
  689. package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -0
  690. package/lib/typescript/ui/components/TextField.d.ts +192 -0
  691. package/lib/typescript/ui/components/TextField.d.ts.map +1 -0
  692. package/lib/typescript/ui/components/TouchableRipple/Pressable.d.ts +13 -0
  693. package/lib/typescript/ui/components/TouchableRipple/Pressable.d.ts.map +1 -0
  694. package/lib/typescript/ui/components/TouchableRipple/TouchableRipple.d.ts +62 -0
  695. package/lib/typescript/ui/components/TouchableRipple/TouchableRipple.d.ts.map +1 -0
  696. package/lib/typescript/ui/components/TouchableRipple/TouchableRipple.native.d.ts +25 -0
  697. package/lib/typescript/ui/components/TouchableRipple/TouchableRipple.native.d.ts.map +1 -0
  698. package/lib/typescript/ui/components/TouchableRipple/utils.d.ts +11 -0
  699. package/lib/typescript/ui/components/TouchableRipple/utils.d.ts.map +1 -0
  700. package/lib/typescript/ui/components/Typography/AnimatedText.d.ts +35 -0
  701. package/lib/typescript/ui/components/Typography/AnimatedText.d.ts.map +1 -0
  702. package/lib/typescript/ui/components/Typography/types.d.ts +19 -0
  703. package/lib/typescript/ui/components/Typography/types.d.ts.map +1 -0
  704. package/lib/typescript/ui/components/fileManagement/FileDetailsModal.d.ts +15 -0
  705. package/lib/typescript/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -0
  706. package/lib/typescript/ui/components/fileManagement/FileViewer.d.ts +18 -0
  707. package/lib/typescript/ui/components/fileManagement/FileViewer.d.ts.map +1 -0
  708. package/lib/typescript/ui/components/fileManagement/UploadPreview.d.ts +21 -0
  709. package/lib/typescript/ui/components/fileManagement/UploadPreview.d.ts.map +1 -0
  710. package/lib/typescript/ui/components/fileManagement/styles.d.ts +860 -0
  711. package/lib/typescript/ui/components/fileManagement/styles.d.ts.map +1 -0
  712. package/lib/typescript/ui/components/index.d.ts +4 -1
  713. package/lib/typescript/ui/components/index.d.ts.map +1 -1
  714. package/lib/typescript/ui/components/profile/EditBioModal.d.ts +11 -0
  715. package/lib/typescript/ui/components/profile/EditBioModal.d.ts.map +1 -0
  716. package/lib/typescript/ui/components/profile/EditDisplayNameModal.d.ts +12 -0
  717. package/lib/typescript/ui/components/profile/EditDisplayNameModal.d.ts.map +1 -0
  718. package/lib/typescript/ui/components/profile/EditEmailModal.d.ts +11 -0
  719. package/lib/typescript/ui/components/profile/EditEmailModal.d.ts.map +1 -0
  720. package/lib/typescript/ui/components/profile/EditLinksModal.d.ts +18 -0
  721. package/lib/typescript/ui/components/profile/EditLinksModal.d.ts.map +1 -0
  722. package/lib/typescript/ui/components/profile/EditLocationModal.d.ts +20 -0
  723. package/lib/typescript/ui/components/profile/EditLocationModal.d.ts.map +1 -0
  724. package/lib/typescript/ui/components/profile/EditUsernameModal.d.ts +11 -0
  725. package/lib/typescript/ui/components/profile/EditUsernameModal.d.ts.map +1 -0
  726. package/lib/typescript/ui/components/profile/TwoFactorSetupModal.d.ts +11 -0
  727. package/lib/typescript/ui/components/profile/TwoFactorSetupModal.d.ts.map +1 -0
  728. package/lib/typescript/ui/components/styles/overlay.d.ts +4 -0
  729. package/lib/typescript/ui/components/styles/overlay.d.ts.map +1 -0
  730. package/lib/typescript/ui/components/styles/shadow.d.ts +3 -0
  731. package/lib/typescript/ui/components/styles/shadow.d.ts.map +1 -0
  732. package/lib/typescript/ui/components/theming.d.ts +8 -0
  733. package/lib/typescript/ui/components/theming.d.ts.map +1 -0
  734. package/lib/typescript/ui/components/types.d.ts +80 -0
  735. package/lib/typescript/ui/components/types.d.ts.map +1 -0
  736. package/lib/typescript/ui/components/utils/forwardRef.d.ts +12 -0
  737. package/lib/typescript/ui/components/utils/forwardRef.d.ts.map +1 -0
  738. package/lib/typescript/ui/components/utils/hasTouchHandler.d.ts +6 -0
  739. package/lib/typescript/ui/components/utils/hasTouchHandler.d.ts.map +1 -0
  740. package/lib/typescript/ui/components/utils/roundLayoutSize.d.ts +2 -0
  741. package/lib/typescript/ui/components/utils/roundLayoutSize.d.ts.map +1 -0
  742. package/lib/typescript/ui/components/utils/splitStyles.d.ts +20 -0
  743. package/lib/typescript/ui/components/utils/splitStyles.d.ts.map +1 -0
  744. package/lib/typescript/ui/constants/iconColors.d.ts +130 -0
  745. package/lib/typescript/ui/constants/iconColors.d.ts.map +1 -0
  746. package/lib/typescript/ui/constants/spacing.d.ts +33 -0
  747. package/lib/typescript/ui/constants/spacing.d.ts.map +1 -0
  748. package/lib/typescript/ui/constants/theme.d.ts +97 -0
  749. package/lib/typescript/ui/constants/theme.d.ts.map +1 -0
  750. package/lib/typescript/ui/context/OxyContext.d.ts +23 -17
  751. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  752. package/lib/typescript/ui/context/ThemeContext.d.ts +19 -0
  753. package/lib/typescript/ui/context/ThemeContext.d.ts.map +1 -0
  754. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +51 -0
  755. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -0
  756. package/lib/typescript/ui/context/hooks/useDeviceManagement.d.ts +27 -0
  757. package/lib/typescript/ui/context/hooks/useDeviceManagement.d.ts.map +1 -0
  758. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts +25 -0
  759. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts.map +1 -0
  760. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +39 -0
  761. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
  762. package/lib/typescript/ui/context/hooks/useStorage.d.ts +22 -0
  763. package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +1 -0
  764. package/lib/typescript/ui/context/utils/errorHandlers.d.ts +30 -0
  765. package/lib/typescript/ui/context/utils/errorHandlers.d.ts.map +1 -0
  766. package/lib/typescript/ui/context/utils/sessionHelpers.d.ts +59 -0
  767. package/lib/typescript/ui/context/utils/sessionHelpers.d.ts.map +1 -0
  768. package/lib/typescript/ui/context/utils/storageHelpers.d.ts +31 -0
  769. package/lib/typescript/ui/context/utils/storageHelpers.d.ts.map +1 -0
  770. package/lib/typescript/ui/hooks/index.d.ts +2 -0
  771. package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
  772. package/lib/typescript/ui/hooks/use-color-scheme.d.ts +8 -0
  773. package/lib/typescript/ui/hooks/use-color-scheme.d.ts.map +1 -0
  774. package/lib/typescript/ui/hooks/use-haptic-press.d.ts +8 -0
  775. package/lib/typescript/ui/hooks/use-haptic-press.d.ts.map +1 -0
  776. package/lib/typescript/ui/hooks/useDeviceManagement.d.ts +27 -0
  777. package/lib/typescript/ui/hooks/useDeviceManagement.d.ts.map +1 -0
  778. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts +25 -0
  779. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts.map +1 -0
  780. package/lib/typescript/ui/hooks/useProfileEditing.d.ts +36 -0
  781. package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -0
  782. package/lib/typescript/ui/hooks/useSessionManagement.d.ts +39 -0
  783. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -0
  784. package/lib/typescript/ui/hooks/useStorage.d.ts +22 -0
  785. package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -0
  786. package/lib/typescript/ui/hooks/useThemeColors.d.ts +94 -0
  787. package/lib/typescript/ui/hooks/useThemeColors.d.ts.map +1 -0
  788. package/lib/typescript/ui/hooks/useThemeStyles.d.ts +45 -0
  789. package/lib/typescript/ui/hooks/useThemeStyles.d.ts.map +1 -0
  790. package/lib/typescript/ui/index.d.ts +2 -2
  791. package/lib/typescript/ui/index.d.ts.map +1 -1
  792. package/lib/typescript/ui/navigation/bottomSheetManager.d.ts +74 -0
  793. package/lib/typescript/ui/navigation/bottomSheetManager.d.ts.map +1 -0
  794. package/lib/typescript/ui/navigation/routes.d.ts +4 -7
  795. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  796. package/lib/typescript/ui/screens/AccountCenterScreen.d.ts +1 -1
  797. package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  798. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts +1 -1
  799. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  800. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts +1 -1
  801. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  802. package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts +1 -1
  803. package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  804. package/lib/typescript/ui/screens/AccountVerificationScreen.d.ts +1 -1
  805. package/lib/typescript/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  806. package/lib/typescript/ui/screens/AppInfoScreen.d.ts +1 -1
  807. package/lib/typescript/ui/screens/AppInfoScreen.d.ts.map +1 -1
  808. package/lib/typescript/ui/screens/FeedbackScreen.d.ts +1 -1
  809. package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
  810. package/lib/typescript/ui/screens/FileManagementScreen.d.ts +1 -36
  811. package/lib/typescript/ui/screens/FileManagementScreen.d.ts.map +1 -1
  812. package/lib/typescript/ui/screens/HelpSupportScreen.d.ts +1 -1
  813. package/lib/typescript/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  814. package/lib/typescript/ui/screens/HistoryViewScreen.d.ts +1 -1
  815. package/lib/typescript/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  816. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts +1 -1
  817. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  818. package/lib/typescript/ui/screens/LegalDocumentsScreen.d.ts +1 -1
  819. package/lib/typescript/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  820. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +16 -0
  821. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -0
  822. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +1 -1
  823. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  824. package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts +1 -1
  825. package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  826. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts +1 -1
  827. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  828. package/lib/typescript/ui/screens/ProfileScreen.d.ts +1 -1
  829. package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
  830. package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts +1 -1
  831. package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  832. package/lib/typescript/ui/screens/SearchSettingsScreen.d.ts +1 -1
  833. package/lib/typescript/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  834. package/lib/typescript/ui/screens/SessionManagementScreen.d.ts +1 -1
  835. package/lib/typescript/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  836. package/lib/typescript/ui/screens/UserLinksScreen.d.ts +2 -2
  837. package/lib/typescript/ui/screens/UserLinksScreen.d.ts.map +1 -1
  838. package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts +1 -1
  839. package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  840. package/lib/typescript/ui/screens/karma/KarmaAboutScreen.d.ts +1 -1
  841. package/lib/typescript/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
  842. package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts +1 -1
  843. package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  844. package/lib/typescript/ui/screens/karma/KarmaFAQScreen.d.ts +1 -1
  845. package/lib/typescript/ui/screens/karma/KarmaLeaderboardScreen.d.ts +1 -1
  846. package/lib/typescript/ui/screens/karma/KarmaLeaderboardScreen.d.ts.map +1 -1
  847. package/lib/typescript/ui/screens/karma/KarmaRewardsScreen.d.ts +1 -1
  848. package/lib/typescript/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
  849. package/lib/typescript/ui/screens/karma/KarmaRulesScreen.d.ts +1 -1
  850. package/lib/typescript/ui/screens/karma/KarmaRulesScreen.d.ts.map +1 -1
  851. package/lib/typescript/ui/stores/authStore.d.ts +1 -2
  852. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  853. package/lib/typescript/ui/styles/authStyles.d.ts +0 -10
  854. package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -1
  855. package/lib/typescript/ui/styles/spacing.d.ts +7 -1
  856. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
  857. package/lib/typescript/ui/types/fileManagement.d.ts +41 -0
  858. package/lib/typescript/ui/types/fileManagement.d.ts.map +1 -0
  859. package/lib/typescript/ui/types/navigation.d.ts +36 -0
  860. package/lib/typescript/ui/types/navigation.d.ts.map +1 -0
  861. package/lib/typescript/ui/utils/colorUtils.d.ts +14 -0
  862. package/lib/typescript/ui/utils/colorUtils.d.ts.map +1 -0
  863. package/lib/typescript/ui/utils/errorHandlers.d.ts +30 -0
  864. package/lib/typescript/ui/utils/errorHandlers.d.ts.map +1 -0
  865. package/lib/typescript/ui/utils/fileManagement.d.ts +39 -0
  866. package/lib/typescript/ui/utils/fileManagement.d.ts.map +1 -0
  867. package/lib/typescript/ui/utils/sessionHelpers.d.ts +59 -0
  868. package/lib/typescript/ui/utils/sessionHelpers.d.ts.map +1 -0
  869. package/lib/typescript/ui/utils/storageHelpers.d.ts +31 -0
  870. package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -0
  871. package/lib/typescript/ui/utils/themeUtils.d.ts +24 -0
  872. package/lib/typescript/ui/utils/themeUtils.d.ts.map +1 -0
  873. package/lib/typescript/ui/utils/user-utils.d.ts +29 -0
  874. package/lib/typescript/ui/utils/user-utils.d.ts.map +1 -0
  875. package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
  876. package/package.json +26 -15
  877. package/src/assets/lottie/welcomeheader_background_op1.json +1 -0
  878. package/src/core/HttpService.ts +97 -4
  879. package/src/core/OxyServices.base.ts +3 -1
  880. package/src/core/mixins/OxyServices.assets.ts +225 -27
  881. package/src/core/mixins/OxyServices.auth.ts +144 -80
  882. package/src/crypto/index.ts +20 -0
  883. package/src/crypto/keyManager.ts +213 -0
  884. package/src/crypto/recoveryPhrase.ts +146 -0
  885. package/src/crypto/signatureService.ts +258 -0
  886. package/src/i18n/locales/en-US.json +4 -0
  887. package/src/index.ts +13 -0
  888. package/src/models/interfaces.ts +1 -0
  889. package/src/types/bip39.d.ts +28 -0
  890. package/src/types/color.d.ts +18 -0
  891. package/src/types/elliptic.d.ts +60 -0
  892. package/src/types/expo-crypto.d.ts +28 -0
  893. package/src/types/expo-random.d.ts +8 -0
  894. package/src/types/expo-secure-store.d.ts +20 -0
  895. package/src/types/expo-vector-icons.d.ts +9 -0
  896. package/src/ui/components/ActivityIndicator.tsx +254 -0
  897. package/src/ui/components/AutoHeightScrollView.tsx +50 -0
  898. package/src/ui/components/BottomSheet.tsx +443 -0
  899. package/src/ui/components/BottomSheetRouter.tsx +407 -0
  900. package/src/ui/components/CrossFadeIcon.tsx +140 -0
  901. package/src/ui/components/EmptyState.tsx +39 -0
  902. package/src/ui/components/GroupedItem.tsx +98 -96
  903. package/src/ui/components/GroupedSection.tsx +24 -29
  904. package/src/ui/components/Header.tsx +129 -49
  905. package/src/ui/components/HelperText.tsx +160 -0
  906. package/src/ui/components/Icon.tsx +181 -0
  907. package/src/ui/components/IconButton/IconButton.tsx +235 -0
  908. package/src/ui/components/IconButton/utils.ts +190 -0
  909. package/src/ui/components/LoadingState.tsx +46 -0
  910. package/src/ui/components/OxyPayButton.tsx +1 -12
  911. package/src/ui/components/OxyProvider.tsx +49 -409
  912. package/src/ui/components/OxySignInButton.tsx +11 -18
  913. package/src/ui/components/ProfileCard.tsx +7 -4
  914. package/src/ui/components/QuickActions.tsx +7 -4
  915. package/src/ui/components/Section.tsx +6 -2
  916. package/src/ui/components/SectionTitle.tsx +7 -4
  917. package/src/ui/components/SettingRow.tsx +76 -0
  918. package/src/ui/components/StepBasedScreen.tsx +205 -187
  919. package/src/ui/components/Surface.tsx +384 -0
  920. package/src/ui/components/TextField/Addons/Outline.tsx +64 -0
  921. package/src/ui/components/TextField/Addons/Underline.tsx +78 -0
  922. package/src/ui/components/TextField/Adornment/TextFieldAdornment.tsx +208 -0
  923. package/src/ui/components/TextField/Adornment/TextFieldAffix.tsx +212 -0
  924. package/src/ui/components/TextField/Adornment/TextFieldIcon.tsx +195 -0
  925. package/src/ui/components/TextField/Adornment/enums.tsx +12 -0
  926. package/src/ui/components/TextField/Adornment/types.tsx +11 -0
  927. package/src/ui/components/TextField/Adornment/utils.ts +66 -0
  928. package/src/ui/components/TextField/Label/InputLabel.tsx +219 -0
  929. package/src/ui/components/TextField/Label/LabelBackground.tsx +100 -0
  930. package/src/ui/components/TextField/TextFieldFlat.tsx +488 -0
  931. package/src/ui/components/TextField/TextFieldOutlined.tsx +464 -0
  932. package/src/ui/components/TextField/constants.tsx +48 -0
  933. package/src/ui/components/TextField/helpers.tsx +612 -0
  934. package/src/ui/components/TextField/types.tsx +156 -0
  935. package/src/ui/components/TextField.tsx +578 -0
  936. package/src/ui/components/TouchableRipple/Pressable.tsx +41 -0
  937. package/src/ui/components/TouchableRipple/TouchableRipple.native.tsx +146 -0
  938. package/src/ui/components/TouchableRipple/TouchableRipple.tsx +347 -0
  939. package/src/ui/components/TouchableRipple/utils.ts +66 -0
  940. package/src/ui/components/Typography/AnimatedText.tsx +107 -0
  941. package/src/ui/components/Typography/types.tsx +22 -0
  942. package/src/ui/components/fileManagement/FileDetailsModal.tsx +137 -0
  943. package/src/ui/components/fileManagement/FileViewer.tsx +380 -0
  944. package/src/ui/components/fileManagement/UploadPreview.tsx +175 -0
  945. package/src/ui/components/fileManagement/styles.ts +860 -0
  946. package/src/ui/components/index.ts +4 -1
  947. package/src/ui/components/profile/EditBioModal.tsx +184 -0
  948. package/src/ui/components/profile/EditDisplayNameModal.tsx +205 -0
  949. package/src/ui/components/profile/EditEmailModal.tsx +188 -0
  950. package/src/ui/components/profile/EditLinksModal.tsx +316 -0
  951. package/src/ui/components/profile/EditLocationModal.tsx +278 -0
  952. package/src/ui/components/profile/EditUsernameModal.tsx +183 -0
  953. package/src/ui/components/profile/TwoFactorSetupModal.tsx +442 -0
  954. package/src/ui/components/styles/overlay.tsx +88 -0
  955. package/src/ui/components/styles/shadow.tsx +136 -0
  956. package/src/ui/components/theming.tsx +114 -0
  957. package/src/ui/components/types.tsx +90 -0
  958. package/src/ui/components/utils/forwardRef.tsx +23 -0
  959. package/src/ui/components/utils/hasTouchHandler.tsx +23 -0
  960. package/src/ui/components/utils/roundLayoutSize.ts +2 -0
  961. package/src/ui/components/utils/splitStyles.ts +60 -0
  962. package/src/ui/constants/iconColors.ts +88 -0
  963. package/src/ui/constants/spacing.ts +45 -0
  964. package/src/ui/constants/theme.ts +120 -0
  965. package/src/ui/context/OxyContext.tsx +276 -894
  966. package/src/ui/context/ThemeContext.tsx +41 -0
  967. package/src/ui/context/hooks/useAuthOperations.ts +400 -0
  968. package/src/ui/context/hooks/useDeviceManagement.ts +108 -0
  969. package/src/ui/context/hooks/useLanguageManagement.ts +152 -0
  970. package/src/ui/context/hooks/useSessionManagement.ts +378 -0
  971. package/src/ui/context/hooks/useStorage.ts +104 -0
  972. package/src/ui/context/utils/errorHandlers.ts +136 -0
  973. package/src/ui/context/utils/sessionHelpers.ts +146 -0
  974. package/src/ui/context/utils/storageHelpers.ts +134 -0
  975. package/src/ui/hooks/index.ts +3 -1
  976. package/src/ui/hooks/use-color-scheme.ts +24 -0
  977. package/src/ui/hooks/use-haptic-press.ts +15 -0
  978. package/src/ui/hooks/useAssets.ts +1 -1
  979. package/src/ui/hooks/useDeviceManagement.ts +108 -0
  980. package/src/ui/hooks/useLanguageManagement.ts +152 -0
  981. package/src/ui/hooks/useProfileEditing.ts +151 -0
  982. package/src/ui/hooks/useSessionManagement.ts +378 -0
  983. package/src/ui/hooks/useStorage.ts +104 -0
  984. package/src/ui/hooks/useThemeColors.ts +26 -0
  985. package/src/ui/hooks/useThemeStyles.ts +85 -0
  986. package/src/ui/index.ts +1 -4
  987. package/src/ui/navigation/bottomSheetManager.ts +191 -0
  988. package/src/ui/navigation/routes.ts +107 -189
  989. package/src/ui/screens/AccountCenterScreen.tsx +67 -63
  990. package/src/ui/screens/AccountOverviewScreen.tsx +237 -95
  991. package/src/ui/screens/AccountSettingsScreen.tsx +546 -474
  992. package/src/ui/screens/AccountSwitcherScreen.tsx +113 -116
  993. package/src/ui/screens/AccountVerificationScreen.tsx +18 -20
  994. package/src/ui/screens/AppInfoScreen.tsx +37 -38
  995. package/src/ui/screens/FeedbackScreen.tsx +15 -12
  996. package/src/ui/screens/FileManagementScreen.tsx +764 -2026
  997. package/src/ui/screens/HelpSupportScreen.tsx +30 -23
  998. package/src/ui/screens/HistoryViewScreen.tsx +25 -56
  999. package/src/ui/screens/LanguageSelectorScreen.tsx +84 -170
  1000. package/src/ui/screens/LegalDocumentsScreen.tsx +18 -41
  1001. package/src/ui/screens/OxyAuthScreen.tsx +402 -0
  1002. package/src/ui/screens/PaymentGatewayScreen.tsx +20 -22
  1003. package/src/ui/screens/PremiumSubscriptionScreen.tsx +13 -10
  1004. package/src/ui/screens/PrivacySettingsScreen.tsx +150 -198
  1005. package/src/ui/screens/ProfileScreen.tsx +7 -6
  1006. package/src/ui/screens/SavesCollectionsScreen.tsx +39 -62
  1007. package/src/ui/screens/SearchSettingsScreen.tsx +36 -86
  1008. package/src/ui/screens/SessionManagementScreen.tsx +25 -17
  1009. package/src/ui/screens/UserLinksScreen.tsx +10 -11
  1010. package/src/ui/screens/WelcomeNewUserScreen.tsx +41 -41
  1011. package/src/ui/screens/karma/KarmaAboutScreen.tsx +13 -9
  1012. package/src/ui/screens/karma/KarmaCenterScreen.tsx +70 -70
  1013. package/src/ui/screens/karma/KarmaFAQScreen.tsx +96 -96
  1014. package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +15 -10
  1015. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +605 -60
  1016. package/src/ui/screens/karma/KarmaRulesScreen.tsx +14 -9
  1017. package/src/ui/stores/authStore.ts +1 -1
  1018. package/src/ui/styles/authStyles.ts +5 -11
  1019. package/src/ui/styles/spacing.ts +21 -2
  1020. package/src/ui/styles/theme.ts +1 -1
  1021. package/src/ui/types/fileManagement.ts +51 -0
  1022. package/src/ui/types/navigation.ts +61 -0
  1023. package/src/ui/utils/colorUtils.ts +46 -0
  1024. package/src/ui/utils/errorHandlers.ts +136 -0
  1025. package/src/ui/utils/fileManagement.ts +190 -0
  1026. package/src/ui/utils/sessionHelpers.ts +146 -0
  1027. package/src/ui/utils/storageHelpers.ts +134 -0
  1028. package/src/ui/utils/themeUtils.ts +43 -0
  1029. package/src/ui/utils/user-utils.ts +58 -0
  1030. package/src/utils/errorUtils.ts +14 -4
  1031. package/lib/commonjs/ui/components/internal/TextField.js +0 -665
  1032. package/lib/commonjs/ui/components/internal/TextField.js.map +0 -1
  1033. package/lib/commonjs/ui/navigation/OxyRouter.js +0 -213
  1034. package/lib/commonjs/ui/navigation/OxyRouter.js.map +0 -1
  1035. package/lib/commonjs/ui/navigation/types.js +0 -13
  1036. package/lib/commonjs/ui/navigation/types.js.map +0 -1
  1037. package/lib/commonjs/ui/screens/AccountManagementDemo.js +0 -298
  1038. package/lib/commonjs/ui/screens/AccountManagementDemo.js.map +0 -1
  1039. package/lib/commonjs/ui/screens/RecoverAccountScreen.js +0 -137
  1040. package/lib/commonjs/ui/screens/RecoverAccountScreen.js.map +0 -1
  1041. package/lib/commonjs/ui/screens/SignInScreen.js +0 -270
  1042. package/lib/commonjs/ui/screens/SignInScreen.js.map +0 -1
  1043. package/lib/commonjs/ui/screens/SignUpScreen.js +0 -229
  1044. package/lib/commonjs/ui/screens/SignUpScreen.js.map +0 -1
  1045. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js +0 -135
  1046. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js.map +0 -1
  1047. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js +0 -165
  1048. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js.map +0 -1
  1049. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js +0 -159
  1050. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js.map +0 -1
  1051. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js +0 -144
  1052. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js.map +0 -1
  1053. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js +0 -358
  1054. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js.map +0 -1
  1055. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js +0 -188
  1056. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js.map +0 -1
  1057. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js +0 -509
  1058. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js.map +0 -1
  1059. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js +0 -200
  1060. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js.map +0 -1
  1061. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js +0 -185
  1062. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js.map +0 -1
  1063. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js +0 -138
  1064. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js.map +0 -1
  1065. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js +0 -150
  1066. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js.map +0 -1
  1067. package/lib/module/package.json +0 -1
  1068. package/lib/module/ui/components/internal/TextField.js +0 -660
  1069. package/lib/module/ui/components/internal/TextField.js.map +0 -1
  1070. package/lib/module/ui/navigation/OxyRouter.js +0 -209
  1071. package/lib/module/ui/navigation/OxyRouter.js.map +0 -1
  1072. package/lib/module/ui/navigation/types.js +0 -22
  1073. package/lib/module/ui/navigation/types.js.map +0 -1
  1074. package/lib/module/ui/screens/AccountManagementDemo.js +0 -295
  1075. package/lib/module/ui/screens/AccountManagementDemo.js.map +0 -1
  1076. package/lib/module/ui/screens/RecoverAccountScreen.js +0 -133
  1077. package/lib/module/ui/screens/RecoverAccountScreen.js.map +0 -1
  1078. package/lib/module/ui/screens/SignInScreen.js +0 -265
  1079. package/lib/module/ui/screens/SignInScreen.js.map +0 -1
  1080. package/lib/module/ui/screens/SignUpScreen.js +0 -224
  1081. package/lib/module/ui/screens/SignUpScreen.js.map +0 -1
  1082. package/lib/module/ui/screens/steps/RecoverRequestStep.js +0 -130
  1083. package/lib/module/ui/screens/steps/RecoverRequestStep.js.map +0 -1
  1084. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js +0 -160
  1085. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js.map +0 -1
  1086. package/lib/module/ui/screens/steps/RecoverSuccessStep.js +0 -154
  1087. package/lib/module/ui/screens/steps/RecoverSuccessStep.js.map +0 -1
  1088. package/lib/module/ui/screens/steps/RecoverVerifyStep.js +0 -139
  1089. package/lib/module/ui/screens/steps/RecoverVerifyStep.js.map +0 -1
  1090. package/lib/module/ui/screens/steps/SignInPasswordStep.js +0 -353
  1091. package/lib/module/ui/screens/steps/SignInPasswordStep.js.map +0 -1
  1092. package/lib/module/ui/screens/steps/SignInTotpStep.js +0 -183
  1093. package/lib/module/ui/screens/steps/SignInTotpStep.js.map +0 -1
  1094. package/lib/module/ui/screens/steps/SignInUsernameStep.js +0 -504
  1095. package/lib/module/ui/screens/steps/SignInUsernameStep.js.map +0 -1
  1096. package/lib/module/ui/screens/steps/SignUpIdentityStep.js +0 -195
  1097. package/lib/module/ui/screens/steps/SignUpIdentityStep.js.map +0 -1
  1098. package/lib/module/ui/screens/steps/SignUpSecurityStep.js +0 -180
  1099. package/lib/module/ui/screens/steps/SignUpSecurityStep.js.map +0 -1
  1100. package/lib/module/ui/screens/steps/SignUpSummaryStep.js +0 -133
  1101. package/lib/module/ui/screens/steps/SignUpSummaryStep.js.map +0 -1
  1102. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js +0 -145
  1103. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js.map +0 -1
  1104. package/lib/typescript/ui/components/internal/TextField.d.ts +0 -41
  1105. package/lib/typescript/ui/components/internal/TextField.d.ts.map +0 -1
  1106. package/lib/typescript/ui/navigation/OxyRouter.d.ts +0 -7
  1107. package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +0 -1
  1108. package/lib/typescript/ui/navigation/types.d.ts +0 -141
  1109. package/lib/typescript/ui/navigation/types.d.ts.map +0 -1
  1110. package/lib/typescript/ui/screens/AccountManagementDemo.d.ts +0 -8
  1111. package/lib/typescript/ui/screens/AccountManagementDemo.d.ts.map +0 -1
  1112. package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts +0 -5
  1113. package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts.map +0 -1
  1114. package/lib/typescript/ui/screens/SignInScreen.d.ts +0 -5
  1115. package/lib/typescript/ui/screens/SignInScreen.d.ts.map +0 -1
  1116. package/lib/typescript/ui/screens/SignUpScreen.d.ts +0 -5
  1117. package/lib/typescript/ui/screens/SignUpScreen.d.ts.map +0 -1
  1118. package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts +0 -24
  1119. package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts.map +0 -1
  1120. package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts +0 -24
  1121. package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts.map +0 -1
  1122. package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts +0 -19
  1123. package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts.map +0 -1
  1124. package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts +0 -26
  1125. package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts.map +0 -1
  1126. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts +0 -30
  1127. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts.map +0 -1
  1128. package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts +0 -19
  1129. package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts.map +0 -1
  1130. package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts +0 -28
  1131. package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts.map +0 -1
  1132. package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts +0 -26
  1133. package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts.map +0 -1
  1134. package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts +0 -27
  1135. package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts.map +0 -1
  1136. package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts +0 -17
  1137. package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts.map +0 -1
  1138. package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts +0 -14
  1139. package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts.map +0 -1
  1140. package/src/ui/components/internal/TextField.tsx +0 -808
  1141. package/src/ui/navigation/OxyRouter.tsx +0 -216
  1142. package/src/ui/navigation/types.ts +0 -164
  1143. package/src/ui/screens/AccountManagementDemo.tsx +0 -297
  1144. package/src/ui/screens/RecoverAccountScreen.tsx +0 -141
  1145. package/src/ui/screens/SignInScreen.tsx +0 -297
  1146. package/src/ui/screens/SignUpScreen.tsx +0 -239
  1147. package/src/ui/screens/steps/RecoverRequestStep.tsx +0 -143
  1148. package/src/ui/screens/steps/RecoverResetPasswordStep.tsx +0 -162
  1149. package/src/ui/screens/steps/RecoverSuccessStep.tsx +0 -148
  1150. package/src/ui/screens/steps/RecoverVerifyStep.tsx +0 -154
  1151. package/src/ui/screens/steps/SignInPasswordStep.tsx +0 -343
  1152. package/src/ui/screens/steps/SignInTotpStep.tsx +0 -163
  1153. package/src/ui/screens/steps/SignInUsernameStep.tsx +0 -560
  1154. package/src/ui/screens/steps/SignUpIdentityStep.tsx +0 -217
  1155. package/src/ui/screens/steps/SignUpSecurityStep.tsx +0 -207
  1156. package/src/ui/screens/steps/SignUpSummaryStep.tsx +0 -155
  1157. package/src/ui/screens/steps/SignUpWelcomeStep.tsx +0 -127
@@ -12,20 +12,44 @@ import {
12
12
  Platform,
13
13
  Image,
14
14
  } from 'react-native';
15
- import type { BaseScreenProps } from '../navigation/types';
16
- import { useOxy } from '../context/OxyContext';
15
+ import type { BaseScreenProps } from '../types/navigation';
17
16
  import Avatar from '../components/Avatar';
18
17
  import type { FileMetadata } from '../../models/interfaces';
19
18
  import OxyIcon from '../components/icon/OxyIcon';
20
19
  import { Ionicons } from '@expo/vector-icons';
20
+ // @ts-ignore - MaterialCommunityIcons is available at runtime
21
+ import { MaterialCommunityIcons } from '@expo/vector-icons';
21
22
  import { toast } from '../../lib/sonner';
22
23
  import { fontFamilies } from '../styles/fonts';
23
24
  import { confirmAction } from '../utils/confirmAction';
24
25
  import { useAuthStore } from '../stores/authStore';
25
- import { Header, GroupedSection } from '../components';
26
+ import { Header, GroupedSection, Section } from '../components';
26
27
  import { useI18n } from '../hooks/useI18n';
27
- import QRCode from 'react-native-qrcode-svg';
28
+ import { useThemeStyles } from '../hooks/useThemeStyles';
29
+ import { useColorScheme } from '../hooks/use-color-scheme';
30
+ import { Colors } from '../constants/theme';
31
+ import { normalizeColorScheme, normalizeTheme } from '../utils/themeUtils';
32
+ import { useHapticPress } from '../hooks/use-haptic-press';
33
+ import { EditDisplayNameModal } from '../components/profile/EditDisplayNameModal';
34
+ import { EditUsernameModal } from '../components/profile/EditUsernameModal';
35
+ import { EditEmailModal } from '../components/profile/EditEmailModal';
36
+ import { EditBioModal } from '../components/profile/EditBioModal';
37
+ import { EditLocationModal } from '../components/profile/EditLocationModal';
38
+ import { EditLinksModal } from '../components/profile/EditLinksModal';
39
+ import { TwoFactorSetupModal } from '../components/profile/TwoFactorSetupModal';
40
+ import { getDisplayName } from '../utils/user-utils';
28
41
  import { TTLCache, registerCacheForCleanup } from '../../utils/cache';
42
+ import QRCode from 'react-native-qrcode-svg';
43
+ import { useOxy } from '../context/OxyContext';
44
+ import {
45
+ SCREEN_PADDING_HORIZONTAL,
46
+ SCREEN_PADDING_VERTICAL,
47
+ SECTION_GAP,
48
+ SECTION_GAP_LARGE,
49
+ COMPONENT_GAP,
50
+ HEADER_PADDING_TOP_SETTINGS,
51
+ createScreenContentStyle,
52
+ } from '../constants/spacing';
29
53
 
30
54
  // Caches for link metadata and location searches
31
55
  const linkMetadataCache = new TTLCache<any>(30 * 60 * 1000); // 30 minutes cache for link metadata
@@ -33,6 +57,7 @@ const locationSearchCache = new TTLCache<any[]>(60 * 60 * 1000); // 1 hour cache
33
57
  registerCacheForCleanup(linkMetadataCache);
34
58
  registerCacheForCleanup(locationSearchCache);
35
59
 
60
+
36
61
  const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string; initialSection?: string }> = ({
37
62
  onClose,
38
63
  theme,
@@ -40,9 +65,18 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
40
65
  navigate,
41
66
  initialField,
42
67
  initialSection,
68
+ scrollTo,
43
69
  }) => {
44
- const { user: userFromContext, oxyServices, isLoading: authLoading, isAuthenticated, showBottomSheet, activeSessionId } = useOxy();
70
+ // Use useOxy() hook for OxyContext values
71
+ const {
72
+ user: userFromContext,
73
+ oxyServices,
74
+ isLoading: authLoading,
75
+ isAuthenticated,
76
+ activeSessionId,
77
+ } = useOxy();
45
78
  const { t } = useI18n();
79
+ const normalizedTheme = normalizeTheme(theme);
46
80
  const updateUser = useAuthStore((state) => state.updateUser);
47
81
  // Get user directly from store to ensure reactivity to avatar changes
48
82
  const user = useAuthStore((state) => state.user) || userFromContext;
@@ -53,14 +87,14 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
53
87
  const scrollViewRef = useRef<ScrollView>(null);
54
88
  const avatarSectionRef = useRef<View>(null);
55
89
  const [avatarSectionY, setAvatarSectionY] = useState<number | null>(null);
56
-
90
+
57
91
  // Section refs for navigation
58
92
  const profilePictureSectionRef = useRef<View>(null);
59
93
  const basicInfoSectionRef = useRef<View>(null);
60
94
  const aboutSectionRef = useRef<View>(null);
61
95
  const quickActionsSectionRef = useRef<View>(null);
62
96
  const securitySectionRef = useRef<View>(null);
63
-
97
+
64
98
  // Section Y positions for scrolling
65
99
  const [profilePictureSectionY, setProfilePictureSectionY] = useState<number | null>(null);
66
100
  const [basicInfoSectionY, setBasicInfoSectionY] = useState<number | null>(null);
@@ -89,9 +123,32 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
89
123
  const [links, setLinks] = useState<string[]>([]);
90
124
  const [avatarFileId, setAvatarFileId] = useState('');
91
125
 
92
- // Editing states
93
- const [editingField, setEditingField] = useState<string | null>(null);
126
+ // Modal visibility states
127
+ const [showEditDisplayNameModal, setShowEditDisplayNameModal] = useState(false);
128
+ const [showEditUsernameModal, setShowEditUsernameModal] = useState(false);
129
+ const [showEditEmailModal, setShowEditEmailModal] = useState(false);
130
+ const [showEditBioModal, setShowEditBioModal] = useState(false);
131
+ const [showEditLocationModal, setShowEditLocationModal] = useState(false);
132
+ const [showEditLinksModal, setShowEditLinksModal] = useState(false);
133
+ const [showTwoFactorModal, setShowTwoFactorModal] = useState(false);
134
+
135
+ // Location and links state (for display only - modals handle editing)
136
+ const [locations, setLocations] = useState<Array<{
137
+ id: string;
138
+ name: string;
139
+ label?: string;
140
+ coordinates?: { lat: number; lon: number };
141
+ }>>([]);
142
+ const [linksMetadata, setLinksMetadata] = useState<Array<{
143
+ url: string;
144
+ title?: string;
145
+ description?: string;
146
+ image?: string;
147
+ id: string;
148
+ }>>([]);
94
149
 
150
+ // State for inline editing (used by old renderEditingField code)
151
+ const [editingField, setEditingField] = useState<string | null>(null);
95
152
  const [tempDisplayName, setTempDisplayName] = useState('');
96
153
  const [tempLastName, setTempLastName] = useState('');
97
154
  const [tempUsername, setTempUsername] = useState('');
@@ -99,6 +156,12 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
99
156
  const [tempBio, setTempBio] = useState('');
100
157
  const [tempLocation, setTempLocation] = useState('');
101
158
  const [tempLinks, setTempLinks] = useState<string[]>([]);
159
+ const [tempLocations, setTempLocations] = useState<Array<{
160
+ id: string;
161
+ name: string;
162
+ label?: string;
163
+ coordinates?: { lat: number; lon: number };
164
+ }>>([]);
102
165
  const [tempLinksWithMetadata, setTempLinksWithMetadata] = useState<Array<{
103
166
  url: string;
104
167
  title?: string;
@@ -106,37 +169,27 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
106
169
  image?: string;
107
170
  id: string;
108
171
  }>>([]);
172
+ const [isAddingLocation, setIsAddingLocation] = useState(false);
173
+ const [isSearchingLocations, setIsSearchingLocations] = useState(false);
174
+ const [locationSearchResults, setLocationSearchResults] = useState<any[]>([]);
175
+ const [newLocationQuery, setNewLocationQuery] = useState('');
109
176
  const [isAddingLink, setIsAddingLink] = useState(false);
110
- const [newLinkUrl, setNewLinkUrl] = useState('');
111
177
  const [isFetchingMetadata, setIsFetchingMetadata] = useState(false);
178
+ const [newLinkUrl, setNewLinkUrl] = useState('');
112
179
 
113
- // Location management state
114
- const [tempLocations, setTempLocations] = useState<Array<{
115
- id: string;
116
- name: string;
117
- label?: string;
118
- coordinates?: { lat: number; lon: number };
119
- }>>([]);
120
- const [isAddingLocation, setIsAddingLocation] = useState(false);
121
- const [newLocationQuery, setNewLocationQuery] = useState('');
122
- const [locationSearchResults, setLocationSearchResults] = useState<Array<{
123
- place_id: number;
124
- display_name: string;
125
- lat: string;
126
- lon: string;
127
- type: string;
128
- }>>([]);
129
- const [isSearchingLocations, setIsSearchingLocations] = useState(false);
180
+ // Get theme colors using centralized hook
181
+ const colorScheme = useColorScheme();
182
+ const themeStyles = useThemeStyles(theme || 'light', colorScheme);
183
+ const handlePressIn = useHapticPress();
130
184
 
131
- // Memoize theme-related calculations to prevent unnecessary recalculations
132
- const themeStyles = useMemo(() => {
133
- const isDarkTheme = theme === 'dark';
134
- return {
135
- isDarkTheme,
136
- backgroundColor: isDarkTheme ? '#121212' : '#f2f2f2',
137
- primaryColor: '#007AFF',
138
- };
139
- }, [theme]);
185
+ // Extract colors for convenience - ensure it's always defined
186
+ // useThemeStyles always returns colors, but add safety check for edge cases
187
+ const colors = themeStyles.colors || Colors[normalizeColorScheme(colorScheme, theme || 'light')];
188
+
189
+ // Memoize onBack handler to provide stable reference for Reanimated
190
+ const handleBack = useMemo(() => {
191
+ return goBack || onClose || undefined;
192
+ }, [goBack, onClose]);
140
193
 
141
194
  // Memoize animation function to prevent recreation on every render
142
195
  const animateSaveButton = useCallback((toValue: number, onComplete?: () => void) => {
@@ -184,7 +237,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
184
237
 
185
238
  // Handle locations - convert single location to array format
186
239
  if (user.locations && Array.isArray(user.locations)) {
187
- setTempLocations(user.locations.map((loc, index) => ({
240
+ setLocations(user.locations.map((loc, index) => ({
188
241
  id: loc.id || `existing-${index}`,
189
242
  name: loc.name,
190
243
  label: loc.label,
@@ -192,13 +245,13 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
192
245
  })));
193
246
  } else if (user.location) {
194
247
  // Convert single location string to array format
195
- setTempLocations([{
248
+ setLocations([{
196
249
  id: 'existing-0',
197
250
  name: user.location,
198
251
  label: 'Location'
199
252
  }]);
200
253
  } else {
201
- setTempLocations([]);
254
+ setLocations([]);
202
255
  }
203
256
 
204
257
  // Handle links - simple and direct like other fields
@@ -209,7 +262,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
209
262
  ...link,
210
263
  id: link.id || `existing-${index}`
211
264
  }));
212
- setTempLinksWithMetadata(metadataWithIds);
265
+ setLinksMetadata(metadataWithIds);
213
266
  } else if (Array.isArray(user.links)) {
214
267
  const simpleLinks = user.links.map(l => typeof l === 'string' ? l : l.link).filter(Boolean);
215
268
  setLinks(simpleLinks);
@@ -220,10 +273,10 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
220
273
  image: undefined,
221
274
  id: `existing-${index}`
222
275
  }));
223
- setTempLinksWithMetadata(linksWithMetadata);
276
+ setLinksMetadata(linksWithMetadata);
224
277
  } else if (user.website) {
225
278
  setLinks([user.website]);
226
- setTempLinksWithMetadata([{
279
+ setLinksMetadata([{
227
280
  url: user.website,
228
281
  title: user.website.replace(/^https?:\/\//, '').replace(/\/$/, ''),
229
282
  description: `Link to ${user.website}`,
@@ -232,7 +285,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
232
285
  }]);
233
286
  } else {
234
287
  setLinks([]);
235
- setTempLinksWithMetadata([]);
288
+ setLinksMetadata([]);
236
289
  }
237
290
  isInitializedRef.current = true;
238
291
  }
@@ -262,10 +315,101 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
262
315
  const hasSetInitialFieldRef = useRef(false);
263
316
  const previousInitialFieldRef = useRef<string | undefined>(undefined);
264
317
  const initialFieldTimeoutRef = useRef<NodeJS.Timeout | null>(null);
265
-
318
+
266
319
  // Delay constant for scroll completion
267
320
  const SCROLL_DELAY_MS = 600;
268
-
321
+
322
+ // Helper functions for inline editing (legacy support)
323
+ const startEditing = useCallback((field: string, initialValue: string) => {
324
+ setEditingField(field);
325
+ switch (field) {
326
+ case 'displayName':
327
+ setTempDisplayName(initialValue || displayName);
328
+ setTempLastName(lastName);
329
+ break;
330
+ case 'username':
331
+ setTempUsername(initialValue || username);
332
+ break;
333
+ case 'email':
334
+ setTempEmail(initialValue || email);
335
+ break;
336
+ case 'bio':
337
+ setTempBio(initialValue || bio);
338
+ break;
339
+ case 'location':
340
+ setTempLocations([...locations]);
341
+ break;
342
+ case 'links':
343
+ setTempLinksWithMetadata([...linksMetadata]);
344
+ break;
345
+ case 'twoFactor':
346
+ // No temp state needed for twoFactor
347
+ break;
348
+ }
349
+ }, [displayName, lastName, username, email, bio, locations, linksMetadata]);
350
+
351
+ const cancelEditing = useCallback(() => {
352
+ setEditingField(null);
353
+ setTempDisplayName('');
354
+ setTempLastName('');
355
+ setTempUsername('');
356
+ setTempEmail('');
357
+ setTempBio('');
358
+ setTempLocation('');
359
+ setTempLinks([]);
360
+ setTempLocations([]);
361
+ setTempLinksWithMetadata([]);
362
+ setIsAddingLocation(false);
363
+ setIsSearchingLocations(false);
364
+ setLocationSearchResults([]);
365
+ setNewLocationQuery('');
366
+ setIsAddingLink(false);
367
+ setIsFetchingMetadata(false);
368
+ setNewLinkUrl('');
369
+ }, []);
370
+
371
+ const saveField = useCallback(async (field: string | null) => {
372
+ if (!field) return;
373
+
374
+ setIsSaving(true);
375
+ try {
376
+ switch (field) {
377
+ case 'displayName':
378
+ await updateUser({ name: { first: tempDisplayName, last: tempLastName } }, oxyServices);
379
+ setDisplayName(tempDisplayName);
380
+ setLastName(tempLastName);
381
+ break;
382
+ case 'username':
383
+ await updateUser({ username: tempUsername }, oxyServices);
384
+ setUsername(tempUsername);
385
+ break;
386
+ case 'email':
387
+ await updateUser({ email: tempEmail }, oxyServices);
388
+ setEmail(tempEmail);
389
+ break;
390
+ case 'bio':
391
+ await updateUser({ bio: tempBio }, oxyServices);
392
+ setBio(tempBio);
393
+ break;
394
+ case 'location':
395
+ await updateUser({ locations: tempLocations }, oxyServices);
396
+ setLocations(tempLocations);
397
+ break;
398
+ case 'links':
399
+ await updateUser({ linksMetadata: tempLinksWithMetadata }, oxyServices);
400
+ setLinksMetadata(tempLinksWithMetadata);
401
+ setLinks(tempLinksWithMetadata.map(l => l.url));
402
+ break;
403
+ }
404
+ setEditingField(null);
405
+ toast.success(t('editProfile.toasts.saved') || 'Saved');
406
+ } catch (error: any) {
407
+ toast.error(error?.message || (t('editProfile.toasts.saveFailed') || 'Failed to save'));
408
+ } finally {
409
+ setIsSaving(false);
410
+ }
411
+ }, [tempDisplayName, tempLastName, tempUsername, tempEmail, tempBio, tempLocations, tempLinksWithMetadata, updateUser, oxyServices, t]);
412
+
269
413
  // Helper to get current value for a field
270
414
  const getFieldCurrentValue = useCallback((field: string): string => {
271
415
  switch (field) {
@@ -290,7 +434,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
290
434
  const hasScrolledToSectionRef = useRef(false);
291
435
  const previousInitialSectionRef = useRef<string | undefined>(undefined);
292
436
  const SCROLL_OFFSET = 100; // Offset to show section near top of viewport
293
-
437
+
294
438
  // Map section names to their Y positions
295
439
  const sectionYPositions = useMemo(() => ({
296
440
  profilePicture: profilePictureSectionY,
@@ -299,7 +443,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
299
443
  quickActions: quickActionsSectionY,
300
444
  security: securitySectionY,
301
445
  }), [profilePictureSectionY, basicInfoSectionY, aboutSectionY, quickActionsSectionY, securitySectionY]);
302
-
446
+
303
447
  useEffect(() => {
304
448
  // If initialSection changed, reset the flag
305
449
  if (previousInitialSectionRef.current !== initialSection) {
@@ -310,14 +454,11 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
310
454
  // Scroll to the specified section if initialSection is provided and we haven't scrolled yet
311
455
  if (initialSection && !hasScrolledToSectionRef.current) {
312
456
  const sectionY = sectionYPositions[initialSection as keyof typeof sectionYPositions];
313
-
314
- if (sectionY !== null && sectionY !== undefined && scrollViewRef.current) {
457
+
458
+ if (sectionY !== null && sectionY !== undefined && scrollTo) {
315
459
  requestAnimationFrame(() => {
316
460
  requestAnimationFrame(() => {
317
- scrollViewRef.current?.scrollTo({
318
- y: Math.max(0, sectionY - SCROLL_OFFSET),
319
- animated: true,
320
- });
461
+ scrollTo(Math.max(0, sectionY - SCROLL_OFFSET), true);
321
462
  hasScrolledToSectionRef.current = true;
322
463
  });
323
464
  });
@@ -336,10 +477,10 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
336
477
  username,
337
478
  email,
338
479
  bio,
339
- location: tempLocations.length > 0 ? tempLocations[0].name : '', // Keep backward compatibility
340
- locations: tempLocations.length > 0 ? tempLocations : undefined,
480
+ location: locations.length > 0 ? locations[0].name : '', // Keep backward compatibility
481
+ locations: locations.length > 0 ? locations : undefined,
341
482
  links,
342
- linksMetadata: tempLinksWithMetadata.length > 0 ? tempLinksWithMetadata : undefined,
483
+ linksMetadata: linksMetadata.length > 0 ? linksMetadata : undefined,
343
484
  };
344
485
 
345
486
  // Handle name field
@@ -378,208 +519,112 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
378
519
  };
379
520
 
380
521
  const openAvatarPicker = useCallback(() => {
381
- showBottomSheet?.({
382
- screen: 'FileManagement',
383
- props: {
384
- selectMode: true,
385
- multiSelect: false,
386
- afterSelect: 'back',
387
- onSelect: async (file: FileMetadata) => {
388
- if (!file.contentType.startsWith('image/')) {
389
- toast.error(t('editProfile.toasts.selectImage') || 'Please select an image file');
390
- return;
391
- }
392
- // If already selected, do nothing
393
- if (file.id === avatarFileId) {
394
- toast.info?.(t('editProfile.toasts.avatarUnchanged') || 'Avatar unchanged');
395
- return;
396
- }
397
-
398
- // Optimistically update UI immediately
399
- setOptimisticAvatarId(file.id);
400
- setAvatarFileId(file.id);
401
-
402
- // Auto-save avatar immediately (does not close edit profile screen)
403
- (async () => {
404
- try {
405
- setIsUpdatingAvatar(true);
406
-
407
- // Update file visibility to public for avatar
408
- try {
409
- await oxyServices.assetUpdateVisibility(file.id, 'public');
410
- } catch (visError) {
411
- // Continue with avatar update even if visibility update fails
412
- }
413
-
414
- // Update on server directly without using updateUser (which triggers fetchUser)
415
- // This prevents the entire component from re-rendering
416
- await oxyServices.updateProfile({ avatar: file.id });
417
-
418
- // Update the user object in store directly without triggering fetchUser
419
- // This prevents isLoading from being set to true, which would show loading screen
420
- const currentUser = useAuthStore.getState().user;
421
- if (currentUser) {
422
- useAuthStore.setState({
423
- user: { ...currentUser, avatar: file.id },
424
- // Don't update lastUserFetch to avoid cache issues
425
- });
426
- }
427
-
428
- // Update local state - keep avatarFileId set to the new value
429
- // Don't clear optimisticAvatarId yet - let it persist until user object updates
430
- // This ensures the avatar displays correctly
431
- setAvatarFileId(file.id);
432
-
433
- toast.success(t('editProfile.toasts.avatarUpdated') || 'Avatar updated');
434
-
435
- // Scroll to avatar section after a brief delay to ensure UI is updated
436
- requestAnimationFrame(() => {
437
- requestAnimationFrame(() => {
438
- if (avatarSectionY !== null) {
439
- scrollViewRef.current?.scrollTo({
440
- y: Math.max(0, avatarSectionY - 100), // Offset to show section near top
441
- animated: true,
442
- });
443
- } else {
444
- // Fallback: scroll to approximate position
445
- scrollViewRef.current?.scrollTo({
446
- y: 200, // Approximate position of avatar section
447
- animated: true,
448
- });
449
- }
450
- });
451
- });
452
- } catch (e: any) {
453
- // Revert optimistic update on error
454
- setAvatarFileId(typeof user?.avatar === 'string' ? user.avatar : '');
455
- setOptimisticAvatarId(null);
456
- toast.error(e.message || t('editProfile.toasts.updateAvatarFailed') || 'Failed to update avatar');
457
- } finally {
458
- setIsUpdatingAvatar(false);
459
- }
460
- })();
461
- },
462
- // Limit to images client-side by using photos view if later exposed
463
- disabledMimeTypes: ['video/', 'audio/', 'application/pdf']
522
+ toast.info?.(t('editProfile.toasts.avatarPickerUnavailable') || 'Avatar picker is not available in this build.');
523
+ }, [t]);
524
+
525
+ // Handlers to open modals
526
+ const handleOpenDisplayNameModal = useCallback(() => setShowEditDisplayNameModal(true), []);
527
+ const handleOpenUsernameModal = useCallback(() => setShowEditUsernameModal(true), []);
528
+ const handleOpenEmailModal = useCallback(() => setShowEditEmailModal(true), []);
529
+ const handleOpenBioModal = useCallback(() => setShowEditBioModal(true), []);
530
+ const handleOpenLocationModal = useCallback(() => setShowEditLocationModal(true), []);
531
+ const handleOpenLinksModal = useCallback(() => setShowEditLinksModal(true), []);
532
+ const handleOpenTwoFactorModal = useCallback(() => setShowTwoFactorModal(true), []);
533
+
534
+ // Handler to refresh data after modal saves
535
+ // Note: Access user directly from store when invoked to get latest value,
536
+ // not from closure which may be stale after modal saves update the backend
537
+ const handleModalSave = useCallback(() => {
538
+ // Get fresh user data from store to ensure we have the latest values
539
+ // after the modal's save operation updates the backend
540
+ // Read from store directly (not from closure) to avoid stale data
541
+ const currentUser = useAuthStore.getState().user;
542
+
543
+ // Reload user data to reflect changes
544
+ if (currentUser) {
545
+ const userDisplayName = typeof currentUser.name === 'string'
546
+ ? currentUser.name
547
+ : currentUser.name?.first || currentUser.name?.full || '';
548
+ const userLastName = typeof currentUser.name === 'object' ? currentUser.name?.last || '' : '';
549
+ setDisplayName(userDisplayName);
550
+ setLastName(userLastName);
551
+ setUsername(currentUser.username || '');
552
+ setEmail(currentUser.email || '');
553
+ setBio(currentUser.bio || '');
554
+
555
+ // Reload locations and links
556
+ if (currentUser.locations && Array.isArray(currentUser.locations)) {
557
+ setLocations(currentUser.locations.map((loc, index) => ({
558
+ id: loc.id || `existing-${index}`,
559
+ name: loc.name,
560
+ label: loc.label,
561
+ coordinates: loc.coordinates
562
+ })));
563
+ } else if (currentUser.location) {
564
+ setLocations([{
565
+ id: 'existing-0',
566
+ name: currentUser.location,
567
+ label: 'Location'
568
+ }]);
569
+ } else {
570
+ setLocations([]);
464
571
  }
465
- });
466
- }, [showBottomSheet, oxyServices, avatarFileId, updateUser, user]);
467
572
 
468
- const startEditing = useCallback((type: string, currentValue: string) => {
469
- switch (type) {
470
- case 'displayName':
471
- setTempDisplayName(displayName);
472
- setTempLastName(lastName);
473
- break;
474
- case 'username':
475
- setTempUsername(currentValue);
476
- break;
477
- case 'email':
478
- setTempEmail(currentValue);
479
- break;
480
- case 'bio':
481
- setTempBio(currentValue);
482
- break;
483
- case 'location':
484
- // Don't reset the locations - keep the existing data
485
- break;
486
- case 'links':
487
- // Don't reset the metadata - keep the existing rich metadata
488
- // The tempLinksWithMetadata should already contain the rich data from the database
489
- break;
490
- case 'twoFactor':
491
- // Reset TOTP temp state
492
- setTotpSetupUrl(null);
493
- setTotpCode('');
494
- break;
573
+ if (currentUser.linksMetadata && Array.isArray(currentUser.linksMetadata)) {
574
+ setLinksMetadata(currentUser.linksMetadata.map((link, index) => ({
575
+ ...link,
576
+ id: link.id || `existing-${index}`
577
+ })));
578
+ } else {
579
+ setLinksMetadata([]);
580
+ }
495
581
  }
496
- setEditingField(type);
497
- }, [displayName, lastName]);
582
+ }, []); // Empty dependency array - callback reads fresh data from store at call time
498
583
 
499
- // Handle initialField prop - must be after startEditing and openAvatarPicker are declared
584
+ // Handle initialField prop - open appropriate modal
500
585
  useEffect(() => {
501
- // Clear any pending timeout
502
- if (initialFieldTimeoutRef.current) {
503
- clearTimeout(initialFieldTimeoutRef.current);
504
- initialFieldTimeoutRef.current = null;
505
- }
506
-
507
- // If initialField changed, reset the flag
508
- if (previousInitialFieldRef.current !== initialField) {
509
- hasSetInitialFieldRef.current = false;
510
- previousInitialFieldRef.current = initialField;
511
- }
512
-
513
- // Set the editing field if initialField is provided and we haven't set it yet
514
- if (initialField && !hasSetInitialFieldRef.current) {
586
+ if (initialField) {
515
587
  // Special handling for avatar - open avatar picker directly
516
588
  if (initialField === 'avatar') {
517
- // Wait for section to be scrolled, then open picker
518
- initialFieldTimeoutRef.current = setTimeout(() => {
589
+ setTimeout(() => {
519
590
  openAvatarPicker();
520
- hasSetInitialFieldRef.current = true;
521
- }, SCROLL_DELAY_MS);
591
+ }, 300);
522
592
  } else {
523
- // For other fields, get current value and start editing after scroll
524
- const currentValue = getFieldCurrentValue(initialField);
525
-
526
- // Wait for section to be scrolled, then start editing
527
- initialFieldTimeoutRef.current = setTimeout(() => {
528
- startEditing(initialField, currentValue);
529
- hasSetInitialFieldRef.current = true;
530
- }, SCROLL_DELAY_MS);
593
+ // Open appropriate modal
594
+ setTimeout(() => {
595
+ switch (initialField) {
596
+ case 'displayName':
597
+ setShowEditDisplayNameModal(true);
598
+ break;
599
+ case 'username':
600
+ setShowEditUsernameModal(true);
601
+ break;
602
+ case 'email':
603
+ setShowEditEmailModal(true);
604
+ break;
605
+ case 'bio':
606
+ setShowEditBioModal(true);
607
+ break;
608
+ case 'location':
609
+ setShowEditLocationModal(true);
610
+ break;
611
+ case 'links':
612
+ setShowEditLinksModal(true);
613
+ break;
614
+ case 'twoFactor':
615
+ setShowTwoFactorModal(true);
616
+ break;
617
+ }
618
+ }, 300);
531
619
  }
532
620
  }
533
-
534
- return () => {
535
- if (initialFieldTimeoutRef.current) {
536
- clearTimeout(initialFieldTimeoutRef.current);
537
- initialFieldTimeoutRef.current = null;
538
- }
539
- };
540
- }, [initialField, getFieldCurrentValue, startEditing, openAvatarPicker]);
621
+ }, [initialField, openAvatarPicker]);
541
622
 
542
- const saveField = (type: string) => {
543
- animateSaveButton(0.95); // Scale down slightly for animation
544
-
545
- switch (type) {
546
- case 'displayName':
547
- setDisplayName(tempDisplayName);
548
- setLastName(tempLastName);
549
- break;
550
- case 'username':
551
- setUsername(tempUsername);
552
- break;
553
- case 'email':
554
- setEmail(tempEmail);
555
- break;
556
- case 'bio':
557
- setBio(tempBio);
558
- break;
559
- case 'location':
560
- // Locations are handled in the main save function
561
- break;
562
- case 'links':
563
- // Save both URLs and metadata
564
- setLinks(tempLinksWithMetadata.map(link => link.url));
565
- // Store full metadata for database
566
- setTempLinksWithMetadata(tempLinksWithMetadata);
567
- break;
568
- }
569
-
570
- // Complete animation, then reset and close editing
571
- animateSaveButton(1, () => {
572
- setEditingField(null);
573
- });
574
- };
575
-
576
- const cancelEditing = () => {
577
- setEditingField(null);
578
- };
579
623
 
580
624
 
581
625
 
582
- const fetchLinkMetadata = async (url: string) => {
626
+ // Removed fetchLinkMetadata - now handled by EditLinksModal
627
+ const _fetchLinkMetadata = async (url: string) => {
583
628
  // Check cache first
584
629
  const cacheKey = url.toLowerCase().trim();
585
630
  const cached = linkMetadataCache.get(cacheKey);
@@ -618,6 +663,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
618
663
  }
619
664
  };
620
665
 
666
+ // Helper functions for inline editing (legacy support - still used by renderEditingField)
621
667
  const searchLocations = async (query: string) => {
622
668
  if (!query.trim() || query.length < 3) {
623
669
  setLocationSearchResults([]);
@@ -691,7 +737,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
691
737
  if (!newLinkUrl.trim()) return;
692
738
 
693
739
  const url = newLinkUrl.trim();
694
- const metadata = await fetchLinkMetadata(url);
740
+ const metadata = await _fetchLinkMetadata(url);
695
741
 
696
742
  setTempLinksWithMetadata(prev => [...prev, metadata]);
697
743
  setNewLinkUrl('');
@@ -711,15 +757,21 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
711
757
  });
712
758
  };
713
759
 
714
- const renderEditingField = (type: string) => {
760
+ // Memoize display name for avatar
761
+ const displayNameForAvatar = useMemo(() => getDisplayName(user), [user]);
762
+
763
+ // Legacy renderEditingField function (still used for twoFactor and fallback)
764
+ const renderEditingField = (type: string | null) => {
765
+ if (!type) return null;
766
+
715
767
  if (type === 'twoFactor') {
716
768
  const enabled = !!user?.privacySettings?.twoFactorEnabled;
717
769
  return (
718
- <View style={[styles.editingFieldContainer, { backgroundColor: themeStyles.backgroundColor }]}>
770
+ <View style={[styles.editingFieldContainer, { backgroundColor: colors.background }]}>
719
771
  <View style={styles.editingFieldContent}>
720
772
  <View style={styles.newValueSection}>
721
773
  <View style={styles.editingFieldHeader}>
722
- <Text style={[styles.editingFieldLabel, { color: themeStyles.isDarkTheme ? '#FFFFFF' : '#1A1A1A' }]}>Two‑Factor Authentication (TOTP)</Text>
774
+ <Text style={[styles.editingFieldLabel, { color: colors.text }]}>Two‑Factor Authentication (TOTP)</Text>
723
775
  </View>
724
776
 
725
777
  {!enabled ? (
@@ -729,7 +781,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
729
781
  </Text>
730
782
  {!totpSetupUrl ? (
731
783
  <TouchableOpacity
732
- style={styles.primaryButton}
784
+ style={[styles.primaryButton, { backgroundColor: colors.iconSecurity }]}
733
785
  disabled={isTotpBusy}
734
786
  onPress={async () => {
735
787
  if (!activeSessionId) { toast.error(t('editProfile.toasts.noActiveSession') || 'No active session'); return; }
@@ -764,7 +816,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
764
816
  />
765
817
  </View>
766
818
  <TouchableOpacity
767
- style={styles.primaryButton}
819
+ style={[styles.primaryButton, { backgroundColor: colors.iconSecurity }]}
768
820
  disabled={isTotpBusy || totpCode.length !== 6}
769
821
  onPress={async () => {
770
822
  if (!activeSessionId) { toast.error(t('editProfile.toasts.noActiveSession') || 'No active session'); return; }
@@ -810,7 +862,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
810
862
  />
811
863
  </View>
812
864
  <TouchableOpacity
813
- style={[styles.primaryButton, { backgroundColor: '#d9534f' }]}
865
+ style={[styles.primaryButton, { backgroundColor: colors.sidebarIconSharing }]}
814
866
  disabled={isTotpBusy || totpCode.length !== 6}
815
867
  onPress={async () => {
816
868
  if (!activeSessionId) { toast.error(t('editProfile.toasts.noActiveSession') || 'No active session'); return; }
@@ -839,11 +891,11 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
839
891
  }
840
892
  if (type === 'displayName') {
841
893
  return (
842
- <View style={[styles.editingFieldContainer, { backgroundColor: themeStyles.backgroundColor }]}>
894
+ <View style={[styles.editingFieldContainer, { backgroundColor: colors.background }]}>
843
895
  <View style={styles.editingFieldContent}>
844
896
  <View style={styles.newValueSection}>
845
897
  <View style={styles.editingFieldHeader}>
846
- <Text style={[styles.editingFieldLabel, { color: themeStyles.isDarkTheme ? '#FFFFFF' : '#1A1A1A' }]}>Edit Full Name</Text>
898
+ <Text style={[styles.editingFieldLabel, { color: colors.text }]}>Edit Full Name</Text>
847
899
  </View>
848
900
  <View style={{ flexDirection: 'row', gap: 12 }}>
849
901
  <View style={{ flex: 1 }}>
@@ -853,7 +905,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
853
905
  value={tempDisplayName}
854
906
  onChangeText={setTempDisplayName}
855
907
  placeholder="Enter your first name"
856
- placeholderTextColor={themeStyles.isDarkTheme ? '#aaa' : '#999'}
908
+ placeholderTextColor={colors.secondaryText}
857
909
  autoFocus
858
910
  selectionColor={themeStyles.primaryColor}
859
911
  />
@@ -865,7 +917,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
865
917
  value={tempLastName}
866
918
  onChangeText={setTempLastName}
867
919
  placeholder="Enter your last name"
868
- placeholderTextColor={themeStyles.isDarkTheme ? '#aaa' : '#999'}
920
+ placeholderTextColor={colors.secondaryText}
869
921
  selectionColor={themeStyles.primaryColor}
870
922
  />
871
923
  </View>
@@ -878,11 +930,11 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
878
930
 
879
931
  if (type === 'location') {
880
932
  return (
881
- <View style={[styles.editingFieldContainer, { backgroundColor: themeStyles.backgroundColor }]}>
933
+ <View style={[styles.editingFieldContainer, { backgroundColor: colors.background }]}>
882
934
  <View style={styles.editingFieldContent}>
883
935
  <View style={styles.newValueSection}>
884
936
  <View style={styles.editingFieldHeader}>
885
- <Text style={[styles.editingFieldLabel, { color: themeStyles.isDarkTheme ? '#FFFFFF' : '#1A1A1A' }]}>Manage Your Locations</Text>
937
+ <Text style={[styles.editingFieldLabel, { color: colors.text }]}>Manage Your Locations</Text>
886
938
  </View>
887
939
 
888
940
  {/* Add new location section */}
@@ -891,7 +943,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
891
943
  <Text style={styles.addLocationLabel}>
892
944
  Add New Location
893
945
  {isSearchingLocations && (
894
- <Text style={styles.searchingText}> • Searching...</Text>
946
+ <Text style={[styles.searchingText, { color: colors.iconSecurity }]}> • Searching...</Text>
895
947
  )}
896
948
  </Text>
897
949
  <View style={styles.addLocationInputContainer}>
@@ -903,7 +955,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
903
955
  searchLocations(text);
904
956
  }}
905
957
  placeholder="Search for a location..."
906
- placeholderTextColor={themeStyles.isDarkTheme ? '#aaa' : '#999'}
958
+ placeholderTextColor={colors.secondaryText}
907
959
  autoFocus
908
960
  selectionColor={themeStyles.primaryColor}
909
961
  />
@@ -947,7 +999,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
947
999
  onPress={() => setIsAddingLocation(true)}
948
1000
  >
949
1001
  <OxyIcon name="add" size={20} color={themeStyles.primaryColor} />
950
- <Text style={styles.addLocationTriggerText}>Add a new location</Text>
1002
+ <Text style={[styles.addLocationTriggerText, { color: colors.iconSecurity }]}>Add a new location</Text>
951
1003
  </TouchableOpacity>
952
1004
  )}
953
1005
 
@@ -982,7 +1034,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
982
1034
  {location.name}
983
1035
  </Text>
984
1036
  {location.label && (
985
- <View style={styles.locationLabel}>
1037
+ <View style={[styles.locationLabel, { backgroundColor: colors.iconSecurity }]}>
986
1038
  <Text style={styles.locationLabelText}>
987
1039
  {location.label}
988
1040
  </Text>
@@ -1022,11 +1074,11 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1022
1074
 
1023
1075
  if (type === 'links') {
1024
1076
  return (
1025
- <View style={[styles.editingFieldContainer, { backgroundColor: themeStyles.backgroundColor }]}>
1077
+ <View style={[styles.editingFieldContainer, { backgroundColor: colors.background }]}>
1026
1078
  <View style={styles.editingFieldContent}>
1027
1079
  <View style={styles.newValueSection}>
1028
1080
  <View style={styles.editingFieldHeader}>
1029
- <Text style={[styles.editingFieldLabel, { color: themeStyles.isDarkTheme ? '#FFFFFF' : '#1A1A1A' }]}>Manage Your Links</Text>
1081
+ <Text style={[styles.editingFieldLabel, { color: colors.text }]}>Manage Your Links</Text>
1030
1082
  </View>
1031
1083
 
1032
1084
  <GroupedSection
@@ -1034,11 +1086,10 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1034
1086
  // Add new link item
1035
1087
  ...(isAddingLink ? [{
1036
1088
  id: 'add-link-input',
1037
- icon: 'add',
1038
- iconColor: '#32D74B',
1089
+ icon: 'plus',
1090
+ iconColor: colors.sidebarIconSharing,
1039
1091
  title: 'Add New Link',
1040
1092
  subtitle: isFetchingMetadata ? 'Fetching metadata...' : 'Enter URL to add a new link',
1041
- multiRow: true,
1042
1093
  customContent: (
1043
1094
  <View style={styles.addLinkInputContainer}>
1044
1095
  <TextInput
@@ -1046,7 +1097,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1046
1097
  value={newLinkUrl}
1047
1098
  onChangeText={setNewLinkUrl}
1048
1099
  placeholder="Enter URL (e.g., https://example.com)"
1049
- placeholderTextColor={themeStyles.isDarkTheme ? '#aaa' : '#999'}
1100
+ placeholderTextColor={colors.secondaryText}
1050
1101
  keyboardType="url"
1051
1102
  autoFocus
1052
1103
  selectionColor={themeStyles.primaryColor}
@@ -1062,7 +1113,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1062
1113
  <Text style={styles.cancelButtonText}>Cancel</Text>
1063
1114
  </TouchableOpacity>
1064
1115
  <TouchableOpacity
1065
- style={[styles.addLinkButton, styles.addButton, { opacity: isFetchingMetadata ? 0.5 : 1 }]}
1116
+ style={[styles.addLinkButton, styles.addButton, { backgroundColor: colors.iconSecurity, opacity: isFetchingMetadata ? 0.5 : 1 }]}
1066
1117
  onPress={addLink}
1067
1118
  disabled={isFetchingMetadata}
1068
1119
  >
@@ -1077,8 +1128,8 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1077
1128
  ),
1078
1129
  }] : [{
1079
1130
  id: 'add-link-trigger',
1080
- icon: 'add',
1081
- iconColor: '#32D74B',
1131
+ icon: 'plus',
1132
+ iconColor: colors.sidebarIconSharing,
1082
1133
  title: 'Add a new link',
1083
1134
  subtitle: 'Tap to add a new link to your profile',
1084
1135
  onPress: () => setIsAddingLink(true),
@@ -1086,13 +1137,13 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1086
1137
  // Existing links
1087
1138
  ...tempLinksWithMetadata.map((link, index) => ({
1088
1139
  id: link.id,
1089
- image: link.image || undefined,
1090
- imageSize: 32,
1091
- icon: link.image ? undefined : 'link',
1092
- iconColor: '#32D74B',
1140
+ customIcon: link.image ? (
1141
+ <Image source={{ uri: link.image }} style={{ width: 36, height: 36, borderRadius: 18 }} />
1142
+ ) : undefined,
1143
+ icon: !link.image ? 'link-variant' : undefined,
1144
+ iconColor: colors.sidebarIconSharing,
1093
1145
  title: link.title || link.url,
1094
1146
  subtitle: link.description && link.description !== link.title ? link.description : link.url,
1095
- multiRow: true,
1096
1147
  customContent: (
1097
1148
  <View style={styles.linkItemActions}>
1098
1149
  <View style={styles.reorderButtons}>
@@ -1121,7 +1172,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1121
1172
  ),
1122
1173
  })),
1123
1174
  ]}
1124
- theme={theme}
1175
+
1125
1176
  />
1126
1177
  {tempLinksWithMetadata.length > 0 && (
1127
1178
  <View style={styles.reorderHint}>
@@ -1134,12 +1185,12 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1134
1185
  );
1135
1186
  }
1136
1187
  const fieldConfig = {
1137
- displayName: { label: 'Display Name', value: displayName, placeholder: 'Enter your display name', icon: 'person', color: '#007AFF', multiline: false, keyboardType: 'default' as const },
1138
- username: { label: 'Username', value: username, placeholder: 'Choose a username', icon: 'at', color: '#5856D6', multiline: false, keyboardType: 'default' as const },
1139
- email: { label: 'Email', value: email, placeholder: 'Enter your email address', icon: 'mail', color: '#FF9500', multiline: false, keyboardType: 'email-address' as const },
1140
- bio: { label: 'Bio', value: bio, placeholder: 'Tell people about yourself...', icon: 'document-text', color: '#34C759', multiline: true, keyboardType: 'default' as const },
1141
- location: { label: 'Location', value: location, placeholder: 'Enter your location', icon: 'location', color: '#FF3B30', multiline: false, keyboardType: 'default' as const },
1142
- links: { label: 'Links', value: links.join(', '), placeholder: 'Enter your links (comma separated)', icon: 'link', color: '#32D74B', multiline: false, keyboardType: 'url' as const }
1188
+ displayName: { label: 'Display Name', value: displayName, placeholder: 'Enter your display name', icon: 'person', color: colors.iconPersonalInfo, multiline: false, keyboardType: 'default' as const },
1189
+ username: { label: 'Username', value: username, placeholder: 'Choose a username', icon: 'at', color: colors.iconData, multiline: false, keyboardType: 'default' as const },
1190
+ email: { label: 'Email', value: email, placeholder: 'Enter your email address', icon: 'mail', color: colors.iconStorage, multiline: false, keyboardType: 'email-address' as const },
1191
+ bio: { label: 'Bio', value: bio, placeholder: 'Tell people about yourself...', icon: 'document-text', color: colors.iconPersonalInfo, multiline: true, keyboardType: 'default' as const },
1192
+ location: { label: 'Location', value: location, placeholder: 'Enter your location', icon: 'location', color: colors.iconSharing, multiline: false, keyboardType: 'default' as const },
1193
+ links: { label: 'Links', value: links.join(', '), placeholder: 'Enter your links (comma separated)', icon: 'link', color: colors.iconPersonalInfo, multiline: false, keyboardType: 'url' as const }
1143
1194
  };
1144
1195
 
1145
1196
  const config = fieldConfig[type as keyof typeof fieldConfig];
@@ -1169,11 +1220,11 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1169
1220
  };
1170
1221
 
1171
1222
  return (
1172
- <View style={[styles.editingFieldContainer, { backgroundColor: themeStyles.isDarkTheme ? '#000000' : '#FFFFFF' }]}>
1223
+ <View style={[styles.editingFieldContainer, { backgroundColor: colors.background }]}>
1173
1224
  <View style={styles.editingFieldContent}>
1174
1225
  <View style={styles.newValueSection}>
1175
1226
  <View style={styles.editingFieldHeader}>
1176
- <Text style={[styles.editingFieldLabel, { color: themeStyles.isDarkTheme ? '#FFFFFF' : '#000000' }]}>
1227
+ <Text style={[styles.editingFieldLabel, { color: colors.text }]}>
1177
1228
  {config.label}
1178
1229
  </Text>
1179
1230
  </View>
@@ -1204,10 +1255,10 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1204
1255
 
1205
1256
 
1206
1257
 
1207
- if (authLoading || !isAuthenticated) {
1258
+ if (isLoading || !isAuthenticated) {
1208
1259
  return (
1209
1260
  <View style={[styles.container, {
1210
- backgroundColor: themeStyles.isDarkTheme ? '#000000' : '#F5F5F7',
1261
+ backgroundColor: themeStyles.backgroundColor,
1211
1262
  justifyContent: 'center'
1212
1263
  }]}>
1213
1264
  <ActivityIndicator size="large" color={themeStyles.primaryColor} />
@@ -1216,21 +1267,21 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1216
1267
  }
1217
1268
 
1218
1269
  return (
1219
- <View style={[styles.container, { backgroundColor: themeStyles.isDarkTheme ? '#000000' : '#F5F5F7' }]}>
1270
+ <View style={[styles.container, { backgroundColor: themeStyles.backgroundColor }]}>
1220
1271
  {/* Header */}
1221
1272
  {editingField ? (
1222
1273
  <View style={[styles.editingHeader, {
1223
- backgroundColor: themeStyles.isDarkTheme ? '#000000' : '#FFFFFF',
1224
- borderBottomColor: themeStyles.isDarkTheme ? '#38383A' : '#E5E5EA'
1274
+ backgroundColor: colors.background,
1275
+ borderBottomColor: colors.border
1225
1276
  }]}>
1226
1277
  <View style={styles.editingHeaderContent}>
1227
1278
  <TouchableOpacity
1228
1279
  style={[styles.editingBackButton, {
1229
- backgroundColor: themeStyles.isDarkTheme ? '#1C1C1E' : '#F2F2F7'
1280
+ backgroundColor: colors.card
1230
1281
  }]}
1231
1282
  onPress={cancelEditing}
1232
1283
  >
1233
- <Ionicons name="chevron-back" size={20} color={themeStyles.primaryColor} />
1284
+ <Ionicons name="chevron-back" size={20} color={colors.tint} />
1234
1285
  </TouchableOpacity>
1235
1286
  <View style={styles.editingTitleContainer}>
1236
1287
  </View>
@@ -1239,49 +1290,49 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1239
1290
  styles.editingSaveButton,
1240
1291
  {
1241
1292
  opacity: isSaving ? 0.5 : 1,
1242
- backgroundColor: themeStyles.isDarkTheme ? '#1C1C1E' : '#F2F2F7'
1293
+ backgroundColor: colors.card
1243
1294
  }
1244
1295
  ]}
1245
1296
  onPress={() => saveField(editingField)}
1246
1297
  disabled={isSaving}
1247
1298
  >
1248
1299
  {isSaving ? (
1249
- <ActivityIndicator size="small" color={themeStyles.primaryColor} />
1300
+ <ActivityIndicator size="small" color={colors.tint} />
1250
1301
  ) : (
1251
- <Text style={[styles.editingSaveButtonText, { color: themeStyles.primaryColor }]}>Save</Text>
1302
+ <Text style={[styles.editingSaveButtonText, { color: colors.tint }]}>Save</Text>
1252
1303
  )}
1253
1304
  </TouchableOpacity>
1254
1305
  </View>
1255
1306
  <View style={styles.editingHeaderBottom}>
1256
1307
  <View style={[styles.editingIconContainer, {
1257
- backgroundColor: editingField === 'displayName' ? '#007AFF20' :
1258
- editingField === 'username' ? '#5856D620' :
1259
- editingField === 'email' ? '#FF950020' :
1260
- editingField === 'bio' ? '#34C75920' :
1261
- editingField === 'location' ? '#FF3B3020' :
1262
- editingField === 'links' ? '#32D74B20' : '#007AFF20'
1308
+ backgroundColor: editingField === 'displayName' ? `${colors.sidebarIconPersonalInfo}20` :
1309
+ editingField === 'username' ? `${colors.sidebarIconData}20` :
1310
+ editingField === 'email' ? `${colors.sidebarIconSecurity}20` :
1311
+ editingField === 'bio' ? `${colors.sidebarIconPersonalInfo}20` :
1312
+ editingField === 'location' ? `${colors.sidebarIconSharing}20` :
1313
+ editingField === 'links' ? `${colors.sidebarIconPersonalInfo}20` : `${colors.tint}20`
1263
1314
  }]}>
1264
- <Ionicons
1315
+ <MaterialCommunityIcons
1265
1316
  name={
1266
- editingField === 'displayName' ? 'person' as any :
1317
+ editingField === 'displayName' ? 'account-outline' as any :
1267
1318
  editingField === 'username' ? 'at' as any :
1268
- editingField === 'email' ? 'mail' as any :
1269
- editingField === 'bio' ? 'document-text' as any :
1270
- editingField === 'location' ? 'location' as any :
1271
- editingField === 'links' ? 'link' as any : 'person' as any
1319
+ editingField === 'email' ? 'email-outline' as any :
1320
+ editingField === 'bio' ? 'text-box-outline' as any :
1321
+ editingField === 'location' ? 'map-marker-outline' as any :
1322
+ editingField === 'links' ? 'link-variant' as any : 'account-outline' as any
1272
1323
  }
1273
1324
  size={28}
1274
1325
  color={
1275
- editingField === 'displayName' ? '#007AFF' :
1276
- editingField === 'username' ? '#5856D6' :
1277
- editingField === 'email' ? '#FF9500' :
1278
- editingField === 'bio' ? '#34C759' :
1279
- editingField === 'location' ? '#FF3B30' :
1280
- editingField === 'links' ? '#32D74B' : '#007AFF'
1326
+ editingField === 'displayName' ? colors.sidebarIconPersonalInfo :
1327
+ editingField === 'username' ? colors.sidebarIconData :
1328
+ editingField === 'email' ? colors.sidebarIconSecurity :
1329
+ editingField === 'bio' ? colors.sidebarIconPersonalInfo :
1330
+ editingField === 'location' ? colors.sidebarIconSharing :
1331
+ editingField === 'links' ? colors.sidebarIconPersonalInfo : colors.tint
1281
1332
  }
1282
1333
  />
1283
1334
  </View>
1284
- <Text style={[styles.editingBottomTitle, { color: themeStyles.isDarkTheme ? '#FFFFFF' : '#000000' }]}>
1335
+ <Text style={[styles.editingBottomTitle, { color: colors.text }]}>
1285
1336
  {editingField === 'displayName' ? (t('editProfile.items.displayName.title') || 'Display Name') :
1286
1337
  editingField === 'username' ? (t('editProfile.items.username.title') || 'Username') :
1287
1338
  editingField === 'email' ? (t('editProfile.items.email.title') || 'Email') :
@@ -1291,24 +1342,13 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1291
1342
  </Text>
1292
1343
  </View>
1293
1344
  </View>
1294
- ) : (
1295
- <Header
1296
- title={t('editProfile.title') || 'Edit Profile'}
1297
- theme={theme}
1298
- onBack={goBack || onClose}
1299
- rightAction={{
1300
- icon: 'checkmark',
1301
- onPress: handleSave,
1302
- loading: isSaving,
1303
- disabled: isSaving,
1304
- }}
1305
- elevation="subtle"
1306
- />
1307
- )}
1345
+ ) : null}
1308
1346
 
1309
1347
  <ScrollView
1310
1348
  ref={scrollViewRef}
1311
1349
  style={editingField ? styles.contentEditing : styles.content}
1350
+ contentContainerStyle={styles.scrollContent}
1351
+ showsVerticalScrollIndicator={false}
1312
1352
  >
1313
1353
  {editingField ? (
1314
1354
  // Show only the editing interface when editing
@@ -1318,6 +1358,16 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1318
1358
  ) : (
1319
1359
  // Show all settings when not editing
1320
1360
  <>
1361
+ {/* Title and Subtitle Header */}
1362
+ <View style={[styles.headerContainer, styles.headerSection]}>
1363
+ <Text style={[styles.modernTitle, { color: themeStyles.textColor, marginBottom: 0, marginTop: 0 }]}>
1364
+ {t('accountOverview.items.editProfile.title') || t('editProfile.title') || 'Edit Profile'}
1365
+ </Text>
1366
+ <Text style={[styles.modernSubtitle, { color: colors.secondaryText, marginBottom: 0, marginTop: 0 }]}>
1367
+ {t('accountOverview.items.editProfile.subtitle') || t('editProfile.subtitle') || 'Manage your profile and preferences'}
1368
+ </Text>
1369
+ </View>
1370
+
1321
1371
  {showRecoveryModal && (
1322
1372
  <View style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0,0,0,0.6)', zIndex: 50, padding: 16, justifyContent: 'center' }}>
1323
1373
  <View style={{ backgroundColor: '#fff', borderRadius: 20, padding: 20, maxHeight: '80%' }}>
@@ -1344,7 +1394,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1344
1394
  </View>
1345
1395
  )}
1346
1396
  <TouchableOpacity
1347
- style={[styles.primaryButton, { alignSelf: 'flex-end', marginTop: 8 }]}
1397
+ style={[styles.primaryButton, { backgroundColor: colors.iconSecurity, alignSelf: 'flex-end', marginTop: 8 }]}
1348
1398
  onPress={() => { setShowRecoveryModal(false); setEditingField(null); toast.success(t('editProfile.toasts.twoFactorEnabled') || 'Two‑Factor Authentication enabled'); }}
1349
1399
  >
1350
1400
  <Ionicons name="checkmark" size={18} color="#fff" />
@@ -1366,7 +1416,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1366
1416
  setProfilePictureSectionY(y);
1367
1417
  }}
1368
1418
  >
1369
- <Text style={[styles.sectionTitle, { color: themeStyles.isDarkTheme ? '#8E8E93' : '#8E8E93' }]}>
1419
+ <Text style={[styles.sectionTitle, { color: colors.secondaryText }]}>
1370
1420
  {t('editProfile.sections.profilePicture') || 'PROFILE PICTURE'}
1371
1421
  </Text>
1372
1422
  <View style={styles.groupedSectionWrapper}>
@@ -1374,58 +1424,59 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1374
1424
  items={[
1375
1425
  {
1376
1426
  id: 'profile-photo',
1377
- icon: avatarFileId ? undefined : 'person',
1378
- iconColor: '#007AFF',
1379
- // Use optimistic avatar ID if available, otherwise use saved one
1380
- image: (optimisticAvatarId || avatarFileId) ? oxyServices.getFileDownloadUrl(optimisticAvatarId || avatarFileId, 'thumb') : undefined,
1381
- imageSize: 40,
1382
- title: 'Profile Photo',
1383
- subtitle: isUpdatingAvatar
1384
- ? 'Updating profile picture...'
1385
- : (avatarFileId ? 'Tap to change your profile picture' : 'Tap to add a profile picture'),
1386
- onPress: isUpdatingAvatar ? undefined : openAvatarPicker,
1387
- disabled: isUpdatingAvatar,
1388
- customIcon: isUpdatingAvatar ? (
1389
- <Animated.View style={{ position: 'relative', width: 40, height: 40 }}>
1390
- {(optimisticAvatarId || avatarFileId) && (
1427
+ customIcon: (optimisticAvatarId || avatarFileId) ? (
1428
+ isUpdatingAvatar ? (
1429
+ <Animated.View style={{ position: 'relative', width: 36, height: 36 }}>
1391
1430
  <Animated.Image
1392
1431
  source={{ uri: oxyServices.getFileDownloadUrl(optimisticAvatarId || avatarFileId, 'thumb') }}
1393
1432
  style={{
1394
- width: 40,
1395
- height: 40,
1396
- borderRadius: 22,
1433
+ width: 36,
1434
+ height: 36,
1435
+ borderRadius: 18,
1397
1436
  opacity: 0.6
1398
1437
  }}
1399
1438
  />
1400
- )}
1401
- <View style={{
1402
- position: 'absolute',
1403
- top: 0,
1404
- left: 0,
1405
- right: 0,
1406
- bottom: 0,
1407
- justifyContent: 'center',
1408
- alignItems: 'center',
1409
- backgroundColor: themeStyles.isDarkTheme ? 'rgba(0, 0, 0, 0.4)' : 'rgba(255, 255, 255, 0.7)',
1410
- borderRadius: 22,
1411
- }}>
1412
- <ActivityIndicator size="small" color={themeStyles.primaryColor} />
1413
- </View>
1414
- </Animated.View>
1439
+ <View style={{
1440
+ position: 'absolute',
1441
+ top: 0,
1442
+ left: 0,
1443
+ right: 0,
1444
+ bottom: 0,
1445
+ justifyContent: 'center',
1446
+ alignItems: 'center',
1447
+ backgroundColor: colorScheme === 'dark' ? 'rgba(0, 0, 0, 0.4)' : 'rgba(255, 255, 255, 0.7)',
1448
+ borderRadius: 18,
1449
+ }}>
1450
+ <ActivityIndicator size="small" color={colors.tint} />
1451
+ </View>
1452
+ </Animated.View>
1453
+ ) : (
1454
+ <Image
1455
+ source={{ uri: oxyServices.getFileDownloadUrl(optimisticAvatarId || avatarFileId, 'thumb') }}
1456
+ style={{ width: 36, height: 36, borderRadius: 18 }}
1457
+ />
1458
+ )
1415
1459
  ) : undefined,
1460
+ icon: !(optimisticAvatarId || avatarFileId) ? 'account-outline' : undefined,
1461
+ iconColor: colors.sidebarIconPersonalInfo,
1462
+ title: 'Profile Photo',
1463
+ subtitle: isUpdatingAvatar
1464
+ ? 'Updating profile picture...'
1465
+ : (avatarFileId ? 'Tap to change your profile picture' : 'Tap to add a profile picture'),
1466
+ onPress: isUpdatingAvatar ? undefined : openAvatarPicker,
1467
+ disabled: isUpdatingAvatar,
1416
1468
  },
1417
1469
  ...(avatarFileId && !isUpdatingAvatar ? [
1418
1470
  {
1419
1471
  id: 'remove-profile-photo',
1420
- icon: 'trash',
1421
- iconColor: '#FF3B30',
1472
+ icon: 'delete-outline',
1473
+ iconColor: colors.sidebarIconSharing,
1422
1474
  title: 'Remove Photo',
1423
1475
  subtitle: 'Delete current profile picture',
1424
1476
  onPress: handleAvatarRemove,
1425
1477
  }
1426
1478
  ] : []),
1427
1479
  ]}
1428
- theme={theme}
1429
1480
  />
1430
1481
  </View>
1431
1482
  </View>
@@ -1439,7 +1490,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1439
1490
  setBasicInfoSectionY(y);
1440
1491
  }}
1441
1492
  >
1442
- <Text style={[styles.sectionTitle, { color: themeStyles.isDarkTheme ? '#8E8E93' : '#8E8E93' }]}>
1493
+ <Text style={[styles.sectionTitle, { color: colors.secondaryText }]}>
1443
1494
  {t('editProfile.sections.basicInfo') || 'BASIC INFORMATION'}
1444
1495
  </Text>
1445
1496
  <View style={styles.groupedSectionWrapper}>
@@ -1447,30 +1498,29 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1447
1498
  items={[
1448
1499
  {
1449
1500
  id: 'display-name',
1450
- icon: 'person',
1451
- iconColor: '#007AFF',
1501
+ icon: 'account-outline',
1502
+ iconColor: colors.sidebarIconPersonalInfo,
1452
1503
  title: t('editProfile.items.displayName.title') || 'Display Name',
1453
1504
  subtitle: [displayName, lastName].filter(Boolean).join(' ') || (t('editProfile.items.displayName.add') || 'Add your display name'),
1454
- onPress: () => startEditing('displayName', ''),
1505
+ onPress: handleOpenDisplayNameModal,
1455
1506
  },
1456
1507
  {
1457
1508
  id: 'username',
1458
1509
  icon: 'at',
1459
- iconColor: '#5856D6',
1510
+ iconColor: colors.sidebarIconData,
1460
1511
  title: t('editProfile.items.username.title') || 'Username',
1461
1512
  subtitle: username || (t('editProfile.items.username.choose') || 'Choose a username'),
1462
- onPress: () => startEditing('username', username),
1513
+ onPress: handleOpenUsernameModal,
1463
1514
  },
1464
1515
  {
1465
1516
  id: 'email',
1466
- icon: 'mail',
1467
- iconColor: '#FF9500',
1517
+ icon: 'email-outline',
1518
+ iconColor: colors.sidebarIconSecurity,
1468
1519
  title: t('editProfile.items.email.title') || 'Email',
1469
1520
  subtitle: email || (t('editProfile.items.email.add') || 'Add your email address'),
1470
- onPress: () => startEditing('email', email),
1521
+ onPress: handleOpenEmailModal,
1471
1522
  },
1472
1523
  ]}
1473
- theme={theme}
1474
1524
  />
1475
1525
  </View>
1476
1526
  </View>
@@ -1484,7 +1534,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1484
1534
  setAboutSectionY(y);
1485
1535
  }}
1486
1536
  >
1487
- <Text style={[styles.sectionTitle, { color: themeStyles.isDarkTheme ? '#8E8E93' : '#8E8E93' }]}>
1537
+ <Text style={[styles.sectionTitle, { color: colors.secondaryText }]}>
1488
1538
  {t('editProfile.sections.about') || 'ABOUT YOU'}
1489
1539
  </Text>
1490
1540
  <View style={styles.groupedSectionWrapper}>
@@ -1492,92 +1542,37 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1492
1542
  items={[
1493
1543
  {
1494
1544
  id: 'bio',
1495
- icon: 'document-text',
1496
- iconColor: '#34C759',
1545
+ icon: 'text-box-outline',
1546
+ iconColor: colors.sidebarIconPersonalInfo,
1497
1547
  title: t('editProfile.items.bio.title') || 'Bio',
1498
1548
  subtitle: bio || (t('editProfile.items.bio.placeholder') || 'Tell people about yourself'),
1499
- onPress: () => startEditing('bio', bio),
1549
+ onPress: handleOpenBioModal,
1500
1550
  },
1501
1551
  {
1502
1552
  id: 'locations',
1503
- icon: 'location',
1504
- iconColor: '#FF3B30',
1553
+ icon: 'map-marker-outline',
1554
+ iconColor: colors.sidebarIconSharing,
1505
1555
  title: t('editProfile.items.locations.title') || 'Locations',
1506
- subtitle: tempLocations.length > 0
1507
- ? (tempLocations.length === 1
1508
- ? (t('editProfile.items.locations.count', { count: tempLocations.length }) || `${tempLocations.length} location added`)
1509
- : (t('editProfile.items.locations.count_plural', { count: tempLocations.length }) || `${tempLocations.length} locations added`))
1556
+ subtitle: locations.length > 0
1557
+ ? (locations.length === 1
1558
+ ? (t('editProfile.items.locations.count', { count: locations.length }) || `${locations.length} location added`)
1559
+ : (t('editProfile.items.locations.count_plural', { count: locations.length }) || `${locations.length} locations added`))
1510
1560
  : (t('editProfile.items.locations.add') || 'Add your locations'),
1511
- onPress: () => startEditing('location', ''),
1512
- customContentBelow: tempLocations.length > 0 && (
1513
- <View style={styles.linksPreviewContainer}>
1514
- {tempLocations.slice(0, 2).map((location, index) => (
1515
- <View key={location.id || index} style={styles.linkPreviewItem}>
1516
- <View style={styles.linkPreviewImage}>
1517
- <Text style={styles.linkPreviewImageText}>
1518
- {location.name.charAt(0).toUpperCase()}
1519
- </Text>
1520
- </View>
1521
- <View style={styles.linkPreviewContent}>
1522
- <Text style={styles.linkPreviewTitle} numberOfLines={1}>
1523
- {location.name}
1524
- </Text>
1525
- {location.label && (
1526
- <Text style={styles.linkPreviewSubtitle}>
1527
- {location.label}
1528
- </Text>
1529
- )}
1530
- </View>
1531
- </View>
1532
- ))}
1533
- {tempLocations.length > 2 && (
1534
- <Text style={styles.linkPreviewMore}>
1535
- +{tempLocations.length - 2} more
1536
- </Text>
1537
- )}
1538
- </View>
1539
- ),
1561
+ onPress: handleOpenLocationModal,
1540
1562
  },
1541
1563
  {
1542
1564
  id: 'links',
1543
- icon: 'link',
1544
- iconColor: '#32D74B',
1565
+ icon: 'link-variant',
1566
+ iconColor: colors.sidebarIconSharing,
1545
1567
  title: t('editProfile.items.links.title') || 'Links',
1546
- subtitle: tempLinksWithMetadata.length > 0
1547
- ? (tempLinksWithMetadata.length === 1
1548
- ? (t('editProfile.items.links.count', { count: tempLinksWithMetadata.length }) || `${tempLinksWithMetadata.length} link added`)
1549
- : (t('editProfile.items.links.count_plural', { count: tempLinksWithMetadata.length }) || `${tempLinksWithMetadata.length} links added`))
1568
+ subtitle: linksMetadata.length > 0
1569
+ ? (linksMetadata.length === 1
1570
+ ? (t('editProfile.items.links.count', { count: linksMetadata.length }) || `${linksMetadata.length} link added`)
1571
+ : (t('editProfile.items.links.count_plural', { count: linksMetadata.length }) || `${linksMetadata.length} links added`))
1550
1572
  : (t('editProfile.items.links.add') || 'Add your links'),
1551
- onPress: () => startEditing('links', ''),
1552
- multiRow: true,
1553
- customContentBelow: tempLinksWithMetadata.length > 0 && (
1554
- <View style={styles.linksPreviewContainer}>
1555
- {tempLinksWithMetadata.slice(0, 2).map((link, index) => (
1556
- <View key={link.id || index} style={styles.linkPreviewItem}>
1557
- {link.image ? (
1558
- <Image source={{ uri: link.image }} style={styles.linkPreviewImage} />
1559
- ) : (
1560
- <View style={styles.linkPreviewImage}>
1561
- <Text style={styles.linkPreviewImageText}>
1562
- {link.title?.charAt(0).toUpperCase() || link.url.charAt(0).toUpperCase()}
1563
- </Text>
1564
- </View>
1565
- )}
1566
- <Text style={styles.linkPreviewTitle} numberOfLines={1}>
1567
- {link.title || link.url}
1568
- </Text>
1569
- </View>
1570
- ))}
1571
- {tempLinksWithMetadata.length > 2 && (
1572
- <Text style={styles.linkPreviewMore}>
1573
- +{tempLinksWithMetadata.length - 2} more
1574
- </Text>
1575
- )}
1576
- </View>
1577
- ),
1573
+ onPress: handleOpenLinksModal,
1578
1574
  },
1579
1575
  ]}
1580
- theme={theme}
1581
1576
  />
1582
1577
  </View>
1583
1578
  </View>
@@ -1591,7 +1586,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1591
1586
  setQuickActionsSectionY(y);
1592
1587
  }}
1593
1588
  >
1594
- <Text style={[styles.sectionTitle, { color: themeStyles.isDarkTheme ? '#8E8E93' : '#8E8E93' }]}>
1589
+ <Text style={[styles.sectionTitle, { color: colors.secondaryText }]}>
1595
1590
  {t('editProfile.sections.quickActions') || 'QUICK ACTIONS'}
1596
1591
  </Text>
1597
1592
  <View style={styles.groupedSectionWrapper}>
@@ -1600,29 +1595,28 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1600
1595
  {
1601
1596
  id: 'preview-profile',
1602
1597
  icon: 'eye',
1603
- iconColor: '#007AFF',
1598
+ iconColor: colors.sidebarIconHome,
1604
1599
  title: t('editProfile.items.previewProfile.title') || 'Preview Profile',
1605
1600
  subtitle: t('editProfile.items.previewProfile.subtitle') || 'See how your profile looks to others',
1606
1601
  onPress: () => navigate?.('Profile', { userId: user?.id }),
1607
1602
  },
1608
1603
  {
1609
1604
  id: 'privacy-settings',
1610
- icon: 'shield-checkmark',
1611
- iconColor: '#8E8E93',
1605
+ icon: 'shield-check',
1606
+ iconColor: colors.sidebarIconSecurity,
1612
1607
  title: t('editProfile.items.privacySettings.title') || 'Privacy Settings',
1613
1608
  subtitle: t('editProfile.items.privacySettings.subtitle') || 'Control who can see your profile',
1614
1609
  onPress: () => navigate?.('PrivacySettings'),
1615
1610
  },
1616
1611
  {
1617
1612
  id: 'verify-account',
1618
- icon: 'checkmark-circle',
1619
- iconColor: '#30D158',
1613
+ icon: 'check-circle',
1614
+ iconColor: colors.sidebarIconPersonalInfo,
1620
1615
  title: t('editProfile.items.verifyAccount.title') || 'Verify Account',
1621
1616
  subtitle: t('editProfile.items.verifyAccount.subtitle') || 'Get a verified badge',
1622
1617
  onPress: () => navigate?.('AccountVerification'),
1623
1618
  },
1624
1619
  ]}
1625
- theme={theme}
1626
1620
  />
1627
1621
  </View>
1628
1622
  </View>
@@ -1636,7 +1630,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1636
1630
  setSecuritySectionY(y);
1637
1631
  }}
1638
1632
  >
1639
- <Text style={[styles.sectionTitle, { color: themeStyles.isDarkTheme ? '#8E8E93' : '#8E8E93' }]}>
1633
+ <Text style={[styles.sectionTitle, { color: colors.secondaryText }]}>
1640
1634
  {t('editProfile.sections.security') || 'SECURITY'}
1641
1635
  </Text>
1642
1636
  <View style={styles.groupedSectionWrapper}>
@@ -1644,41 +1638,121 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
1644
1638
  items={[
1645
1639
  {
1646
1640
  id: 'two-factor',
1647
- icon: 'shield-checkmark',
1648
- iconColor: '#007AFF',
1641
+ icon: 'shield-lock',
1642
+ iconColor: colors.sidebarIconSecurity,
1649
1643
  title: t('editProfile.items.twoFactor.title') || 'Two‑Factor Authentication',
1650
1644
  subtitle: user?.privacySettings?.twoFactorEnabled
1651
1645
  ? (t('editProfile.items.twoFactor.enabled') || 'Enabled')
1652
1646
  : (t('editProfile.items.twoFactor.disabled') || 'Disabled (recommended)'),
1653
- onPress: () => startEditing('twoFactor', ''),
1647
+ onPress: handleOpenTwoFactorModal,
1654
1648
  },
1655
1649
  ]}
1656
- theme={theme}
1657
1650
  />
1658
1651
  </View>
1659
1652
  </View>
1660
1653
  </>
1661
1654
  )}
1662
1655
  </ScrollView>
1656
+
1657
+ {/* Modal Components */}
1658
+ <EditDisplayNameModal
1659
+ visible={showEditDisplayNameModal}
1660
+ onClose={() => setShowEditDisplayNameModal(false)}
1661
+ initialDisplayName={displayName}
1662
+ initialLastName={lastName}
1663
+ theme={normalizedTheme}
1664
+ onSave={handleModalSave}
1665
+ />
1666
+ <EditUsernameModal
1667
+ visible={showEditUsernameModal}
1668
+ onClose={() => setShowEditUsernameModal(false)}
1669
+ initialValue={username}
1670
+ theme={normalizedTheme}
1671
+ onSave={handleModalSave}
1672
+ />
1673
+ <EditEmailModal
1674
+ visible={showEditEmailModal}
1675
+ onClose={() => setShowEditEmailModal(false)}
1676
+ initialValue={email}
1677
+ theme={normalizedTheme}
1678
+ onSave={handleModalSave}
1679
+ />
1680
+ <EditBioModal
1681
+ visible={showEditBioModal}
1682
+ onClose={() => setShowEditBioModal(false)}
1683
+ initialValue={bio}
1684
+ theme={normalizedTheme}
1685
+ onSave={handleModalSave}
1686
+ />
1687
+ <EditLocationModal
1688
+ visible={showEditLocationModal}
1689
+ onClose={() => setShowEditLocationModal(false)}
1690
+ initialLocations={locations}
1691
+ theme={normalizedTheme}
1692
+ onSave={handleModalSave}
1693
+ />
1694
+ <EditLinksModal
1695
+ visible={showEditLinksModal}
1696
+ onClose={() => setShowEditLinksModal(false)}
1697
+ initialLinks={linksMetadata}
1698
+ theme={normalizedTheme}
1699
+ onSave={handleModalSave}
1700
+ />
1701
+ <TwoFactorSetupModal
1702
+ visible={showTwoFactorModal}
1703
+ onClose={() => setShowTwoFactorModal(false)}
1704
+ isEnabled={!!user?.privacySettings?.twoFactorEnabled}
1705
+ theme={normalizedTheme}
1706
+ />
1663
1707
  </View>
1664
1708
  );
1665
1709
  };
1666
1710
 
1667
1711
  const styles = StyleSheet.create({
1668
1712
  container: {
1669
- flex: 1,
1713
+ flexShrink: 1,
1714
+ width: '100%',
1670
1715
  },
1671
1716
  content: {
1672
- flex: 1,
1673
- paddingTop: 8,
1674
- paddingBottom: 24,
1717
+ flexShrink: 1,
1718
+ },
1719
+ scrollView: {
1720
+ flexShrink: 1,
1675
1721
  },
1676
1722
  contentEditing: {
1677
1723
  flex: 1,
1678
1724
  padding: 0,
1679
1725
  },
1726
+ scrollContent: createScreenContentStyle(HEADER_PADDING_TOP_SETTINGS),
1727
+ headerContainer: {
1728
+ width: '100%',
1729
+ maxWidth: 420,
1730
+ alignSelf: 'center',
1731
+ marginBottom: SECTION_GAP_LARGE,
1732
+ },
1733
+ headerSection: {
1734
+ alignItems: 'flex-start',
1735
+ width: '100%',
1736
+ gap: COMPONENT_GAP,
1737
+ },
1738
+ modernTitle: {
1739
+ fontFamily: fontFamilies.phuduBold,
1740
+ fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
1741
+ fontSize: 42,
1742
+ lineHeight: 50.4, // 42 * 1.2
1743
+ textAlign: 'left',
1744
+ letterSpacing: -0.5,
1745
+ },
1746
+ modernSubtitle: {
1747
+ fontSize: 18,
1748
+ lineHeight: 24,
1749
+ textAlign: 'left',
1750
+ maxWidth: 320,
1751
+ alignSelf: 'flex-start',
1752
+ opacity: 0.8,
1753
+ },
1680
1754
  section: {
1681
- marginBottom: 32,
1755
+ marginBottom: SECTION_GAP_LARGE,
1682
1756
  },
1683
1757
  sectionTitle: {
1684
1758
  fontSize: 13,
@@ -1686,13 +1760,11 @@ const styles = StyleSheet.create({
1686
1760
  color: '#8E8E93',
1687
1761
  marginBottom: 8,
1688
1762
  marginTop: 4,
1689
- marginHorizontal: 16,
1690
1763
  textTransform: 'uppercase',
1691
1764
  letterSpacing: 0.5,
1692
1765
  fontFamily: fontFamilies.phuduSemiBold,
1693
1766
  },
1694
1767
  groupedSectionWrapper: {
1695
- marginHorizontal: 16,
1696
1768
  backgroundColor: 'transparent',
1697
1769
  },
1698
1770
 
@@ -1759,7 +1831,7 @@ const styles = StyleSheet.create({
1759
1831
  alignItems: 'center',
1760
1832
  justifyContent: 'center',
1761
1833
  gap: 8,
1762
- backgroundColor: '#007AFF',
1834
+ // backgroundColor should be applied inline using colors.iconSecurity
1763
1835
  paddingVertical: 12,
1764
1836
  paddingHorizontal: 16,
1765
1837
  borderRadius: 10,
@@ -1906,7 +1978,7 @@ const styles = StyleSheet.create({
1906
1978
  color: '#6C757D',
1907
1979
  },
1908
1980
  addButton: {
1909
- backgroundColor: '#007AFF',
1981
+ // backgroundColor should be applied inline using colors.iconSecurity
1910
1982
  },
1911
1983
  addButtonText: {
1912
1984
  fontSize: 14,
@@ -1927,7 +1999,7 @@ const styles = StyleSheet.create({
1927
1999
  addLinkTriggerText: {
1928
2000
  fontSize: 14,
1929
2001
  fontWeight: '600',
1930
- color: '#007AFF',
2002
+ // color should be applied inline using colors.iconSecurity
1931
2003
  marginLeft: 6,
1932
2004
  },
1933
2005
  linksList: {
@@ -2024,7 +2096,7 @@ const styles = StyleSheet.create({
2024
2096
  width: 32,
2025
2097
  height: 32,
2026
2098
  borderRadius: 16,
2027
- backgroundColor: '#007AFF',
2099
+ // backgroundColor should be applied inline using colors.iconSecurity
2028
2100
  alignItems: 'center',
2029
2101
  justifyContent: 'center',
2030
2102
  marginRight: 8,
@@ -2036,7 +2108,7 @@ const styles = StyleSheet.create({
2036
2108
  },
2037
2109
  fetchingText: {
2038
2110
  fontSize: 12,
2039
- color: '#007AFF',
2111
+ // color should be applied inline using colors.iconSecurity
2040
2112
  fontStyle: 'italic',
2041
2113
  },
2042
2114
  linksFieldContent: {
@@ -2061,7 +2133,7 @@ const styles = StyleSheet.create({
2061
2133
  width: 20,
2062
2134
  height: 20,
2063
2135
  borderRadius: 10,
2064
- backgroundColor: '#007AFF',
2136
+ // backgroundColor should be applied inline using colors.iconSecurity
2065
2137
  alignItems: 'center',
2066
2138
  justifyContent: 'center',
2067
2139
  marginRight: 6,
@@ -2102,7 +2174,7 @@ const styles = StyleSheet.create({
2102
2174
  },
2103
2175
  searchingText: {
2104
2176
  fontSize: 12,
2105
- color: '#007AFF',
2177
+ // color should be applied inline using colors.iconSecurity
2106
2178
  fontStyle: 'italic',
2107
2179
  },
2108
2180
  addLocationInputContainer: {
@@ -2143,7 +2215,7 @@ const styles = StyleSheet.create({
2143
2215
  addLocationTriggerText: {
2144
2216
  marginLeft: 8,
2145
2217
  fontSize: 16,
2146
- color: '#007AFF',
2218
+ // color should be applied inline using colors.iconSecurity
2147
2219
  fontWeight: '500',
2148
2220
  },
2149
2221
  searchResults: {
@@ -2207,7 +2279,7 @@ const styles = StyleSheet.create({
2207
2279
  flex: 1,
2208
2280
  },
2209
2281
  locationLabel: {
2210
- backgroundColor: '#007AFF',
2282
+ // backgroundColor should be applied inline using colors.iconSecurity
2211
2283
  paddingHorizontal: 6,
2212
2284
  paddingVertical: 2,
2213
2285
  borderRadius: 4,