@oxyhq/services 22.13.1 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/ui/boot/runProviderColdBoot.js +20 -64
  3. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  4. package/lib/commonjs/ui/components/AvatarCameraBadge.js +3 -2
  5. package/lib/commonjs/ui/components/AvatarCameraBadge.js.map +1 -1
  6. package/lib/commonjs/ui/components/OxyProvider.js +5 -6
  7. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  8. package/lib/commonjs/ui/components/ProfileButton.js +4 -3
  9. package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
  10. package/lib/commonjs/ui/components/SettingsIcon.js +3 -2
  11. package/lib/commonjs/ui/components/SettingsIcon.js.map +1 -1
  12. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +7 -7
  13. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  14. package/lib/commonjs/ui/components/authChooser/primitives.js +5 -4
  15. package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
  16. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +2 -2
  17. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -1
  18. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +3 -2
  19. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  20. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +3 -2
  21. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  22. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +15 -14
  23. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  24. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +6 -5
  25. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  26. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +3 -2
  27. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  28. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +6 -6
  29. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  30. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +5 -5
  31. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -1
  32. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +10 -9
  33. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
  34. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +4 -3
  35. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  36. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +6 -5
  37. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  38. package/lib/commonjs/ui/components/styles/shadow.js.map +1 -1
  39. package/lib/commonjs/ui/context/OxyContext.js +14 -45
  40. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  41. package/lib/commonjs/ui/context/commitSessionFlow.js +0 -43
  42. package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
  43. package/lib/commonjs/ui/context/useOxyAccountGraph.js +3 -4
  44. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  45. package/lib/commonjs/ui/hooks/queries/userCache.js +17 -17
  46. package/lib/commonjs/ui/hooks/queries/userCache.js.map +1 -1
  47. package/lib/commonjs/ui/hooks/useAssets.js.map +1 -1
  48. package/lib/commonjs/ui/hooks/useAuth.js +4 -2
  49. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  50. package/lib/commonjs/ui/hooks/useOnlineStatus.js +3 -2
  51. package/lib/commonjs/ui/hooks/useOnlineStatus.js.map +1 -1
  52. package/lib/commonjs/ui/hooks/useSessionManagement.js +0 -2
  53. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  54. package/lib/commonjs/ui/screens/AccountMembersScreen.js +4 -3
  55. package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
  56. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js +1 -1
  57. package/lib/commonjs/ui/screens/ConnectedAppsScreen.js.map +1 -1
  58. package/lib/commonjs/ui/screens/CreateAccountScreen.js +7 -6
  59. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  60. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +4 -3
  61. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  62. package/lib/commonjs/ui/screens/FAQScreen.js +3 -2
  63. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/FeedbackScreen.js +96 -96
  65. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/FileManagementScreen.js +19 -18
  67. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  68. package/lib/commonjs/ui/screens/HistoryViewScreen.js +4 -29
  69. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  70. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +4 -3
  71. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  72. package/lib/commonjs/ui/screens/ManageAccountScreen.js +2 -2
  73. package/lib/commonjs/ui/screens/ManageAccountScreen.js.map +1 -1
  74. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +3 -3
  75. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  76. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +10 -9
  77. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  78. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -0
  79. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/ProfileScreen.js +12 -13
  81. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/UserListScreen.js +4 -4
  83. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +6 -6
  85. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js +4 -3
  87. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  88. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js +4 -3
  89. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js.map +1 -1
  90. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +5 -7
  91. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  92. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js +3 -2
  93. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js.map +1 -1
  94. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js +3 -2
  95. package/lib/commonjs/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  96. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +5 -4
  97. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  98. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js +4 -3
  99. package/lib/commonjs/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  100. package/lib/commonjs/ui/utils/fileManagement.js +24 -24
  101. package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
  102. package/lib/commonjs/ui/utils/netConnectivity.js +28 -0
  103. package/lib/commonjs/ui/utils/netConnectivity.js.map +1 -0
  104. package/lib/commonjs/ui/utils/oauthReturn.js +15 -28
  105. package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
  106. package/lib/module/ui/boot/runProviderColdBoot.js +21 -65
  107. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  108. package/lib/module/ui/components/AvatarCameraBadge.js +1 -1
  109. package/lib/module/ui/components/AvatarCameraBadge.js.map +1 -1
  110. package/lib/module/ui/components/OxyProvider.js +5 -6
  111. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  112. package/lib/module/ui/components/ProfileButton.js +1 -1
  113. package/lib/module/ui/components/ProfileButton.js.map +1 -1
  114. package/lib/module/ui/components/SettingsIcon.js +1 -1
  115. package/lib/module/ui/components/SettingsIcon.js.map +1 -1
  116. package/lib/module/ui/components/authChooser/AccountsMenuView.js +1 -1
  117. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  118. package/lib/module/ui/components/authChooser/primitives.js +1 -1
  119. package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
  120. package/lib/module/ui/components/authChooser/requestSurfaces.js +1 -1
  121. package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -1
  122. package/lib/module/ui/components/fileManagement/AnimatedButton.js +1 -1
  123. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  124. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +1 -1
  125. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  126. package/lib/module/ui/components/fileManagement/FileViewer.js +1 -1
  127. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  128. package/lib/module/ui/components/fileManagement/UploadPreview.js +1 -1
  129. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  130. package/lib/module/ui/components/modals/DeleteAccountModal.js +1 -1
  131. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  132. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  133. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  134. package/lib/module/ui/components/payment/PaymentMethodStep.js +1 -1
  135. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -1
  136. package/lib/module/ui/components/payment/PaymentReviewStep.js +1 -1
  137. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
  138. package/lib/module/ui/components/payment/PaymentSuccessStep.js +1 -1
  139. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  140. package/lib/module/ui/components/payment/PaymentSummaryStep.js +1 -1
  141. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  142. package/lib/module/ui/components/styles/shadow.js.map +1 -1
  143. package/lib/module/ui/context/OxyContext.js +16 -47
  144. package/lib/module/ui/context/OxyContext.js.map +1 -1
  145. package/lib/module/ui/context/commitSessionFlow.js +0 -42
  146. package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
  147. package/lib/module/ui/context/useOxyAccountGraph.js +3 -4
  148. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  149. package/lib/module/ui/hooks/queries/userCache.js +17 -17
  150. package/lib/module/ui/hooks/queries/userCache.js.map +1 -1
  151. package/lib/module/ui/hooks/useAssets.js.map +1 -1
  152. package/lib/module/ui/hooks/useAuth.js +4 -2
  153. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  154. package/lib/module/ui/hooks/useOnlineStatus.js +3 -2
  155. package/lib/module/ui/hooks/useOnlineStatus.js.map +1 -1
  156. package/lib/module/ui/hooks/useSessionManagement.js +0 -2
  157. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  158. package/lib/module/ui/screens/AccountMembersScreen.js +1 -1
  159. package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
  160. package/lib/module/ui/screens/ConnectedAppsScreen.js +1 -1
  161. package/lib/module/ui/screens/ConnectedAppsScreen.js.map +1 -1
  162. package/lib/module/ui/screens/CreateAccountScreen.js +1 -1
  163. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  164. package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
  165. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  166. package/lib/module/ui/screens/FAQScreen.js +1 -1
  167. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  168. package/lib/module/ui/screens/FeedbackScreen.js +91 -90
  169. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  170. package/lib/module/ui/screens/FileManagementScreen.js +2 -1
  171. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  172. package/lib/module/ui/screens/HistoryViewScreen.js +4 -29
  173. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  174. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
  175. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  176. package/lib/module/ui/screens/ManageAccountScreen.js +1 -1
  177. package/lib/module/ui/screens/ManageAccountScreen.js.map +1 -1
  178. package/lib/module/ui/screens/PaymentGatewayScreen.js +1 -1
  179. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  180. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
  181. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  182. package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -0
  183. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  184. package/lib/module/ui/screens/ProfileScreen.js +4 -5
  185. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  186. package/lib/module/ui/screens/UserListScreen.js +3 -3
  187. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  188. package/lib/module/ui/screens/WelcomeNewUserScreen.js +5 -6
  189. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  190. package/lib/module/ui/screens/fileManagement/FileLibraryError.js +1 -1
  191. package/lib/module/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  192. package/lib/module/ui/screens/fileManagement/FileListSection.js +1 -1
  193. package/lib/module/ui/screens/fileManagement/FileListSection.js.map +1 -1
  194. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +3 -5
  195. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  196. package/lib/module/ui/screens/fileManagement/UploadBar.js +1 -1
  197. package/lib/module/ui/screens/fileManagement/UploadBar.js.map +1 -1
  198. package/lib/module/ui/screens/trust/TrustCenterScreen.js +1 -1
  199. package/lib/module/ui/screens/trust/TrustCenterScreen.js.map +1 -1
  200. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +3 -3
  201. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  202. package/lib/module/ui/screens/trust/TrustRewardsScreen.js +1 -1
  203. package/lib/module/ui/screens/trust/TrustRewardsScreen.js.map +1 -1
  204. package/lib/module/ui/utils/fileManagement.js +25 -25
  205. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  206. package/lib/module/ui/utils/netConnectivity.js +23 -0
  207. package/lib/module/ui/utils/netConnectivity.js.map +1 -0
  208. package/lib/module/ui/utils/oauthReturn.js +15 -27
  209. package/lib/module/ui/utils/oauthReturn.js.map +1 -1
  210. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts +11 -30
  211. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  212. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  213. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts +1 -1
  214. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts.map +1 -1
  215. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts +1 -1
  216. package/lib/typescript/commonjs/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
  217. package/lib/typescript/commonjs/ui/components/payment/types.d.ts +6 -6
  218. package/lib/typescript/commonjs/ui/components/payment/types.d.ts.map +1 -1
  219. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  220. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +0 -40
  221. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
  222. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +4 -7
  223. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  224. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +0 -1
  225. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  226. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts +2 -2
  227. package/lib/typescript/commonjs/ui/hooks/queries/userCache.d.ts.map +1 -1
  228. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +1 -1
  229. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts.map +1 -1
  230. package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts +2 -2
  231. package/lib/typescript/commonjs/ui/hooks/useAsyncAction.d.ts.map +1 -1
  232. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +4 -2
  233. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  234. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts +3 -2
  235. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts.map +1 -1
  236. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts +2 -2
  238. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  239. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  241. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
  243. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  244. package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  245. package/lib/typescript/commonjs/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/ui/types/navigation.d.ts +20 -19
  247. package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
  248. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +5 -5
  249. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  250. package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts +17 -0
  251. package/lib/typescript/commonjs/ui/utils/netConnectivity.d.ts.map +1 -0
  252. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +15 -12
  253. package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
  254. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts +11 -30
  255. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  256. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  257. package/lib/typescript/module/ui/components/SettingsIcon.d.ts +1 -1
  258. package/lib/typescript/module/ui/components/SettingsIcon.d.ts.map +1 -1
  259. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts +1 -1
  260. package/lib/typescript/module/ui/components/authChooser/requestSurfaces.d.ts.map +1 -1
  261. package/lib/typescript/module/ui/components/payment/types.d.ts +6 -6
  262. package/lib/typescript/module/ui/components/payment/types.d.ts.map +1 -1
  263. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  264. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +0 -40
  265. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
  266. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +4 -7
  267. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  268. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +0 -1
  269. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  270. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts +2 -2
  271. package/lib/typescript/module/ui/hooks/queries/userCache.d.ts.map +1 -1
  272. package/lib/typescript/module/ui/hooks/useAssets.d.ts +1 -1
  273. package/lib/typescript/module/ui/hooks/useAssets.d.ts.map +1 -1
  274. package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts +2 -2
  275. package/lib/typescript/module/ui/hooks/useAsyncAction.d.ts.map +1 -1
  276. package/lib/typescript/module/ui/hooks/useAuth.d.ts +4 -2
  277. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  278. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts +3 -2
  279. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts.map +1 -1
  280. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  281. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts +2 -2
  282. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  283. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  284. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  285. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  286. package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
  287. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  288. package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  289. package/lib/typescript/module/ui/screens/trust/TrustLeaderboardScreen.d.ts.map +1 -1
  290. package/lib/typescript/module/ui/types/navigation.d.ts +20 -19
  291. package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
  292. package/lib/typescript/module/ui/utils/fileManagement.d.ts +5 -5
  293. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  294. package/lib/typescript/module/ui/utils/netConnectivity.d.ts +17 -0
  295. package/lib/typescript/module/ui/utils/netConnectivity.d.ts.map +1 -0
  296. package/lib/typescript/module/ui/utils/oauthReturn.d.ts +15 -12
  297. package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
  298. package/package.json +5 -5
  299. package/src/ui/boot/__tests__/coldBootNoIdpRedirect.test.ts +215 -0
  300. package/src/ui/boot/runProviderColdBoot.ts +24 -101
  301. package/src/ui/components/AvatarCameraBadge.tsx +1 -1
  302. package/src/ui/components/OxyProvider.tsx +5 -6
  303. package/src/ui/components/ProfileButton.tsx +1 -1
  304. package/src/ui/components/SettingsIcon.tsx +1 -1
  305. package/src/ui/components/authChooser/AccountsMenuView.tsx +1 -1
  306. package/src/ui/components/authChooser/primitives.tsx +1 -1
  307. package/src/ui/components/authChooser/requestSurfaces.tsx +1 -1
  308. package/src/ui/components/fileManagement/AnimatedButton.tsx +1 -1
  309. package/src/ui/components/fileManagement/FileDetailsModal.tsx +1 -1
  310. package/src/ui/components/fileManagement/FileViewer.tsx +1 -1
  311. package/src/ui/components/fileManagement/UploadPreview.tsx +1 -1
  312. package/src/ui/components/modals/DeleteAccountModal.tsx +1 -1
  313. package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
  314. package/src/ui/components/payment/PaymentMethodStep.tsx +1 -1
  315. package/src/ui/components/payment/PaymentReviewStep.tsx +1 -1
  316. package/src/ui/components/payment/PaymentSuccessStep.tsx +1 -1
  317. package/src/ui/components/payment/PaymentSummaryStep.tsx +1 -1
  318. package/src/ui/components/payment/types.ts +24 -24
  319. package/src/ui/components/styles/shadow.tsx +2 -2
  320. package/src/ui/context/OxyContext.tsx +15 -46
  321. package/src/ui/context/__tests__/commitSessionFlow.test.ts +0 -89
  322. package/src/ui/context/commitSessionFlow.ts +0 -61
  323. package/src/ui/context/oxyContextTypes.ts +4 -7
  324. package/src/ui/context/useOxyAccountGraph.ts +4 -4
  325. package/src/ui/hooks/queries/userCache.ts +169 -148
  326. package/src/ui/hooks/useAssets.ts +1 -1
  327. package/src/ui/hooks/useAsyncAction.ts +2 -2
  328. package/src/ui/hooks/useAuth.ts +4 -2
  329. package/src/ui/hooks/useOnlineStatus.ts +3 -2
  330. package/src/ui/hooks/useSessionManagement.ts +0 -2
  331. package/src/ui/screens/AccountMembersScreen.tsx +1 -1
  332. package/src/ui/screens/ConnectedAppsScreen.tsx +1 -1
  333. package/src/ui/screens/CreateAccountScreen.tsx +1 -1
  334. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  335. package/src/ui/screens/FAQScreen.tsx +1 -1
  336. package/src/ui/screens/FeedbackScreen.tsx +740 -574
  337. package/src/ui/screens/FileManagementScreen.tsx +2 -1
  338. package/src/ui/screens/HistoryViewScreen.tsx +4 -19
  339. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  340. package/src/ui/screens/ManageAccountScreen.tsx +1 -1
  341. package/src/ui/screens/PaymentGatewayScreen.tsx +1 -1
  342. package/src/ui/screens/PremiumSubscriptionScreen.tsx +2 -2
  343. package/src/ui/screens/PrivacySettingsScreen.tsx +1 -0
  344. package/src/ui/screens/ProfileScreen.tsx +6 -4
  345. package/src/ui/screens/UserListScreen.tsx +3 -3
  346. package/src/ui/screens/WelcomeNewUserScreen.tsx +6 -6
  347. package/src/ui/screens/fileManagement/FileLibraryError.tsx +1 -1
  348. package/src/ui/screens/fileManagement/FileListSection.tsx +1 -1
  349. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +3 -2
  350. package/src/ui/screens/fileManagement/UploadBar.tsx +1 -1
  351. package/src/ui/screens/trust/TrustCenterScreen.tsx +1 -1
  352. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +4 -3
  353. package/src/ui/screens/trust/TrustRewardsScreen.tsx +1 -1
  354. package/src/ui/types/navigation.ts +20 -19
  355. package/src/ui/utils/fileManagement.ts +108 -92
  356. package/src/ui/utils/netConnectivity.ts +27 -0
  357. package/src/ui/utils/oauthReturn.ts +15 -30
  358. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js +0 -48
  359. package/lib/commonjs/ui/oauth/legacyRedirectLanes.js.map +0 -1
  360. package/lib/commonjs/ui/utils/crossOriginRestore.js +0 -140
  361. package/lib/commonjs/ui/utils/crossOriginRestore.js.map +0 -1
  362. package/lib/module/ui/oauth/legacyRedirectLanes.js +0 -44
  363. package/lib/module/ui/oauth/legacyRedirectLanes.js.map +0 -1
  364. package/lib/module/ui/utils/crossOriginRestore.js +0 -131
  365. package/lib/module/ui/utils/crossOriginRestore.js.map +0 -1
  366. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts +0 -40
  367. package/lib/typescript/commonjs/ui/oauth/legacyRedirectLanes.d.ts.map +0 -1
  368. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts +0 -43
  369. package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +0 -1
  370. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts +0 -40
  371. package/lib/typescript/module/ui/oauth/legacyRedirectLanes.d.ts.map +0 -1
  372. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts +0 -43
  373. package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +0 -1
  374. package/src/ui/boot/__tests__/coldBootWebAuthMode.test.ts +0 -281
  375. package/src/ui/oauth/legacyRedirectLanes.ts +0 -43
  376. package/src/ui/utils/__tests__/crossOriginRestore.test.ts +0 -160
  377. package/src/ui/utils/crossOriginRestore.ts +0 -168
