@oxyhq/services 22.13.1 → 23.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 (395) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/index.js +18 -55
  3. package/lib/commonjs/index.js.map +1 -1
  4. package/lib/commonjs/notifications/deviceNotifications.js +19 -0
  5. package/lib/commonjs/notifications/deviceNotifications.js.map +1 -1
  6. package/lib/commonjs/ui/boot/runProviderColdBoot.js +20 -64
  7. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  8. package/lib/commonjs/ui/components/AvatarCameraBadge.js +3 -2
  9. package/lib/commonjs/ui/components/AvatarCameraBadge.js.map +1 -1
  10. package/lib/commonjs/ui/components/OxyProvider.js +5 -6
  11. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  12. package/lib/commonjs/ui/components/ProfileButton.js +4 -3
  13. package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
  14. package/lib/commonjs/ui/components/SettingsIcon.js +3 -2
  15. package/lib/commonjs/ui/components/SettingsIcon.js.map +1 -1
  16. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +7 -7
  17. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  18. package/lib/commonjs/ui/components/authChooser/primitives.js +5 -4
  19. package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
  20. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +2 -2
  21. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -1
  22. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +3 -2
  23. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  24. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +3 -2
  25. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  26. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +15 -14
  27. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  28. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +6 -5
  29. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  30. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +3 -2
  31. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  32. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +6 -6
  33. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  34. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +5 -5
  35. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -1
  36. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +10 -9
  37. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
  38. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +4 -3
  39. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  40. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +6 -5
  41. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  42. package/lib/commonjs/ui/components/styles/shadow.js.map +1 -1
  43. package/lib/commonjs/ui/context/OxyContext.js +14 -45
  44. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  45. package/lib/commonjs/ui/context/commitSessionFlow.js +0 -43
  46. package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
  47. package/lib/commonjs/ui/context/useOxyAccountGraph.js +3 -4
  48. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  49. package/lib/commonjs/ui/hooks/queries/userCache.js +17 -17
  50. package/lib/commonjs/ui/hooks/queries/userCache.js.map +1 -1
  51. package/lib/commonjs/ui/hooks/useAssets.js.map +1 -1
  52. package/lib/commonjs/ui/hooks/useAuth.js +4 -2
  53. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  54. package/lib/commonjs/ui/hooks/useOnlineStatus.js +3 -2
  55. package/lib/commonjs/ui/hooks/useOnlineStatus.js.map +1 -1
  56. package/lib/commonjs/ui/hooks/useSessionManagement.js +0 -2
  57. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  58. package/lib/commonjs/ui/screens/AccountMembersScreen.js +4 -3
  59. package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
  60. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +1 -1
  61. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
  62. package/lib/commonjs/ui/screens/CreateAccountScreen.js +7 -6
  63. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +4 -3
  65. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/FAQScreen.js +3 -2
  67. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  68. package/lib/commonjs/ui/screens/FeedbackScreen.js +96 -96
  69. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  70. package/lib/commonjs/ui/screens/FileManagementScreen.js +19 -18
  71. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  72. package/lib/commonjs/ui/screens/HistoryViewScreen.js +4 -29
  73. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  74. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +4 -3
  75. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  76. package/lib/commonjs/ui/screens/ManageAccountScreen.js +2 -2
  77. package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
  78. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +3 -3
  79. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +10 -9
  81. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -0
  83. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/ProfileScreen.js +12 -13
  85. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/UserListScreen.js +4 -4
  87. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  88. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +6 -6
  89. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  90. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js +4 -3
  91. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  92. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js +4 -3
  93. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js.map +1 -1
  94. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +5 -7
  95. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  96. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js +3 -2
  97. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js.map +1 -1
  98. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +3 -2
  99. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  100. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +5 -4
  101. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  102. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +4 -3
  103. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  104. package/lib/commonjs/ui/utils/fileManagement.js +24 -24
  105. package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
  106. package/lib/commonjs/ui/utils/netConnectivity.js +28 -0
  107. package/lib/commonjs/ui/utils/netConnectivity.js.map +1 -0
  108. package/lib/commonjs/ui/utils/oauthReturn.js +15 -28
  109. package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
  110. package/lib/module/index.js +20 -8
  111. package/lib/module/index.js.map +1 -1
  112. package/lib/module/notifications/deviceNotifications.js +19 -0
  113. package/lib/module/notifications/deviceNotifications.js.map +1 -1
  114. package/lib/module/ui/boot/runProviderColdBoot.js +21 -65
  115. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  116. package/lib/module/ui/components/AvatarCameraBadge.js +1 -1
  117. package/lib/module/ui/components/AvatarCameraBadge.js.map +1 -1
  118. package/lib/module/ui/components/OxyProvider.js +5 -6
  119. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  120. package/lib/module/ui/components/ProfileButton.js +1 -1
  121. package/lib/module/ui/components/ProfileButton.js.map +1 -1
  122. package/lib/module/ui/components/SettingsIcon.js +1 -1
  123. package/lib/module/ui/components/SettingsIcon.js.map +1 -1
  124. package/lib/module/ui/components/authChooser/AccountsMenuView.js +1 -1
  125. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  126. package/lib/module/ui/components/authChooser/primitives.js +1 -1
  127. package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
  128. package/lib/module/ui/components/authChooser/requestSurfaces.js +1 -1
  129. package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -1
  130. package/lib/module/ui/components/fileManagement/AnimatedButton.js +1 -1
  131. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  132. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +1 -1
  133. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  134. package/lib/module/ui/components/fileManagement/FileViewer.js +1 -1
  135. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  136. package/lib/module/ui/components/fileManagement/UploadPreview.js +1 -1
  137. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  138. package/lib/module/ui/components/modals/DeleteAccountModal.js +1 -1
  139. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  140. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  141. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  142. package/lib/module/ui/components/payment/PaymentMethodStep.js +1 -1
  143. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -1
  144. package/lib/module/ui/components/payment/PaymentReviewStep.js +1 -1
  145. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
  146. package/lib/module/ui/components/payment/PaymentSuccessStep.js +1 -1
  147. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  148. package/lib/module/ui/components/payment/PaymentSummaryStep.js +1 -1
  149. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  150. package/lib/module/ui/components/styles/shadow.js.map +1 -1
  151. package/lib/module/ui/context/OxyContext.js +16 -47
  152. package/lib/module/ui/context/OxyContext.js.map +1 -1
  153. package/lib/module/ui/context/commitSessionFlow.js +0 -42
  154. package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
  155. package/lib/module/ui/context/useOxyAccountGraph.js +3 -4
  156. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  157. package/lib/module/ui/hooks/queries/userCache.js +17 -17
  158. package/lib/module/ui/hooks/queries/userCache.js.map +1 -1
  159. package/lib/module/ui/hooks/useAssets.js.map +1 -1
  160. package/lib/module/ui/hooks/useAuth.js +4 -2
  161. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  162. package/lib/module/ui/hooks/useOnlineStatus.js +3 -2
  163. package/lib/module/ui/hooks/useOnlineStatus.js.map +1 -1
  164. package/lib/module/ui/hooks/useSessionManagement.js +0 -2
  165. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  166. package/lib/module/ui/screens/AccountMembersScreen.js +1 -1
  167. package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
  168. package/lib/module/ui/screens/ConnectedAppsScreen.js +1 -1
  169. package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
  170. package/lib/module/ui/screens/CreateAccountScreen.js +1 -1
  171. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  172. package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
  173. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  174. package/lib/module/ui/screens/FAQScreen.js +1 -1
  175. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  176. package/lib/module/ui/screens/FeedbackScreen.js +91 -90
  177. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  178. package/lib/module/ui/screens/FileManagementScreen.js +2 -1
  179. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  180. package/lib/module/ui/screens/HistoryViewScreen.js +4 -29
  181. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  182. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
  183. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  184. package/lib/module/ui/screens/ManageAccountScreen.js +1 -1
  185. package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
  186. package/lib/module/ui/screens/PaymentGatewayScreen.js +1 -1
  187. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  188. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
  189. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  190. package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -0
  191. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  192. package/lib/module/ui/screens/ProfileScreen.js +4 -5
  193. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  194. package/lib/module/ui/screens/UserListScreen.js +3 -3
  195. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  196. package/lib/module/ui/screens/WelcomeNewUserScreen.js +5 -6
  197. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  198. package/lib/module/ui/screens/fileManagement/FileLibraryError.js +1 -1
  199. package/lib/module/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  200. package/lib/module/ui/screens/fileManagement/FileListSection.js +1 -1
  201. package/lib/module/ui/screens/fileManagement/FileListSection.js.map +1 -1
  202. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +3 -5
  203. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  204. package/lib/module/ui/screens/fileManagement/UploadBar.js +1 -1
  205. package/lib/module/ui/screens/fileManagement/UploadBar.js.map +1 -1
  206. package/lib/module/ui/screens/trust/TrustCenterScreen.js +1 -1
  207. package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  208. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +3 -3
  209. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  210. package/lib/module/ui/screens/trust/TrustRewardsScreen.js +1 -1
  211. package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  212. package/lib/module/ui/utils/fileManagement.js +25 -25
  213. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  214. package/lib/module/ui/utils/netConnectivity.js +23 -0
  215. package/lib/module/ui/utils/netConnectivity.js.map +1 -0
  216. package/lib/module/ui/utils/oauthReturn.js +15 -27
  217. package/lib/module/ui/utils/oauthReturn.js.map +1 -1
  218. package/lib/typescript/commonjs/index.d.ts +0 -2
  219. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  220. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts +19 -0
  221. package/lib/typescript/commonjs/notifications/deviceNotifications.d.ts.map +1 -1
  222. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +11 -30
  223. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  224. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  225. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts +1 -1
  226. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts.map +1 -1
  227. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts +1 -1
  228. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
  229. package/lib/typescript/commonjs/ui/components/payment/types.d.ts +6 -6
  230. package/lib/typescript/commonjs/ui/components/payment/types.d.ts.map +1 -1
  231. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  232. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +0 -40
  233. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
  234. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +4 -7
  235. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  236. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +0 -1
  237. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  238. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts +2 -2
  239. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +1 -1
  241. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts +2 -2
  243. package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts.map +1 -1
  244. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +4 -2
  245. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts +3 -2
  247. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts.map +1 -1
  248. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  249. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts +2 -2
  250. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  251. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  252. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  253. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  254. package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
  255. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  256. package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  257. package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  258. package/lib/typescript/commonjs/ui/types/navigation.d.ts +20 -19
  259. package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
  260. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +5 -5
  261. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  262. package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts +17 -0
  263. package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts.map +1 -0
  264. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +15 -12
  265. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
  266. package/lib/typescript/module/index.d.ts +0 -2
  267. package/lib/typescript/module/index.d.ts.map +1 -1
  268. package/lib/typescript/module/notifications/deviceNotifications.d.ts +19 -0
  269. package/lib/typescript/module/notifications/deviceNotifications.d.ts.map +1 -1
  270. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +11 -30
  271. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  272. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  273. package/lib/typescript/module/ui/components/SettingsIcon.d.ts +1 -1
  274. package/lib/typescript/module/ui/components/SettingsIcon.d.ts.map +1 -1
  275. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts +1 -1
  276. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
  277. package/lib/typescript/module/ui/components/payment/types.d.ts +6 -6
  278. package/lib/typescript/module/ui/components/payment/types.d.ts.map +1 -1
  279. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  280. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +0 -40
  281. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
  282. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +4 -7
  283. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  284. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +0 -1
  285. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  286. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts +2 -2
  287. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts.map +1 -1
  288. package/lib/typescript/module/ui/hooks/useAssets.d.ts +1 -1
  289. package/lib/typescript/module/ui/hooks/useAssets.d.ts.map +1 -1
  290. package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts +2 -2
  291. package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts.map +1 -1
  292. package/lib/typescript/module/ui/hooks/useAuth.d.ts +4 -2
  293. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  294. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts +3 -2
  295. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts.map +1 -1
  296. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  297. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts +2 -2
  298. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  299. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  300. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  301. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  302. package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
  303. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  304. package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  305. package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  306. package/lib/typescript/module/ui/types/navigation.d.ts +20 -19
  307. package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
  308. package/lib/typescript/module/ui/utils/fileManagement.d.ts +5 -5
  309. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  310. package/lib/typescript/module/ui/utils/netConnectivity.d.ts +17 -0
  311. package/lib/typescript/module/ui/utils/netConnectivity.d.ts.map +1 -0
  312. package/lib/typescript/module/ui/utils/oauthReturn.d.ts +15 -12
  313. package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
  314. package/package.json +20 -8
  315. package/src/index.ts +18 -17
  316. package/src/notifications/deviceNotifications.ts +19 -0
  317. package/src/ui/boot/__tests__/coldBootNoIdpRedirect.test.ts +215 -0
  318. package/src/ui/boot/runProviderColdBoot.ts +24 -101
  319. package/src/ui/components/AvatarCameraBadge.tsx +1 -1
  320. package/src/ui/components/OxyProvider.tsx +5 -6
  321. package/src/ui/components/ProfileButton.tsx +1 -1
  322. package/src/ui/components/SettingsIcon.tsx +1 -1
  323. package/src/ui/components/authChooser/AccountsMenuView.tsx +1 -1
  324. package/src/ui/components/authChooser/primitives.tsx +1 -1
  325. package/src/ui/components/authChooser/requestSurfaces.tsx +1 -1
  326. package/src/ui/components/fileManagement/AnimatedButton.tsx +1 -1
  327. package/src/ui/components/fileManagement/FileDetailsModal.tsx +1 -1
  328. package/src/ui/components/fileManagement/FileViewer.tsx +1 -1
  329. package/src/ui/components/fileManagement/UploadPreview.tsx +1 -1
  330. package/src/ui/components/modals/DeleteAccountModal.tsx +1 -1
  331. package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
  332. package/src/ui/components/payment/PaymentMethodStep.tsx +1 -1
  333. package/src/ui/components/payment/PaymentReviewStep.tsx +1 -1
  334. package/src/ui/components/payment/PaymentSuccessStep.tsx +1 -1
  335. package/src/ui/components/payment/PaymentSummaryStep.tsx +1 -1
  336. package/src/ui/components/payment/types.ts +24 -24
  337. package/src/ui/components/styles/shadow.tsx +2 -2
  338. package/src/ui/context/OxyContext.tsx +15 -46
  339. package/src/ui/context/__tests__/commitSessionFlow.test.ts +0 -89
  340. package/src/ui/context/commitSessionFlow.ts +0 -61
  341. package/src/ui/context/oxyContextTypes.ts +4 -7
  342. package/src/ui/context/useOxyAccountGraph.ts +4 -4
  343. package/src/ui/hooks/queries/userCache.ts +169 -148
  344. package/src/ui/hooks/useAssets.ts +1 -1
  345. package/src/ui/hooks/useAsyncAction.ts +2 -2
  346. package/src/ui/hooks/useAuth.ts +4 -2
  347. package/src/ui/hooks/useOnlineStatus.ts +3 -2
  348. package/src/ui/hooks/useSessionManagement.ts +0 -2
  349. package/src/ui/screens/AccountMembersScreen.tsx +1 -1
  350. package/src/ui/screens/ConnectedAppsScreen.tsx +1 -1
  351. package/src/ui/screens/CreateAccountScreen.tsx +1 -1
  352. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  353. package/src/ui/screens/FAQScreen.tsx +1 -1
  354. package/src/ui/screens/FeedbackScreen.tsx +740 -574
  355. package/src/ui/screens/FileManagementScreen.tsx +2 -1
  356. package/src/ui/screens/HistoryViewScreen.tsx +4 -19
  357. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  358. package/src/ui/screens/ManageAccountScreen.tsx +1 -1
  359. package/src/ui/screens/PaymentGatewayScreen.tsx +1 -1
  360. package/src/ui/screens/PremiumSubscriptionScreen.tsx +2 -2
  361. package/src/ui/screens/PrivacySettingsScreen.tsx +1 -0
  362. package/src/ui/screens/ProfileScreen.tsx +6 -4
  363. package/src/ui/screens/UserListScreen.tsx +3 -3
  364. package/src/ui/screens/WelcomeNewUserScreen.tsx +6 -6
  365. package/src/ui/screens/fileManagement/FileLibraryError.tsx +1 -1
  366. package/src/ui/screens/fileManagement/FileListSection.tsx +1 -1
  367. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +3 -2
  368. package/src/ui/screens/fileManagement/UploadBar.tsx +1 -1
  369. package/src/ui/screens/trust/TrustCenterScreen.tsx +1 -1
  370. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +4 -3
  371. package/src/ui/screens/trust/TrustRewardsScreen.tsx +1 -1
  372. package/src/ui/types/navigation.ts +20 -19
  373. package/src/ui/utils/fileManagement.ts +108 -92
  374. package/src/ui/utils/netConnectivity.ts +27 -0
  375. package/src/ui/utils/oauthReturn.ts +15 -30
  376. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js +0 -48
  377. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js.map +0 -1
  378. package/lib/commonjs/ui/utils/crossOriginRestore.js +0 -140
  379. package/lib/commonjs/ui/utils/crossOriginRestore.js.map +0 -1
  380. package/lib/module/ui/oauth/legacyRedirectLanes.js +0 -44
  381. package/lib/module/ui/oauth/legacyRedirectLanes.js.map +0 -1
  382. package/lib/module/ui/utils/crossOriginRestore.js +0 -131
  383. package/lib/module/ui/utils/crossOriginRestore.js.map +0 -1
  384. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts +0 -40
  385. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts.map +0 -1
  386. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts +0 -43
  387. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +0 -1
  388. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts +0 -40
  389. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts.map +0 -1
  390. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts +0 -43
  391. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +0 -1
  392. package/src/ui/boot/__tests__/coldBootWebAuthMode.test.ts +0 -281
  393. package/src/ui/oauth/legacyRedirectLanes.ts +0 -43
  394. package/src/ui/utils/__tests__/crossOriginRestore.test.ts +0 -160
  395. package/src/ui/utils/crossOriginRestore.ts +0 -168
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "22.13.1",
3
+ "version": "23.0.1",
4
4
  "description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -60,6 +60,18 @@
