@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
@@ -0,0 +1,42 @@
1
+ declare module 'expo-haptics' {
2
+ export enum ImpactFeedbackStyle {
3
+ Light = 'light',
4
+ Medium = 'medium',
5
+ Heavy = 'heavy',
6
+ Rigid = 'rigid',
7
+ Soft = 'soft',
8
+ }
9
+
10
+ export enum NotificationFeedbackType {
11
+ Success = 'success',
12
+ Warning = 'warning',
13
+ Error = 'error',
14
+ }
15
+
16
+ export enum AndroidHaptics {
17
+ Confirm = 'confirm',
18
+ Reject = 'reject',
19
+ Toggle_On = 'toggle_on',
20
+ Toggle_Off = 'toggle_off',
21
+ Selection = 'selection',
22
+ Context_Click = 'context_click',
23
+ Keyboard_Tap = 'keyboard_tap',
24
+ Keyboard_Press = 'keyboard_press',
25
+ Keyboard_Release = 'keyboard_release',
26
+ Virtual_Key = 'virtual_key',
27
+ Virtual_Key_Release = 'virtual_key_release',
28
+ Long_Press = 'long_press',
29
+ Gesture_Start = 'gesture_start',
30
+ Gesture_End = 'gesture_end',
31
+ Clock_Tick = 'clock_tick',
32
+ Segment_Tick = 'segment_tick',
33
+ Segment_Frequent_Tick = 'segment_frequent_tick',
34
+ Text_Handle_Move = 'text_handle_move',
35
+ Drag_Start = 'drag_start',
36
+ }
37
+
38
+ export function impactAsync(style?: ImpactFeedbackStyle): Promise<void>;
39
+ export function notificationAsync(type?: NotificationFeedbackType): Promise<void>;
40
+ export function selectionAsync(): Promise<void>;
41
+ export function performAndroidHapticsAsync(type: AndroidHaptics): Promise<void>;
42
+ }
@@ -19,7 +19,7 @@ import { useTheme } from '@oxyhq/bloom/theme';
19
19
  import Avatar from './Avatar';
20
20
  import { useOxy } from '../context/OxyContext';
21
21
  import { useI18n } from '../hooks/useI18n';
22
- import { logger as loggerUtil } from '@oxyhq/core';
22
+ import { isDev, logger as loggerUtil } from '@oxyhq/core';
23
23
  import { buildAccountRows, type AccountRow } from './accountMenuRows';
24
24
  import { useDeviceAccounts } from '../hooks/useDeviceAccounts';
25
25
 
@@ -53,6 +53,8 @@ export interface AccountMenuProps {
53
53
  onAddAccount: () => void;
54
54
  /** Optional anchor (web only). Native ignores this and uses bottom-sheet style. */
55
55
  anchor?: AccountMenuAnchor | null;
56
+ /** Called before the active identity changes so apps can clear tenant-scoped state. */
57
+ onBeforeSessionChange?: () => void | Promise<void>;
56
58
  }
57
59
 
58
60
  const isWeb = Platform.OS === 'web';
@@ -76,6 +78,7 @@ const AccountMenu: React.FC<AccountMenuProps> = ({
76
78
  onNavigateManage,
77
79
  onAddAccount,
78
80
  anchor,
81
+ onBeforeSessionChange,
79
82
  }) => {
80
83
  const {
81
84
  activeSessionId,
@@ -131,18 +134,19 @@ const AccountMenu: React.FC<AccountMenuProps> = ({
131
134
  }
132
135
  setBusySessionId(sessionId);
133
136
  try {
137
+ await onBeforeSessionChange?.();
134
138
  await switchSession(sessionId);
135
139
  toast.success(t('accountSwitcher.toasts.switchSuccess') || 'Switched account');
136
140
  onClose();
137
141
  } catch (error) {
138
- if (!__DEV__) {
142
+ if (!isDev()) {
139
143
  loggerUtil.warn('Switch account failed', { component: 'AccountMenu' }, error as unknown);
140
144
  }
141
145
  toast.error(t('accountSwitcher.toasts.switchFailed') || 'Failed to switch account');
142
146
  } finally {
143
147
  setBusySessionId(null);
144
148
  }
145
- }, [activeSessionId, busySessionId, switchSession, t, onClose]);
149
+ }, [activeSessionId, busySessionId, switchSession, t, onClose, onBeforeSessionChange]);
146
150
 
