@oxyhq/services 26.0.0 → 26.0.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 (583) hide show
  1. package/README.md +2 -2
  2. package/android/src/main/java/so/oxy/identity/OxyIdentityStore.kt +127 -21
  3. package/expo-module.config.json +1 -4
  4. package/lib/commonjs/index.js +49 -18
  5. package/lib/commonjs/index.js.map +1 -1
  6. package/lib/commonjs/notifications/deviceNotifications.js +0 -63
  7. package/lib/commonjs/notifications/deviceNotifications.js.map +1 -1
  8. package/lib/commonjs/ui/boot/runProviderColdBoot.js +64 -20
  9. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  10. package/lib/commonjs/ui/components/FollowButton.js +4 -4
  11. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  12. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js +1 -13
  13. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js.map +1 -1
  14. package/lib/commonjs/ui/components/OxyAuthChooser.js +8 -9
  15. package/lib/commonjs/ui/components/OxyAuthChooser.js.map +1 -1
  16. package/lib/commonjs/ui/components/OxyProvider.js +7 -8
  17. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  18. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  19. package/lib/commonjs/ui/components/ProfileButton.js +1 -1
  20. package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
  21. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +30 -25
  22. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  23. package/lib/commonjs/ui/components/authChooser/primitives.js +9 -9
  24. package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
  25. package/lib/commonjs/ui/components/authChooser/useUsernameAvailability.js +2 -2
  26. package/lib/commonjs/ui/components/authChooser/useUsernameAvailability.js.map +1 -1
  27. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +2 -2
  28. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  29. package/lib/commonjs/ui/components/internal/PinInput.js +1 -3
  30. package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
  31. package/lib/commonjs/ui/components/logo/LogoText.js +4 -4
  32. package/lib/commonjs/ui/components/logo/LogoText.js.map +1 -1
  33. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +2 -2
  34. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  35. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +2 -2
  36. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  37. package/lib/commonjs/ui/components/styles/shadow.js.map +1 -1
  38. package/lib/commonjs/ui/context/OxyContext.js +46 -32
  39. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  40. package/lib/commonjs/ui/context/commitSessionFlow.js +43 -3
  41. package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
  42. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +2 -15
  43. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  44. package/lib/commonjs/ui/context/useOxyAccountGraph.js +4 -3
  45. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  46. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +5 -5
  47. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js.map +1 -1
  48. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +11 -11
  49. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  50. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +9 -9
  51. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  52. package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js +2 -3
  53. package/lib/commonjs/ui/hooks/queries/usePaymentQueries.js.map +1 -1
  54. package/lib/commonjs/ui/hooks/queries/userCache.js +17 -17
  55. package/lib/commonjs/ui/hooks/queries/userCache.js.map +1 -1
  56. package/lib/commonjs/ui/hooks/useAssets.js.map +1 -1
  57. package/lib/commonjs/ui/hooks/useAsyncAction.js +7 -7
  58. package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -1
  59. package/lib/commonjs/ui/hooks/useAuth.js +2 -4
  60. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  61. package/lib/commonjs/ui/hooks/useAvatarPicker.js +5 -5
  62. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +1 -1
  63. package/lib/commonjs/ui/hooks/useOnlineStatus.js +2 -3
  64. package/lib/commonjs/ui/hooks/useOnlineStatus.js.map +1 -1
  65. package/lib/commonjs/ui/hooks/useSessionManagement.js +2 -0
  66. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  67. package/lib/commonjs/ui/hooks/useSettingToggle.js +4 -4
  68. package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -1
  69. package/lib/commonjs/ui/hooks/useSurfaceHeader.js +11 -68
  70. package/lib/commonjs/ui/hooks/useSurfaceHeader.js.map +1 -1
  71. package/lib/commonjs/ui/oauth/browserAuthTransport.js +64 -66
  72. package/lib/commonjs/ui/oauth/browserAuthTransport.js.map +1 -1
  73. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js +48 -0
  74. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js.map +1 -0
  75. package/lib/commonjs/ui/oauth/oauthPopup.js +0 -47
  76. package/lib/commonjs/ui/oauth/oauthPopup.js.map +1 -1
  77. package/lib/commonjs/ui/screens/AccountMembersScreen.js +10 -10
  78. package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
  79. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +19 -41
  80. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  81. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +4 -4
  82. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  83. package/lib/commonjs/ui/screens/AppInfoScreen.js +9 -9
  84. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  85. package/lib/commonjs/ui/screens/AvatarCropScreen.js +3 -3
  86. package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -1
  87. package/lib/commonjs/ui/screens/ChangeAvatarScreen.js +7 -6
  88. package/lib/commonjs/ui/screens/ChangeAvatarScreen.js.map +1 -1
  89. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +4 -4
  90. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
  91. package/lib/commonjs/ui/screens/CreateAccountScreen.js +13 -35
  92. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  93. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +5 -5
  94. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  95. package/lib/commonjs/ui/screens/EditProfileScreen.js +3 -2
  96. package/lib/commonjs/ui/screens/EditProfileScreen.js.map +1 -1
  97. package/lib/commonjs/ui/screens/FAQScreen.js +2 -2
  98. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  99. package/lib/commonjs/ui/screens/FeedbackScreen.js +89 -90
  100. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  101. package/lib/commonjs/ui/screens/FileManagementScreen.js +20 -20
  102. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  103. package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -1
  105. package/lib/commonjs/ui/screens/HelpSupportScreen.js +7 -7
  106. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  107. package/lib/commonjs/ui/screens/HistoryViewScreen.js +34 -9
  108. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  109. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +3 -3
  110. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  111. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +3 -3
  112. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  113. package/lib/commonjs/ui/screens/ManageAccountScreen.js +15 -15
  114. package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
  115. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +19 -19
  116. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  117. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +15 -15
  118. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  119. package/lib/commonjs/ui/screens/ProfileScreen.js +7 -17
  120. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  121. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +2 -2
  122. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  123. package/lib/commonjs/ui/screens/UserListScreen.js +7 -13
  124. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  125. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +6 -5
  126. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  127. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +4 -1
  128. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  129. package/lib/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.js +24 -34
  130. package/lib/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.js.map +1 -1
  131. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +1 -1
  132. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  133. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +4 -3
  134. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  135. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +1 -1
  136. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  137. package/lib/commonjs/ui/session/index.js +0 -7
  138. package/lib/commonjs/ui/session/index.js.map +1 -1
  139. package/lib/commonjs/ui/utils/crossOriginRestore.js +140 -0
  140. package/lib/commonjs/ui/utils/crossOriginRestore.js.map +1 -0
  141. package/lib/commonjs/ui/utils/fileManagement.js +24 -24
  142. package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
  143. package/lib/commonjs/ui/utils/oauthReturn.js +30 -19
  144. package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
  145. package/lib/commonjs/ui/utils/userUtils.js +28 -27
  146. package/lib/commonjs/ui/utils/userUtils.js.map +1 -1
  147. package/lib/module/index.js +8 -20
  148. package/lib/module/index.js.map +1 -1
  149. package/lib/module/notifications/deviceNotifications.js +0 -62
  150. package/lib/module/notifications/deviceNotifications.js.map +1 -1
  151. package/lib/module/ui/boot/runProviderColdBoot.js +65 -21
  152. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  153. package/lib/module/ui/components/FollowButton.js +1 -1
  154. package/lib/module/ui/components/FollowButton.js.map +1 -1
  155. package/lib/module/ui/components/OxyAccountDialogScreen.js +1 -13
  156. package/lib/module/ui/components/OxyAccountDialogScreen.js.map +1 -1
  157. package/lib/module/ui/components/OxyAuthChooser.js +4 -5
  158. package/lib/module/ui/components/OxyAuthChooser.js.map +1 -1
  159. package/lib/module/ui/components/OxyProvider.js +6 -7
  160. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  161. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  162. package/lib/module/ui/components/ProfileButton.js +2 -2
  163. package/lib/module/ui/components/ProfileButton.js.map +1 -1
  164. package/lib/module/ui/components/authChooser/AccountsMenuView.js +8 -3
  165. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  166. package/lib/module/ui/components/authChooser/primitives.js +1 -1
  167. package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
  168. package/lib/module/ui/components/authChooser/useUsernameAvailability.js +1 -1
  169. package/lib/module/ui/components/authChooser/useUsernameAvailability.js.map +1 -1
  170. package/lib/module/ui/components/fileManagement/UploadPreview.js +1 -1
  171. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  172. package/lib/module/ui/components/internal/PinInput.js +1 -3
  173. package/lib/module/ui/components/internal/PinInput.js.map +1 -1
  174. package/lib/module/ui/components/logo/LogoText.js +4 -4
  175. package/lib/module/ui/components/logo/LogoText.js.map +1 -1
  176. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  177. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  178. package/lib/module/ui/components/payment/PaymentSummaryStep.js +2 -2
  179. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  180. package/lib/module/ui/components/styles/shadow.js.map +1 -1
  181. package/lib/module/ui/context/OxyContext.js +49 -35
  182. package/lib/module/ui/context/OxyContext.js.map +1 -1
  183. package/lib/module/ui/context/commitSessionFlow.js +42 -3
  184. package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
  185. package/lib/module/ui/context/hooks/useAuthOperations.js +2 -15
  186. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  187. package/lib/module/ui/context/useOxyAccountGraph.js +4 -3
  188. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  189. package/lib/module/ui/hooks/mutations/mutationFactory.js +1 -1
  190. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
  191. package/lib/module/ui/hooks/mutations/useAccountMutations.js +1 -1
  192. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  193. package/lib/module/ui/hooks/mutations/useServicesMutations.js +1 -1
  194. package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  195. package/lib/module/ui/hooks/queries/usePaymentQueries.js +2 -3
  196. package/lib/module/ui/hooks/queries/usePaymentQueries.js.map +1 -1
  197. package/lib/module/ui/hooks/queries/userCache.js +17 -17
  198. package/lib/module/ui/hooks/queries/userCache.js.map +1 -1
  199. package/lib/module/ui/hooks/useAssets.js.map +1 -1
  200. package/lib/module/ui/hooks/useAsyncAction.js +1 -1
  201. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
  202. package/lib/module/ui/hooks/useAuth.js +2 -4
  203. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  204. package/lib/module/ui/hooks/useAvatarPicker.js +1 -1
  205. package/lib/module/ui/hooks/useAvatarPicker.js.map +1 -1
  206. package/lib/module/ui/hooks/useOnlineStatus.js +2 -3
  207. package/lib/module/ui/hooks/useOnlineStatus.js.map +1 -1
  208. package/lib/module/ui/hooks/useSessionManagement.js +2 -0
  209. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  210. package/lib/module/ui/hooks/useSettingToggle.js +1 -1
  211. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
  212. package/lib/module/ui/hooks/useSurfaceHeader.js +11 -68
  213. package/lib/module/ui/hooks/useSurfaceHeader.js.map +1 -1
  214. package/lib/module/ui/oauth/browserAuthTransport.js +64 -66
  215. package/lib/module/ui/oauth/browserAuthTransport.js.map +1 -1
  216. package/lib/module/ui/oauth/legacyRedirectLanes.js +44 -0
  217. package/lib/module/ui/oauth/legacyRedirectLanes.js.map +1 -0
  218. package/lib/module/ui/oauth/oauthPopup.js +1 -48
  219. package/lib/module/ui/oauth/oauthPopup.js.map +1 -1
  220. package/lib/module/ui/screens/AccountMembersScreen.js +1 -1
  221. package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
  222. package/lib/module/ui/screens/AccountSettingsScreen.js +15 -37
  223. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  224. package/lib/module/ui/screens/AccountVerificationScreen.js +1 -1
  225. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  226. package/lib/module/ui/screens/AppInfoScreen.js +1 -1
  227. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  228. package/lib/module/ui/screens/AvatarCropScreen.js +1 -1
  229. package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -1
  230. package/lib/module/ui/screens/ChangeAvatarScreen.js +5 -4
  231. package/lib/module/ui/screens/ChangeAvatarScreen.js.map +1 -1
  232. package/lib/module/ui/screens/ConnectedAppsScreen.js +2 -2
  233. package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
  234. package/lib/module/ui/screens/CreateAccountScreen.js +12 -34
  235. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  236. package/lib/module/ui/screens/EditProfileFieldScreen.js +4 -4
  237. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  238. package/lib/module/ui/screens/EditProfileScreen.js +4 -3
  239. package/lib/module/ui/screens/EditProfileScreen.js.map +1 -1
  240. package/lib/module/ui/screens/FAQScreen.js +1 -1
  241. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  242. package/lib/module/ui/screens/FeedbackScreen.js +91 -94
  243. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  244. package/lib/module/ui/screens/FileManagementScreen.js +1 -1
  245. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  246. package/lib/module/ui/screens/FollowersListScreen.js.map +1 -1
  247. package/lib/module/ui/screens/FollowingListScreen.js.map +1 -1
  248. package/lib/module/ui/screens/HelpSupportScreen.js +1 -1
  249. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  250. package/lib/module/ui/screens/HistoryViewScreen.js +30 -5
  251. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  252. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
  253. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  254. package/lib/module/ui/screens/LegalDocumentsScreen.js +1 -1
  255. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  256. package/lib/module/ui/screens/ManageAccountScreen.js +3 -3
  257. package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
  258. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +4 -4
  259. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  260. package/lib/module/ui/screens/PrivacySettingsScreen.js +11 -11
  261. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  262. package/lib/module/ui/screens/ProfileScreen.js +8 -18
  263. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  264. package/lib/module/ui/screens/SavesCollectionsScreen.js +1 -1
  265. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  266. package/lib/module/ui/screens/UserListScreen.js +8 -14
  267. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  268. package/lib/module/ui/screens/WelcomeNewUserScreen.js +6 -5
  269. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  270. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +4 -1
  271. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  272. package/lib/module/ui/screens/fileManagement/hooks/useFileUploadState.js +5 -15
  273. package/lib/module/ui/screens/fileManagement/hooks/useFileUploadState.js.map +1 -1
  274. package/lib/module/ui/screens/trust/TrustCenterScreen.js +1 -1
  275. package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  276. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +5 -4
  277. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  278. package/lib/module/ui/screens/trust/TrustRewardsScreen.js +1 -1
  279. package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  280. package/lib/module/ui/session/index.js +0 -1
  281. package/lib/module/ui/session/index.js.map +1 -1
  282. package/lib/module/ui/utils/crossOriginRestore.js +131 -0
  283. package/lib/module/ui/utils/crossOriginRestore.js.map +1 -0
  284. package/lib/module/ui/utils/fileManagement.js +25 -25
  285. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  286. package/lib/module/ui/utils/oauthReturn.js +30 -20
  287. package/lib/module/ui/utils/oauthReturn.js.map +1 -1
  288. package/lib/module/ui/utils/userUtils.js +28 -27
  289. package/lib/module/ui/utils/userUtils.js.map +1 -1
  290. package/lib/typescript/commonjs/index.d.ts +2 -0
  291. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  292. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts +0 -51
  293. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts.map +1 -1
  294. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +30 -11
  295. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  296. package/lib/typescript/commonjs/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  297. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts +0 -7
  298. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts.map +1 -1
  299. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  300. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +1 -2
  301. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  302. package/lib/typescript/commonjs/ui/components/ProfileButton.d.ts.map +1 -1
  303. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
  304. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts +1 -1
  305. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts.map +1 -1
  306. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts +1 -1
  307. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  308. package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts.map +1 -1
  309. package/lib/typescript/commonjs/ui/components/payment/types.d.ts +6 -6
  310. package/lib/typescript/commonjs/ui/components/payment/types.d.ts.map +1 -1
  311. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  312. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +40 -0
  313. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +2 -11
  315. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  316. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +7 -26
  317. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  318. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +1 -0
  319. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  320. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  321. package/lib/typescript/commonjs/ui/hooks/queries/paymentTypes.d.ts +2 -3
  322. package/lib/typescript/commonjs/ui/hooks/queries/paymentTypes.d.ts.map +1 -1
  323. package/lib/typescript/commonjs/ui/hooks/queries/usePaymentQueries.d.ts +2 -3
  324. package/lib/typescript/commonjs/ui/hooks/queries/usePaymentQueries.d.ts.map +1 -1
  325. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts +2 -2
  326. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts.map +1 -1
  327. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +1 -1
  328. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts.map +1 -1
  329. package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts +2 -2
  330. package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts.map +1 -1
  331. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +2 -4
  332. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  333. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts +2 -3
  334. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts.map +1 -1
  335. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  336. package/lib/typescript/commonjs/ui/hooks/useSurfaceHeader.d.ts +2 -7
  337. package/lib/typescript/commonjs/ui/hooks/useSurfaceHeader.d.ts.map +1 -1
  338. package/lib/typescript/commonjs/ui/oauth/browserAuthTransport.d.ts.map +1 -1
  339. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts +40 -0
  340. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts.map +1 -0
  341. package/lib/typescript/commonjs/ui/oauth/oauthPopup.d.ts +0 -6
  342. package/lib/typescript/commonjs/ui/oauth/oauthPopup.d.ts.map +1 -1
  343. package/lib/typescript/commonjs/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  344. package/lib/typescript/commonjs/ui/screens/ChangeAvatarScreen.d.ts.map +1 -1
  345. package/lib/typescript/commonjs/ui/screens/CreateAccountScreen.d.ts.map +1 -1
  346. package/lib/typescript/commonjs/ui/screens/EditProfileScreen.d.ts.map +1 -1
  347. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts +2 -2
  348. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  349. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +0 -3
  350. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -1
  351. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +0 -3
  352. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -1
  353. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  354. package/lib/typescript/commonjs/ui/screens/ManageAccountScreen.d.ts.map +1 -1
  355. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  356. package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
  357. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +0 -7
  358. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
  359. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  360. package/lib/typescript/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.d.ts.map +1 -1
  361. package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  362. package/lib/typescript/commonjs/ui/screens/trust/trustTier.d.ts +1 -1
  363. package/lib/typescript/commonjs/ui/screens/trust/trustTier.d.ts.map +1 -1
  364. package/lib/typescript/commonjs/ui/session/index.d.ts +0 -1
  365. package/lib/typescript/commonjs/ui/session/index.d.ts.map +1 -1
  366. package/lib/typescript/commonjs/ui/types/navigation.d.ts +19 -27
  367. package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
  368. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts +43 -0
  369. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +1 -0
  370. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +5 -5
  371. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  372. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +12 -15
  373. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
  374. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts +14 -7
  375. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -1
  376. package/lib/typescript/module/index.d.ts +2 -0
  377. package/lib/typescript/module/index.d.ts.map +1 -1
  378. package/lib/typescript/module/notifications/deviceNotifications.d.ts +0 -51
  379. package/lib/typescript/module/notifications/deviceNotifications.d.ts.map +1 -1
  380. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +30 -11
  381. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  382. package/lib/typescript/module/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  383. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts +0 -7
  384. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts.map +1 -1
  385. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  386. package/lib/typescript/module/ui/components/OxySignInButton.d.ts +1 -2
  387. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  388. package/lib/typescript/module/ui/components/ProfileButton.d.ts.map +1 -1
  389. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
  390. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts +1 -1
  391. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts.map +1 -1
  392. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts +1 -1
  393. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  394. package/lib/typescript/module/ui/components/internal/PinInput.d.ts.map +1 -1
  395. package/lib/typescript/module/ui/components/payment/types.d.ts +6 -6
  396. package/lib/typescript/module/ui/components/payment/types.d.ts.map +1 -1
  397. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  398. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +40 -0
  399. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
  400. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +2 -11
  401. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  402. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +7 -26
  403. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  404. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +1 -0
  405. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  406. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  407. package/lib/typescript/module/ui/hooks/queries/paymentTypes.d.ts +2 -3
  408. package/lib/typescript/module/ui/hooks/queries/paymentTypes.d.ts.map +1 -1
  409. package/lib/typescript/module/ui/hooks/queries/usePaymentQueries.d.ts +2 -3
  410. package/lib/typescript/module/ui/hooks/queries/usePaymentQueries.d.ts.map +1 -1
  411. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts +2 -2
  412. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts.map +1 -1
  413. package/lib/typescript/module/ui/hooks/useAssets.d.ts +1 -1
  414. package/lib/typescript/module/ui/hooks/useAssets.d.ts.map +1 -1
  415. package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts +2 -2
  416. package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts.map +1 -1
  417. package/lib/typescript/module/ui/hooks/useAuth.d.ts +2 -4
  418. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  419. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts +2 -3
  420. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts.map +1 -1
  421. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  422. package/lib/typescript/module/ui/hooks/useSurfaceHeader.d.ts +2 -7
  423. package/lib/typescript/module/ui/hooks/useSurfaceHeader.d.ts.map +1 -1
  424. package/lib/typescript/module/ui/oauth/browserAuthTransport.d.ts.map +1 -1
  425. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts +40 -0
  426. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts.map +1 -0
  427. package/lib/typescript/module/ui/oauth/oauthPopup.d.ts +0 -6
  428. package/lib/typescript/module/ui/oauth/oauthPopup.d.ts.map +1 -1
  429. package/lib/typescript/module/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  430. package/lib/typescript/module/ui/screens/ChangeAvatarScreen.d.ts.map +1 -1
  431. package/lib/typescript/module/ui/screens/CreateAccountScreen.d.ts.map +1 -1
  432. package/lib/typescript/module/ui/screens/EditProfileScreen.d.ts.map +1 -1
  433. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts +2 -2
  434. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  435. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +0 -3
  436. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -1
  437. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +0 -3
  438. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -1
  439. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  440. package/lib/typescript/module/ui/screens/ManageAccountScreen.d.ts.map +1 -1
  441. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  442. package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
  443. package/lib/typescript/module/ui/screens/UserListScreen.d.ts +0 -7
  444. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
  445. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  446. package/lib/typescript/module/ui/screens/fileManagement/hooks/useFileUploadState.d.ts.map +1 -1
  447. package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  448. package/lib/typescript/module/ui/screens/trust/trustTier.d.ts +1 -1
  449. package/lib/typescript/module/ui/screens/trust/trustTier.d.ts.map +1 -1
  450. package/lib/typescript/module/ui/session/index.d.ts +0 -1
  451. package/lib/typescript/module/ui/session/index.d.ts.map +1 -1
  452. package/lib/typescript/module/ui/types/navigation.d.ts +19 -27
  453. package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
  454. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts +43 -0
  455. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +1 -0
  456. package/lib/typescript/module/ui/utils/fileManagement.d.ts +5 -5
  457. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  458. package/lib/typescript/module/ui/utils/oauthReturn.d.ts +12 -15
  459. package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
  460. package/lib/typescript/module/ui/utils/userUtils.d.ts +14 -7
  461. package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -1
  462. package/package.json +10 -22
  463. package/src/index.ts +16 -18
  464. package/src/notifications/deviceNotifications.ts +0 -82
  465. package/src/ui/boot/__tests__/coldBootWebAuthMode.test.ts +281 -0
  466. package/src/ui/boot/runProviderColdBoot.ts +101 -24
  467. package/src/ui/components/FollowButton.tsx +1 -1
  468. package/src/ui/components/OxyAccountDialogScreen.tsx +1 -13
  469. package/src/ui/components/OxyAuthChooser.tsx +4 -14
  470. package/src/ui/components/OxyProvider.tsx +7 -8
  471. package/src/ui/components/OxySignInButton.tsx +1 -2
  472. package/src/ui/components/ProfileButton.tsx +2 -5
  473. package/src/ui/components/authChooser/AccountsMenuView.tsx +10 -5
  474. package/src/ui/components/authChooser/primitives.tsx +1 -1
  475. package/src/ui/components/authChooser/useUsernameAvailability.ts +1 -1
  476. package/src/ui/components/fileManagement/UploadPreview.tsx +1 -1
  477. package/src/ui/components/internal/PinInput.tsx +0 -1
  478. package/src/ui/components/logo/LogoText.tsx +4 -4
  479. package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
  480. package/src/ui/components/payment/PaymentSummaryStep.tsx +2 -2
  481. package/src/ui/components/payment/types.ts +24 -24
  482. package/src/ui/components/styles/shadow.tsx +2 -2
  483. package/src/ui/context/OxyContext.tsx +46 -35
  484. package/src/ui/context/__tests__/commitSessionFlow.test.ts +89 -13
  485. package/src/ui/context/commitSessionFlow.ts +61 -3
  486. package/src/ui/context/hooks/useAuthOperations.ts +1 -26
  487. package/src/ui/context/oxyContextTypes.ts +7 -26
  488. package/src/ui/context/useOxyAccountGraph.ts +4 -4
  489. package/src/ui/hooks/mutations/mutationFactory.ts +1 -1
  490. package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
  491. package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
  492. package/src/ui/hooks/queries/paymentTypes.ts +2 -3
  493. package/src/ui/hooks/queries/usePaymentQueries.ts +2 -3
  494. package/src/ui/hooks/queries/userCache.ts +148 -169
  495. package/src/ui/hooks/useAssets.ts +1 -1
  496. package/src/ui/hooks/useAsyncAction.ts +3 -3
  497. package/src/ui/hooks/useAuth.ts +2 -4
  498. package/src/ui/hooks/useAvatarPicker.ts +1 -1
  499. package/src/ui/hooks/useOnlineStatus.ts +2 -3
  500. package/src/ui/hooks/useSessionManagement.ts +2 -0
  501. package/src/ui/hooks/useSettingToggle.ts +1 -1
  502. package/src/ui/hooks/useSurfaceHeader.ts +15 -90
  503. package/src/ui/oauth/__tests__/oauthPopup.test.ts +0 -26
  504. package/src/ui/oauth/browserAuthTransport.ts +49 -55
  505. package/src/ui/oauth/legacyRedirectLanes.ts +43 -0
  506. package/src/ui/oauth/oauthPopup.ts +3 -61
  507. package/src/ui/screens/AccountMembersScreen.tsx +1 -1
  508. package/src/ui/screens/AccountSettingsScreen.tsx +17 -45
  509. package/src/ui/screens/AccountVerificationScreen.tsx +1 -1
  510. package/src/ui/screens/AppInfoScreen.tsx +1 -1
  511. package/src/ui/screens/AvatarCropScreen.tsx +1 -1
  512. package/src/ui/screens/ChangeAvatarScreen.tsx +4 -7
  513. package/src/ui/screens/ConnectedAppsScreen.tsx +2 -2
  514. package/src/ui/screens/CreateAccountScreen.tsx +13 -43
  515. package/src/ui/screens/EditProfileFieldScreen.tsx +4 -4
  516. package/src/ui/screens/EditProfileScreen.tsx +3 -6
  517. package/src/ui/screens/FAQScreen.tsx +1 -1
  518. package/src/ui/screens/FeedbackScreen.tsx +575 -741
  519. package/src/ui/screens/FileManagementScreen.tsx +1 -1
  520. package/src/ui/screens/FollowersListScreen.tsx +0 -3
  521. package/src/ui/screens/FollowingListScreen.tsx +0 -3
  522. package/src/ui/screens/HelpSupportScreen.tsx +1 -1
  523. package/src/ui/screens/HistoryViewScreen.tsx +20 -5
  524. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  525. package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
  526. package/src/ui/screens/ManageAccountScreen.tsx +2 -9
  527. package/src/ui/screens/PremiumSubscriptionScreen.tsx +4 -4
  528. package/src/ui/screens/PrivacySettingsScreen.tsx +12 -15
  529. package/src/ui/screens/ProfileScreen.tsx +6 -24
  530. package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
  531. package/src/ui/screens/UserListScreen.tsx +8 -18
  532. package/src/ui/screens/WelcomeNewUserScreen.tsx +6 -6
  533. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +1 -1
  534. package/src/ui/screens/fileManagement/hooks/useFileUploadState.ts +5 -14
  535. package/src/ui/screens/trust/TrustCenterScreen.tsx +2 -2
  536. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +5 -6
  537. package/src/ui/screens/trust/TrustRewardsScreen.tsx +1 -1
  538. package/src/ui/screens/trust/TrustRulesScreen.tsx +1 -1
  539. package/src/ui/screens/trust/trustTier.ts +1 -1
  540. package/src/ui/session/index.ts +0 -1
  541. package/src/ui/types/navigation.ts +19 -27
  542. package/src/ui/utils/__tests__/crossOriginRestore.test.ts +143 -0
  543. package/src/ui/utils/crossOriginRestore.ts +169 -0
  544. package/src/ui/utils/fileManagement.ts +92 -108
  545. package/src/ui/utils/oauthReturn.ts +33 -23
  546. package/src/ui/utils/userUtils.ts +32 -27
  547. package/android/src/main/java/so/oxy/session/OxyBackgroundSession.kt +0 -184
  548. package/android/src/main/java/so/oxy/session/OxyBackgroundSessionApi.kt +0 -162
  549. package/android/src/main/java/so/oxy/session/OxyBackgroundSessionModule.kt +0 -116
  550. package/android/src/main/java/so/oxy/session/OxyBackgroundSessionStore.kt +0 -179
  551. package/android/src/main/java/so/oxy/session/OxyBackgroundToken.kt +0 -61
  552. package/android/src/main/java/so/oxy/storage/OxyEncryptedPrefs.kt +0 -241
  553. package/lib/commonjs/ui/session/backgroundSession.js +0 -258
  554. package/lib/commonjs/ui/session/backgroundSession.js.map +0 -1
  555. package/lib/commonjs/ui/session/useBackgroundSessionSync.js +0 -81
  556. package/lib/commonjs/ui/session/useBackgroundSessionSync.js.map +0 -1
  557. package/lib/commonjs/ui/utils/netConnectivity.js +0 -28
  558. package/lib/commonjs/ui/utils/netConnectivity.js.map +0 -1
  559. package/lib/module/ui/session/backgroundSession.js +0 -252
  560. package/lib/module/ui/session/backgroundSession.js.map +0 -1
  561. package/lib/module/ui/session/useBackgroundSessionSync.js +0 -76
  562. package/lib/module/ui/session/useBackgroundSessionSync.js.map +0 -1
  563. package/lib/module/ui/utils/netConnectivity.js +0 -23
  564. package/lib/module/ui/utils/netConnectivity.js.map +0 -1
  565. package/lib/typescript/commonjs/ui/session/backgroundSession.d.ts +0 -42
  566. package/lib/typescript/commonjs/ui/session/backgroundSession.d.ts.map +0 -1
  567. package/lib/typescript/commonjs/ui/session/useBackgroundSessionSync.d.ts +0 -23
  568. package/lib/typescript/commonjs/ui/session/useBackgroundSessionSync.d.ts.map +0 -1
  569. package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts +0 -17
  570. package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts.map +0 -1
  571. package/lib/typescript/module/ui/session/backgroundSession.d.ts +0 -42
  572. package/lib/typescript/module/ui/session/backgroundSession.d.ts.map +0 -1
  573. package/lib/typescript/module/ui/session/useBackgroundSessionSync.d.ts +0 -23
  574. package/lib/typescript/module/ui/session/useBackgroundSessionSync.d.ts.map +0 -1
  575. package/lib/typescript/module/ui/utils/netConnectivity.d.ts +0 -17
  576. package/lib/typescript/module/ui/utils/netConnectivity.d.ts.map +0 -1
  577. package/lib/typescript/types/expo-image-picker.d.ts +0 -35
  578. package/src/types/expo-image-picker.d.ts +0 -35
  579. package/src/ui/boot/__tests__/coldBootNoIdpRedirect.test.ts +0 -215
  580. package/src/ui/session/__tests__/backgroundSession.test.ts +0 -392
  581. package/src/ui/session/backgroundSession.ts +0 -313
  582. package/src/ui/session/useBackgroundSessionSync.ts +0 -92
  583. package/src/ui/utils/netConnectivity.ts +0 -27