60
60
  },
61
61
  "default": "./lib/module/ui/server.js"
62
62
  },
63
+ "./notifications": {
64
+ "react-native": "./src/notifications/deviceNotifications.ts",
65
+ "import": {
66
+ "types": "./lib/typescript/module/notifications/deviceNotifications.d.ts",
67
+ "default": "./lib/module/notifications/deviceNotifications.js"
68
+ },
69
+ "require": {
70
+ "types": "./lib/typescript/commonjs/notifications/deviceNotifications.d.ts",
71
+ "default": "./lib/commonjs/notifications/deviceNotifications.js"
72
+ },
73
+ "default": "./lib/module/notifications/deviceNotifications.js"
74
+ },
63
75
  "./plugins/*": "./plugins/*.js",
64
76
  "./expo-module.config.json": "./expo-module.config.json",
65
77
  "./package.json": "./package.json"
@@ -126,8 +138,8 @@
126
138
  }
127
139
  },
128
140
  "dependencies": {
129
- "@oxyhq/contracts": "0.18.0",
130
- "@oxyhq/core": "^12.11.0",
141
+ "@oxyhq/contracts": "0.19.0",
142
+ "@oxyhq/core": "^13.0.0",
131
143
  "@simplewebauthn/browser": "^13.3.0",
132
144
  "color": "^4.2.3"
133
145
  },
