@oxyhq/services 11.0.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/lib/commonjs/index.js.map +1 -1
  2. package/lib/commonjs/ui/components/AccountMenu.js +9 -5
  3. package/lib/commonjs/ui/components/AccountMenu.js.map +1 -1
  4. package/lib/commonjs/ui/components/AnotherDeviceQR.js +51 -56
  5. package/lib/commonjs/ui/components/AnotherDeviceQR.js.map +1 -1
  6. package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -0
  7. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  8. package/lib/commonjs/ui/components/FollowButton.js +18 -5
  9. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  10. package/lib/commonjs/ui/components/OxyProvider.js +23 -7
  11. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  12. package/lib/commonjs/ui/components/SignInModal.js +20 -1
  13. package/lib/commonjs/ui/components/SignInModal.js.map +1 -1
  14. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +19 -9
  15. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  16. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +4 -2
  17. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  18. package/lib/commonjs/ui/context/OxyContext.js +153 -19
  19. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  20. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +6 -17
  21. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  22. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +5 -5
  23. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js.map +1 -1
  24. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +38 -38
  25. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  26. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +2 -2
  27. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  28. package/lib/commonjs/ui/hooks/queries/queryKeys.js +3 -3
  29. package/lib/commonjs/ui/hooks/queries/queryKeys.js.map +1 -1
  30. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +1 -1
  31. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  32. package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js +16 -12
  33. package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js.map +1 -1
  34. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +10 -6
  35. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  36. package/lib/commonjs/ui/hooks/queryClient.js +6 -5
  37. package/lib/commonjs/ui/hooks/queryClient.js.map +1 -1
  38. package/lib/commonjs/ui/hooks/useOxyAuthSession.js +40 -2
  39. package/lib/commonjs/ui/hooks/useOxyAuthSession.js.map +1 -1
  40. package/lib/commonjs/ui/hooks/useProfileEditing.js +21 -0
  41. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  42. package/lib/commonjs/ui/hooks/useSessionManagement.js +3 -3
  43. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  44. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +100 -108
  45. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  46. package/lib/commonjs/ui/screens/AppInfoScreen.js +227 -273
  47. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  48. package/lib/commonjs/ui/screens/AvatarCropScreen.js +10 -4
  49. package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -1
  50. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +20 -37
  51. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
  52. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js +89 -201
  53. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js.map +1 -1
  54. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +80 -208
  55. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  56. package/lib/commonjs/ui/screens/FAQScreen.js +56 -208
  57. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  58. package/lib/commonjs/ui/screens/FeedbackScreen.js +303 -352
  59. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  60. package/lib/commonjs/ui/screens/FileManagementScreen.js +20 -20
  61. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  62. package/lib/commonjs/ui/screens/HelpSupportScreen.js +77 -89
  63. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/HistoryViewScreen.js +43 -58
  65. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +67 -90
  67. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  68. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +77 -177
  69. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  70. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +113 -107
  71. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  72. package/lib/commonjs/ui/screens/ManageAccountScreen.js +55 -114
  73. package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
  74. package/lib/commonjs/ui/screens/NotificationsScreen.js +67 -85
  75. package/lib/commonjs/ui/screens/NotificationsScreen.js.map +1 -1
  76. package/lib/commonjs/ui/screens/OxyAuthScreen.js +71 -135
  77. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  78. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +15 -9
  79. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/PreferencesScreen.js +65 -83
  81. package/lib/commonjs/ui/screens/PreferencesScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +378 -1023
  83. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +294 -242
  85. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/ProfileScreen.js +192 -305
  87. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  88. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +57 -97
  89. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  90. package/lib/commonjs/ui/screens/SearchSettingsScreen.js +41 -41
  91. package/lib/commonjs/ui/screens/SearchSettingsScreen.js.map +1 -1
  92. package/lib/commonjs/ui/screens/UserLinksScreen.js +17 -24
  93. package/lib/commonjs/ui/screens/UserLinksScreen.js.map +1 -1
  94. package/lib/commonjs/ui/screens/UserListScreen.js +83 -214
  95. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  96. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +115 -77
  97. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  98. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js +70 -57
  99. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  100. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +136 -332
  101. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  102. package/lib/commonjs/ui/screens/trust/TrustFAQScreen.js +47 -137
  103. package/lib/commonjs/ui/screens/trust/TrustFAQScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +182 -115
  105. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  106. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +138 -214
  107. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  108. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js +54 -92
  109. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  110. package/lib/commonjs/ui/utils/activeAuthuser.js +15 -9
  111. package/lib/commonjs/ui/utils/activeAuthuser.js.map +1 -1
  112. package/lib/commonjs/ui/utils/avatarUtils.js +1 -1
  113. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  114. package/lib/module/index.js.map +1 -1
  115. package/lib/module/ui/components/AccountMenu.js +10 -6
  116. package/lib/module/ui/components/AccountMenu.js.map +1 -1
  117. package/lib/module/ui/components/AnotherDeviceQR.js +50 -56
  118. package/lib/module/ui/components/AnotherDeviceQR.js.map +1 -1
  119. package/lib/module/ui/components/BottomSheetRouter.js +2 -1
  120. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  121. package/lib/module/ui/components/FollowButton.js +18 -5
  122. package/lib/module/ui/components/FollowButton.js.map +1 -1
  123. package/lib/module/ui/components/OxyProvider.js +23 -7
  124. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  125. package/lib/module/ui/components/SignInModal.js +20 -1
  126. package/lib/module/ui/components/SignInModal.js.map +1 -1
  127. package/lib/module/ui/components/fileManagement/FileViewer.js +19 -9
  128. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  129. package/lib/module/ui/components/fileManagement/UploadPreview.js +4 -2
  130. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  131. package/lib/module/ui/context/OxyContext.js +154 -20
  132. package/lib/module/ui/context/OxyContext.js.map +1 -1
  133. package/lib/module/ui/context/hooks/useAuthOperations.js +6 -17
  134. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  135. package/lib/module/ui/hooks/mutations/mutationFactory.js +5 -5
  136. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
  137. package/lib/module/ui/hooks/mutations/useAccountMutations.js +38 -38
  138. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  139. package/lib/module/ui/hooks/mutations/useServicesMutations.js +2 -2
  140. package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  141. package/lib/module/ui/hooks/queries/queryKeys.js +3 -3
  142. package/lib/module/ui/hooks/queries/queryKeys.js.map +1 -1
  143. package/lib/module/ui/hooks/queries/useAccountQueries.js +1 -1
  144. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  145. package/lib/module/ui/hooks/queries/usePaymentQueries.js +16 -12
  146. package/lib/module/ui/hooks/queries/usePaymentQueries.js.map +1 -1
  147. package/lib/module/ui/hooks/queries/useServicesQueries.js +9 -6
  148. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  149. package/lib/module/ui/hooks/queryClient.js +6 -5
  150. package/lib/module/ui/hooks/queryClient.js.map +1 -1
  151. package/lib/module/ui/hooks/useOxyAuthSession.js +40 -2
  152. package/lib/module/ui/hooks/useOxyAuthSession.js.map +1 -1
  153. package/lib/module/ui/hooks/useProfileEditing.js +21 -0
  154. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  155. package/lib/module/ui/hooks/useSessionManagement.js +4 -3
  156. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  157. package/lib/module/ui/screens/AccountVerificationScreen.js +101 -109
  158. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  159. package/lib/module/ui/screens/AppInfoScreen.js +228 -275
  160. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  161. package/lib/module/ui/screens/AvatarCropScreen.js +10 -4
  162. package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -1
  163. package/lib/module/ui/screens/ConnectedAppsScreen.js +19 -39
  164. package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
  165. package/lib/module/ui/screens/CreateManagedAccountScreen.js +90 -202
  166. package/lib/module/ui/screens/CreateManagedAccountScreen.js.map +1 -1
  167. package/lib/module/ui/screens/EditProfileFieldScreen.js +77 -205
  168. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  169. package/lib/module/ui/screens/FAQScreen.js +55 -207
  170. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  171. package/lib/module/ui/screens/FeedbackScreen.js +301 -350
  172. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  173. package/lib/module/ui/screens/FileManagementScreen.js +20 -20
  174. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  175. package/lib/module/ui/screens/HelpSupportScreen.js +78 -90
  176. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  177. package/lib/module/ui/screens/HistoryViewScreen.js +44 -59
  178. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  179. package/lib/module/ui/screens/LanguageSelectorScreen.js +68 -91
  180. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  181. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +75 -177
  182. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  183. package/lib/module/ui/screens/LegalDocumentsScreen.js +116 -108
  184. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  185. package/lib/module/ui/screens/ManageAccountScreen.js +52 -112
  186. package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
  187. package/lib/module/ui/screens/NotificationsScreen.js +68 -86
  188. package/lib/module/ui/screens/NotificationsScreen.js.map +1 -1
  189. package/lib/module/ui/screens/OxyAuthScreen.js +69 -134
  190. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  191. package/lib/module/ui/screens/PaymentGatewayScreen.js +16 -10
  192. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  193. package/lib/module/ui/screens/PreferencesScreen.js +66 -84
  194. package/lib/module/ui/screens/PreferencesScreen.js.map +1 -1
  195. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +366 -1012
  196. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  197. package/lib/module/ui/screens/PrivacySettingsScreen.js +295 -243
  198. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  199. package/lib/module/ui/screens/ProfileScreen.js +189 -302
  200. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  201. package/lib/module/ui/screens/SavesCollectionsScreen.js +58 -98
  202. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  203. package/lib/module/ui/screens/SearchSettingsScreen.js +42 -42
  204. package/lib/module/ui/screens/SearchSettingsScreen.js.map +1 -1
  205. package/lib/module/ui/screens/UserLinksScreen.js +18 -25
  206. package/lib/module/ui/screens/UserLinksScreen.js.map +1 -1
  207. package/lib/module/ui/screens/UserListScreen.js +81 -212
  208. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  209. package/lib/module/ui/screens/WelcomeNewUserScreen.js +114 -76
  210. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  211. package/lib/module/ui/screens/trust/TrustAboutScreen.js +69 -57
  212. package/lib/module/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  213. package/lib/module/ui/screens/trust/TrustCenterScreen.js +135 -332
  214. package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  215. package/lib/module/ui/screens/trust/TrustFAQScreen.js +48 -138
  216. package/lib/module/ui/screens/trust/TrustFAQScreen.js.map +1 -1
  217. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +184 -117
  218. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  219. package/lib/module/ui/screens/trust/TrustRewardsScreen.js +132 -208
  220. package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  221. package/lib/module/ui/screens/trust/TrustRulesScreen.js +58 -94
  222. package/lib/module/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  223. package/lib/module/ui/utils/activeAuthuser.js +15 -9
  224. package/lib/module/ui/utils/activeAuthuser.js.map +1 -1
  225. package/lib/module/ui/utils/avatarUtils.js +1 -1
  226. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  227. package/lib/typescript/commonjs/index.d.ts +1 -0
  228. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  229. package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts +2 -0
  230. package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts.map +1 -1
  231. package/lib/typescript/commonjs/ui/components/AnotherDeviceQR.d.ts +12 -2
  232. package/lib/typescript/commonjs/ui/components/AnotherDeviceQR.d.ts.map +1 -1
  233. package/lib/typescript/commonjs/ui/components/BottomSheetRouter.d.ts.map +1 -1
  234. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts.map +1 -1
  235. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts +3 -2
  236. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -1
  238. package/lib/typescript/commonjs/ui/components/TouchableRipple/TouchableRipple.native.d.ts +1 -1
  239. package/lib/typescript/commonjs/ui/components/TouchableRipple/TouchableRipple.native.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +34 -0
  241. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  243. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +3 -0
  244. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  245. package/lib/typescript/commonjs/ui/hooks/queries/queryKeys.d.ts +3 -3
  246. package/lib/typescript/commonjs/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  247. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  248. package/lib/typescript/commonjs/ui/hooks/queryClient.d.ts.map +1 -1
  249. package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts +22 -0
  250. package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
  251. package/lib/typescript/commonjs/ui/hooks/useProfileEditing.d.ts +3 -0
  252. package/lib/typescript/commonjs/ui/hooks/useProfileEditing.d.ts.map +1 -1
  253. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts +2 -1
  254. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  255. package/lib/typescript/commonjs/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  256. package/lib/typescript/commonjs/ui/screens/AppInfoScreen.d.ts.map +1 -1
  257. package/lib/typescript/commonjs/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  258. package/lib/typescript/commonjs/ui/screens/ConnectedAppsScreen.d.ts.map +1 -1
  259. package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -1
  260. package/lib/typescript/commonjs/ui/screens/EditProfileFieldScreen.d.ts.map +1 -1
  261. package/lib/typescript/commonjs/ui/screens/FAQScreen.d.ts.map +1 -1
  262. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  263. package/lib/typescript/commonjs/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  264. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  265. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  266. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  267. package/lib/typescript/commonjs/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  268. package/lib/typescript/commonjs/ui/screens/ManageAccountScreen.d.ts.map +1 -1
  269. package/lib/typescript/commonjs/ui/screens/NotificationsScreen.d.ts.map +1 -1
  270. package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  271. package/lib/typescript/commonjs/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  272. package/lib/typescript/commonjs/ui/screens/PreferencesScreen.d.ts.map +1 -1
  273. package/lib/typescript/commonjs/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  274. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  275. package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
  276. package/lib/typescript/commonjs/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  277. package/lib/typescript/commonjs/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  278. package/lib/typescript/commonjs/ui/screens/UserLinksScreen.d.ts.map +1 -1
  279. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
  280. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  281. package/lib/typescript/commonjs/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  282. package/lib/typescript/commonjs/ui/screens/trust/TrustCenterScreen.d.ts.map +1 -1
  283. package/lib/typescript/commonjs/ui/screens/trust/TrustFAQScreen.d.ts.map +1 -1
  284. package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  285. package/lib/typescript/commonjs/ui/screens/trust/TrustRewardsScreen.d.ts.map +1 -1
  286. package/lib/typescript/commonjs/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  287. package/lib/typescript/commonjs/ui/utils/activeAuthuser.d.ts.map +1 -1
  288. package/lib/typescript/module/index.d.ts +1 -0
  289. package/lib/typescript/module/index.d.ts.map +1 -1
  290. package/lib/typescript/module/ui/components/AccountMenu.d.ts +2 -0
  291. package/lib/typescript/module/ui/components/AccountMenu.d.ts.map +1 -1
  292. package/lib/typescript/module/ui/components/AnotherDeviceQR.d.ts +12 -2
  293. package/lib/typescript/module/ui/components/AnotherDeviceQR.d.ts.map +1 -1
  294. package/lib/typescript/module/ui/components/BottomSheetRouter.d.ts.map +1 -1
  295. package/lib/typescript/module/ui/components/FollowButton.d.ts.map +1 -1
  296. package/lib/typescript/module/ui/components/OxyProvider.d.ts +3 -2
  297. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  298. package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -1
  299. package/lib/typescript/module/ui/components/TouchableRipple/TouchableRipple.native.d.ts +1 -1
  300. package/lib/typescript/module/ui/components/TouchableRipple/TouchableRipple.native.d.ts.map +1 -1
  301. package/lib/typescript/module/ui/context/OxyContext.d.ts +34 -0
  302. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  303. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  304. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +3 -0
  305. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  306. package/lib/typescript/module/ui/hooks/queries/queryKeys.d.ts +3 -3
  307. package/lib/typescript/module/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  308. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  309. package/lib/typescript/module/ui/hooks/queryClient.d.ts.map +1 -1
  310. package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts +22 -0
  311. package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
  312. package/lib/typescript/module/ui/hooks/useProfileEditing.d.ts +3 -0
  313. package/lib/typescript/module/ui/hooks/useProfileEditing.d.ts.map +1 -1
  314. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts +2 -1
  315. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  316. package/lib/typescript/module/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  317. package/lib/typescript/module/ui/screens/AppInfoScreen.d.ts.map +1 -1
  318. package/lib/typescript/module/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  319. package/lib/typescript/module/ui/screens/ConnectedAppsScreen.d.ts.map +1 -1
  320. package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -1
  321. package/lib/typescript/module/ui/screens/EditProfileFieldScreen.d.ts.map +1 -1
  322. package/lib/typescript/module/ui/screens/FAQScreen.d.ts.map +1 -1
  323. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  324. package/lib/typescript/module/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  325. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  326. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  327. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  328. package/lib/typescript/module/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  329. package/lib/typescript/module/ui/screens/ManageAccountScreen.d.ts.map +1 -1
  330. package/lib/typescript/module/ui/screens/NotificationsScreen.d.ts.map +1 -1
  331. package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  332. package/lib/typescript/module/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  333. package/lib/typescript/module/ui/screens/PreferencesScreen.d.ts.map +1 -1
  334. package/lib/typescript/module/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  335. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  336. package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
  337. package/lib/typescript/module/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  338. package/lib/typescript/module/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  339. package/lib/typescript/module/ui/screens/UserLinksScreen.d.ts.map +1 -1
  340. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
  341. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  342. package/lib/typescript/module/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  343. package/lib/typescript/module/ui/screens/trust/TrustCenterScreen.d.ts.map +1 -1
  344. package/lib/typescript/module/ui/screens/trust/TrustFAQScreen.d.ts.map +1 -1
  345. package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  346. package/lib/typescript/module/ui/screens/trust/TrustRewardsScreen.d.ts.map +1 -1
  347. package/lib/typescript/module/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  348. package/lib/typescript/module/ui/utils/activeAuthuser.d.ts.map +1 -1
  349. package/lib/typescript/types/expo-haptics.d.ts +42 -0
  350. package/package.json +8 -3
  351. package/src/index.ts +1 -0
  352. package/src/types/expo-haptics.d.ts +42 -0
  353. package/src/ui/components/AccountMenu.tsx +11 -5
  354. package/src/ui/components/AnotherDeviceQR.tsx +53 -45
  355. package/src/ui/components/BottomSheetRouter.tsx +2 -1
  356. package/src/ui/components/FollowButton.tsx +24 -5
  357. package/src/ui/components/OxyProvider.tsx +22 -8
  358. package/src/ui/components/SignInModal.tsx +21 -2
  359. package/src/ui/components/TouchableRipple/TouchableRipple.native.tsx +1 -1
  360. package/src/ui/components/fileManagement/FileViewer.tsx +9 -9
  361. package/src/ui/components/fileManagement/UploadPreview.tsx +2 -2
  362. package/src/ui/context/OxyContext.tsx +178 -21
  363. package/src/ui/context/hooks/useAuthOperations.ts +6 -17
  364. package/src/ui/hooks/mutations/mutationFactory.ts +5 -5
  365. package/src/ui/hooks/mutations/useAccountMutations.ts +38 -38
  366. package/src/ui/hooks/mutations/useServicesMutations.ts +2 -2
  367. package/src/ui/hooks/queries/queryKeys.ts +6 -3
  368. package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
  369. package/src/ui/hooks/queries/usePaymentQueries.ts +12 -12
  370. package/src/ui/hooks/queries/useServicesQueries.ts +9 -6
  371. package/src/ui/hooks/queryClient.ts +5 -5
  372. package/src/ui/hooks/useOxyAuthSession.ts +76 -2
  373. package/src/ui/hooks/useProfileEditing.ts +24 -0
  374. package/src/ui/hooks/useSessionManagement.ts +9 -6
  375. package/src/ui/screens/AccountVerificationScreen.tsx +101 -113
  376. package/src/ui/screens/AppInfoScreen.tsx +200 -238
  377. package/src/ui/screens/AvatarCropScreen.tsx +17 -4
  378. package/src/ui/screens/ConnectedAppsScreen.tsx +16 -34
  379. package/src/ui/screens/CreateManagedAccountScreen.tsx +94 -170
  380. package/src/ui/screens/EditProfileFieldScreen.tsx +77 -190
  381. package/src/ui/screens/FAQScreen.tsx +77 -208
  382. package/src/ui/screens/FeedbackScreen.tsx +330 -239
  383. package/src/ui/screens/FileManagementScreen.tsx +20 -20
  384. package/src/ui/screens/HelpSupportScreen.tsx +67 -82
  385. package/src/ui/screens/HistoryViewScreen.tsx +32 -38
  386. package/src/ui/screens/LanguageSelectorScreen.tsx +79 -93
  387. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +81 -164
  388. package/src/ui/screens/LegalDocumentsScreen.tsx +184 -123
  389. package/src/ui/screens/ManageAccountScreen.tsx +48 -114
  390. package/src/ui/screens/NotificationsScreen.tsx +107 -106
  391. package/src/ui/screens/OxyAuthScreen.tsx +76 -109
  392. package/src/ui/screens/PaymentGatewayScreen.tsx +16 -7
  393. package/src/ui/screens/PreferencesScreen.tsx +96 -116
  394. package/src/ui/screens/PremiumSubscriptionScreen.tsx +419 -872
  395. package/src/ui/screens/PrivacySettingsScreen.tsx +203 -185
  396. package/src/ui/screens/ProfileScreen.tsx +158 -200
  397. package/src/ui/screens/SavesCollectionsScreen.tsx +78 -125
  398. package/src/ui/screens/SearchSettingsScreen.tsx +52 -41
  399. package/src/ui/screens/UserLinksScreen.tsx +18 -25
  400. package/src/ui/screens/UserListScreen.tsx +95 -188
  401. package/src/ui/screens/WelcomeNewUserScreen.tsx +109 -36
  402. package/src/ui/screens/trust/TrustAboutScreen.tsx +52 -41
  403. package/src/ui/screens/trust/TrustCenterScreen.tsx +184 -222
  404. package/src/ui/screens/trust/TrustFAQScreen.tsx +64 -124
  405. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +190 -67
  406. package/src/ui/screens/trust/TrustRewardsScreen.tsx +147 -182
  407. package/src/ui/screens/trust/TrustRulesScreen.tsx +77 -50
  408. package/src/ui/utils/activeAuthuser.ts +15 -9
  409. package/src/ui/utils/avatarUtils.ts +1 -1
  410. package/lib/commonjs/ui/components/feedback/FormInput.js +0 -72
  411. package/lib/commonjs/ui/components/feedback/FormInput.js.map +0 -1
  412. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +0 -261
  413. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +0 -1
  414. package/lib/module/ui/components/feedback/FormInput.js +0 -67
  415. package/lib/module/ui/components/feedback/FormInput.js.map +0 -1
  416. package/lib/module/ui/components/feedback/feedbackStyles.js +0 -256
  417. package/lib/module/ui/components/feedback/feedbackStyles.js.map +0 -1
  418. package/lib/typescript/commonjs/ui/components/feedback/FormInput.d.ts +0 -20
  419. package/lib/typescript/commonjs/ui/components/feedback/FormInput.d.ts.map +0 -1
  420. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts +0 -279
  421. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts.map +0 -1
  422. package/lib/typescript/module/ui/components/feedback/FormInput.d.ts +0 -20
  423. package/lib/typescript/module/ui/components/feedback/FormInput.d.ts.map +0 -1
  424. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts +0 -279
  425. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts.map +0 -1
  426. package/src/ui/components/feedback/FormInput.tsx +0 -84
  427. 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
@@ -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
  )}