147
151
  // Sign out a SPECIFIC inactive account from its per-row icon. `removeSession`
148
152
  // is the SDK's canonical per-session sign-out: it targets the given session
@@ -171,6 +175,7 @@ const AccountMenu: React.FC<AccountMenuProps> = ({
171
175
  }
172
176
  setSigningOut(true);
173
177
  try {
178
+ await onBeforeSessionChange?.();
174
179
  await logout();
175
180
  toast.success(t('common.actions.signedOut') || 'Signed out');
176
181
  onClose();
@@ -180,7 +185,7 @@ const AccountMenu: React.FC<AccountMenuProps> = ({
180
185
  } finally {
181
186
  setSigningOut(false);
182
187
  }
183
- }, [signingOut, logout, t, onClose]);
188
+ }, [signingOut, logout, t, onClose, onBeforeSessionChange]);
184
189
 
185
190
  const performSignOutAll = useCallback(async () => {
186
191
  if (signingOutAll) {
@@ -188,6 +193,7 @@ const AccountMenu: React.FC<AccountMenuProps> = ({
188
193
  }
189
194
  setSigningOutAll(true);
190
195
  try {
196
+ await onBeforeSessionChange?.();
191
197
  await logoutAll();
192
198
  toast.success(t('accountSwitcher.toasts.signOutAllSuccess') || 'Signed out of all accounts');
193
199
  onClose();
@@ -197,7 +203,7 @@ const AccountMenu: React.FC<AccountMenuProps> = ({
197
203
  } finally {
198
204
  setSigningOutAll(false);
199
205
  }
200
- }, [signingOutAll, logoutAll, t, onClose]);
206
+ }, [signingOutAll, logoutAll, t, onClose, onBeforeSessionChange]);
201
207
 
202
208
  // Escape-to-close + focus management (web only).
203
209
  useEffect(() => {
@@ -8,64 +8,96 @@
8
8
  * inside a tap-to-expand disclosure so it never competes with the primary CTA.
9
9
  *
10
10
  * The QR plate stays white intentionally — high contrast is required for
11
- * reliable scanning regardless of the app theme.
11
+ * reliable scanning regardless of the app theme. That single plate (and its
12
+ * fixed dimensions) is the only StyleSheet/hardcoded-color in this component;
13
+ * everything else is composed from Bloom typography + centralized token classes.
12
14
  */
13
15
 
14
16
  import type React from 'react';
15
17
  import { useState, useCallback } from 'react';
16
- import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
18
+ import { View, TouchableOpacity, StyleSheet } from 'react-native';
17
19
  import QRCode from 'react-native-qrcode-svg';
18
20
  import { useTheme } from '@oxyhq/bloom/theme';
21
+ import { Text } from '@oxyhq/bloom/typography';
22
+ import * as Icons from '@oxyhq/bloom/icons';
19
23
 
20
24
  export interface AnotherDeviceQRProps {
21
- /** The QR payload (`oxyauth://<token>`). Empty string renders nothing. */
25
+ /** The legacy QR payload (`oxyauth://<token>`). Empty string renders nothing. */
22
26
  qrData: string;
27
+ /**
28
+ * The secure "Sign in with Oxy" handoff payload (`oxycommons://approve?...`).
29
+ * Preferred over `qrData` when present — it carries the PUBLIC authorize code
30
+ * (never the secret session token), so the Oxy identity app on another device
31
+ * can scan it to approve. Falls back to `qrData` when the handoff backend has
32
+ * not returned a payload.
33
+ */
34
+ qrPayload?: string | null;
23
35
  }
24
36
 
25
37
  /** Size, in px, of the rendered QR symbol. */
26
38
  const QR_SIZE = 200;
27
39
 
40
+ /** High-contrast QR colors — intentionally fixed (NOT themed) for scan reliability. */
41
+ const QR_PLATE_BG = '#FFFFFF';
42
+ const QR_FOREGROUND = '#000000';
43
+
28
44
  /**
29
45
  * Collapsed disclosure that reveals a high-contrast QR for signing in on a
30
46
  * second device with the Oxy Accounts app.
31
47
  */
32
- const AnotherDeviceQR: React.FC<AnotherDeviceQRProps> = ({ qrData }) => {
33
- const { colors } = useTheme();
48
+ const AnotherDeviceQR: React.FC<AnotherDeviceQRProps> = ({ qrData, qrPayload }) => {
49
+ const bloomTheme = useTheme();
34
50
  const [expanded, setExpanded] = useState(false);
35
51
 
36
52
  const toggle = useCallback(() => {
37
53
  setExpanded((prev) => !prev);
38
54
  }, []);
39
55
 
40
- if (!qrData) {
56
+ // Prefer the secure handoff payload (public authorize code) over the legacy
57
+ // token QR; fall back to `qrData` until the handoff backend is available.
58
+ const value = qrPayload || qrData;
59
+
60
+ if (!value) {
41
61
  return null;
42
62
  }
43
63
 
44
64
  return (
45
- <View style={styles.container}>
65
+ <View className="w-full items-center">
46
66
  <TouchableOpacity
47
- style={styles.toggle}
67
+ className="flex-row items-center justify-center gap-space-8 py-space-12 px-space-8"
48
68
  onPress={toggle}
49
69
  accessibilityRole="button"
50
70
  accessibilityState={{ expanded }}
51
71
  accessibilityHint="Reveals a QR code to sign in using the Oxy Accounts app on another device"
52
72
  >
53
- <Text style={styles.toggleText} className="text-muted-foreground">
73
+ <Icons.QrCode_Stroke2_Corner0_Rounded
74
+ size="sm"
75
+ style={{ color: bloomTheme.colors.textSecondary }}
76
+ />
77
+ <Text className="font-sansSemibold text-body text-text-secondary">
54
78
  Sign in on another device
55
79
  </Text>
56
- <Text style={styles.chevron} className="text-muted-foreground">
57
- {expanded ? '✕' : '›'}
58
- </Text>
80
+ {expanded ? (
81
+ <Icons.ChevronTop_Stroke2_Corner0_Rounded
82
+ size="sm"
83
+ style={{ color: bloomTheme.colors.textSecondary }}
84
+ />
85
+ ) : (
86
+ <Icons.ChevronRight_Stroke2_Corner0_Rounded
87
+ size="sm"
88
+ style={{ color: bloomTheme.colors.textSecondary }}
89
+ />
90
+ )}
59
91
  </TouchableOpacity>
60
92
 
61
93
  {expanded && (
62
- <View style={styles.body}>
94
+ <View className="items-center mt-space-8 gap-space-12">
63
95
  {/* The QR plate is intentionally white for scan reliability. */}
64
- <View style={[styles.qrPlate, { backgroundColor: '#FFFFFF' }]}>
65
- <QRCode value={qrData} size={QR_SIZE} backgroundColor="#FFFFFF" color="#000000" />
96
+ <View style={styles.qrPlate}>
97
+ <QRCode value={value} size={QR_SIZE} backgroundColor={QR_PLATE_BG} color={QR_FOREGROUND} />
66
98
  </View>
67
- <Text style={[styles.hint, { color: colors.textSecondary }]}>
68
- Scan with the Oxy Accounts app
99
+ <Text className="font-sans text-caption text-text-tertiary text-center">
100
+ Scan with the Oxy app
69
101
  </Text>
70
102
  </View>
71
103
  )}
@@ -73,38 +105,14 @@ const AnotherDeviceQR: React.FC<AnotherDeviceQRProps> = ({ qrData }) => {
73
105
  );
74
106
  };
75
107
 
108
+ // Measured/positioned layout only (no theming): the high-contrast QR plate keeps
109
+ // a fixed white background + padding so the symbol scans reliably regardless of
110
+ // the app theme. This is the single intentional non-token surface in the file.
76
111
  const styles = StyleSheet.create({
77
- container: {
78
- width: '100%',
79
- alignItems: 'center',
80
- },
81
- toggle: {
82
- flexDirection: 'row',
83
- alignItems: 'center',
84
- justifyContent: 'center',
85
- paddingVertical: 12,
86
- paddingHorizontal: 8,
87
- },
88
- toggleText: {
89
- fontSize: 14,
90
- fontWeight: '600',
91
- },
92
- chevron: {
93
- fontSize: 16,
94
- marginLeft: 8,
95
- },
96
- body: {
97
- alignItems: 'center',
98
- marginTop: 8,
99
- },
100
112
  qrPlate: {
101
113
  padding: 16,
102
114
  borderRadius: 16,
103
- },
104
- hint: {
105
- marginTop: 12,
106
- fontSize: 12,
107
- textAlign: 'center',
115
+ backgroundColor: QR_PLATE_BG,
108
116
  },
109
117
  });
110
118
 
@@ -1,5 +1,5 @@
1
1
  import React, { useRef, useEffect, useCallback, useMemo, type ErrorInfo } from 'react';
2
- import { BackHandler, View, StyleSheet, Text, type StyleProp, type ViewStyle } from 'react-native';
2
+ import { BackHandler, Platform, View, StyleSheet, Text, type StyleProp, type ViewStyle } from 'react-native';
3
3
  import { useStore } from 'zustand';
4
4
  import type { RouteName } from '../navigation/routes';
5
5
  import { getScreenComponent, getSheetConfig, isValidRoute } from '../navigation/routes';
@@ -115,6 +115,7 @@ const BottomSheetRouter: React.FC<BottomSheetRouterProps> = ({ onScreenChange, o
115
115
  // Android back button
116
116
  useEffect(() => {
117
117
  if (!isOpen) return;
118
+ if (Platform.OS !== 'android') return;
118
119
  const handler = BackHandler.addEventListener('hardwareBackPress', () => {
119
120
  handleGoBack();
120
121
  return true;
@@ -11,8 +11,10 @@ import {
11
11
  import { useOxy } from '../context/OxyContext';
12
12
  import { toast } from '@oxyhq/bloom';
13
13
  import { useFollow, useFollowForButton } from '../hooks/useFollow';
14
+ import { useFollowStore } from '../stores/followStore';
14
15
  import { useTheme } from '@oxyhq/bloom/theme';
15
16
  import type { OxyServices, BulkFollowResult, BulkUnfollowResult } from '@oxyhq/core';
17
+ import { useShallow } from 'zustand/react/shallow';
16
18
 
17
19
  const DEFAULT_FOLLOW_ALL_LABEL = 'Follow all';
18
20
  const DEFAULT_FOLLOWED_ALL_LABEL = 'Following';
@@ -122,7 +124,7 @@ const FollowButtonInner = memo(function FollowButtonInner({
122
124
  {showLoadingState && isLoading ? (
123
125
  <ActivityIndicator
124
126
  size="small"
125
- color={isFollowing ? colors.text : colors.negativeForeground}
127
+ color={isFollowing ? colors.text : colors.primaryForeground}
126
128
  />
127
129
  ) : (
128
130
  <Text
@@ -138,6 +140,7 @@ const FollowButtonInner = memo(function FollowButtonInner({
138
140
 
139
141
  const FollowButtonMultiInner = memo(function FollowButtonMultiInner({
140
142
  userIds,
143
+ initiallyAllFollowing = false,
141
144
  size = 'medium',
142
145
  followAllLabel = DEFAULT_FOLLOW_ALL_LABEL,
143
146
  followedAllLabel = DEFAULT_FOLLOWED_ALL_LABEL,
@@ -156,11 +159,27 @@ const FollowButtonMultiInner = memo(function FollowButtonMultiInner({
156
159
  const unfollowAllUsers = 'unfollowAllUsers' in follow ? follow.unfollowAllUsers : undefined;
157
160
  const isAnyLoading = 'isAnyLoading' in follow ? follow.isAnyLoading : false;
158
161
 
162
+ const initialFollowStatuses = useFollowStore(
163
+ useShallow((state) => {
164
+ const statuses: Record<string, boolean | null> = {};
165
+ for (const uid of userIds) {
166
+ statuses[uid] = Object.prototype.hasOwnProperty.call(state.followingUsers, uid)
167
+ ? state.followingUsers[uid]
168
+ : null;
169
+ }
170
+ return statuses;
171
+ })
172
+ );
173
+
174
+ const hasKnownNotFollowing = userIds.some((uid) => initialFollowStatuses[uid] === false);
175
+
159
176
  // `allFollowing` is store-derived (LIVE aggregate of each target's follow
160
177
  // status) — it reacts in real time as individual members are followed or
161
- // unfollowed elsewhere. Only `isSubmitting` is transient local state for the
162
- // in-flight bulk call.
163
- const allFollowing = 'allFollowing' in follow ? follow.allFollowing : false;
178
+ // unfollowed elsewhere. `initiallyAllFollowing` preserves the public initial
179
+ // state contract until the store learns that any member is not followed. Only
180
+ // `isSubmitting` is transient local state for the in-flight bulk call.
181
+ const storeAllFollowing = 'allFollowing' in follow ? follow.allFollowing : false;
182
+ const allFollowing = storeAllFollowing || (initiallyAllFollowing && !hasKnownNotFollowing);
164
183
  const fetchAllStatuses = 'fetchAllStatuses' in follow ? follow.fetchAllStatuses : undefined;
165
184
  const [isSubmitting, setIsSubmitting] = useState(false);
166
185
 
@@ -244,7 +263,7 @@ const FollowButtonMultiInner = memo(function FollowButtonMultiInner({
244
263
  {showLoadingState && isLoading ? (
245
264
  <ActivityIndicator
246
265
  size="small"
247
- color={allFollowing ? colors.text : colors.negativeForeground}
266
+ color={allFollowing ? colors.text : colors.primaryForeground}
248
267
  />
249
268
  ) : (
250
269
  <Text
@@ -52,7 +52,7 @@ const IconLogo: React.FC<{ size: number; style?: ViewStyle; primary: string; inn
52
52
  />
53
53
  <Path
54
54
  d="M342.19 891.70425c-34.34375 2.53125-64.8125-3.85547-91.40625-19.15625-26.59375-15.3125-49.26172-36.85156-68-64.625-18.73047-27.78125-33.58594-60.5039-44.5625-98.17188-10.96875-37.67578-18.0039-77.625-21.10938-119.84375-2.89453-39.40625-1.46874-79.6953 4.28126-120.875 5.75-41.17578 16.42578-78.75 32.03124-112.71875 15.61329-33.97656 36.44532-62.39453 62.5-85.25 26.05079-22.85156 58.21875-35.6875 96.5-38.5 37.14454-2.72656 68.97657 4.98047 95.5 23.125 26.51954 18.13672 48.40625 42.5625 65.65625 73.28126 17.25782 30.71093 30.57032 65.53125 39.9375 104.46875 9.375 38.92968 15.50782 78.09375 18.40626 117.5 3.22656 43.90625 1.91406 85.74609-3.9375 125.51562-5.84375 39.76172-16.53907 75.21094-32.07813 106.34375-15.54297 31.13672-36.04297 56.41406-61.5 75.82813-25.44922 19.40625-56.1875 30.42968-92.21875 33.07812zm-24.5-471.89063c-10.69922.78125-19.53906 5.67188-26.51563 14.67188-6.98046 8.99219-12.49609 20.57031-16.54687 34.73438-4.04297 14.16796-6.5625 29.92187-7.5625 47.26562-.99219 17.33594-.84375 34.73047.4375 52.1875 1.44531 19.69922 4.16016 39.30469 8.14063 58.8125 3.98828 19.51172 9.09375 36.96484 15.3125 52.35938 6.22656 15.39843 13.49218 27.60156 21.79687 36.60937 8.30078 9 17.80078 13.10938 28.5 12.32813 12.38281-.91407 21.78125-7.83204 28.1875-20.75 6.40625-12.91407 11.07813-28.25391 14.01563-46.01563 2.9453-17.75781 4.4414-35.97656 4.48437-54.65625.03906-18.6875-.39844-34.21875-1.3125-46.59375-1.11719-15.19531-3.28125-31.17188-6.5-47.92188-3.21094-16.75-7.59375-32.1328-13.15625-46.15625-5.55469-14.01953-12.33984-25.54687-20.35938-34.57812-8.02343-9.03125-17.66406-13.1289-28.92187-12.29688z"
55
- fill="#ffffff"
55
+ fill={inner}
56
56
  />
57
57
  </G>
58
58
  </G>
@@ -1,5 +1,7 @@
1
1
  import { lazy, Suspense, useEffect, useRef, useState, type ComponentType, type FC, type ReactNode } from 'react';
2
2
  import { AppState, Platform, StyleSheet, View } from 'react-native';
3
+ import { GestureHandlerRootView } from 'react-native-gesture-handler';
4
+ import { SafeAreaProvider } from 'react-native-safe-area-context';
3
5
  import type { OxyProviderProps } from '../types/navigation';
4
6
  import { OxyContextProvider, type OxyContextProviderProps } from '../context/OxyContext';
5
7
  import { QueryClientProvider, focusManager, onlineManager } from '@tanstack/react-query';
@@ -27,6 +29,9 @@ import { createPlatformStorage, type StorageInterface } from '../utils/storageHe
27
29
  const BOOT_BG_COLOR = '#ffffff';
28
30
 
29
31
  const bootStyles = StyleSheet.create({
32
+ providerRoot: {
33
+ flex: 1,
34
+ },
30
35
  bootShell: {
31
36
  flex: 1,
32
37
  backgroundColor: BOOT_BG_COLOR,
@@ -69,8 +74,9 @@ const LazySignInModal = lazy((): Promise<{ default: ComponentType }> =>
69
74
  * OxyProvider - Universal provider for Expo apps (native + web)
70
75
  *
71
76
  * Provides authentication, session management, query client, and UI overlays.
72
- * Does NOT wrap in SafeAreaProvider or GestureHandlerRootView — those are the
73
- * consuming app's responsibility.
77
+ * Wraps its own overlay stack in SafeAreaProvider and GestureHandlerRootView so
78
+ * BottomSheetRouter and SignInModal can safely render even when a consuming app
79
+ * has not mounted those providers yet.
74
80
  *
75
81
  * Usage:
76
82
  * ```tsx
@@ -276,9 +282,13 @@ const OxyProvider: FC<OxyProviderProps> = ({
276
282
  // until children can mount under a real <QueryClientProvider>.
277
283
  if (!queryClient) {
278
284
  return (
279
- <KeyboardWrapper>
280
- <View style={bootStyles.bootShell} />
281
- </KeyboardWrapper>
285
+ <GestureHandlerRootView style={bootStyles.providerRoot}>
286
+ <SafeAreaProvider>
287
+ <KeyboardWrapper>
288
+ <View style={bootStyles.bootShell} />
289
+ </KeyboardWrapper>
290
+ </SafeAreaProvider>
291
+ </GestureHandlerRootView>
282
292
  );
283
293
  }
284
294
 
@@ -314,9 +324,13 @@ const OxyProvider: FC<OxyProviderProps> = ({
314
324
  );
315
325
 
316
326
  return (
317
- <KeyboardWrapper>
318
- {coreContent}
319
- </KeyboardWrapper>
327
+ <GestureHandlerRootView style={bootStyles.providerRoot}>
328
+ <SafeAreaProvider>
329
+ <KeyboardWrapper>
330
+ {coreContent}
331
+ </KeyboardWrapper>
332
+ </SafeAreaProvider>
333
+ </GestureHandlerRootView>
320
334
  );
321
335
  };
322
336
 
@@ -103,7 +103,7 @@ const SignInModalContent: React.FC<SignInModalContentProps> = ({
103
103
  switchSession,
104
104
  clientId,
105
105
  }) => {
106
- const { qrData, isLoading, error, isWaiting, openAuthApproval, retry } = useOxyAuthSession(
106
+ const { qrData, qrPayload, isLoading, error, isWaiting, openAuthApproval, openSameDeviceApproval, retry } = useOxyAuthSession(
107
107
  oxyServices,
108
108
  clientId,
109
109
  switchSession,
@@ -192,6 +192,20 @@ const SignInModalContent: React.FC<SignInModalContentProps> = ({
192
192
  Continue with Oxy
193
193
  </Button>
194
194
 
195
+ {/* Same-device "Sign in with Oxy" handoff — deep-links into the
196
+ native Oxy app to approve. Shown only when the handoff backend
197
+ returned a payload. */}
198
+ {qrPayload && (
199
+ <Button
200
+ variant="secondary"
201
+ onPress={openSameDeviceApproval}
202
+ icon={<OxyLogo variant="icon" size={20} fillColor={theme.colors.text} style={styles.buttonIcon} />}
203
+ style={styles.secondaryButton}
204
+ >
205
+ Sign in with the Oxy app
206
+ </Button>
207
+ )}
208
+
195
209
  {/* Waiting status */}
196
210
  {isWaiting && (
197
211
  <View style={styles.statusContainer}>
@@ -204,7 +218,7 @@ const SignInModalContent: React.FC<SignInModalContentProps> = ({
204
218
 
205
219
  {/* Collapsed "sign in on another device" QR disclosure */}
206
220
  <View style={styles.qrSection}>
207
- <AnotherDeviceQR qrData={qrData} />
221
+ <AnotherDeviceQR qrData={qrData} qrPayload={qrPayload} />
208
222
  </View>
209
223
  </>
210
224
  )}
@@ -274,6 +288,11 @@ const styles = StyleSheet.create({
274
288
  width: '100%',
275
289
  borderRadius: 12,
276
290
  },
291
+ secondaryButton: {
292
+ width: '100%',
293
+ borderRadius: 12,
294
+ marginTop: 12,
295
+ },
277
296
  buttonIcon: {
278
297
  marginRight: 10,
279
298
  },
@@ -28,7 +28,7 @@ export type Props = PressableProps & {
28
28
  background?: PressableAndroidRippleConfig;
29
29
  centered?: boolean;
30
30
  disabled?: boolean;
31
- onPress?: (e: GestureResponderEvent) => undefined | null;
31
+ onPress?: (e: GestureResponderEvent) => void | null;
32
32
  onLongPress?: (e: GestureResponderEvent) => void;
33
33
  onPressIn?: (e: GestureResponderEvent) => void;
34
34
  onPressOut?: (e: GestureResponderEvent) => void;
@@ -266,8 +266,8 @@ export const FileViewer: React.FC<FileViewerProps> = ({
266
266
  style={fileManagementStyles.downloadButtonLarge}
267
267
  onPress={() => onDownload(file.id, file.filename)}
268
268
  >
269
- <MaterialCommunityIcons name="download" size={18} color={colors.negativeForeground} />
270
- <Text style={fileManagementStyles.downloadButtonText}>Download PDF</Text>
269
+ <MaterialCommunityIcons name="download" size={18} color={colors.primaryForeground} />
270
+ <Text style={[fileManagementStyles.downloadButtonText, { color: colors.primaryForeground }]}>Download PDF</Text>
271
271
  </TouchableOpacity>
272
272
  </View>
273
273
  ) : isVideo && fileContent ? (
@@ -289,8 +289,8 @@ export const FileViewer: React.FC<FileViewerProps> = ({
289
289
  style={fileManagementStyles.downloadButtonLarge}
290
290
  onPress={() => onDownload(file.id, file.filename)}
291
291
  >
292
- <MaterialCommunityIcons name="download" size={18} color={colors.negativeForeground} />
293
- <Text style={fileManagementStyles.downloadButtonText}>Download Video</Text>
292
+ <MaterialCommunityIcons name="download" size={18} color={colors.primaryForeground} />
293
+ <Text style={[fileManagementStyles.downloadButtonText, { color: colors.primaryForeground }]}>Download Video</Text>
294
294
  </TouchableOpacity>
295
295
  </View>
296
296
  ) : isAudio && fileContent ? (
@@ -312,8 +312,8 @@ export const FileViewer: React.FC<FileViewerProps> = ({
312
312
  style={fileManagementStyles.downloadButtonLarge}
313
313
  onPress={() => onDownload(file.id, file.filename)}
314
314
  >
315
- <MaterialCommunityIcons name="download" size={18} color={colors.negativeForeground} />
316
- <Text style={fileManagementStyles.downloadButtonText}>Download Audio</Text>
315
+ <MaterialCommunityIcons name="download" size={18} color={colors.primaryForeground} />
316
+ <Text style={[fileManagementStyles.downloadButtonText, { color: colors.primaryForeground }]}>Download Audio</Text>
317
317
  </TouchableOpacity>
318
318
  </View>
319
319
  ) : (
@@ -335,8 +335,8 @@ export const FileViewer: React.FC<FileViewerProps> = ({
335
335
  style={fileManagementStyles.downloadButtonLarge}
336
336
  onPress={() => onDownload(file.id, file.filename)}
337
337
  >
338
- <MaterialCommunityIcons name="download" size={18} color={colors.negativeForeground} />
339
- <Text style={fileManagementStyles.downloadButtonText}>Download File</Text>
338
+ <MaterialCommunityIcons name="download" size={18} color={colors.primaryForeground} />
339
+ <Text style={[fileManagementStyles.downloadButtonText, { color: colors.primaryForeground }]}>Download File</Text>
340
340
  </TouchableOpacity>
341
341
  </View>
342
342
  )}
@@ -387,7 +387,7 @@ export const FileViewer: React.FC<FileViewerProps> = ({
387
387
  }}
388
388
  >
389
389
  <MaterialCommunityIcons name="delete" size={16} color={colors.negativeForeground} />
390
- <Text style={fileManagementStyles.fileDetailsActionText}>Delete</Text>
390
+ <Text style={[fileManagementStyles.fileDetailsActionText, { color: colors.negativeForeground }]}>Delete</Text>
391
391
  </TouchableOpacity>
392
392
  </View>
393
393
  )}
@@ -123,8 +123,8 @@ const UploadPreviewContent: React.FC<{
123
123
  style={fileManagementStyles.uploadPreviewConfirmButton}
124
124
  onPress={onConfirm}
125
125
  >
126
- <Ionicons name="cloud-upload" size={20} color={colors.negativeForeground} />
127
- <Text style={fileManagementStyles.uploadPreviewConfirmText}>Upload</Text>
126
+ <Ionicons name="cloud-upload" size={20} color={colors.primaryForeground} />
127
+ <Text style={[fileManagementStyles.uploadPreviewConfirmText, { color: colors.primaryForeground }]}>Upload</Text>
128
128
  </TouchableOpacity>
129
129
  </View>
130
130
  )}