@@ -136,7 +148,7 @@
136
148
  "@commitlint/cli": "^21.2.1",
137
149
  "@commitlint/config-conventional": "^21.2.0",
138
150
  "@expo/vector-icons": "^15.0.3",
139
- "@oxyhq/core": "12.11.2",
151
+ "@oxyhq/core": "13.0.0",
140
152
  "@react-native-async-storage/async-storage": "^2.0.0",
141
153
  "@react-native-community/netinfo": "^11.4.1",
142
154
  "@react-native/babel-preset": "^0.86.0",
@@ -178,9 +190,9 @@
178
190
  "peerDependencies": {
179
191
  "@expo/vector-icons": "^15.0.3",
180
192
  "@oxyhq/bloom": ">=0.59.0",
181
- "@oxyhq/core": "^12.11.0",
193
+ "@oxyhq/core": "^13.0.0",
182
194
  "@react-native-async-storage/async-storage": "^2.0.0",
183
- "@react-native-community/netinfo": "^11.4.1",
195
+ "@react-native-community/netinfo": ">=11.4.1",
184
196
  "@tanstack/query-async-storage-persister": "^5.101",
185
197
  "@tanstack/query-sync-storage-persister": "^5.101",
186
198
  "@tanstack/react-query": "^5.101",
@@ -201,11 +213,11 @@
201
213
  "nativewind": ">=5.0.0",
202
214
  "react": ">=18.0.0",
203
215
  "react-native": ">=0.85.0",
204
- "react-native-gesture-handler": "~2.32.0",
216
+ "react-native-gesture-handler": ">=2.31.1",
205
217
  "react-native-keyboard-controller": ">=1.21.0",
206
218
  "react-native-qrcode-svg": "^6.3.0",
207
219
  "react-native-reanimated": ">=4.3.0",
208
- "react-native-safe-area-context": "~5.8.0",
220
+ "react-native-safe-area-context": ">=5.7.0",
209
221
  "react-native-svg": ">=15.15.0",
210
222
  "socket.io-client": "^4.8.0",
211
223
  "zustand": "^5.0.0"
package/src/index.ts CHANGED
@@ -201,24 +201,25 @@ export { useFileFiltering } from './ui/hooks/useFileFiltering';
201
201
  export type { ViewMode, SortBy, SortOrder } from './ui/hooks/useFileFiltering';
202
202
 
203
203
  // ---------------------------------------------------------------------------
204
- // Device notifications (the ONE `expo-notifications` adapter)
204
+ // Device notifications DELIBERATELY NOT EXPORTED HERE
205
205
  // ---------------------------------------------------------------------------
206
- // The Expo-side half of push: permission, platform tag, and the EXPO push token
207
- // `@oxyhq/core`'s `registerPushToken` accepts (never a raw APNs/FCM token).
208
- // Native-only by construction every entry point resolves its null/no-op result
209
- // from `Platform.OS` before `expo-notifications` is ever imported, and both
210
- // `expo-notifications` and `expo-constants` are OPTIONAL peers.
211
- export {
212
- pushTokenPlatform,
213
- hasNotificationPermission,
214
- requestNotificationPermission,
215
- getExpoPushToken,
216
- takeLaunchNotificationData,
217
- ensureNotificationChannel,
218
- installForegroundNotificationHandler,
219
- subscribeToNotificationResponses,
220
- } from './notifications/deviceNotifications';
221
- export type { NotificationChannelImportance, NotificationChannelSpec, ForegroundPresentation } from './notifications/deviceNotifications';
206
+ // The `expo-notifications` adapter lives behind its own entry point:
207
+ //
208
+ // import { getExpoPushToken } from '@oxyhq/services/notifications';
209
+ //
210
+ // It is the one module in this package whose dependencies (`expo-notifications`
211
+ // and `expo-constants`) are optional peers that an app which does not use push
212
+ // genuinely never installs. Re-exporting it from THIS barrel is what made that
213
+ // optionality a lie: a barrel export puts the module in the import graph of
214
+ // every consumer, and `tsc` must resolve the specifier of an `import()` even
215
+ // when the call is lazy and wrapped in try/catch — so every consumer without
216
+ // `expo-notifications` failed with TS2307 (plus TS7006 cascades) whether or not
217
+ // it had ever heard of push. Behind a subpath the module is only ever pulled in
218
+ // by an app that asked for it, which is what "optional peer" is supposed to
219
+ // mean.
220
+ //
221
+ // Do NOT re-add these exports here. `__tests__/notifications/barrelIsolation.test.ts`
222
+ // fails if you do.
222
223
 
223
224
  // ---------------------------------------------------------------------------
224
225
  // UI components
@@ -8,6 +8,25 @@
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
+ *
11
30
  * ## Native-only by construction
12
31
  *
13
32
  * Every entry point resolves its null/no-op result from `Platform.OS` BEFORE the
@@ -0,0 +1,215 @@
1
+ /**
2
+ * `runProviderColdBoot` — the boot NEVER navigates the top-level window (#691
3
+ * phase 7b).
4
+ *
5
+ * Phase 7b deleted the two SDK-initiated, gesture-less full-page hops to the
6
+ * IdP: the cold-boot `prompt=none` silent restore and the post-sign-in hub sync.
7
+ * A web origin with no local device credential now resolves SIGNED OUT and waits
8
+ * for the user's next explicit "Continue with Oxy".
9
+ *
10
+ * What must still work — and is asserted here — is everything the user actually
11
+ * asked for: an authorization code ALREADY on the URL is completed, which is how
12
+ * a browser-BLOCKED sign-in popup finishes after `startWebOAuthSignIn` falls
13
+ * back to a full-page redirect.
14
+ *
15
+ * Unlike `__tests__/boot/runProviderColdBoot.test.ts` (deadline + connectivity
16
+ * wiring), this suite keeps the real navigation primitive in view: every
17
+ * assertion below reaches `redirectToAuthorize`, the ONLY top-level-window
18
+ * navigation the boot could ever have performed.
19
+ */
20
+
21
+ import type { AuthStateStore, PersistedAuthState, SessionClient } from '@oxyhq/core';
22
+
23
+ jest.mock('@oxyhq/core', () => {
24
+ const actual = jest.requireActual('@oxyhq/core');
25
+ return {
26
+ __esModule: true,
27
+ ...actual,
28
+ runSessionColdBoot: jest.fn(),
29
+ };
30
+ });
31
+
32
+ // The ONLY top-level-window navigation primitive the SDK has.
33
+ jest.mock('../../components/oauthNavigation', () => ({
34
+ redirectToAuthorize: jest.fn(),
35
+ }));
36
+
37
+ jest.mock('../../utils/oauthReturn', () => {
38
+ const actual = jest.requireActual('../../utils/oauthReturn');
39
+ return {
40
+ __esModule: true,
41
+ ...actual,
42
+ tryCompleteOAuthReturn: jest.fn(async () => false),
43
+ };
44
+ });
45
+
46
+ import { runSessionColdBoot } from '@oxyhq/core';
47
+ import { redirectToAuthorize } from '../../components/oauthNavigation';
48
+ import { tryCompleteOAuthReturn } from '../../utils/oauthReturn';
49
+ import { runProviderColdBoot, type RunProviderColdBootOptions } from '../runProviderColdBoot';
50
+
51
+ const mockRunSessionColdBoot = runSessionColdBoot as jest.Mock;
52
+ const mockRedirectToAuthorize = redirectToAuthorize as jest.Mock;
53
+ const mockTryCompleteOAuthReturn = tryCompleteOAuthReturn as jest.Mock;
54
+
55
+ const CLIENT_ID = 'oxy_dk_test';
56
+
57
+ /** An auth store holding no device credential — the signed-out domain case. */
58
+ function makeEmptyAuthStore(): AuthStateStore {
59
+ return {
60
+ load: jest.fn(async (): Promise<PersistedAuthState | null> => null),
61
+ save: jest.fn(async () => undefined),
62
+ clear: jest.fn(async () => undefined),
63
+ } as unknown as AuthStateStore;
64
+ }
65
+
66
+ interface Harness {
67
+ options: RunProviderColdBootOptions;
68
+ commitSession: jest.Mock;
69
+ markAuthResolved: jest.Mock;
70
+ setTokenReady: jest.Mock;
71
+ sessionClientStart: jest.Mock;
72
+ }
73
+
74
+ function makeHarness(overrides: Partial<RunProviderColdBootOptions> = {}): Harness {
75
+ const commitSession = jest.fn(async () => undefined);
76
+ const markAuthResolved = jest.fn();
77
+ const setTokenReady = jest.fn();
78
+ const sessionClientStart = jest.fn(async () => undefined);
79
+
80
+ const options: RunProviderColdBootOptions = {
81
+ oxyServices: {} as RunProviderColdBootOptions['oxyServices'],
82
+ authStore: makeEmptyAuthStore(),
83
+ clientId: CLIENT_ID,
84
+ sessionClient: { start: sessionClientStart } as unknown as SessionClient,
85
+ syncDeviceCredentialToHost: jest.fn(async () => undefined),
86
+ commitSession,
87
+ markAuthResolved,
88
+ setTokenReady,
89
+ ...overrides,
90
+ };
91
+
92
+ return { options, commitSession, markAuthResolved, setTokenReady, sessionClientStart };
93
+ }
94
+
95
+ /** `runSessionColdBoot` finding no session at all — the signed-out domain. */
96
+ function stubSignedOutBoot(): void {
97
+ mockRunSessionColdBoot.mockImplementation(
98
+ async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
99
+ await opts.onSignedOut?.('no_session');
100
+ return { kind: 'unauthenticated' } as const;
101
+ },
102
+ );
103
+ }
104
+
105
+ describe('runProviderColdBoot — no SDK-initiated IdP navigation (#691 phase 7b)', () => {
106
+ beforeEach(() => {
107
+ mockRunSessionColdBoot.mockReset();
108
+ mockRedirectToAuthorize.mockClear();
109
+ mockTryCompleteOAuthReturn.mockClear();
110
+ mockTryCompleteOAuthReturn.mockImplementation(async () => false);
111
+ globalThis.sessionStorage?.clear();
112
+ });
113
+
114
+ it('resolves a domain with no local credential SIGNED OUT instead of bouncing to the IdP', async () => {
115
+ stubSignedOutBoot();
116
+ const { options, markAuthResolved, commitSession, sessionClientStart } = makeHarness();
117
+
118
+ await runProviderColdBoot(options);
119
+
120
+ // Auth resolution concluded (routing can settle), nothing was committed,
121
+ // and with no persisted credential the device socket is not started.
122
+ expect(markAuthResolved).toHaveBeenCalled();
123
+ expect(commitSession).not.toHaveBeenCalled();
124
+ expect(sessionClientStart).not.toHaveBeenCalled();
125
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
126
+ });
127
+
128
+ it('does not navigate even with a clientId configured and the mint finding nothing', async () => {
129
+ // The deleted silent-restore lane needed exactly this shape: a registered
130
+ // client id plus a signed-out mint outcome. It must now be inert.
131
+ stubSignedOutBoot();
132
+ const { options } = makeHarness({ clientId: CLIENT_ID, authRedirectUri: 'https://app.oxy.so' });
133
+
134
+ await runProviderColdBoot(options);
135
+
136
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
137
+ });
138
+
139
+ it('does not navigate when the mint already resolved a session', async () => {
140
+ mockRunSessionColdBoot.mockImplementation(
141
+ async (opts: Parameters<typeof runSessionColdBoot>[0]) => {
142
+ const session = {
143
+ sessionId: 's1',
144
+ userId: 'u1',
145
+ accessToken: 'at',
146
+ via: 'device-secret-mint',
147
+ };
148
+ await opts.onSession?.(session);
149
+ return { kind: 'session', via: session.via, session } as const;
150
+ },
151
+ );
152
+ const { options, commitSession } = makeHarness();
153
+
154
+ await runProviderColdBoot(options);
155
+
156
+ expect(commitSession).toHaveBeenCalledWith(
157
+ { sessionId: 's1', accessToken: 'at', userId: 'u1' },
158
+ { activate: false },
159
+ );
160
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
161
+ });
162
+
163
+ describe('the blocked-popup redirect fallback still completes', () => {
164
+ it('completes an authorization code already on the URL', async () => {
165
+ // A popup-mode app lands here whenever the browser blocked the popup and
166
+ // `startWebOAuthSignIn` fell back to a full-page redirect.
167
+ mockTryCompleteOAuthReturn.mockImplementation(async () => true);
168
+ const { options, markAuthResolved, setTokenReady } = makeHarness();
169
+
170
+ await runProviderColdBoot(options);
171
+
172
+ expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
173
+ expect(setTokenReady).toHaveBeenLastCalledWith(true);
174
+ expect(markAuthResolved).toHaveBeenCalled();
175
+ // The device mint is short-circuited by the completed return leg.
176
+ expect(mockRunSessionColdBoot).not.toHaveBeenCalled();
177
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
178
+ });
179
+
180
+ it('runs the return leg even on a boot that finds no session', async () => {
181
+ stubSignedOutBoot();
182
+ const { options } = makeHarness();
183
+
184
+ await runProviderColdBoot(options);
185
+
186
+ expect(mockTryCompleteOAuthReturn).toHaveBeenCalledTimes(1);
187
+ });
188
+
189
+ it('commits the OAuth return as a deliberate sign-in', async () => {
190
+ mockTryCompleteOAuthReturn.mockImplementation(async () => true);
191
+ const { options } = makeHarness();
192
+
193
+ await runProviderColdBoot(options);
194
+
195
+ const commit = mockTryCompleteOAuthReturn.mock.calls[0][0] as {
196
+ commitSession: (input: unknown) => Promise<void>;
197
+ };
198
+ await commit.commitSession({ sessionId: 's1', userId: 'u1' });
199
+ expect(options.commitSession).toHaveBeenCalledWith(
200
+ { sessionId: 's1', userId: 'u1' },
201
+ { activate: true },
202
+ );
203
+ });
204
+ });
205
+
206
+ it('identity mode skips the web OAuth return leg entirely', async () => {
207
+ stubSignedOutBoot();
208
+ const { options } = makeHarness({ sessionMode: 'identity' });
209
+
210
+ await runProviderColdBoot(options);
211
+
212
+ expect(mockTryCompleteOAuthReturn).not.toHaveBeenCalled();
213
+ expect(mockRedirectToAuthorize).not.toHaveBeenCalled();
214
+ });
215
+ });
@@ -8,15 +8,9 @@ import {
8
8
  } from '@oxyhq/core';
