@oxyhq/services 11.0.0 → 11.1.1

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 (434) hide show
  1. package/lib/commonjs/index.js +7 -0
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/ui/components/AccountMenu.js +9 -5
  4. package/lib/commonjs/ui/components/AccountMenu.js.map +1 -1
  5. package/lib/commonjs/ui/components/AnotherDeviceQR.js +51 -56
  6. package/lib/commonjs/ui/components/AnotherDeviceQR.js.map +1 -1
  7. package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -0
  8. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  9. package/lib/commonjs/ui/components/FollowButton.js +18 -5
  10. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  11. package/lib/commonjs/ui/components/OxyLogo.js +1 -1
  12. package/lib/commonjs/ui/components/OxyLogo.js.map +1 -1
  13. package/lib/commonjs/ui/components/OxyProvider.js +23 -7
  14. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  15. package/lib/commonjs/ui/components/SignInModal.js +20 -1
  16. package/lib/commonjs/ui/components/SignInModal.js.map +1 -1
  17. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +19 -9
  18. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  19. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +4 -2
  20. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  21. package/lib/commonjs/ui/context/OxyContext.js +153 -19
  22. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  23. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +6 -17
  24. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  25. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +5 -5
  26. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js.map +1 -1
  27. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +38 -38
  28. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  29. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +2 -2
  30. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  31. package/lib/commonjs/ui/hooks/queries/queryKeys.js +3 -3
  32. package/lib/commonjs/ui/hooks/queries/queryKeys.js.map +1 -1
  33. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +1 -1
  34. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  35. package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js +16 -12
  36. package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js.map +1 -1
  37. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +10 -6
  38. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  39. package/lib/commonjs/ui/hooks/queryClient.js +6 -5
  40. package/lib/commonjs/ui/hooks/queryClient.js.map +1 -1
  41. package/lib/commonjs/ui/hooks/useOxyAuthSession.js +40 -2
  42. package/lib/commonjs/ui/hooks/useOxyAuthSession.js.map +1 -1
  43. package/lib/commonjs/ui/hooks/useProfileEditing.js +21 -0
  44. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  45. package/lib/commonjs/ui/hooks/useSessionManagement.js +3 -3
  46. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  47. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +100 -108
  48. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  49. package/lib/commonjs/ui/screens/AppInfoScreen.js +227 -273
  50. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  51. package/lib/commonjs/ui/screens/AvatarCropScreen.js +10 -4
  52. package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -1
  53. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +20 -37
  54. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
  55. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js +89 -201
  56. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js.map +1 -1
  57. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +80 -208
  58. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  59. package/lib/commonjs/ui/screens/FAQScreen.js +56 -208
  60. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  61. package/lib/commonjs/ui/screens/FeedbackScreen.js +303 -352
  62. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  63. package/lib/commonjs/ui/screens/FileManagementScreen.js +20 -20
  64. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  65. package/lib/commonjs/ui/screens/HelpSupportScreen.js +77 -89
  66. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  67. package/lib/commonjs/ui/screens/HistoryViewScreen.js +43 -58
  68. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  69. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +67 -90
  70. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  71. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +77 -177
  72. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  73. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +113 -107
  74. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  75. package/lib/commonjs/ui/screens/ManageAccountScreen.js +55 -114
  76. package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
  77. package/lib/commonjs/ui/screens/NotificationsScreen.js +67 -85
  78. package/lib/commonjs/ui/screens/NotificationsScreen.js.map +1 -1
  79. package/lib/commonjs/ui/screens/OxyAuthScreen.js +71 -135
  80. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  81. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +15 -9
  82. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  83. package/lib/commonjs/ui/screens/PreferencesScreen.js +65 -83
  84. package/lib/commonjs/ui/screens/PreferencesScreen.js.map +1 -1
  85. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +378 -1023
  86. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  87. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +294 -242
  88. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  89. package/lib/commonjs/ui/screens/ProfileScreen.js +194 -333
  90. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  91. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +57 -97
  92. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  93. package/lib/commonjs/ui/screens/SearchSettingsScreen.js +41 -41
  94. package/lib/commonjs/ui/screens/SearchSettingsScreen.js.map +1 -1
  95. package/lib/commonjs/ui/screens/UserLinksScreen.js +17 -24
  96. package/lib/commonjs/ui/screens/UserLinksScreen.js.map +1 -1
  97. package/lib/commonjs/ui/screens/UserListScreen.js +83 -214
  98. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  99. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +115 -77
  100. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  101. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js +70 -57
  102. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  103. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +136 -332
  104. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  105. package/lib/commonjs/ui/screens/trust/TrustFAQScreen.js +47 -137
  106. package/lib/commonjs/ui/screens/trust/TrustFAQScreen.js.map +1 -1
  107. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +182 -115
  108. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  109. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +138 -214
  110. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  111. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js +54 -92
  112. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  113. package/lib/commonjs/ui/utils/activeAuthuser.js +15 -9
  114. package/lib/commonjs/ui/utils/activeAuthuser.js.map +1 -1
  115. package/lib/commonjs/ui/utils/avatarUtils.js +1 -1
  116. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  117. package/lib/module/index.js +2 -0
  118. package/lib/module/index.js.map +1 -1
  119. package/lib/module/ui/components/AccountMenu.js +10 -6
  120. package/lib/module/ui/components/AccountMenu.js.map +1 -1
  121. package/lib/module/ui/components/AnotherDeviceQR.js +50 -56
  122. package/lib/module/ui/components/AnotherDeviceQR.js.map +1 -1
  123. package/lib/module/ui/components/BottomSheetRouter.js +2 -1
  124. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  125. package/lib/module/ui/components/FollowButton.js +18 -5
  126. package/lib/module/ui/components/FollowButton.js.map +1 -1
  127. package/lib/module/ui/components/OxyLogo.js +1 -1
  128. package/lib/module/ui/components/OxyLogo.js.map +1 -1
  129. package/lib/module/ui/components/OxyProvider.js +23 -7
  130. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  131. package/lib/module/ui/components/SignInModal.js +20 -1
  132. package/lib/module/ui/components/SignInModal.js.map +1 -1
  133. package/lib/module/ui/components/fileManagement/FileViewer.js +19 -9
  134. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  135. package/lib/module/ui/components/fileManagement/UploadPreview.js +4 -2
  136. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  137. package/lib/module/ui/context/OxyContext.js +154 -20
  138. package/lib/module/ui/context/OxyContext.js.map +1 -1
  139. package/lib/module/ui/context/hooks/useAuthOperations.js +6 -17
  140. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  141. package/lib/module/ui/hooks/mutations/mutationFactory.js +5 -5
  142. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
  143. package/lib/module/ui/hooks/mutations/useAccountMutations.js +38 -38
  144. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  145. package/lib/module/ui/hooks/mutations/useServicesMutations.js +2 -2
  146. package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  147. package/lib/module/ui/hooks/queries/queryKeys.js +3 -3
  148. package/lib/module/ui/hooks/queries/queryKeys.js.map +1 -1
  149. package/lib/module/ui/hooks/queries/useAccountQueries.js +1 -1
  150. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  151. package/lib/module/ui/hooks/queries/usePaymentQueries.js +16 -12
  152. package/lib/module/ui/hooks/queries/usePaymentQueries.js.map +1 -1
  153. package/lib/module/ui/hooks/queries/useServicesQueries.js +9 -6
  154. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  155. package/lib/module/ui/hooks/queryClient.js +6 -5
  156. package/lib/module/ui/hooks/queryClient.js.map +1 -1
  157. package/lib/module/ui/hooks/useOxyAuthSession.js +40 -2
  158. package/lib/module/ui/hooks/useOxyAuthSession.js.map +1 -1
  159. package/lib/module/ui/hooks/useProfileEditing.js +21 -0
  160. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  161. package/lib/module/ui/hooks/useSessionManagement.js +4 -3
  162. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  163. package/lib/module/ui/screens/AccountVerificationScreen.js +101 -109
  164. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  165. package/lib/module/ui/screens/AppInfoScreen.js +228 -275
  166. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  167. package/lib/module/ui/screens/AvatarCropScreen.js +10 -4
  168. package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -1
  169. package/lib/module/ui/screens/ConnectedAppsScreen.js +19 -39
  170. package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
  171. package/lib/module/ui/screens/CreateManagedAccountScreen.js +90 -202
  172. package/lib/module/ui/screens/CreateManagedAccountScreen.js.map +1 -1
  173. package/lib/module/ui/screens/EditProfileFieldScreen.js +77 -205
  174. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  175. package/lib/module/ui/screens/FAQScreen.js +55 -207
  176. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  177. package/lib/module/ui/screens/FeedbackScreen.js +301 -350
  178. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  179. package/lib/module/ui/screens/FileManagementScreen.js +20 -20
  180. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  181. package/lib/module/ui/screens/HelpSupportScreen.js +78 -90
  182. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  183. package/lib/module/ui/screens/HistoryViewScreen.js +44 -59
  184. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  185. package/lib/module/ui/screens/LanguageSelectorScreen.js +68 -91
  186. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  187. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +75 -177
  188. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  189. package/lib/module/ui/screens/LegalDocumentsScreen.js +116 -108
  190. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  191. package/lib/module/ui/screens/ManageAccountScreen.js +52 -112
  192. package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
  193. package/lib/module/ui/screens/NotificationsScreen.js +68 -86
  194. package/lib/module/ui/screens/NotificationsScreen.js.map +1 -1
  195. package/lib/module/ui/screens/OxyAuthScreen.js +69 -134
  196. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  197. package/lib/module/ui/screens/PaymentGatewayScreen.js +16 -10
  198. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  199. package/lib/module/ui/screens/PreferencesScreen.js +66 -84
  200. package/lib/module/ui/screens/PreferencesScreen.js.map +1 -1
  201. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +366 -1012
  202. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  203. package/lib/module/ui/screens/PrivacySettingsScreen.js +295 -243
  204. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  205. package/lib/module/ui/screens/ProfileScreen.js +192 -331
  206. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  207. package/lib/module/ui/screens/SavesCollectionsScreen.js +58 -98
  208. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  209. package/lib/module/ui/screens/SearchSettingsScreen.js +42 -42
  210. package/lib/module/ui/screens/SearchSettingsScreen.js.map +1 -1
  211. package/lib/module/ui/screens/UserLinksScreen.js +18 -25
  212. package/lib/module/ui/screens/UserLinksScreen.js.map +1 -1
  213. package/lib/module/ui/screens/UserListScreen.js +81 -212
  214. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  215. package/lib/module/ui/screens/WelcomeNewUserScreen.js +114 -76
  216. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  217. package/lib/module/ui/screens/trust/TrustAboutScreen.js +69 -57
  218. package/lib/module/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  219. package/lib/module/ui/screens/trust/TrustCenterScreen.js +135 -332
  220. package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  221. package/lib/module/ui/screens/trust/TrustFAQScreen.js +48 -138
  222. package/lib/module/ui/screens/trust/TrustFAQScreen.js.map +1 -1
  223. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +184 -117
  224. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  225. package/lib/module/ui/screens/trust/TrustRewardsScreen.js +132 -208
  226. package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  227. package/lib/module/ui/screens/trust/TrustRulesScreen.js +58 -94
  228. package/lib/module/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  229. package/lib/module/ui/utils/activeAuthuser.js +15 -9
  230. package/lib/module/ui/utils/activeAuthuser.js.map +1 -1
  231. package/lib/module/ui/utils/avatarUtils.js +1 -1
  232. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  233. package/lib/typescript/commonjs/index.d.ts +2 -0
  234. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  235. package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts +2 -0
  236. package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/ui/components/AnotherDeviceQR.d.ts +12 -2
  238. package/lib/typescript/commonjs/ui/components/AnotherDeviceQR.d.ts.map +1 -1
  239. package/lib/typescript/commonjs/ui/components/BottomSheetRouter.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts.map +1 -1
  241. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts +3 -2
  242. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  243. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -1
  244. package/lib/typescript/commonjs/ui/components/TouchableRipple/TouchableRipple.native.d.ts +1 -1
  245. package/lib/typescript/commonjs/ui/components/TouchableRipple/TouchableRipple.native.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +34 -0
  247. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  248. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  249. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +6 -0
  250. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  251. package/lib/typescript/commonjs/ui/hooks/queries/queryKeys.d.ts +3 -3
  252. package/lib/typescript/commonjs/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  253. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  254. package/lib/typescript/commonjs/ui/hooks/queryClient.d.ts.map +1 -1
  255. package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts +22 -0
  256. package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
  257. package/lib/typescript/commonjs/ui/hooks/useProfileEditing.d.ts +3 -0
  258. package/lib/typescript/commonjs/ui/hooks/useProfileEditing.d.ts.map +1 -1
  259. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts +2 -1
  260. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  261. package/lib/typescript/commonjs/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  262. package/lib/typescript/commonjs/ui/screens/AppInfoScreen.d.ts.map +1 -1
  263. package/lib/typescript/commonjs/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  264. package/lib/typescript/commonjs/ui/screens/ConnectedAppsScreen.d.ts.map +1 -1
  265. package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -1
  266. package/lib/typescript/commonjs/ui/screens/EditProfileFieldScreen.d.ts.map +1 -1
  267. package/lib/typescript/commonjs/ui/screens/FAQScreen.d.ts.map +1 -1
  268. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  269. package/lib/typescript/commonjs/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  270. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  271. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  272. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  273. package/lib/typescript/commonjs/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  274. package/lib/typescript/commonjs/ui/screens/ManageAccountScreen.d.ts.map +1 -1
  275. package/lib/typescript/commonjs/ui/screens/NotificationsScreen.d.ts.map +1 -1
  276. package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  277. package/lib/typescript/commonjs/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  278. package/lib/typescript/commonjs/ui/screens/PreferencesScreen.d.ts.map +1 -1
  279. package/lib/typescript/commonjs/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  280. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  281. package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
  282. package/lib/typescript/commonjs/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  283. package/lib/typescript/commonjs/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  284. package/lib/typescript/commonjs/ui/screens/UserLinksScreen.d.ts.map +1 -1
  285. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
  286. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  287. package/lib/typescript/commonjs/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  288. package/lib/typescript/commonjs/ui/screens/trust/TrustCenterScreen.d.ts.map +1 -1
  289. package/lib/typescript/commonjs/ui/screens/trust/TrustFAQScreen.d.ts.map +1 -1
  290. package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  291. package/lib/typescript/commonjs/ui/screens/trust/TrustRewardsScreen.d.ts.map +1 -1
  292. package/lib/typescript/commonjs/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  293. package/lib/typescript/commonjs/ui/utils/activeAuthuser.d.ts.map +1 -1
  294. package/lib/typescript/module/index.d.ts +2 -0
  295. package/lib/typescript/module/index.d.ts.map +1 -1
  296. package/lib/typescript/module/ui/components/AccountMenu.d.ts +2 -0
  297. package/lib/typescript/module/ui/components/AccountMenu.d.ts.map +1 -1
  298. package/lib/typescript/module/ui/components/AnotherDeviceQR.d.ts +12 -2
  299. package/lib/typescript/module/ui/components/AnotherDeviceQR.d.ts.map +1 -1
  300. package/lib/typescript/module/ui/components/BottomSheetRouter.d.ts.map +1 -1
  301. package/lib/typescript/module/ui/components/FollowButton.d.ts.map +1 -1
  302. package/lib/typescript/module/ui/components/OxyProvider.d.ts +3 -2
  303. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  304. package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -1
  305. package/lib/typescript/module/ui/components/TouchableRipple/TouchableRipple.native.d.ts +1 -1
  306. package/lib/typescript/module/ui/components/TouchableRipple/TouchableRipple.native.d.ts.map +1 -1
  307. package/lib/typescript/module/ui/context/OxyContext.d.ts +34 -0
  308. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  309. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  310. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +6 -0
  311. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  312. package/lib/typescript/module/ui/hooks/queries/queryKeys.d.ts +3 -3
  313. package/lib/typescript/module/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  314. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  315. package/lib/typescript/module/ui/hooks/queryClient.d.ts.map +1 -1
  316. package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts +22 -0
  317. package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
  318. package/lib/typescript/module/ui/hooks/useProfileEditing.d.ts +3 -0
  319. package/lib/typescript/module/ui/hooks/useProfileEditing.d.ts.map +1 -1
  320. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts +2 -1
  321. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  322. package/lib/typescript/module/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  323. package/lib/typescript/module/ui/screens/AppInfoScreen.d.ts.map +1 -1
  324. package/lib/typescript/module/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  325. package/lib/typescript/module/ui/screens/ConnectedAppsScreen.d.ts.map +1 -1
  326. package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -1
  327. package/lib/typescript/module/ui/screens/EditProfileFieldScreen.d.ts.map +1 -1
  328. package/lib/typescript/module/ui/screens/FAQScreen.d.ts.map +1 -1
  329. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  330. package/lib/typescript/module/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  331. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  332. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  333. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  334. package/lib/typescript/module/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  335. package/lib/typescript/module/ui/screens/ManageAccountScreen.d.ts.map +1 -1
  336. package/lib/typescript/module/ui/screens/NotificationsScreen.d.ts.map +1 -1
  337. package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  338. package/lib/typescript/module/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  339. package/lib/typescript/module/ui/screens/PreferencesScreen.d.ts.map +1 -1
  340. package/lib/typescript/module/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  341. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  342. package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
  343. package/lib/typescript/module/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  344. package/lib/typescript/module/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  345. package/lib/typescript/module/ui/screens/UserLinksScreen.d.ts.map +1 -1
  346. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
  347. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  348. package/lib/typescript/module/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  349. package/lib/typescript/module/ui/screens/trust/TrustCenterScreen.d.ts.map +1 -1
  350. package/lib/typescript/module/ui/screens/trust/TrustFAQScreen.d.ts.map +1 -1
  351. package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  352. package/lib/typescript/module/ui/screens/trust/TrustRewardsScreen.d.ts.map +1 -1
  353. package/lib/typescript/module/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  354. package/lib/typescript/module/ui/utils/activeAuthuser.d.ts.map +1 -1
  355. package/lib/typescript/types/expo-haptics.d.ts +42 -0
  356. package/package.json +8 -3
  357. package/src/index.ts +2 -0
  358. package/src/types/expo-haptics.d.ts +42 -0
  359. package/src/ui/components/AccountMenu.tsx +11 -5
  360. package/src/ui/components/AnotherDeviceQR.tsx +53 -45
  361. package/src/ui/components/BottomSheetRouter.tsx +2 -1
  362. package/src/ui/components/FollowButton.tsx +24 -5
  363. package/src/ui/components/OxyLogo.tsx +1 -1
  364. package/src/ui/components/OxyProvider.tsx +22 -8
  365. package/src/ui/components/SignInModal.tsx +21 -2
  366. package/src/ui/components/TouchableRipple/TouchableRipple.native.tsx +1 -1
  367. package/src/ui/components/fileManagement/FileViewer.tsx +9 -9
  368. package/src/ui/components/fileManagement/UploadPreview.tsx +2 -2
  369. package/src/ui/context/OxyContext.tsx +178 -21
  370. package/src/ui/context/hooks/useAuthOperations.ts +6 -17
  371. package/src/ui/hooks/mutations/mutationFactory.ts +5 -5
  372. package/src/ui/hooks/mutations/useAccountMutations.ts +38 -38
  373. package/src/ui/hooks/mutations/useServicesMutations.ts +2 -2
  374. package/src/ui/hooks/queries/queryKeys.ts +6 -3
  375. package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
  376. package/src/ui/hooks/queries/usePaymentQueries.ts +12 -12
  377. package/src/ui/hooks/queries/useServicesQueries.ts +9 -6
  378. package/src/ui/hooks/queryClient.ts +5 -5
  379. package/src/ui/hooks/useOxyAuthSession.ts +76 -2
  380. package/src/ui/hooks/useProfileEditing.ts +24 -0
  381. package/src/ui/hooks/useSessionManagement.ts +9 -6
  382. package/src/ui/screens/AccountVerificationScreen.tsx +101 -113
  383. package/src/ui/screens/AppInfoScreen.tsx +200 -238
  384. package/src/ui/screens/AvatarCropScreen.tsx +17 -4
  385. package/src/ui/screens/ConnectedAppsScreen.tsx +16 -34
  386. package/src/ui/screens/CreateManagedAccountScreen.tsx +94 -170
  387. package/src/ui/screens/EditProfileFieldScreen.tsx +77 -190
  388. package/src/ui/screens/FAQScreen.tsx +77 -208
  389. package/src/ui/screens/FeedbackScreen.tsx +330 -239
  390. package/src/ui/screens/FileManagementScreen.tsx +20 -20
  391. package/src/ui/screens/HelpSupportScreen.tsx +67 -82
  392. package/src/ui/screens/HistoryViewScreen.tsx +32 -38
  393. package/src/ui/screens/LanguageSelectorScreen.tsx +79 -93
  394. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +81 -164
  395. package/src/ui/screens/LegalDocumentsScreen.tsx +184 -123
  396. package/src/ui/screens/ManageAccountScreen.tsx +48 -114
  397. package/src/ui/screens/NotificationsScreen.tsx +107 -106
  398. package/src/ui/screens/OxyAuthScreen.tsx +76 -109
  399. package/src/ui/screens/PaymentGatewayScreen.tsx +16 -7
  400. package/src/ui/screens/PreferencesScreen.tsx +96 -116
  401. package/src/ui/screens/PremiumSubscriptionScreen.tsx +419 -872
  402. package/src/ui/screens/PrivacySettingsScreen.tsx +203 -185
  403. package/src/ui/screens/ProfileScreen.tsx +162 -246
  404. package/src/ui/screens/SavesCollectionsScreen.tsx +78 -125
  405. package/src/ui/screens/SearchSettingsScreen.tsx +52 -41
  406. package/src/ui/screens/UserLinksScreen.tsx +18 -25
  407. package/src/ui/screens/UserListScreen.tsx +95 -188
  408. package/src/ui/screens/WelcomeNewUserScreen.tsx +109 -36
  409. package/src/ui/screens/trust/TrustAboutScreen.tsx +52 -41
  410. package/src/ui/screens/trust/TrustCenterScreen.tsx +184 -222
  411. package/src/ui/screens/trust/TrustFAQScreen.tsx +64 -124
  412. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +190 -67
  413. package/src/ui/screens/trust/TrustRewardsScreen.tsx +147 -182
  414. package/src/ui/screens/trust/TrustRulesScreen.tsx +77 -50
  415. package/src/ui/utils/activeAuthuser.ts +15 -9
  416. package/src/ui/utils/avatarUtils.ts +1 -1
  417. package/lib/commonjs/ui/components/feedback/FormInput.js +0 -72
  418. package/lib/commonjs/ui/components/feedback/FormInput.js.map +0 -1
  419. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +0 -261
  420. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +0 -1
  421. package/lib/module/ui/components/feedback/FormInput.js +0 -67
  422. package/lib/module/ui/components/feedback/FormInput.js.map +0 -1
  423. package/lib/module/ui/components/feedback/feedbackStyles.js +0 -256
  424. package/lib/module/ui/components/feedback/feedbackStyles.js.map +0 -1
  425. package/lib/typescript/commonjs/ui/components/feedback/FormInput.d.ts +0 -20
  426. package/lib/typescript/commonjs/ui/components/feedback/FormInput.d.ts.map +0 -1
  427. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts +0 -279
  428. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts.map +0 -1
  429. package/lib/typescript/module/ui/components/feedback/FormInput.d.ts +0 -20
  430. package/lib/typescript/module/ui/components/feedback/FormInput.d.ts.map +0 -1
  431. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts +0 -279
  432. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts.map +0 -1
  433. package/src/ui/components/feedback/FormInput.tsx +0 -84
  434. package/src/ui/components/feedback/feedbackStyles.ts +0 -246