@@ -8,25 +8,6 @@
8
8
  * already lives in `@oxyhq/core`; core may never import an `expo-*` module, and
9
9
  * this adapter is the Expo-side half that closes that gap.
10
10
  *
11
- * ## Reached through its OWN entry point, never the root barrel
12
- *
13
- * ```ts
14
- * import { getExpoPushToken } from '@oxyhq/services/notifications';
15
- * ```
16
- *
17
- * This is the only module in the package that depends on peers an app which
18
- * does not use push genuinely never installs, and a barrel export would put it
19
- * in EVERY consumer's import graph. `tsc` resolves the specifier of an
20
- * `import()` even when the call is lazy and inside a try/catch, so a barrel
21
- * export turned "optional peer" into a hard requirement: consumers with no
22
- * interest in push failed to type-check with TS2307. The subpath is what keeps
23
- * the optionality honest — see the note in `src/index.ts`.
24
- *
25
- * Metro is the resolver that behaves differently here, and in the useful
26
- * direction: an unresolvable DYNAMIC `import()` bundles fine (the `catch` below
27
- * takes over at runtime), where a static import fails the build outright. That
28
- * is why the runtime shape below must stay dynamic-and-guarded.
29
- *
30
11
  * ## Native-only by construction
31
12
  *
32
13
  * Every entry point resolves its null/no-op result from `Platform.OS` BEFORE the