9
9
  import type { SessionClient } from '@oxyhq/core';
10
10
  import { loadPersistedDeviceCredential } from '../utils/deviceCredential';
11
- import {
12
- consumeSilentOAuthError,
13
- isSilentRestoreEligibleOrigin,
14
- maybeStartSilentOAuthRestore,
15
- } from '../utils/crossOriginRestore';
16
- import { tryCompleteOAuthReturn, consumeHubSyncFailure } from '../utils/oauthReturn';
11
+ import { tryCompleteOAuthReturn } from '../utils/oauthReturn';
17
12
  import { isWebBrowser } from '../utils/isWebBrowser';
18
- import { allowsAutomaticIdpRedirect } from '../oauth/legacyRedirectLanes';
19
- import type { WebAuthMode } from '../oauth/types';
13
+ import { isNetConnectivityExplicitlyOffline } from '../utils/netConnectivity';
20
14
  import type { CommitInput } from '../context/oxyContextTypes';
21
15
 
22
16
  /** How long the cold boot waits for the post-boot SessionClient handoff (ms). */
@@ -67,8 +61,8 @@ async function detectOfflineHint(): Promise<boolean> {
67
61
  }),
68
62
  ]);
69
63
  // `null` ⇒ the probe timed out (unknown → assume online). Only an explicit