@@ -1,131 +0,0 @@
1
- "use strict";
2
-
3
- import { buildOAuthAuthorizeUrl, generateOAuthState, generatePkcePair, isIdpHubOrigin, isLoopbackOrigin, isOfficialWebOrigin, OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, OXY_SILENT_OAUTH_ATTEMPTED_KEY, clearOAuthHandshake, persistOAuthHandshake, canonicalizeOAuthRedirectUri, logger } from '@oxyhq/core';
4
- import { isWebBrowser } from "./isWebBrowser.js";
5
- import { replaceUrlAfterOAuthReturn } from "./oauthReturn.js";
6
- import { redirectToAuthorize } from "../components/oauthNavigation.js";
7
- function sessionStore() {
8
- return globalThis.sessionStorage;
9
- }
10
-
11
- /** True when this tab already attempted cross-origin silent OAuth restore. */
12
- export function isCrossOriginRestoreBlocked() {
13
- const store = sessionStore();
14
- if (!store) return false;
15
- return Boolean(store.getItem(OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY) || store.getItem(OXY_SILENT_OAUTH_ATTEMPTED_KEY));
16
- }
17
-
18
- /** Mark restore as attempted — never auto-retry until sign-out clears guards. */
19
- export function markCrossOriginRestoreAttempted() {
20
- const store = sessionStore();
21
- if (!store) return;
22
- store.setItem(OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, '1');
23
- store.setItem(OXY_SILENT_OAUTH_ATTEMPTED_KEY, '1');
24
- }
25
-
26
- /** Clear all cross-origin restore loop guards (call on sign-out). */
27
- export function clearCrossOriginRestoreGuards() {
28
- const store = sessionStore();
29
- if (!store) return;
30
- for (const key of [OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, OXY_SILENT_OAUTH_ATTEMPTED_KEY]) {
31
- store.removeItem(key);
32
- }
33
- }
34
-
35
- /**
36
- * Whether cold boot should attempt silent cross-origin OAuth restore for the
37
- * given web origin.
38
- *
39
- * Mirrors the hub-sync WRITE gate (`syncHubAfterSignIn`): only OFFICIAL Oxy web
40
- * origins participate in cross-app SSO — a random third-party / preview origin
41
- * must never have its tab bounced to the IdP. Additionally, loopback / local-dev
42
- * origins are EXCLUDED here even though {@link isOfficialWebOrigin} treats them
43
- * as official: a developer's local app must never be redirected to a hosted IdP
44
- * on cold boot (it signs in through the in-app dialog instead). The central IdP
45
- * hub's own origin is excluded to avoid a wasteful self-hop.
46
- */
47
- export function isSilentRestoreEligibleOrigin(origin) {
48
- if (isLoopbackOrigin(origin)) return false;
49
- if (isIdpHubOrigin()) return false;
50
- return isOfficialWebOrigin(origin);
51
- }
52
- /**
53
- * Top-level redirect to auth.oxy.so/authorize with `prompt=none` for silent
54
- * cross-origin session restore on all web apps (official + third-party).
55
- */
56
- export async function maybeStartSilentOAuthRestore(opts) {
57
- if (!isWebBrowser()) return false;
58
- const location = globalThis.location;
59
- if (!location) return false;
60
-
61
- // Defense-in-depth: never bounce a loopback / non-official / IdP-hub origin to
62
- // a hosted authorize endpoint (the caller gates on this too).
63
- if (!isSilentRestoreEligibleOrigin(location.origin)) {
64
- return false;
65
- }
66
- if (isCrossOriginRestoreBlocked()) {
67
- return false;
68
- }
69
- const params = new URLSearchParams(location.search);
70
- if (params.has('code') || params.has('error')) {
71
- return false;
72
- }
73
- try {
74
- const {
75
- codeVerifier,
76
- codeChallenge
77
- } = await generatePkcePair();
78
- const state = await generateOAuthState();
79
- const redirectUri = canonicalizeOAuthRedirectUri(opts.redirectUri ?? location.origin);
80
- if (!persistOAuthHandshake(state, codeVerifier, redirectUri)) {
81
- return false;
82
- }
83
- const authorizeUrl = buildOAuthAuthorizeUrl({
84
- authorizeBaseUrl: opts.authorizeBaseUrl,
85
- clientId: opts.clientId,
86
- redirectUri,
87
- state,
88
- codeChallenge,
89
- scope: opts.scope,
90
- prompt: 'none'
91
- });
92
- markCrossOriginRestoreAttempted();
93
- redirectToAuthorize(authorizeUrl);
94
- return true;
95
- } catch (error) {
96
- logger.warn('Silent OAuth restore skipped', {
97
- component: 'crossOriginRestore'
98
- }, error);
99
- return false;
100
- }
101
- }
102
-
103
- /**
104
- * When the RP lands with OAuth error params from a silent authorize attempt,
105
- * strip them and return whether the error was terminal for silent restore.
106
- */
107
- export function consumeSilentOAuthError() {
108
- if (!isWebBrowser()) return null;
109
- const location = globalThis.location;
110
- const history = globalThis.history;
111
- if (!location) return null;
112
- const params = new URLSearchParams(location.search);
113
- const error = params.get('error');
114
- if (error !== 'login_required' && error !== 'consent_required') {
115
- return null;
116
- }
117
- markCrossOriginRestoreAttempted();
118
- if (history?.replaceState) {
119
- const url = new URL(location.href);
120
- url.searchParams.delete('error');
121
- url.searchParams.delete('error_description');
122
- url.searchParams.delete('state');
123
- // Silent restore failed, but the visitor still asked for a specific page.
124
- // Put them back on it rather than leaving them on the bare origin the IdP
125
- // redirected to.
126
- replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
127
- }
128
- clearOAuthHandshake();
129
- return error;
130
- }
131
- //# sourceMappingURL=crossOriginRestore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["buildOAuthAuthorizeUrl","generateOAuthState","generatePkcePair","isIdpHubOrigin","isLoopbackOrigin","isOfficialWebOrigin","OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY","OXY_SILENT_OAUTH_ATTEMPTED_KEY","clearOAuthHandshake","persistOAuthHandshake","canonicalizeOAuthRedirectUri","logger","isWebBrowser","replaceUrlAfterOAuthReturn","redirectToAuthorize","sessionStore","globalThis","sessionStorage","isCrossOriginRestoreBlocked","store","Boolean","getItem","markCrossOriginRestoreAttempted","setItem","clearCrossOriginRestoreGuards","key","removeItem","isSilentRestoreEligibleOrigin","origin","maybeStartSilentOAuthRestore","opts","location","params","URLSearchParams","search","has","codeVerifier","codeChallenge","state","redirectUri","authorizeUrl","authorizeBaseUrl","clientId","scope","prompt","error","warn","component","consumeSilentOAuthError","history","get","replaceState","url","URL","href","searchParams","delete","pathname","hash"],"sourceRoot":"../../../../src","sources":["ui/utils/crossOriginRestore.ts"],"mappings":"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","ignoreList":[]}
@@ -1,40 +0,0 @@
1
- /**
2
- * The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
3
- * to the IdP without a user gesture.
4
- *
5
- * `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
6
- * party never leaves its route. Two mechanics in this SDK break that guarantee,
7
- * because each replaces the whole document on its own initiative:
8
- *
9
- * 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
10
- * to `auth.oxy.so` when the device-secret mint finds no local session
11
- * (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
12
- * 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
13
- * plants this device's credential on the IdP hub so OTHER origins can later
14
- * run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
15
- *
16
- * Both belong to the redirect transport and are kept only for the migration
17
- * window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
18
- * domain with no local credential simply resolves SIGNED OUT, and the user's
19
- * next explicit "Continue with Oxy" opens the popup — from a real user gesture,
20
- * never automatically.
21
- *
22
- * NOT covered here, and correctly enabled in BOTH modes: navigations the user
23
- * asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
24
- * falls back to a full-page redirect rather than dead-ending the sign-in, and
25
- * `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
26
- *
27
- * PHASE 7b: once the pilot flips the default transport to `'popup'`, this
28
- * predicate and BOTH lanes above are deleted outright. Grepping this symbol
29
- * finds every site that has to go.
30
- */
31
- import type { WebAuthMode } from './types';
32
- /**
33
- * Whether a provider running `webAuthMode` may perform an SDK-initiated,
34
- * non-gesture, full-page navigation to the IdP.
35
- *
36
- * `true` only for `'redirect'` — still the default and the compatibility path,
37
- * whose behaviour must stay byte-for-byte unchanged.
38
- */
39
- export declare function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean;
40
- //# sourceMappingURL=legacyRedirectLanes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacyRedirectLanes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/oauth/legacyRedirectLanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE5E"}
@@ -1,43 +0,0 @@
1
- import type { OxyServices } from '@oxyhq/core';
2
- /** True when this tab already attempted cross-origin silent OAuth restore. */
3
- export declare function isCrossOriginRestoreBlocked(): boolean;
4
- /** Mark restore as attempted — never auto-retry until sign-out clears guards. */
5
- export declare function markCrossOriginRestoreAttempted(): void;
6
- /** Clear all cross-origin restore loop guards (call on sign-out). */
7
- export declare function clearCrossOriginRestoreGuards(): void;
8
- /**
9
- * Whether cold boot should attempt silent cross-origin OAuth restore for the
10
- * given web origin.
11
- *
12
- * Mirrors the hub-sync WRITE gate (`syncHubAfterSignIn`): only OFFICIAL Oxy web
13
- * origins participate in cross-app SSO — a random third-party / preview origin
14
- * must never have its tab bounced to the IdP. Additionally, loopback / local-dev
15
- * origins are EXCLUDED here even though {@link isOfficialWebOrigin} treats them
16
- * as official: a developer's local app must never be redirected to a hosted IdP
17
- * on cold boot (it signs in through the in-app dialog instead). The central IdP
18
- * hub's own origin is excluded to avoid a wasteful self-hop.
19
- */
20
- export declare function isSilentRestoreEligibleOrigin(origin: string): boolean;
21
- export interface SilentOAuthRestoreOptions {
22
- oxyServices: OxyServices;
23
- clientId: string;
24
- redirectUri?: string;
25
- scope?: string;
26
- /**
27
- * Authorize endpoint override (env-configurable per deployment). Defaults to
28
- * the production Oxy IdP when unset, so a local/staging app points silent
29
- * restore at its OWN IdP instead of production `auth.oxy.so`.
30
- */
31
- authorizeBaseUrl?: string;
32
- }
33
- /**
34
- * Top-level redirect to auth.oxy.so/authorize with `prompt=none` for silent
35
- * cross-origin session restore on all web apps (official + third-party).
36
- */
37
- export declare function maybeStartSilentOAuthRestore(opts: SilentOAuthRestoreOptions): Promise<boolean>;
38
- /**
39
- * When the RP lands with OAuth error params from a silent authorize attempt,
40
- * strip them and return whether the error was terminal for silent restore.
41
- */
42
- export declare function consumeSilentOAuthError(): 'login_required' | 'consent_required' | null;
43
- //# sourceMappingURL=crossOriginRestore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAgDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CA0BtF"}
@@ -1,40 +0,0 @@
1
- /**
2
- * The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
3
- * to the IdP without a user gesture.
4
- *
5
- * `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
6
- * party never leaves its route. Two mechanics in this SDK break that guarantee,
7
- * because each replaces the whole document on its own initiative:
8
- *
9
- * 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
10
- * to `auth.oxy.so` when the device-secret mint finds no local session
11
- * (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
12
- * 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
13
- * plants this device's credential on the IdP hub so OTHER origins can later
14
- * run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
15
- *
16
- * Both belong to the redirect transport and are kept only for the migration
17
- * window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
18
- * domain with no local credential simply resolves SIGNED OUT, and the user's
19
- * next explicit "Continue with Oxy" opens the popup — from a real user gesture,
20
- * never automatically.
21
- *
22
- * NOT covered here, and correctly enabled in BOTH modes: navigations the user
23
- * asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
24
- * falls back to a full-page redirect rather than dead-ending the sign-in, and
25
- * `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
26
- *
27
- * PHASE 7b: once the pilot flips the default transport to `'popup'`, this
28
- * predicate and BOTH lanes above are deleted outright. Grepping this symbol
29
- * finds every site that has to go.
30
- */
31
- import type { WebAuthMode } from './types.js';
32
- /**
33
- * Whether a provider running `webAuthMode` may perform an SDK-initiated,
34
- * non-gesture, full-page navigation to the IdP.
35
- *
36
- * `true` only for `'redirect'` — still the default and the compatibility path,
37
- * whose behaviour must stay byte-for-byte unchanged.
38
- */
39
- export declare function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean;
40
- //# sourceMappingURL=legacyRedirectLanes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacyRedirectLanes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/oauth/legacyRedirectLanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE5E"}
@@ -1,43 +0,0 @@
1
- import type { OxyServices } from '@oxyhq/core';
2
- /** True when this tab already attempted cross-origin silent OAuth restore. */
3
- export declare function isCrossOriginRestoreBlocked(): boolean;
4
- /** Mark restore as attempted — never auto-retry until sign-out clears guards. */
5
- export declare function markCrossOriginRestoreAttempted(): void;
6
- /** Clear all cross-origin restore loop guards (call on sign-out). */
7
- export declare function clearCrossOriginRestoreGuards(): void;
8
- /**
9
- * Whether cold boot should attempt silent cross-origin OAuth restore for the
10
- * given web origin.
11
- *
12
- * Mirrors the hub-sync WRITE gate (`syncHubAfterSignIn`): only OFFICIAL Oxy web
13
- * origins participate in cross-app SSO — a random third-party / preview origin
14
- * must never have its tab bounced to the IdP. Additionally, loopback / local-dev
15
- * origins are EXCLUDED here even though {@link isOfficialWebOrigin} treats them
16
- * as official: a developer's local app must never be redirected to a hosted IdP
17
- * on cold boot (it signs in through the in-app dialog instead). The central IdP
18
- * hub's own origin is excluded to avoid a wasteful self-hop.
19
- */
20
- export declare function isSilentRestoreEligibleOrigin(origin: string): boolean;
21
- export interface SilentOAuthRestoreOptions {
22
- oxyServices: OxyServices;
23
- clientId: string;
24
- redirectUri?: string;
25
- scope?: string;
26
- /**
27
- * Authorize endpoint override (env-configurable per deployment). Defaults to
28
- * the production Oxy IdP when unset, so a local/staging app points silent
29
- * restore at its OWN IdP instead of production `auth.oxy.so`.
30
- */
31
- authorizeBaseUrl?: string;
32
- }
33
- /**
34
- * Top-level redirect to auth.oxy.so/authorize with `prompt=none` for silent
35
- * cross-origin session restore on all web apps (official + third-party).
36
- */
37
- export declare function maybeStartSilentOAuthRestore(opts: SilentOAuthRestoreOptions): Promise<boolean>;
38
- /**
39
- * When the RP lands with OAuth error params from a silent authorize attempt,
40
- * strip them and return whether the error was terminal for silent restore.
41
- */
42
- export declare function consumeSilentOAuthError(): 'login_required' | 'consent_required' | null;
43
- //# sourceMappingURL=crossOriginRestore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAgDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CA0BtF"}
@@ -1,281 +0,0 @@
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
- });
@@ -1,43 +0,0 @@
1
- /**
2
- * The legacy, redirect-mode-only lanes that navigate the RP's TOP-LEVEL window
3
- * to the IdP without a user gesture.
4
- *
5
- * `webAuthMode: 'popup'` exists to guarantee exactly one thing: the relying
6
- * party never leaves its route. Two mechanics in this SDK break that guarantee,
7
- * because each replaces the whole document on its own initiative:
8
- *
9
- * 1. **Cold-boot silent restore** — a full-page `prompt=none` authorize bounce
10
- * to `auth.oxy.so` when the device-secret mint finds no local session
11
- * (`maybeStartSilentOAuthRestore`, called from `runProviderColdBoot`).
12
- * 2. **Post-sign-in hub sync** — a full-page hop to `auth.oxy.so/sync` that
13
- * plants this device's credential on the IdP hub so OTHER origins can later
14
- * run lane 1 (`syncHubAfterSignIn`, called from the `commitSession` funnel).
15
- *
16
- * Both belong to the redirect transport and are kept only for the migration
17
- * window (issue #691, "Cold boot and cross-domain behavior"). In popup mode a
18
- * domain with no local credential simply resolves SIGNED OUT, and the user's
19
- * next explicit "Continue with Oxy" opens the popup — from a real user gesture,
20
- * never automatically.
21
- *
22
- * NOT covered here, and correctly enabled in BOTH modes: navigations the user
23
- * asked for. When the browser blocks the popup, `startWebOAuthSignIn` still
24
- * falls back to a full-page redirect rather than dead-ending the sign-in, and
25
- * `tryCompleteOAuthReturn` still consumes a `?code=` that is already on the URL.
26
- *
27
- * PHASE 7b: once the pilot flips the default transport to `'popup'`, this
28
- * predicate and BOTH lanes above are deleted outright. Grepping this symbol
29
- * finds every site that has to go.
30
- */
31
-
32
- import type { WebAuthMode } from './types';
33
-
34
- /**
35
- * Whether a provider running `webAuthMode` may perform an SDK-initiated,
36
- * non-gesture, full-page navigation to the IdP.
37
- *
38
- * `true` only for `'redirect'` — still the default and the compatibility path,
39
- * whose behaviour must stay byte-for-byte unchanged.
40
- */
41
- export function allowsAutomaticIdpRedirect(webAuthMode: WebAuthMode): boolean {
42
- return webAuthMode === 'redirect';
43
- }