@@ -316,69 +297,6 @@ export type ForegroundPresentation = 'show' | 'suppress';
316
297
  */
317
298
  let foregroundHandlerAttempted = false;
318
299
 
319
- /** How prominently Android surfaces a channel's notifications. */
320
- export type NotificationChannelImportance = 'default' | 'high';
321
-
322
- /** An Android notification channel this app delivers on. */
323
- export interface NotificationChannelSpec {
324
- /**
325
- * The channel id. It MUST match the id the sender attaches: Android 8+ drops
326
- * a notification whose channel the app has not created, silently and with no
327
- * error on either side, which is the hardest push symptom there is to
328
- * diagnose. Ids that cross the wire belong in `@oxyhq/contracts`, not in a
329
- * string typed on both sides.
330
- */
331
- id: string;
332
- /** User-visible channel name — app copy, so the caller localizes it. */
333
- name: string;
334
- /** User-visible description shown in Android's notification settings. */
335
- description?: string;
336
- importance?: NotificationChannelImportance;
337
- }
338
-
339
- /**
340
- * Create (or update) an Android notification channel.
341
- *
342
- * A no-op everywhere but Android: iOS has no channels, and web never loads the
343
- * native module. Call it BEFORE registering a push token, so the very first
344
- * notification the server sends already has a channel to land on.
345
- *
346
- * Failure is non-fatal and logged: a missing channel costs visibility, and
347
- * refusing to register a token over it would cost the feature entirely.
348
- *
349
- * @returns Whether the channel was actually created (`false` off Android, or
350
- * when the native module is unavailable, or when creation failed).
351
- */
352
- export async function ensureNotificationChannel(
353
- spec: NotificationChannelSpec,
354
- ): Promise<boolean> {
355
- if (Platform.OS !== 'android') {
356
- return false;
357
- }
358
- const notifications = await loadNotifications();
359
- if (!notifications) {
360
- return false;
361
- }
362
- try {
363
- await notifications.setNotificationChannelAsync(spec.id, {
364
- name: spec.name,
365
- importance:
366
- spec.importance === 'high'
367
- ? notifications.AndroidImportance.HIGH
368
- : notifications.AndroidImportance.DEFAULT,
369
- ...(spec.description ? { description: spec.description } : {}),
370
- });
371
- return true;
372
- } catch (error) {
373
- log.warn(
374
- 'could not create the notification channel',
375
- { method: 'ensureNotificationChannel', channelId: spec.id },
376
- error,
377
- );
378
- return false;
379
- }
380
- }
381
-
382
300
  /**
383
301
  * Install the ONE process-wide handler that decides whether an incoming
384
302
  * notification is shown while the app is in the FOREGROUND.
@@ -0,0 +1,281 @@
1
+ /**
2
+ * `runProviderColdBoot` — the `webAuthMode` transport gate (#691 phase 7).
3
+ *
4
+ * `webAuthMode: 'popup'` must never let the boot navigate the RP's top-level
5
+ * window: no silent `prompt=none` restore, no authorize redirect, a signed-out
6
+ * domain simply resolves signed out. `'redirect'` — still the default and the
7
+ * compatibility path — must behave exactly as before.
8
+ *
9
+ * Unlike `__tests__/boot/runProviderColdBoot.test.ts` (deadline + connectivity
10
+ * wiring, with `crossOriginRestore` stubbed out), this suite keeps the restore
11
+ * lane REAL so the redirect-mode assertions reach the actual navigation
12
+ * primitive — the thing popup mode has to suppress.
13
+ */
14
+
15
+ import type { AuthStateStore, PersistedAuthState, SessionClient } from '@oxyhq/core';
16
+
17
+ // Only `runSessionColdBoot` and the origin-CLASSIFICATION predicates are faked.
18
+ // jsdom's `location` is non-configurable, so origin eligibility has to be driven
19
+ // through the predicates (their real behaviour is covered by core's own tests);
20
+ // everything else in core (PKCE, authorize-URL builder, handshake store) stays
21
+ // real so the redirect-mode lane is exercised end to end.
22
+ jest.mock('@oxyhq/core', () => {
23
+ const actual = jest.requireActual('@oxyhq/core');
24
+ return {
25
+ __esModule: true,
26
+ ...actual,
27
+ runSessionColdBoot: jest.fn(),
28
+ isLoopbackOrigin: jest.fn(() => false),
29
+ isOfficialWebOrigin: jest.fn(() => true),
30
+ isIdpHubOrigin: jest.fn(() => false),
31
+ };
32
+ });
33
+
34
+ // The ONLY top-level-window navigation primitive either lane can reach.
35
+ jest.mock('../../components/oauthNavigation', () => ({
36
+ redirectToAuthorize: jest.fn(),
37
+ }));
38
+
39
+ // Spied but REAL: redirect mode must still perform the actual restore.
40
+ jest.mock('../../utils/crossOriginRestore', () => {
41
+ const actual = jest.requireActual('../../utils/crossOriginRestore');
42
+ return {
43
+ __esModule: true,
44
+ ...actual,
45
+ maybeStartSilentOAuthRestore: jest.fn(actual.maybeStartSilentOAuthRestore),
46
+ consumeSilentOAuthError: jest.fn(actual.consumeSilentOAuthError),
47
+ };
48
+ });
49
+
50
+ jest.mock('../../utils/oauthReturn', () => {
51
+ const actual = jest.requireActual('../../utils/oauthReturn');
52
+ return {
53
+ __esModule: true,
54
+ ...actual,
55
+ tryCompleteOAuthReturn: jest.fn(async () => false),
56
+ consumeHubSyncFailure: jest.fn(actual.consumeHubSyncFailure),
57
+ };
58
+ });
59
+
60
+ import { runSessionColdBoot } from '@oxyhq/core';
61
+ import { redirectToAuthorize } from '../../components/oauthNavigation';
62
+ import {
63
+ clearCrossOriginRestoreGuards,
64
+ consumeSilentOAuthError,
65
+ maybeStartSilentOAuthRestore,
66
+ } from '../../utils/crossOriginRestore';
67
+ import { consumeHubSyncFailure, tryCompleteOAuthReturn } from '../../utils/oauthReturn';
68
+ import { runProviderColdBoot, type RunProviderColdBootOptions } from '../runProviderColdBoot';
69
+
70
+ const mockRunSessionColdBoot = runSessionColdBoot as jest.Mock;
71
+ const mockRedirectToAuthorize = redirectToAuthorize as jest.Mock;
72
+ const mockSilentRestore = maybeStartSilentOAuthRestore as jest.Mock;
73
+ const mockConsumeSilentOAuthError = consumeSilentOAuthError as jest.Mock;
74
+ const mockConsumeHubSyncFailure = consumeHubSyncFailure as jest.Mock;
75
+ const mockTryCompleteOAuthReturn = tryCompleteOAuthReturn as jest.Mock;
76
+
77
+ const CLIENT_ID = 'oxy_dk_test';
78
+
79
+ /** An auth store holding no device credential — the signed-out domain case. */
80
+ function makeEmptyAuthStore(): AuthStateStore {
81
+ return {
82
+ load: jest.fn(async (): Promise<PersistedAuthState | null> => null),
83
+ save: jest.fn(async () => undefined),
84
+ clear: jest.fn(async () => undefined),
85
+ } as unknown as AuthStateStore;
86
+ }
87
+
88
+ interface Harness {
89
+ options: RunProviderColdBootOptions;
90
+ commitSession: jest.Mock;
91
+ markAuthResolved: jest.Mock;
92
+ setTokenReady: jest.Mock;
93
+ sessionClientStart: jest.Mock;
94
+ }
95
+
96
+ function makeHarness(overrides: Partial<RunProviderColdBootOptions> = {}): Harness {
97
+ const commitSession = jest.fn(async () => undefined);
98
+ const markAuthResolved = jest.fn();
99
+ const setTokenReady = jest.fn();
100
+ const sessionClientStart = jest.fn(async () => undefined);
101
+
102
+ const options: RunProviderColdBootOptions = {
103
+ oxyServices: {} as RunProviderColdBootOptions['oxyServices'],
104
+ authStore: makeEmptyAuthStore(),
105
+ clientId: CLIENT_ID,
106
+ sessionClient: { start: sessionClientStart } as unknown as SessionClient,
107
+ syncDeviceCredentialToHost: jest.fn(async () => undefined),
108
+ commitSession,
109
+ markAuthResolved,
110
+ setTokenReady,
111
+ ...overrides,
112
+ };
113
+
114
+ return { options, commitSession, markAuthResolved, setTokenReady, sessionClientStart };
115
+ }
116
+
117
+ /** `runSessionColdBoot` finding no session at all — the signed-out domain. */
118
+ function stubSignedOutBoot(): void {
119
+ mockRunSessionColdBoot.mockImplementation(async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
120
+ await opts.onSignedOut?.('no_session');
121
+ return { kind: 'unauthenticated' } as const;
122
+ });
123
+ }
124
+
125
+ describe('runProviderColdBoot — webAuthMode transport gate (#691 phase 7)', () => {
126
+ beforeEach(() => {
127
+ mockRunSessionColdBoot.mockReset();
128
+ mockRedirectToAuthorize.mockClear();
129
+ mockSilentRestore.mockClear();
130
+ mockConsumeSilentOAuthError.mockClear();
131
+ mockConsumeHubSyncFailure.mockClear();
132
+ mockTryCompleteOAuthReturn.mockClear();
133
+ mockTryCompleteOAuthReturn.mockImplementation(async () => false);
134
+ globalThis.sessionStorage?.clear();
135
+ clearCrossOriginRestoreGuards();
136
+ });
137
+
138
+ describe("webAuthMode: 'popup'", () => {
139
+ it('never starts the silent restore and never navigates the top-level window', async () => {
140
+ stubSignedOutBoot();
141
+ const { options } = makeHarness({ webAuthMode: 'popup' });
142
+
143
+ await runProviderColdBoot(options);
144
+
145
+ expect(mockSilentRestore).not.toHaveBeenCalled();
146
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
147
+ });
148
+
149
+ it('resolves a domain with no local credential SIGNED OUT instead of bouncing', async () => {
150
+ stubSignedOutBoot();
151
+ const { options, markAuthResolved, commitSession, sessionClientStart } = makeHarness({
152
+ webAuthMode: 'popup',
153
+ });
154
+
155
+ await runProviderColdBoot(options);
156
+
157
+ // Auth resolution concluded (routing can settle), nothing was committed,
158
+ // and with no persisted credential the device socket is not started.
159
+ expect(markAuthResolved).toHaveBeenCalled();
160
+ expect(commitSession).not.toHaveBeenCalled();
161
+ expect(sessionClientStart).not.toHaveBeenCalled();
162
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
163
+ });
164
+
165
+ it('still completes an authorization code already on the URL (blocked-popup fallback)', async () => {
166
+ // A popup-mode app lands here whenever the browser blocked the popup and
167
+ // `startWebOAuthSignIn` fell back to a full-page redirect.
168
+ mockTryCompleteOAuthReturn.mockImplementation(async () => true);
169
+ const { options, markAuthResolved, setTokenReady } = makeHarness({ webAuthMode: 'popup' });
170
+
171
+ await runProviderColdBoot(options);
172
+
173
+ expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
174
+ expect(setTokenReady).toHaveBeenLastCalledWith(true);
175
+ expect(markAuthResolved).toHaveBeenCalled();
176
+ // The device mint is short-circuited by the completed return leg.
177
+ expect(mockRunSessionColdBoot).not.toHaveBeenCalled();
178
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
179
+ });
180
+
181
+ it('commits the OAuth return WITHOUT hub sync', async () => {
182
+ mockTryCompleteOAuthReturn.mockImplementation(async () => true);
183
+ const { options } = makeHarness({ webAuthMode: 'popup' });
184
+
185
+ await runProviderColdBoot(options);
186
+
187
+ const commit = mockTryCompleteOAuthReturn.mock.calls[0][0] as {
188
+ commitSession: (input: unknown) => Promise<void>;
189
+ };
190
+ await commit.commitSession({ sessionId: 's1', userId: 'u1' });
191
+ expect(options.commitSession).toHaveBeenCalledWith(
192
+ { sessionId: 's1', userId: 'u1' },
193
+ { activate: true, hubSync: false },
194
+ );
195
+ });
196
+ });
197
+
198
+ describe("webAuthMode: 'redirect' (unchanged compatibility path)", () => {
199
+ it('starts the silent restore and navigates to the IdP with prompt=none', async () => {
200
+ stubSignedOutBoot();
201
+ const { options } = makeHarness({ webAuthMode: 'redirect' });
202
+
203
+ await runProviderColdBoot(options);
204
+
205
+ expect(mockSilentRestore).toHaveBeenCalledTimes(1);
206
+ expect(mockRedirectToAuthorize).toHaveBeenCalledTimes(1);
207
+ const url = new URL(mockRedirectToAuthorize.mock.calls[0][0] as string);
208
+ expect(url.origin + url.pathname).toBe('https://auth.oxy.so/authorize');
209
+ expect(url.searchParams.get('client_id')).toBe(CLIENT_ID);
210
+ expect(url.searchParams.get('prompt')).toBe('none');
211
+ });
212
+
213
+ it('is the DEFAULT when no webAuthMode is supplied', async () => {
214
+ stubSignedOutBoot();
215
+ const { options } = makeHarness();
216
+
217
+ await runProviderColdBoot(options);
218
+
219
+ expect(mockSilentRestore).toHaveBeenCalledTimes(1);
220
+ expect(mockRedirectToAuthorize).toHaveBeenCalledTimes(1);
221
+ });
222
+
223
+ it('does NOT restore when the mint already resolved a session', async () => {
224
+ mockRunSessionColdBoot.mockImplementation(async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
225
+ const session = { sessionId: 's1', userId: 'u1', accessToken: 'at', via: 'device-secret-mint' };
226
+ await opts.onSession?.(session);
227
+ return { kind: 'session', via: session.via, session } as const;
228
+ });
229
+ const { options, commitSession } = makeHarness({ webAuthMode: 'redirect' });
230
+
231
+ await runProviderColdBoot(options);
232
+
233
+ expect(commitSession).toHaveBeenCalledWith(
234
+ { sessionId: 's1', accessToken: 'at', userId: 'u1' },
235
+ { activate: false },
236
+ );
237
+ expect(mockSilentRestore).not.toHaveBeenCalled();
238
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
239
+ });
240
+ });
241
+
242
+ describe('URL-cleanup consumers run in BOTH modes', () => {
243
+ it.each(['popup', 'redirect'] as const)(
244
+ 'consumes the silent-OAuth error and hub-sync failure params (%s)',
245
+ async (webAuthMode) => {
246
+ stubSignedOutBoot();
247
+ const { options } = makeHarness({ webAuthMode });
248
+
249
+ await runProviderColdBoot(options);
250
+
251
+ expect(mockConsumeSilentOAuthError).toHaveBeenCalledTimes(1);
252
+ expect(mockConsumeHubSyncFailure).toHaveBeenCalledTimes(1);
253
+ },
254
+ );
255
+
256
+ it.each(['popup', 'redirect'] as const)(
257
+ 'consumes an authorization code left on the URL (%s)',
258
+ async (webAuthMode) => {
259
+ stubSignedOutBoot();
260
+ const { options } = makeHarness({ webAuthMode });
261
+
262
+ await runProviderColdBoot(options);
263
+
264
+ expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
265
+ },
266
+ );
267
+ });
268
+
269
+ describe('identity mode still skips both web OAuth lanes in either transport', () => {
270
+ it.each(['popup', 'redirect'] as const)('skips the return leg and the restore (%s)', async (webAuthMode) => {
271
+ stubSignedOutBoot();
272
+ const { options } = makeHarness({ webAuthMode, sessionMode: 'identity' });
273
+
274
+ await runProviderColdBoot(options);
275
+
276
+ expect(mockTryCompleteOAuthReturn).not.toHaveBeenCalled();
277
+ expect(mockSilentRestore).not.toHaveBeenCalled();
278
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
279
+ });
280
+ });
281
+ });
@@ -8,9 +8,15 @@ import {
8
8
  } from '@oxyhq/core';