@@ -1,16 +1,19 @@
1
1
  import type React from 'react';
2
2
  import { useEffect, useState } from 'react';
3
- import { View, Text, StyleSheet, ActivityIndicator, ScrollView, TouchableOpacity, Image } from 'react-native';
3
+ import { View, StyleSheet, ActivityIndicator, ScrollView } from 'react-native';
4
4
  import type { BaseScreenProps } from '../types/navigation';
5
5
  import { useTheme } from '@oxyhq/bloom/theme';
6
+ import { Button } from '@oxyhq/bloom/button';
7
+ import { H2, Text } from '@oxyhq/bloom/typography';
8
+ import { SettingsListGroup, SettingsListItem } from '@oxyhq/bloom/settings-list';
6
9
  import Avatar from '../components/Avatar';
7
10
  import FollowButton from '../components/FollowButton';
8
11
  import { useFollow } from '../hooks/useFollow';
9
12
  import { Ionicons } from '@expo/vector-icons';
10
13
  import { useI18n } from '../hooks/useI18n';
11
14
  import { useOxy } from '../context/OxyContext';
12
- import { getAccountDisplayName, logger } from '@oxyhq/core';
13
- import type { User } from '@oxyhq/core';
15
+ import { getAccountDisplayName, logger, normalizeProfileLinks } from '@oxyhq/core';
16
+ import type { User, ProfileLink } from '@oxyhq/core';
14
17
  import { extractErrorMessage } from '../utils/errorHandlers';