70
- // `isConnected === false` disables the network steps.
71
- return state?.isConnected === false;
64
+ // disconnected / unreachable verdict disables the network steps.
65
+ return isNetConnectivityExplicitlyOffline(state);
72
66
  } catch {
73
67
  // NetInfo missing / probe threw — never block sign-in on a probe failure.
74
68
  return false;
@@ -80,39 +74,19 @@ export interface RunProviderColdBootOptions {
80
74
  authStore: AuthStateStore;
81
75
  clientId?: string;
82
76
  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;
89
77
  /**
90
78
  * Who owns the session this boot resolves. `'account'` (the default) is the
91
79
  * device's active account — every ordinary Oxy app. `'identity'` binds the
92
80
  * boot to the owner of this device's PRIMARY identity key and REQUIRES
93
- * {@link identity}; it also disables the two web OAuth lanes below, which
94
- * commit whatever account the IdP hands back.
81
+ * {@link identity}; it also disables the web OAuth return leg below, which
82
+ * commits whatever account the IdP hands back.
95
83
  */
96
84
  sessionMode?: SessionMode;
97
85
  /** The identity binding required by `sessionMode: 'identity'`. */
98
86
  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;
110
87
  sessionClient: SessionClient;
111
88
  syncDeviceCredentialToHost: () => Promise<void>;
112
- commitSession: (
113
- input: CommitInput,
114
- options: { activate: boolean; hubSync?: boolean },
115
- ) => Promise<void>;
89
+ commitSession: (input: CommitInput, options: { activate: boolean }) => Promise<void>;
116
90
  markAuthResolved: () => void;
117
91
  setTokenReady: (ready: boolean) => void;
118
92
  }
@@ -121,19 +95,19 @@ export interface RunProviderColdBootOptions {
121
95
  * Device-first cold boot for `@oxyhq/services` providers.
122
96
  *
123
97
  * Ordered pipeline:
124
- * 1. Complete OAuth authorization-code return (web)
98
+ * 1. Complete an OAuth authorization-code return already on the URL (web)
125
99
  * 2. `runSessionColdBoot` — device-secret mint (+ native shared-key, or the
126
100
  * primary-identity-key lane in `sessionMode: 'identity'`)
127
- * 3. Silent OAuth for all web apps when mint finds no session
128
101
  *
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.
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.
132
105
  *
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`.
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.
137
111
  */
138
112
  export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Promise<void> {
139
113
  const {
@@ -141,10 +115,8 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
141
115
  authStore,
142
116
  clientId,
143
117
  authRedirectUri,
144
- authorizeBaseUrl,
145
118
  sessionMode = 'account',
146
119
  identity,
147
- webAuthMode = 'redirect',
148
120
  sessionClient,
149
121
  syncDeviceCredentialToHost,
150
122
  commitSession,
@@ -157,28 +129,19 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
157
129
  setTokenReady(false);
158
130
 
159
131
  try {
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.
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.
175
138
  const oauthCompleted = identityBound
176
139
  ? false
177
140
  : await tryCompleteOAuthReturn({
178
141
  oxyServices,
179
142
  clientId,
180
143
  authRedirectUri,
181
- commitSession: (input) => commitSession(input, { activate: true, hubSync: false }),
144
+ commitSession: (input) => commitSession(input, { activate: true }),
182
145
  });
183
146
  if (oauthCompleted) {
184
147
  setTokenReady(true);
@@ -192,7 +155,7 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
192
155
  // resolves to "online" — the network steps still run.
193
156
  const offline = await detectOfflineHint();
194
157
 
195
- const outcome = await runSessionColdBoot({
158
+ await runSessionColdBoot({
196
159
  oxy: oxyServices,
197
160
  store: authStore,
198
161
  platform: { isWeb: isWebBrowser(), isNative: !isWebBrowser() },
@@ -259,46 +222,6 @@ export async function runProviderColdBoot(opts: RunProviderColdBootOptions): Pro
259
222
  }
260
223
  },
261
224
  });
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
- }
302
225
  } catch (error) {
303
226
  if (__DEV__) {
304
227
  loggerUtil.error(
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  import { View, type ViewStyle } from 'react-native';
3
- import { Ionicons } from '@expo/vector-icons';
3
+ import Ionicons from '@expo/vector-icons/Ionicons';
4
4
  import { useTheme } from '@oxyhq/bloom/theme';
5
5
 
6
6
  /**
@@ -12,6 +12,7 @@ import { logger as loggerUtil } from '@oxyhq/core';
12
12
  import { RequireOxyAuth } from './RequireOxyAuth';
13
13
  import { attachQueryPersistence, createQueryClient } from '../hooks/queryClient';
14
14
  import { createPlatformStorage, type StorageInterface } from '../utils/storageHelpers';
15
+ import { isNetConnectivityOnline } from '../utils/netConnectivity';
15
16
 
16
17
  /**
17
18
  * Background color shown for the brief window between mount and the
@@ -92,10 +93,9 @@ const OxyProvider: FC<OxyProviderProps> = ({
92
93
  authRedirectUri,
93
94
  authorizeBaseUrl,
94
95
  sessionMode = 'account',
95
- webAuthMode = 'redirect',
96
+ webAuthMode = 'popup',
96
97
  queryClient: providedQueryClient,
97
98
  requireAuth = 'off',
98
- hubSync = true,
99
99
  }) => {
100
100
 
101
101
  // Dynamic KeyboardProvider for native. Uses variable indirection
@@ -230,10 +230,10 @@ const OxyProvider: FC<OxyProviderProps> = ({
230
230
  try {
231
231
  const NetInfo = await import('@react-native-community/netinfo');
232
232
  const state = await NetInfo.default.fetch();
233
- onlineManager.setOnline(state.isConnected ?? true);
233
+ onlineManager.setOnline(isNetConnectivityOnline(state));
234
234
 
235
- const unsubscribe = NetInfo.default.addEventListener((state: { isConnected: boolean | null }) => {
236
- onlineManager.setOnline(state.isConnected ?? true);
235
+ const unsubscribe = NetInfo.default.addEventListener((state: { isConnected: boolean | null; isInternetReachable?: boolean | null }) => {
236
+ onlineManager.setOnline(isNetConnectivityOnline(state));
237
237
  });
238
238
 
239
239
  cleanup = () => unsubscribe();
@@ -293,7 +293,6 @@ const OxyProvider: FC<OxyProviderProps> = ({
293
293
  clientId={clientId}
294
294
  sessionMode={sessionMode}
295
295
  webAuthMode={webAuthMode}
296
- hubSync={hubSync}
297
296
  onAuthStateChange={onAuthStateChange as OxyContextProviderProps['onAuthStateChange']}
298
297
  >
299
298
  <SurfaceProvider>
@@ -8,7 +8,7 @@ import {
8
8
  type StyleProp,
9
9
  type ViewStyle,
10
10
  } from 'react-native';
11
- import { MaterialCommunityIcons } from '@expo/vector-icons';
11
+ import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';
12
12
  import { Avatar } from '@oxyhq/bloom/avatar';
13
13
  import * as Skeleton from '@oxyhq/bloom/skeleton';
14
14
  import { Text } from '@oxyhq/bloom/typography';
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
2
  import { memo } from 'react';
3
3
  import { View, StyleSheet } from 'react-native';
4
- import { MaterialCommunityIcons } from '@expo/vector-icons';
4
+ import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';
5
5
  import { darkenColor } from '../utils/colorUtils';
6
6
 
7
7
  interface SettingsIconProps {
@@ -33,7 +33,7 @@ import Animated, {
33
33
  useSharedValue,
34
34
  withTiming,
35
35
  } from 'react-native-reanimated';
36
- import { MaterialCommunityIcons } from '@expo/vector-icons';
36
+ import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';
37
37
  import { Avatar } from '@oxyhq/bloom/avatar';
38
38
  import { AvatarGroup, type AvatarGroupItem } from '@oxyhq/bloom/avatar-group';
39
39
  import { Button } from '@oxyhq/bloom/button';
@@ -7,7 +7,7 @@
7
7
  import type React from 'react';
8
8
  import { useState } from 'react';
9
9
  import { Pressable, View } from 'react-native';
10
- import { MaterialCommunityIcons } from '@expo/vector-icons';
10
+ import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';
11
11
  import { Avatar } from '@oxyhq/bloom/avatar';
12
12
  import { Text } from '@oxyhq/bloom/typography';
13
13
  import { BloomColorScope } from '@oxyhq/bloom/theme';