9
9
  import type { SessionClient } from '@oxyhq/core';
10
10
  import { loadPersistedDeviceCredential } from '../utils/deviceCredential';
11
- import { tryCompleteOAuthReturn } from '../utils/oauthReturn';
11
+ import {
12
+ consumeSilentOAuthError,
13
+ isSilentRestoreEligibleOrigin,
14
+ maybeStartSilentOAuthRestore,
15
+ } from '../utils/crossOriginRestore';
16
+ import { tryCompleteOAuthReturn, consumeHubSyncFailure } from '../utils/oauthReturn';
12
17
  import { isWebBrowser } from '../utils/isWebBrowser';
13
- import { isNetConnectivityExplicitlyOffline } from '../utils/netConnectivity';
18
+ import { allowsAutomaticIdpRedirect } from '../oauth/legacyRedirectLanes';
19
+ import type { WebAuthMode } from '../oauth/types';
14
20
  import type { CommitInput } from '../context/oxyContextTypes';
15
21
 
16
22
  /** How long the cold boot waits for the post-boot SessionClient handoff (ms). */
@@ -61,8 +67,8 @@ async function detectOfflineHint(): Promise<boolean> {
61
67
  }),
62
68
  ]);
63
69
  // `null` ⇒ the probe timed out (unknown → assume online). Only an explicit