15
18
 
16
19
  interface ProfileScreenProps extends BaseScreenProps {
@@ -18,15 +21,10 @@ interface ProfileScreenProps extends BaseScreenProps {
18
21
  username?: string;
19
22
  }
20
23
 
21
- interface LinkMetadata {
22
- id?: string;
23
- url: string;
24
- title?: string;
25
- description?: string;
26
- image?: string;
27
- }
28
-
29
- type ProfileLink = string | { link: string } | LinkMetadata;
24
+ const AVATAR_SIZE = 96;
25
+ const BANNER_HEIGHT = 160;
26
+ const AVATAR_OVERLAP = -56;
27
+ const INFO_ICON_SIZE = 18;
30
28
 
31
29
  const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme, goBack, navigate }) => {
32
30
  // Use useOxy() hook for OxyContext values
@@ -37,13 +35,7 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
37
35
  const [commentsCount, setCommentsCount] = useState<number | null>(null);
38
36
  const [isLoading, setIsLoading] = useState(true);
39
37
  const [error, setError] = useState<string | null>(null);
40
- const [links, setLinks] = useState<Array<{
41
- url: string;
42
- title?: string;
43
- description?: string;
44
- image?: string;
45
- id: string;
46
- }>>([]);
38
+ const [links, setLinks] = useState<ProfileLink[]>([]);
47
39
 
48
40
  // Use the follow hook for real follower data
49
41
  const {
@@ -53,7 +45,6 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
53
45
  } = useFollow(userId);
54
46
 
55
47
  const bloomTheme = useTheme();
56
- const styles = createStyles();
57
48
  const { t, locale } = useI18n();
58
49
 
59
50
  // Check if current user is viewing their own profile
@@ -107,34 +98,8 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
107
98
  setProfile(profileRes);
108
99
  setReputationTotal(typeof reputationRes.total === 'number' ? reputationRes.total : null);
109
100
 
110
- // Extract links from profile data
111
- if (profileRes.linksMetadata && Array.isArray(profileRes.linksMetadata)) {
112
- const linksWithIds = profileRes.linksMetadata.map((link: LinkMetadata, index: number) => ({
113
- ...link,
114
- id: link.id || `existing-${index}`
115
- }));
116
- setLinks(linksWithIds);
117
- } else if (Array.isArray(profileRes.links)) {
118
- const simpleLinks = profileRes.links.map((l: ProfileLink) => typeof l === 'string' ? l : (typeof l === 'object' && 'link' in l ? l.link : '')).filter(Boolean);
119
- const linksWithMetadata = simpleLinks.map((url: string, index: number) => ({
120
- url,
121
- title: url.replace(/^https?:\/\//, '').replace(/\/$/, ''),
122
- description: `Link to ${url}`,
123
- image: undefined,
124
- id: `existing-${index}`
125
- }));
126
- setLinks(linksWithMetadata);
127
- } else if (profileRes.website) {
128
- setLinks([{
129
- url: profileRes.website,
130
- title: profileRes.website.replace(/^https?:\/\//, '').replace(/\/$/, ''),
131
- description: `Link to ${profileRes.website}`,
132
- image: undefined,
133
- id: 'existing-0'
134
- }]);
135
- } else {
136
- setLinks([]);
137
- }
101
+ // Normalize profile links via the shared @oxyhq/core helper.
102
+ setLinks(normalizeProfileLinks(profileRes.linksMetadata, profileRes.links));
138
103
 
139
104
  // Follower/following counts are managed by the `useFollow` hook.
140
105
 
@@ -174,7 +139,7 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
174
139
 
175
140
  if (isLoading) {
176
141
  return (
177
- <View style={[styles.container, { justifyContent: 'center', backgroundColor: bloomTheme.colors.background }]}>
142
+ <View style={styles.centerContainer} className="bg-bg">
178
143
  <ActivityIndicator size="large" color={bloomTheme.colors.primary} />
179
144
  </View>
180
145
  );
@@ -182,57 +147,63 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
182
147
 
183
148
  if (error) {
184
149
  return (
185
- <View style={[styles.container, { backgroundColor: bloomTheme.colors.background }]}>
186
- <View style={[styles.errorHeader, { borderBottomColor: bloomTheme.colors.border }]}>
150
+ <View style={styles.container} className="bg-bg">
151
+ <View style={styles.errorHeader} className="px-screen-margin py-space-12 border-b border-border">
187
152
  {goBack && (
188
- <TouchableOpacity onPress={goBack} style={styles.backButton}>
189
- <Ionicons name="arrow-back" size={24} color={bloomTheme.colors.text} />
190
- </TouchableOpacity>
153
+ <Button
154
+ variant="icon"
155
+ size="icon"
156
+ onPress={goBack}
157
+ accessibilityLabel={t('common.back') || 'Back'}
158
+ icon={<Ionicons name="arrow-back" size={22} color={bloomTheme.colors.text} />}
159
+ />
191
160
  )}
192
- <Text style={styles.errorTitle} className="text-foreground">Profile Error</Text>
161
+ <H2 style={styles.errorTitle} className="text-text">
162
+ {t('profile.errorTitle') || 'Profile Error'}
163
+ </H2>
193
164
  </View>
194
- <View style={styles.errorContent}>
195
- <Ionicons name="alert-circle" size={48} color={bloomTheme.colors.error} style={styles.errorIcon} />
196
- <Text style={styles.errorText} className="text-destructive">{error}</Text>
197
- <Text style={styles.errorSubtext} className="text-muted-foreground">
198
- This could happen if the user doesn't exist or the profile service is unavailable.
165
+ <View style={styles.errorContent} className="px-space-32 gap-space-12">
166
+ <Ionicons name="alert-circle" size={48} color={bloomTheme.colors.error} />
167
+ <Text style={styles.errorText} className="text-text">{error}</Text>
168
+ <Text style={styles.errorSubtext} className="text-text-secondary">
169
+ {t('profile.errorSubtext') || "This could happen if the user doesn't exist or the profile service is unavailable."}
199
170
  </Text>
200
171
  </View>
201
172
  </View>
202
173
  );
203
174
  }
204
175
 
176
+ const displayName = profile ? getAccountDisplayName(profile, locale) : username || '';
177
+
205
178
  return (
206
- <View style={[styles.container, { backgroundColor: bloomTheme.colors.background }]}>
207
- <ScrollView style={{ flex: 1 }} contentContainerStyle={styles.scrollContainer}>
179
+ <View style={styles.container} className="bg-bg">
180
+ <ScrollView style={styles.flex} contentContainerStyle={styles.scrollContainer}>
208
181
  {/* Banner Image */}
209
- <View style={styles.bannerContainer} className="bg-primary/20">
210
- <View style={styles.bannerImage} className="bg-primary" />
182
+ <View style={styles.bannerContainer} className="bg-fill-brand/20">
183
+ <View style={styles.flex} className="bg-fill-brand" />
211
184
  </View>
212
185
  {/* Avatar overlapping banner */}
213
- <View style={styles.avatarRow}>
214
- <View style={styles.avatarWrapper} className="border-background bg-background">
186
+ <View style={styles.avatarRow} className="px-screen-margin">
187
+ <View style={styles.avatarWrapper} className="border-bg bg-bg rounded-radius-max">
215
188
  <Avatar
216
189
  uri={profile?.avatar ? oxyServices.getFileDownloadUrl(profile.avatar, 'thumb') : undefined}
217
- name={profile ? getAccountDisplayName(profile, locale) : username}
218
- size={96}
219
-
190
+ name={displayName || username}
191
+ size={AVATAR_SIZE}
220
192
  />
221
193
  </View>
222
194
  {/* Conditional Action Button */}
223
195
  <View style={styles.actionButtonWrapper}>
224
196
  {isOwnProfile ? (
225
- <TouchableOpacity
226
- style={styles.actionButton}
227
- className="bg-background border-primary"
197
+ <Button
198
+ variant="secondary"
199
+ size="small"
228
200
  onPress={() => navigate?.('ManageAccount')}
229
201
  >
230
- <Text style={styles.actionButtonText} className="text-primary">{t('editProfile.title') || 'Edit Profile'}</Text>
231
- </TouchableOpacity>
202
+ {t('editProfile.title') || 'Edit Profile'}
203
+ </Button>
232
204
  ) : (
233
205
  <FollowButton
234
206
  userId={userId}
235
-
236
207
  onFollowChange={(isFollowing) => {
237
208
  // The follow button will automatically update counts via Zustand
238
209
  if (__DEV__) {
@@ -244,105 +215,99 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
244
215
  </View>
245
216
  </View>
246
217
  {/* Profile Info */}
247
- <View style={styles.header}>
248
- <Text style={styles.displayName} className="text-foreground">
249
- {profile ? getAccountDisplayName(profile, locale) : username || ''}
250
- </Text>
218
+ <View style={styles.header} className="px-screen-margin">
219
+ <H2 style={styles.displayName} className="text-text">
220
+ {displayName}
221
+ </H2>
251
222
  {profile?.username && (
252
- <Text style={styles.subText} className="text-muted-foreground">@{profile.username}</Text>
223
+ <Text style={styles.subText} className="text-text-secondary">@{profile.username}</Text>
253
224
  )}
254
- {/* Bio placeholder */}
255
- <Text style={styles.bio} className="text-foreground">{profile?.bio || (t('profile.noBio') || 'This user has no bio yet.')}</Text>
225
+ {/* Bio */}
226
+ <Text style={styles.bio} className="text-text">{profile?.bio || (t('profile.noBio') || 'This user has no bio yet.')}</Text>
227
+ </View>
256
228
 
257
- {/* Info Grid Row */}
258
- <View style={styles.infoGrid}>
259
- {profile?.createdAt && (
260
- <View style={styles.infoGridItem}>
261
- <Ionicons name="calendar-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
262
- <Text style={styles.infoGridText} className="text-muted-foreground">
263
- {t('profile.joinedOn', { date: new Date(profile.createdAt).toLocaleDateString() }) || `Joined ${new Date(profile.createdAt).toLocaleDateString()}`}
264
- </Text>
265
- </View>
266
- )}
267
- {profile?.location && (
268
- <View style={styles.infoGridItem}>
269
- <Ionicons name="location-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
270
- <Text style={styles.infoGridText} className="text-muted-foreground" numberOfLines={1}>{profile.location}</Text>
271
- </View>
272
- )}
273
- {profile?.website && (
274
- <View style={styles.infoGridItem}>
275
- <Ionicons name="globe-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
276
- <Text style={styles.infoGridText} className="text-muted-foreground" numberOfLines={1}>{profile.website}</Text>
277
- </View>
278
- )}
279
- {profile && 'company' in profile && typeof profile.company === 'string' && profile.company && (
280
- <View style={styles.infoGridItem}>
281
- <Ionicons name="business-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
282
- <Text style={styles.infoGridText} className="text-muted-foreground" numberOfLines={1}>{profile.company}</Text>
283
- </View>
284
- )}
285
- {profile && 'jobTitle' in profile && typeof profile.jobTitle === 'string' && profile.jobTitle && (
286
- <View style={styles.infoGridItem}>
287
- <Ionicons name="briefcase-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
288
- <Text style={styles.infoGridText} className="text-muted-foreground" numberOfLines={1}>{profile.jobTitle}</Text>
289
- </View>
290
- )}
291
- {profile && 'education' in profile && typeof profile.education === 'string' && profile.education && (
292
- <View style={styles.infoGridItem}>
293
- <Ionicons name="school-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
294
- <Text style={styles.infoGridText} className="text-muted-foreground" numberOfLines={1}>{profile.education}</Text>
295
- </View>
296
- )}
297
- {profile && 'birthday' in profile && typeof profile.birthday === 'string' && profile.birthday && (
298
- <View style={styles.infoGridItem}>
299
- <Ionicons name="gift-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
300
- <Text style={styles.infoGridText} className="text-muted-foreground">
301
- {t('profile.bornOn', { date: new Date(profile.birthday).toLocaleDateString() }) || `Born ${new Date(profile.birthday).toLocaleDateString()}`}
302
- </Text>
303
- </View>
304
- )}
305
- {links.length > 0 && (
306
- <TouchableOpacity
307
- style={styles.infoGridItem}
308
- onPress={() => navigate?.('UserLinks', { userId, links })}
309
- >
310
- <Ionicons name="link-outline" size={16} color={bloomTheme.colors.textSecondary} style={{ marginRight: 6 }} />
311
- <Text style={styles.infoGridText} className="text-muted-foreground" numberOfLines={1}>
312
- {links[0].url}
313
- </Text>
314
- {links.length > 1 && (
315
- <Text style={styles.linksMore} className="text-muted-foreground">
316
- {t('profile.more', { count: links.length - 1 }) || `+ ${links.length - 1} more`}
317
- </Text>
318
- )}
319
- </TouchableOpacity>
229
+ {/* Info Grid as a settings list group */}
230
+ <SettingsListGroup>
231
+ {profile?.createdAt && (
232
+ <SettingsListItem
233
+ icon={<Ionicons name="calendar-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
234
+ title={t('profile.joinedOn', { date: new Date(profile.createdAt).toLocaleDateString() }) || `Joined ${new Date(profile.createdAt).toLocaleDateString()}`}
235
+ showChevron={false}
236
+ />
237
+ )}
238
+ {profile?.location && (
239
+ <SettingsListItem
240
+ icon={<Ionicons name="location-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
241
+ title={profile.location}
242
+ showChevron={false}
243
+ />
244
+ )}
245
+ {profile?.website && (
246
+ <SettingsListItem
247
+ icon={<Ionicons name="globe-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
248
+ title={profile.website}
249
+ showChevron={false}
250
+ />
251
+ )}
252
+ {profile && 'company' in profile && typeof profile.company === 'string' && profile.company && (
253
+ <SettingsListItem
254
+ icon={<Ionicons name="business-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
255
+ title={profile.company}
256
+ showChevron={false}
257
+ />
258
+ )}
259
+ {profile && 'jobTitle' in profile && typeof profile.jobTitle === 'string' && profile.jobTitle && (
260
+ <SettingsListItem
261
+ icon={<Ionicons name="briefcase-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
262
+ title={profile.jobTitle}
263
+ showChevron={false}
264
+ />
265
+ )}
266
+ {profile && 'education' in profile && typeof profile.education === 'string' && profile.education && (
267
+ <SettingsListItem
268
+ icon={<Ionicons name="school-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
269
+ title={profile.education}
270
+ showChevron={false}
271
+ />
272
+ )}
273
+ {profile && 'birthday' in profile && typeof profile.birthday === 'string' && profile.birthday && (
274
+ <SettingsListItem
275
+ icon={<Ionicons name="gift-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
276
+ title={t('profile.bornOn', { date: new Date(profile.birthday).toLocaleDateString() }) || `Born ${new Date(profile.birthday).toLocaleDateString()}`}
277
+ showChevron={false}
278
+ />
279
+ )}
280
+ {links.length > 0 && (
281
+ <SettingsListItem
282
+ icon={<Ionicons name="link-outline" size={INFO_ICON_SIZE} color={bloomTheme.colors.textSecondary} />}
283
+ title={links[0].url}
284
+ value={links.length > 1 ? (t('profile.more', { count: links.length - 1 }) || `+ ${links.length - 1} more`) : undefined}
285
+ onPress={() => navigate?.('UserLinks', { userId, links })}
286
+ />
287
+ )}
288
+ </SettingsListGroup>
289
+
290
+ {/* All Stats in one row */}
291
+ <View style={styles.statsRow} className="px-screen-margin">
292
+ <View style={styles.statItem}>
293
+ <Text style={styles.statAmount} className="text-text-inverse">{reputationTotal !== null && reputationTotal !== undefined ? reputationTotal : '--'}</Text>
294
+ <Text style={styles.statLabel} className="text-text-secondary">{t('profile.reputation') || 'Reputation'}</Text>
295
+ </View>
296
+ <View style={styles.statItem}>
297
+ {isLoadingCounts ? (
298
+ <ActivityIndicator size="small" color={bloomTheme.colors.text} />
299
+ ) : (
300
+ <Text style={styles.statAmount} className="text-text">{followerCount !== null ? followerCount : '--'}</Text>
320
301
  )}
302
+ <Text style={styles.statLabel} className="text-text-secondary">{t('profile.followers') || 'Followers'}</Text>
321
303
  </View>
322
- {/* Divider */}
323
- <View style={styles.divider} className="bg-border" />
324
- {/* All Stats in one row */}
325
- <View style={styles.statsRow}>
326
- <View style={styles.statItem}>
327
- <Text style={styles.statAmount} className="text-primary">{reputationTotal !== null && reputationTotal !== undefined ? reputationTotal : '--'}</Text>
328
- <Text style={styles.statLabel} className="text-muted-foreground">{t('profile.reputation') || 'Reputation'}</Text>
329
- </View>
330
- <View style={styles.statItem}>
331
- {isLoadingCounts ? (
332
- <ActivityIndicator size="small" color={bloomTheme.colors.text} />
333
- ) : (
334
- <Text style={styles.statAmount} className="text-foreground">{followerCount !== null ? followerCount : '--'}</Text>
335
- )}
336
- <Text style={styles.statLabel} className="text-muted-foreground">{t('profile.followers') || 'Followers'}</Text>
337
- </View>
338
- <View style={styles.statItem}>
339
- {isLoadingCounts ? (
340
- <ActivityIndicator size="small" color={bloomTheme.colors.text} />
341
- ) : (
342
- <Text style={styles.statAmount} className="text-foreground">{followingCount !== null ? followingCount : '--'}</Text>
343
- )}
344
- <Text style={styles.statLabel} className="text-muted-foreground">{t('profile.following') || 'Following'}</Text>
345
- </View>
304
+ <View style={styles.statItem}>
305
+ {isLoadingCounts ? (
306
+ <ActivityIndicator size="small" color={bloomTheme.colors.text} />
307
+ ) : (
308
+ <Text style={styles.statAmount} className="text-text">{followingCount !== null ? followingCount : '--'}</Text>
309
+ )}
310
+ <Text style={styles.statLabel} className="text-text-secondary">{t('profile.following') || 'Following'}</Text>
346
311
  </View>
347
312
  </View>
348
313
  </ScrollView>
@@ -350,93 +315,44 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
350
315
  );
351
316
  };
352
317
 
353
- const createStyles = () => StyleSheet.create({
318
+ // Layout-only styles: flex, dimensions, and the measured banner/avatar overlap
319
+ // that no token class can express. Colors, spacing, radius, and typography roles
320
+ // live on Bloom components + NativeWind token classes.
321
+ const styles = StyleSheet.create({
354
322
  container: { flex: 1 },
323
+ flex: { flex: 1 },
324
+ centerContainer: { flex: 1, justifyContent: 'center', alignItems: 'center' },
355
325
  scrollContainer: { alignItems: 'stretch', paddingBottom: 40 },
356
- bannerContainer: { height: 160, position: 'relative', overflow: 'hidden' },
357
- bannerImage: { flex: 1 },
358
- avatarRow: { flexDirection: 'row', alignItems: 'flex-end', marginTop: -56, paddingHorizontal: 20, justifyContent: 'space-between', zIndex: 2 },
359
- avatarWrapper: { borderWidth: 5, borderRadius: 64, overflow: 'hidden' },
360
- actionButtonWrapper: { flex: 1, alignItems: 'flex-end', justifyContent: 'flex-end' },
361
- actionButton: {
362
- borderWidth: 1,
363
- borderRadius: 24,
364
- paddingVertical: 7,
365
- paddingHorizontal: 22,
366
- marginBottom: 8,
367
- elevation: 2,
368
- shadowOffset: { width: 0, height: 1 },
369
- shadowOpacity: 0.08,
370
- shadowRadius: 2
371
- },
372
- actionButtonText: {
373
- fontWeight: 'bold',
374
- fontSize: 16
375
- },
376
- header: { alignItems: 'flex-start', width: '100%', paddingHorizontal: 20 },
377
- displayName: { fontSize: 24, fontWeight: 'bold', marginTop: 10, marginBottom: 2, letterSpacing: 0.1 },
378
- subText: { fontSize: 16, marginBottom: 2 },
379
- bio: { fontSize: 16, marginTop: 10, marginBottom: 10, lineHeight: 22 },
380
- infoGrid: {
326
+ bannerContainer: { height: BANNER_HEIGHT, position: 'relative', overflow: 'hidden' },
327
+ avatarRow: {
381
328
  flexDirection: 'row',
382
- alignItems: 'center',
383
- marginBottom: 10,
384
- flexWrap: 'wrap'
329
+ alignItems: 'flex-end',
330
+ marginTop: AVATAR_OVERLAP,
331
+ justifyContent: 'space-between',
332
+ zIndex: 2,
385
333
  },
386
- infoGridItem: {
334
+ avatarWrapper: { borderWidth: 5, overflow: 'hidden' },
335
+ actionButtonWrapper: { flex: 1, alignItems: 'flex-end', justifyContent: 'flex-end', paddingBottom: 8 },
336
+ header: { alignItems: 'flex-start', width: '100%', marginTop: 10 },
337
+ displayName: { fontSize: 24, marginBottom: 2, letterSpacing: 0.1 },
338
+ subText: { fontSize: 16, marginBottom: 2 },
339
+ bio: { fontSize: 16, marginTop: 10, lineHeight: 22 },
340
+ statsRow: {
341
+ width: '100%',
387
342
  flexDirection: 'row',
388
343
  alignItems: 'center',
389
- marginRight: 24,
390
- marginBottom: 4
391
- },
392
- infoGridText: {
393
- fontSize: 15,
344
+ marginTop: 14,
345
+ justifyContent: 'space-between',
394
346
  },
395
- divider: { height: 1, width: '100%', marginVertical: 14 },
396
- linksMore: {
397
- fontSize: 15,
398
- marginLeft: 4
399
- },
400
- statsRow: { width: '100%', flex: 1, flexDirection: 'row', alignItems: 'center', marginTop: 6, marginBottom: 2, justifyContent: 'space-between' },
401
347
  statItem: { flex: 1, alignItems: 'center', minWidth: 50, marginBottom: 12 },
402
348
  statLabel: { fontSize: 14, marginBottom: 2, textAlign: 'center' },
403
349
  statAmount: { fontSize: 24, fontWeight: 'bold', textAlign: 'center', letterSpacing: 0.2 },
404
- // Error handling styles
405
- errorHeader: {
406
- flexDirection: 'row',
407
- alignItems: 'center',
408
- paddingHorizontal: 16,
409
- paddingVertical: 12,
410
- borderBottomWidth: 1,
411
- },
412
- backButton: {
413
- padding: 8,
414
- marginRight: 16,
415
- },
416
- errorTitle: {
417
- fontSize: 20,
418
- fontWeight: 'bold',
419
- },
420
- errorContent: {
421
- flex: 1,
422
- justifyContent: 'center',
423
- alignItems: 'center',
424
- paddingHorizontal: 32,
425
- },
426
- errorIcon: {
427
- marginBottom: 16,
428
- },
429
- errorText: {
430
- fontSize: 18,
431
- fontWeight: '600',
432
- textAlign: 'center',
433
- marginBottom: 8,
434
- },
435
- errorSubtext: {
436
- fontSize: 14,
437
- textAlign: 'center',
438
- opacity: 0.7,
439
- },
350
+ // Error state layout
351
+ errorHeader: { flexDirection: 'row', alignItems: 'center', gap: 16 },
352
+ errorTitle: { fontSize: 20 },
353
+ errorContent: { flex: 1, justifyContent: 'center', alignItems: 'center' },
354
+ errorText: { fontSize: 18, fontWeight: '600', textAlign: 'center' },
355
+ errorSubtext: { fontSize: 14, textAlign: 'center' },
440
356
  });
441
357
 
442
358
  export default ProfileScreen;