64
- // disconnected / unreachable verdict disables the network steps.
65
- return isNetConnectivityExplicitlyOffline(state);
70
+ // `isConnected === false` disables the network steps.
71
+ return state?.isConnected === false;
66
72
  } catch {
67
73
  // NetInfo missing / probe threw — never block sign-in on a probe failure.
68
74
  return false;
@@ -74,19 +80,39 @@ export interface RunProviderColdBootOptions {
74
80
  authStore: AuthStateStore;
75
81
  clientId?: string;
76
82
  authRedirectUri?: string;
83
+ /**
84
+ * Authorize endpoint override for silent cross-origin restore. Defaults to
85
+ * the production Oxy IdP when unset; a local/staging deployment sets it so the
86
+ * silent-restore redirect targets its own IdP, never production.
87
+ */
88
+ authorizeBaseUrl?: string;
77
89
  /**
78
90
  * Who owns the session this boot resolves. `'account'` (the default) is the
79
91
  * device's active account — every ordinary Oxy app. `'identity'` binds the
80
92
  * boot to the owner of this device's PRIMARY identity key and REQUIRES
81
- * {@link identity}; it also disables the web OAuth return leg below, which
82
- * commits whatever account the IdP hands back.
93
+ * {@link identity}; it also disables the two web OAuth lanes below, which
94
+ * commit whatever account the IdP hands back.
83
95
  */
84
96
  sessionMode?: SessionMode;
85
97
  /** The identity binding required by `sessionMode: 'identity'`. */
86
98
  identity?: IdentityBinding;
99
+ /**
100
+ * How this provider's WEB sign-in reaches the IdP
101
+ * (`OxyProviderProps.webAuthMode`).
102
+ *
103
+ * A first-class INPUT to the boot, not a UI-only concern: `'popup'` forbids
104
+ * the automatic full-page `prompt=none` restore in step 3, so a domain with no
105
+ * local credential resolves SIGNED OUT instead of bouncing the top-level
106
+ * window to `auth.oxy.so`. See `allowsAutomaticIdpRedirect`.
107
+ * @default 'redirect'
108
+ */
109
+ webAuthMode?: WebAuthMode;
87
110
  sessionClient: SessionClient;
88
111
  syncDeviceCredentialToHost: () => Promise<void>;
89
- commitSession: (input: CommitInput, options: { activate: boolean }) => Promise<void>;
112
+ commitSession: (
113
+ input: CommitInput,
114
+ options: { activate: boolean; hubSync?: boolean },
115
+ ) => Promise<void>;
90
116
  markAuthResolved: () => void;
91
117
  setTokenReady: (ready: boolean) => void;
92
118
  }
@@ -95,19 +121,19 @@ export interface RunProviderColdBootOptions {
95
121
  * Device-first cold boot for `@oxyhq/services` providers.
96
122
  *
97
123
  * Ordered pipeline:
98
- * 1. Complete an OAuth authorization-code return already on the URL (web)
124
+ * 1. Complete OAuth authorization-code return (web)
99
125
  * 2. `runSessionColdBoot` — device-secret mint (+ native shared-key, or the
100
126
  * primary-identity-key lane in `sessionMode: 'identity'`)
127
+ * 3. Silent OAuth for all web apps when mint finds no session
101
128
  *
102
- * Step 1 is ACCOUNT-MODE ONLY: it commits whichever account the IdP resolves,
103
- * which for an identity-bound client is somebody else's account by construction.
104
- * In `'identity'` mode the boot is exactly step 2.
129
+ * Steps 1 and 3 are ACCOUNT-MODE ONLY: both commit whichever account the IdP
130
+ * resolves, which for an identity-bound client is somebody else's account by
131
+ * construction. In `'identity'` mode the boot is exactly step 2.
105
132
  *
106
- * The boot NEVER navigates the top-level window. There is no automatic
107
- * `prompt=none` bounce to the IdP: a web origin with no local device credential
108
- * resolves SIGNED OUT and waits for the user's next explicit "Continue with
109
- * Oxy", which opens a popup from a real gesture (#691 phase 7b). Step 1 is not a
110
- * navigation — it only consumes a code that is already in the address bar.
133
+ * Step 3 is additionally REDIRECT-MODE ONLY: it navigates the top-level window
134
+ * with no user gesture behind it, which `webAuthMode: 'popup'` exists to
135
+ * eliminate. In popup mode the boot is steps 1 and 2, and a domain with no local
136
+ * credential simply resolves signed out. See `allowsAutomaticIdpRedirect`.
111
137
  */
112
138
  export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Promise<void> {
113
139
  const {
@@ -115,8 +141,10 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
115
141
  authStore,
116
142
  clientId,
117
143
  authRedirectUri,
144
+ authorizeBaseUrl,
118
145
  sessionMode = 'account',
119
146
  identity,
147
+ webAuthMode = 'redirect',
120
148
  sessionClient,
121
149
  syncDeviceCredentialToHost,
122
150
  commitSession,
@@ -129,19 +157,28 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
129
157
  setTokenReady(false);
130
158
 
131
159
  try {
132
- // The redirect transport's RETURN leg. An app reaches it whenever the browser
133
- // BLOCKED the sign-in popup and `startWebOAuthSignIn` fell back to a
134
- // full-page redirect (`popup-blocked` / `popup-navigation-failed`), so it is
135
- // load-bearing even though nothing here ever starts a redirect. It consumes a
136
- // code (or a stale OAuth `error`) already in the address bar and rewrites the
137
- // URL via `history.replaceState`; it never begins a navigation.
160
+ // MODE-INDEPENDENT URL cleanup, deliberately so: both consume query params a
161
+ // PREVIOUS redirect-mode session left in the address bar (`?error=login_required`
162
+ // from a silent authorize, `?hub_sync=failed` from the hub) and restore the
163
+ // page the visit started on. Flipping an app to popup mode must not strand
164
+ // those params, so neither is gated on `webAuthMode`. Neither starts a
165
+ // navigation — they only rewrite the URL via `history.replaceState`.
166
+ consumeSilentOAuthError();
167
+ consumeHubSyncFailure();
168
+
169
+ // The redirect transport's RETURN leg — also NOT gated on `webAuthMode`. A
170
+ // popup-mode app legitimately lands here with `?code=` whenever the browser
171
+ // blocked the popup and `startWebOAuthSignIn` fell back to a full-page
172
+ // redirect (`popup-blocked` / `popup-navigation-failed`), and an app that
173
+ // switched modes mid-flight must not be stranded with a dead `?code=`
174
+ // either. It consumes a code already on the URL; it never starts one.
138
175
  const oauthCompleted = identityBound
139
176
  ? false
140
177
  : await tryCompleteOAuthReturn({
141
178
  oxyServices,
142
179
  clientId,
143
180
  authRedirectUri,
144
- commitSession: (input) => commitSession(input, { activate: true }),
181
+ commitSession: (input) => commitSession(input, { activate: true, hubSync: false }),
145
182
  });
146
183
  if (oauthCompleted) {
147
184
  setTokenReady(true);
@@ -155,7 +192,7 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
155
192
  // resolves to "online" — the network steps still run.
156
193
  const offline = await detectOfflineHint();
157
194
 
158
- await runSessionColdBoot({
195
+ const outcome = await runSessionColdBoot({
159
196
  oxy: oxyServices,
160
197
  store: authStore,
161
198
  platform: { isWeb: isWebBrowser(), isNative: !isWebBrowser() },
@@ -222,6 +259,46 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
222
259
  }
223
260
  },
224
261
  });
262
+
263
+ // Silent cross-origin OAuth restore (web cross-app SSO): a full-page
264
+ // `prompt=none` bounce to the IdP when the mint found no local session.
265
+ //
266
+ // TRANSPORT gate (`allowsAutomaticIdpRedirect`): `webAuthMode: 'popup'`
267
+ // FORBIDS this lane. It navigates the top-level window with no user gesture
268
+ // behind it, which is precisely what popup mode exists to eliminate — a
269
+ // popup-mode domain without a local credential resolves signed out right
270
+ // here and waits for the user's next explicit "Continue with Oxy" (issue
271
+ // #691, "Cold boot and cross-domain behavior"). `'redirect'` — still the
272
+ // default and the compatibility path — reaches this lane unchanged, and this
273
+ // whole block disappears with the transport in phase 7b.
274
+ //
275
+ // ORIGIN gate: same as the hub-sync WRITE side (`syncHubAfterSignIn`) —
276
+ // official web origins only, never the IdP hub itself, and — unlike the
277
+ // write side — never a loopback / local-dev origin (which must not be
278
+ // bounced to a hosted IdP on cold boot). The authorize endpoint is
279
+ // env-configurable so a local/staging app targets its own IdP instead of
280
+ // production.
281
+ const webOrigin = isWebBrowser()
282
+ ? (globalThis as { location?: Location }).location?.origin
283
+ : undefined;
284
+ if (
285
+ !identityBound &&
286
+ allowsAutomaticIdpRedirect(webAuthMode) &&
287
+ clientId &&
288
+ outcome.kind !== 'session' &&
289
+ webOrigin &&
290
+ isSilentRestoreEligibleOrigin(webOrigin)
291
+ ) {
292
+ const redirected = await maybeStartSilentOAuthRestore({
293
+ oxyServices,
294
+ clientId,
295
+ redirectUri: authRedirectUri,
296
+ authorizeBaseUrl,
297
+ });
298
+ if (redirected) {
299
+ return;
300
+ }
301
+ }
225
302
  } catch (error) {
226
303
  if (__DEV__) {
227
304
  loggerUtil.error(
@@ -6,7 +6,7 @@ import type {
6
6
  StyleProp,
7
7
  } from 'react-native';
8
8
  import { useOxy } from '../context/OxyContext';
9
- import { toast } from '@oxyhq/bloom/toast';
9
+ import { toast } from '@oxyhq/bloom';
10
10
  import { Button } from '@oxyhq/bloom/button';
11
11
  import { Loading } from '@oxyhq/bloom/loading';
12
12
  import { useFollow, useFollowForButton } from '../hooks/useFollow';
@@ -75,19 +75,7 @@ const OxyAccountDialogScreen: React.FC<BaseScreenProps> = ({ canGoBack }) => {
75
75
  const { view } = snapshot;
76
76
  const showBack =
77
77
  view === 'qr' || view === 'signup' || (view === 'add' && snapshot.accounts.length > 0);
78
- const goToAccounts = useCallback(() => {
79
- if (!controller) return;
80
- const { view: currentView, signIn } = controller.getSnapshot();
81
- // Backing out of an active request must withdraw it — otherwise the
82
- // authorizeCode stays approvable until expiry (issue #691 phase 5).
83
- if (
84
- (currentView === 'qr' || currentView === 'add') &&
85
- (signIn.phase === 'starting' || signIn.phase === 'waiting')
86
- ) {
87
- controller.cancelSignIn();
88
- }
89
- controller.setView('accounts');
90
- }, [controller]);
78
+ const goToAccounts = useCallback(() => controller?.setView('accounts'), [controller]);
91
79
  // An ENTRY view (accounts / signin — no in-dialog back of its own) that is
92
80
  // MORPHED into a host surface (ManageAccount → switcher) has a frame beneath it,
93
81
  // so its back CLOSES the dialog and reshapes back to the host — routed through
@@ -36,7 +36,7 @@
36
36
  import type React from 'react';
37
37
  import { useCallback, useMemo, useState, useSyncExternalStore } from 'react';
38
38
  import { Linking, Platform } from 'react-native';
39
- import { toast } from '@oxyhq/bloom/toast';
39
+ import { toast } from '@oxyhq/bloom';
40
40
  import { useTheme } from '@oxyhq/bloom/theme';
41
41
  import type { AccountDialogSnapshot } from '@oxyhq/core';
42
42
  import { isOxyRpOrigin } from '@oxyhq/core';
@@ -72,13 +72,6 @@ const ACCOUNTS_APP_URL = 'https://accounts.oxy.so';
72
72
  export interface OxyAuthChooserProps {
73
73
  /** Called after a completed switch, sign-in, or sign-up. */
74
74
  onComplete?: () => void;
75
- /**
76
- * When false, the web sign-in entry does not auto-start a device-flow
77
- * session on mount. Use for hosts (e.g. the cross-origin passkey hub) that
78
- * already have a pending `authorizeCode` and must not spawn a second one.
79
- * @default true
80
- */
81
- autoStartSignIn?: boolean;
82
75
  }
83
76
 
84
77
  /**
@@ -86,10 +79,7 @@ export interface OxyAuthChooserProps {
86
79
  * (wrapped in Bloom's `<Dialog>`) today; mountable bare by any future host that
87
80
  * supplies its own `onComplete`.
88
81
  */
89
- const OxyAuthChooser: React.FC<OxyAuthChooserProps> = ({
90
- onComplete,
91
- autoStartSignIn: autoStartSignInEnabled = true,
92
- }) => {
82
+ const OxyAuthChooser: React.FC<OxyAuthChooserProps> = ({ onComplete }) => {
93
83
  const {
94
84
  accountDialogController: controller,
95
85
  showBottomSheet,
@@ -171,11 +161,11 @@ const OxyAuthChooser: React.FC<OxyAuthChooserProps> = ({
171
161
  // a no-op on native (button-driven). Reads the live snapshot at call time (an
172
162
  // event callback, not render), so it is stable across renders.
173
163
  const autoStartSignIn = useCallback(() => {
174
- if (!autoStartSignInEnabled || !controller || !isWebBrowser()) return;
164
+ if (!controller || !isWebBrowser()) return;
175
165
  const { view: currentView, signIn } = controller.getSnapshot();
176
166
  if ((currentView !== 'signin' && currentView !== 'add') || signIn.phase !== 'idle') return;
177
167
  void controller.signInWithOxy();
178
- }, [autoStartSignInEnabled, controller]);
168
+ }, [controller]);
179
169
 
180
170
  // Bind the headless controller. `getSnapshot` returns a stable reference
181
171
  // between changes, so it is `useSyncExternalStore`-safe. Guard the no-provider