@oxyhq/services 28.0.0 → 29.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 (324) hide show
  1. package/NOTICE +10 -9
  2. package/README.md +65 -2
  3. package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionModule.kt +178 -0
  4. package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionProvider.kt +99 -0
  5. package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionStore.kt +115 -0
  6. package/expo-module.config.json +1 -0
  7. package/lib/commonjs/index.js +60 -16
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/ui/boot/runProviderColdBoot.js +7 -0
  10. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  11. package/lib/commonjs/ui/client.js +12 -7
  12. package/lib/commonjs/ui/client.js.map +1 -1
  13. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js +10 -27
  14. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js.map +1 -1
  15. package/lib/commonjs/ui/components/OxyAuthChooser.js +132 -44
  16. package/lib/commonjs/ui/components/OxyAuthChooser.js.map +1 -1
  17. package/lib/commonjs/ui/components/OxyProvider.js +4 -2
  18. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  19. package/lib/commonjs/ui/components/SurfaceScreen.js +31 -3
  20. package/lib/commonjs/ui/components/SurfaceScreen.js.map +1 -1
  21. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +209 -84
  22. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  23. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js +25 -7
  24. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js.map +1 -1
  25. package/lib/commonjs/ui/components/authChooser/primitives.js +35 -22
  26. package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
  27. package/lib/commonjs/ui/components/authChooser/types.js +11 -0
  28. package/lib/commonjs/ui/components/authChooser/types.js.map +1 -1
  29. package/lib/commonjs/ui/context/OxyContext.js +257 -306
  30. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  31. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +27 -37
  32. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  33. package/lib/commonjs/ui/context/oxyContextHelpers.js +0 -29
  34. package/lib/commonjs/ui/context/oxyContextHelpers.js.map +1 -1
  35. package/lib/commonjs/ui/context/useOxyAccountGraph.js +6 -17
  36. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  37. package/lib/commonjs/ui/hooks/accountDialogSnapshot.js +42 -0
  38. package/lib/commonjs/ui/hooks/accountDialogSnapshot.js.map +1 -0
  39. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +0 -19
  40. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  41. package/lib/commonjs/ui/hooks/useDeviceSwitcher.js +57 -0
  42. package/lib/commonjs/ui/hooks/useDeviceSwitcher.js.map +1 -0
  43. package/lib/commonjs/ui/hooks/useI18n.js +22 -3
  44. package/lib/commonjs/ui/hooks/useI18n.js.map +1 -1
  45. package/lib/commonjs/ui/hooks/useSessionManagement.js +46 -153
  46. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  47. package/lib/commonjs/ui/index.js +12 -7
  48. package/lib/commonjs/ui/index.js.map +1 -1
  49. package/lib/commonjs/ui/navigation/routes.js +85 -73
  50. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  51. package/lib/commonjs/ui/navigation/surfaces.js +8 -7
  52. package/lib/commonjs/ui/navigation/surfaces.js.map +1 -1
  53. package/lib/commonjs/ui/runtime/createOxyRuntime.js +433 -0
  54. package/lib/commonjs/ui/runtime/createOxyRuntime.js.map +1 -0
  55. package/lib/commonjs/ui/runtime/index.js +63 -0
  56. package/lib/commonjs/ui/runtime/index.js.map +1 -0
  57. package/lib/commonjs/ui/runtime/runtimeContext.js +83 -0
  58. package/lib/commonjs/ui/runtime/runtimeContext.js.map +1 -0
  59. package/lib/commonjs/ui/runtime/types.js +6 -0
  60. package/lib/commonjs/ui/runtime/types.js.map +1 -0
  61. package/lib/commonjs/ui/runtime/useRuntimeSnapshot.js +57 -0
  62. package/lib/commonjs/ui/runtime/useRuntimeSnapshot.js.map +1 -0
  63. package/lib/commonjs/ui/server.js +1 -2
  64. package/lib/commonjs/ui/server.js.map +1 -1
  65. package/lib/commonjs/ui/session/authStore.js +45 -9
  66. package/lib/commonjs/ui/session/authStore.js.map +1 -1
  67. package/lib/commonjs/ui/session/sharedDeviceCredentialStore.js +306 -0
  68. package/lib/commonjs/ui/session/sharedDeviceCredentialStore.js.map +1 -0
  69. package/lib/commonjs/ui/stores/authStore.js +154 -55
  70. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  71. package/lib/commonjs/ui/utils/avatarUtils.js +2 -36
  72. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  73. package/lib/module/index.js +16 -8
  74. package/lib/module/index.js.map +1 -1
  75. package/lib/module/ui/boot/runProviderColdBoot.js +7 -0
  76. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  77. package/lib/module/ui/client.js +1 -2
  78. package/lib/module/ui/client.js.map +1 -1
  79. package/lib/module/ui/components/OxyAccountDialogScreen.js +10 -27
  80. package/lib/module/ui/components/OxyAccountDialogScreen.js.map +1 -1
  81. package/lib/module/ui/components/OxyAuthChooser.js +134 -44
  82. package/lib/module/ui/components/OxyAuthChooser.js.map +1 -1
  83. package/lib/module/ui/components/OxyProvider.js +5 -3
  84. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  85. package/lib/module/ui/components/SurfaceScreen.js +33 -5
  86. package/lib/module/ui/components/SurfaceScreen.js.map +1 -1
  87. package/lib/module/ui/components/authChooser/AccountsMenuView.js +210 -85
  88. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  89. package/lib/module/ui/components/authChooser/SignInEntryView.js +25 -7
  90. package/lib/module/ui/components/authChooser/SignInEntryView.js.map +1 -1
  91. package/lib/module/ui/components/authChooser/primitives.js +35 -22
  92. package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
  93. package/lib/module/ui/components/authChooser/types.js +11 -0
  94. package/lib/module/ui/components/authChooser/types.js.map +1 -1
  95. package/lib/module/ui/context/OxyContext.js +251 -303
  96. package/lib/module/ui/context/OxyContext.js.map +1 -1
  97. package/lib/module/ui/context/hooks/useAuthOperations.js +27 -37
  98. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  99. package/lib/module/ui/context/oxyContextHelpers.js +0 -28
  100. package/lib/module/ui/context/oxyContextHelpers.js.map +1 -1
  101. package/lib/module/ui/context/useOxyAccountGraph.js +6 -17
  102. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  103. package/lib/module/ui/hooks/accountDialogSnapshot.js +38 -0
  104. package/lib/module/ui/hooks/accountDialogSnapshot.js.map +1 -0
  105. package/lib/module/ui/hooks/mutations/useAccountMutations.js +0 -19
  106. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  107. package/lib/module/ui/hooks/useDeviceSwitcher.js +53 -0
  108. package/lib/module/ui/hooks/useDeviceSwitcher.js.map +1 -0
  109. package/lib/module/ui/hooks/useI18n.js +24 -4
  110. package/lib/module/ui/hooks/useI18n.js.map +1 -1
  111. package/lib/module/ui/hooks/useSessionManagement.js +47 -155
  112. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  113. package/lib/module/ui/index.js +1 -2
  114. package/lib/module/ui/index.js.map +1 -1
  115. package/lib/module/ui/navigation/routes.js +84 -72
  116. package/lib/module/ui/navigation/routes.js.map +1 -1
  117. package/lib/module/ui/navigation/surfaces.js +6 -6
  118. package/lib/module/ui/navigation/surfaces.js.map +1 -1
  119. package/lib/module/ui/runtime/createOxyRuntime.js +430 -0
  120. package/lib/module/ui/runtime/createOxyRuntime.js.map +1 -0
  121. package/lib/module/ui/runtime/index.js +15 -0
  122. package/lib/module/ui/runtime/index.js.map +1 -0
  123. package/lib/module/ui/runtime/runtimeContext.js +75 -0
  124. package/lib/module/ui/runtime/runtimeContext.js.map +1 -0
  125. package/lib/module/ui/runtime/types.js +4 -0
  126. package/lib/module/ui/runtime/types.js.map +1 -0
  127. package/lib/module/ui/runtime/useRuntimeSnapshot.js +52 -0
  128. package/lib/module/ui/runtime/useRuntimeSnapshot.js.map +1 -0
  129. package/lib/module/ui/server.js +0 -1
  130. package/lib/module/ui/server.js.map +1 -1
  131. package/lib/module/ui/session/authStore.js +46 -11
  132. package/lib/module/ui/session/authStore.js.map +1 -1
  133. package/lib/module/ui/session/sharedDeviceCredentialStore.js +302 -0
  134. package/lib/module/ui/session/sharedDeviceCredentialStore.js.map +1 -0
  135. package/lib/module/ui/stores/authStore.js +154 -55
  136. package/lib/module/ui/stores/authStore.js.map +1 -1
  137. package/lib/module/ui/utils/avatarUtils.js +2 -35
  138. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  139. package/lib/typescript/commonjs/index.d.ts +5 -3
  140. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  141. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/ui/client.d.ts +1 -2
  143. package/lib/typescript/commonjs/ui/client.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  145. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts.map +1 -1
  146. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  147. package/lib/typescript/commonjs/ui/components/SurfaceScreen.d.ts.map +1 -1
  148. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts +11 -4
  149. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
  150. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts +3 -1
  151. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts.map +1 -1
  152. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts +18 -6
  153. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts.map +1 -1
  154. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts +33 -1
  155. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts.map +1 -1
  156. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +35 -4
  157. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  158. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +8 -12
  159. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  160. package/lib/typescript/commonjs/ui/context/oxyContextHelpers.d.ts +0 -2
  161. package/lib/typescript/commonjs/ui/context/oxyContextHelpers.d.ts.map +1 -1
  162. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +9 -1
  163. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  164. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +1 -3
  165. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/ui/hooks/accountDialogSnapshot.d.ts +15 -0
  167. package/lib/typescript/commonjs/ui/hooks/accountDialogSnapshot.d.ts.map +1 -0
  168. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  169. package/lib/typescript/commonjs/ui/hooks/useDeviceSwitcher.d.ts +49 -0
  170. package/lib/typescript/commonjs/ui/hooks/useDeviceSwitcher.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/ui/hooks/useI18n.d.ts +13 -0
  172. package/lib/typescript/commonjs/ui/hooks/useI18n.d.ts.map +1 -1
  173. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts +23 -18
  174. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  175. package/lib/typescript/commonjs/ui/index.d.ts +1 -2
  176. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  177. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +15 -1
  178. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  179. package/lib/typescript/commonjs/ui/navigation/surfaces.d.ts.map +1 -1
  180. package/lib/typescript/commonjs/ui/runtime/createOxyRuntime.d.ts +144 -0
  181. package/lib/typescript/commonjs/ui/runtime/createOxyRuntime.d.ts.map +1 -0
  182. package/lib/typescript/commonjs/ui/runtime/index.d.ts +16 -0
  183. package/lib/typescript/commonjs/ui/runtime/index.d.ts.map +1 -0
  184. package/lib/typescript/commonjs/ui/runtime/runtimeContext.d.ts +43 -0
  185. package/lib/typescript/commonjs/ui/runtime/runtimeContext.d.ts.map +1 -0
  186. package/lib/typescript/commonjs/ui/runtime/types.d.ts +89 -0
  187. package/lib/typescript/commonjs/ui/runtime/types.d.ts.map +1 -0
  188. package/lib/typescript/commonjs/ui/runtime/useRuntimeSnapshot.d.ts +23 -0
  189. package/lib/typescript/commonjs/ui/runtime/useRuntimeSnapshot.d.ts.map +1 -0
  190. package/lib/typescript/commonjs/ui/server.d.ts +0 -1
  191. package/lib/typescript/commonjs/ui/server.d.ts.map +1 -1
  192. package/lib/typescript/commonjs/ui/session/authStore.d.ts +60 -9
  193. package/lib/typescript/commonjs/ui/session/authStore.d.ts.map +1 -1
  194. package/lib/typescript/commonjs/ui/session/sharedDeviceCredentialStore.d.ts +32 -0
  195. package/lib/typescript/commonjs/ui/session/sharedDeviceCredentialStore.d.ts.map +1 -0
  196. package/lib/typescript/commonjs/ui/stores/authStore.d.ts +49 -5
  197. package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
  198. package/lib/typescript/commonjs/ui/types/navigation.d.ts +26 -0
  199. package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
  200. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts +2 -10
  201. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts.map +1 -1
  202. package/lib/typescript/module/index.d.ts +5 -3
  203. package/lib/typescript/module/index.d.ts.map +1 -1
  204. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  205. package/lib/typescript/module/ui/client.d.ts +1 -2
  206. package/lib/typescript/module/ui/client.d.ts.map +1 -1
  207. package/lib/typescript/module/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  208. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts.map +1 -1
  209. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  210. package/lib/typescript/module/ui/components/SurfaceScreen.d.ts.map +1 -1
  211. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts +11 -4
  212. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
  213. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts +3 -1
  214. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts.map +1 -1
  215. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts +18 -6
  216. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts.map +1 -1
  217. package/lib/typescript/module/ui/components/authChooser/types.d.ts +33 -1
  218. package/lib/typescript/module/ui/components/authChooser/types.d.ts.map +1 -1
  219. package/lib/typescript/module/ui/context/OxyContext.d.ts +35 -4
  220. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  221. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +8 -12
  222. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  223. package/lib/typescript/module/ui/context/oxyContextHelpers.d.ts +0 -2
  224. package/lib/typescript/module/ui/context/oxyContextHelpers.d.ts.map +1 -1
  225. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +9 -1
  226. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  227. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +1 -3
  228. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  229. package/lib/typescript/module/ui/hooks/accountDialogSnapshot.d.ts +15 -0
  230. package/lib/typescript/module/ui/hooks/accountDialogSnapshot.d.ts.map +1 -0
  231. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  232. package/lib/typescript/module/ui/hooks/useDeviceSwitcher.d.ts +49 -0
  233. package/lib/typescript/module/ui/hooks/useDeviceSwitcher.d.ts.map +1 -0
  234. package/lib/typescript/module/ui/hooks/useI18n.d.ts +13 -0
  235. package/lib/typescript/module/ui/hooks/useI18n.d.ts.map +1 -1
  236. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts +23 -18
  237. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  238. package/lib/typescript/module/ui/index.d.ts +1 -2
  239. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  240. package/lib/typescript/module/ui/navigation/routes.d.ts +15 -1
  241. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  242. package/lib/typescript/module/ui/navigation/surfaces.d.ts.map +1 -1
  243. package/lib/typescript/module/ui/runtime/createOxyRuntime.d.ts +144 -0
  244. package/lib/typescript/module/ui/runtime/createOxyRuntime.d.ts.map +1 -0
  245. package/lib/typescript/module/ui/runtime/index.d.ts +16 -0
  246. package/lib/typescript/module/ui/runtime/index.d.ts.map +1 -0
  247. package/lib/typescript/module/ui/runtime/runtimeContext.d.ts +43 -0
  248. package/lib/typescript/module/ui/runtime/runtimeContext.d.ts.map +1 -0
  249. package/lib/typescript/module/ui/runtime/types.d.ts +89 -0
  250. package/lib/typescript/module/ui/runtime/types.d.ts.map +1 -0
  251. package/lib/typescript/module/ui/runtime/useRuntimeSnapshot.d.ts +23 -0
  252. package/lib/typescript/module/ui/runtime/useRuntimeSnapshot.d.ts.map +1 -0
  253. package/lib/typescript/module/ui/server.d.ts +0 -1
  254. package/lib/typescript/module/ui/server.d.ts.map +1 -1
  255. package/lib/typescript/module/ui/session/authStore.d.ts +60 -9
  256. package/lib/typescript/module/ui/session/authStore.d.ts.map +1 -1
  257. package/lib/typescript/module/ui/session/sharedDeviceCredentialStore.d.ts +32 -0
  258. package/lib/typescript/module/ui/session/sharedDeviceCredentialStore.d.ts.map +1 -0
  259. package/lib/typescript/module/ui/stores/authStore.d.ts +49 -5
  260. package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
  261. package/lib/typescript/module/ui/types/navigation.d.ts +26 -0
  262. package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
  263. package/lib/typescript/module/ui/utils/avatarUtils.d.ts +2 -10
  264. package/lib/typescript/module/ui/utils/avatarUtils.d.ts.map +1 -1
  265. package/package.json +6 -7
  266. package/plugins/withSharedDeviceSessionProvider.js +102 -0
  267. package/plugins/withSharedDeviceSessionReader.js +57 -0
  268. package/src/__tests__/esmSourcePurity.test.ts +61 -0
  269. package/src/index.ts +31 -9
  270. package/src/ui/boot/runProviderColdBoot.ts +7 -0
  271. package/src/ui/client.ts +1 -2
  272. package/src/ui/components/OxyAccountDialogScreen.tsx +10 -29
  273. package/src/ui/components/OxyAuthChooser.tsx +149 -50
  274. package/src/ui/components/OxyProvider.tsx +7 -5
  275. package/src/ui/components/SurfaceScreen.tsx +28 -4
  276. package/src/ui/components/authChooser/AccountsMenuView.tsx +246 -96
  277. package/src/ui/components/authChooser/SignInEntryView.tsx +31 -8
  278. package/src/ui/components/authChooser/primitives.tsx +37 -23
  279. package/src/ui/components/authChooser/types.ts +34 -1
  280. package/src/ui/context/OxyContext.tsx +269 -324
  281. package/src/ui/context/hooks/useAuthOperations.ts +32 -35
  282. package/src/ui/context/oxyContextHelpers.ts +0 -30
  283. package/src/ui/context/oxyContextTypes.ts +9 -1
  284. package/src/ui/context/useOxyAccountGraph.ts +5 -19
  285. package/src/ui/hooks/accountDialogSnapshot.ts +37 -0
  286. package/src/ui/hooks/mutations/useAccountMutations.ts +0 -19
  287. package/src/ui/hooks/queries/__tests__/userCache.test.ts +12 -1
  288. package/src/ui/hooks/useDeviceSwitcher.ts +110 -0
  289. package/src/ui/hooks/useI18n.ts +23 -3
  290. package/src/ui/hooks/useSessionManagement.ts +62 -211
  291. package/src/ui/index.ts +1 -2
  292. package/src/ui/navigation/routes.ts +85 -75
  293. package/src/ui/navigation/surfaces.ts +6 -9
  294. package/src/ui/runtime/createOxyRuntime.ts +623 -0
  295. package/src/ui/runtime/index.ts +34 -0
  296. package/src/ui/runtime/runtimeContext.tsx +111 -0
  297. package/src/ui/runtime/types.ts +110 -0
  298. package/src/ui/runtime/useRuntimeSnapshot.ts +52 -0
  299. package/src/ui/server.ts +0 -1
  300. package/src/ui/session/__tests__/authStore.test.ts +90 -0
  301. package/src/ui/session/__tests__/sharedDeviceCredentialStore.test.ts +289 -0
  302. package/src/ui/session/authStore.ts +78 -9
  303. package/src/ui/session/sharedDeviceCredentialStore.ts +318 -0
  304. package/src/ui/stores/authStore.ts +171 -43
  305. package/src/ui/types/navigation.ts +26 -0
  306. package/src/ui/utils/avatarUtils.ts +2 -37
  307. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js +0 -64
  308. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js.map +0 -1
  309. package/lib/commonjs/ui/stores/accountStore.js +0 -221
  310. package/lib/commonjs/ui/stores/accountStore.js.map +0 -1
  311. package/lib/module/ui/hooks/useSwitchableAccounts.js +0 -60
  312. package/lib/module/ui/hooks/useSwitchableAccounts.js.map +0 -1
  313. package/lib/module/ui/stores/accountStore.js +0 -213
  314. package/lib/module/ui/stores/accountStore.js.map +0 -1
  315. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts +0 -23
  316. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts.map +0 -1
  317. package/lib/typescript/commonjs/ui/stores/accountStore.d.ts +0 -27
  318. package/lib/typescript/commonjs/ui/stores/accountStore.d.ts.map +0 -1
  319. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts +0 -23
  320. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts.map +0 -1
  321. package/lib/typescript/module/ui/stores/accountStore.d.ts +0 -27
  322. package/lib/typescript/module/ui/stores/accountStore.d.ts.map +0 -1
  323. package/src/ui/hooks/useSwitchableAccounts.ts +0 -75
  324. package/src/ui/stores/accountStore.ts +0 -264
@@ -143,4 +143,30 @@ export interface OxyProviderProps {
143
143
  * @default false
144
144
  */
145
145
  backgroundSession?: boolean;
146
+ /**
147
+ * Whether this origin/app may persist the durable device credential
148
+ * (`deviceId` + `deviceSecret`) at all.
149
+ *
150
+ * `'persistent'` (the default, and every app's behaviour) stores it — web
151
+ * localStorage per origin, SecureStore per app on native — so the SDK can
152
+ * re-mint an access token on the next cold boot.
153
+ *
154
+ * `'ephemeral'` stores NOTHING durable: the session lives in memory for the
155
+ * lifetime of the page and is gone on reload. It exists for ONE caller,
156
+ * `auth.oxy.so` with the browser hub enabled (issue #937 Phase 5, ADR 0003),
157
+ * where the durable credential for the browser profile is the server-side
158
+ * DeviceSession behind the `__Host-oxy-device` handle. Two durable
159
+ * credentials for one origin is the dual authority that phase exists to
160
+ * remove — revoking the hub while a localStorage secret still mints would
161
+ * make a sign-out look like it worked — so the way to let the hub be
162
+ * authoritative is to stop persisting the other one, not to consult it
163
+ * second.
164
+ *
165
+ * Do NOT reach for this to make an app "more private". A relying-party
166
+ * origin set to `'ephemeral'` simply signs the user out on every reload,
167
+ * because nothing else on that origin remembers the device.
168
+ *
169
+ * @default 'persistent'
170
+ */
171
+ deviceCredentialStorage?: 'persistent' | 'ephemeral';
146
172
  }
@@ -1,7 +1,6 @@
1
1
  import { authenticatedApiCall } from '@oxyhq/core';
2
2
  import type { OxyServices, User } from '@oxyhq/core';
3
3
  import type { UserProfileUpdate } from '@oxyhq/contracts';
4
- import { useAccountStore } from '../stores/accountStore';
5
4
  import { useAuthStore } from '../stores/authStore';
6
5
  import type { QueryClient } from '@tanstack/react-query';
7
6
  import { queryKeys, invalidateUserQueries, invalidateAccountQueries } from '../hooks/queries/queryKeys';
@@ -11,28 +10,8 @@ import {
11
10
  } from '../hooks/queries/userCache';
12
11
 
13
12
  /**
14
- * Refreshes avatar in accountStore with cache-busted URL to force image reload.
15
- *
16
- * @param sessionId - The session ID for the account to update
17
- * @param avatarFileId - The new avatar file ID
18
- * @param oxyServices - OxyServices instance to generate download URL
19
- */
20
- export function refreshAvatarInStore(
21
- sessionId: string,
22
- avatarFileId: string,
23
- oxyServices: OxyServices
24
- ): void {
25
- const { updateAccount } = useAccountStore.getState();
26
- const cacheBustedUrl = `${oxyServices.getFileDownloadUrl(avatarFileId, 'thumb')}?t=${Date.now()}`;
27
- updateAccount(sessionId, {
28
- avatar: avatarFileId,
29
- avatarUrl: cacheBustedUrl,
30
- });
31
- }
32
-
33
- /**
34
- * Updates user profile with avatar and handles all side effects (query invalidation, accountStore update).
35
- * This function can be used from within OxyContext provider without requiring useOxy hook.
13
+ * Updates user profile with avatar and handles all side effects (cache writes,
14
+ * query invalidation). Usable from inside the provider without `useOxy`.
36
15
  *
37
16
  * @param updates - Profile updates including avatar
38
17
  * @param oxyServices - OxyServices instance
@@ -69,20 +48,6 @@ export async function updateProfileWithAvatar(
69
48
  cleared: cleared.length > 0 ? cleared : undefined,
70
49
  });
71
50
 
72
- // If avatar was updated, refresh accountStore with a cache-busted URL. An
73
- // EMPTY avatar is a removal: clear both fields so the switcher falls back to
74
- // initials instead of pointing at a download URL for the empty file id.
75
- if (typeof updates.avatar === 'string' && activeSessionId) {
76
- if (updates.avatar) {
77
- refreshAvatarInStore(activeSessionId, updates.avatar, oxyServices);
78
- } else {
79
- useAccountStore.getState().updateAccount(activeSessionId, {
80
- avatar: undefined,
81
- avatarUrl: undefined,
82
- });
83
- }
84
- }
85
-
86
51
  // Invalidate all related queries to refresh everywhere
87
52
  invalidateUserQueries(queryClient);
88
53
  invalidateAccountQueries(queryClient);
@@ -1,64 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useSwitchableAccounts = useSwitchableAccounts;
7
- var _react = require("react");
8
- var _OxyContext = require("../context/OxyContext.js");
9
- /**
10
- * Stable empty snapshot for the no-provider loading state, so `useSyncExternalStore`
11
- * always has a getSnapshot that returns a constant reference before mount.
12
- */
13
- const EMPTY_SNAPSHOT = {
14
- view: 'accounts',
15
- accounts: [],
16
- activeAccountId: null,
17
- loading: false,
18
- error: null,
19
- switchingAccountId: null,
20
- signIn: {
21
- phase: 'idle',
22
- authorizeCode: null,
23
- qrPayload: null,
24
- expiresAt: null,
25
- error: null,
26
- route: null,
27
- routeFailed: false,
28
- pushSentAt: null,
29
- openedAt: null,
30
- progress: 'idle'
31
- },
32
- commonsAvailability: 'unknown'
33
- };
34
-
35
- /**
36
- * Every account the signed-in user can switch into — device sign-ins AND linked
37
- * graph accounts (owned orgs + shared-with-you) — as one flat, deduped list with
38
- * real per-account name / email / avatar / color.
39
- *
40
- * This is a thin binding over the shared `AccountDialogController` in
41
- * `@oxyhq/core` (the SAME headless source the {@link OxyAccountDialogScreen} renders),
42
- * so there is ONE projection (`projectSwitchableAccounts`) and one switch path
43
- * (`controller.switchTo`) across the whole SDK — the local duplicate projection
44
- * this hook used to own has been removed. Every switch routes through
45
- * `useOxy().switchToAccount(accountId)` (or the dialog's row press).
46
- */
47
- function useSwitchableAccounts() {
48
- const {
49
- accountDialogController: controller
50
- } = (0, _OxyContext.useOxy)();
51
- const subscribe = (0, _react.useCallback)(listener => controller ? controller.subscribe(listener) : () => undefined, [controller]);
52
- const getSnapshot = (0, _react.useCallback)(() => controller ? controller.getSnapshot() : EMPTY_SNAPSHOT, [controller]);
53
- const snapshot = (0, _react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
54
- const currentSessionId = (0, _react.useMemo)(() => {
55
- const active = snapshot.accounts.find(account => account.accountId === snapshot.activeAccountId);
56
- return active?.sessionId ?? null;
57
- }, [snapshot]);
58
- return {
59
- accounts: snapshot.accounts,
60
- isLoading: snapshot.loading,
61
- currentSessionId
62
- };
63
- }
64
- //# sourceMappingURL=useSwitchableAccounts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_react","require","_OxyContext","EMPTY_SNAPSHOT","view","accounts","activeAccountId","loading","error","switchingAccountId","signIn","phase","authorizeCode","qrPayload","expiresAt","route","routeFailed","pushSentAt","openedAt","progress","commonsAvailability","useSwitchableAccounts","accountDialogController","controller","useOxy","subscribe","useCallback","listener","undefined","getSnapshot","snapshot","useSyncExternalStore","currentSessionId","useMemo","active","find","account","accountId","sessionId","isLoading"],"sourceRoot":"../../../../src","sources":["ui/hooks/useSwitchableAccounts.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAD,OAAA;AAWA;AACA;AACA;AACA;AACA,MAAME,cAAqC,GAAG;EAC1CC,IAAI,EAAE,UAAU;EAChBC,QAAQ,EAAE,EAAE;EACZC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,KAAK,EAAE,IAAI;EACXC,kBAAkB,EAAE,IAAI;EACxBC,MAAM,EAAE;IACJC,KAAK,EAAE,MAAM;IACbC,aAAa,EAAE,IAAI;IACnBC,SAAS,EAAE,IAAI;IACfC,SAAS,EAAE,IAAI;IACfN,KAAK,EAAE,IAAI;IACXO,KAAK,EAAE,IAAI;IACXC,WAAW,EAAE,KAAK;IAClBC,UAAU,EAAE,IAAI;IAChBC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACd,CAAC;EACDC,mBAAmB,EAAE;AACzB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,qBAAqBA,CAAA,EAAgC;EACjE,MAAM;IAAEC,uBAAuB,EAAEC;EAAW,CAAC,GAAG,IAAAC,kBAAM,EAAC,CAAC;EAExD,MAAMC,SAAS,GAAG,IAAAC,kBAAW,EACxBC,QAAoB,IAAMJ,UAAU,GAAGA,UAAU,CAACE,SAAS,CAACE,QAAQ,CAAC,GAAG,MAAMC,SAAU,EACzF,CAACL,UAAU,CACf,CAAC;EACD,MAAMM,WAAW,GAAG,IAAAH,kBAAW,EAC3B,MAAOH,UAAU,GAAGA,UAAU,CAACM,WAAW,CAAC,CAAC,GAAG1B,cAAe,EAC9D,CAACoB,UAAU,CACf,CAAC;EACD,MAAMO,QAAQ,GAAG,IAAAC,2BAAoB,EAACN,SAAS,EAAEI,WAAW,EAAEA,WAAW,CAAC;EAE1E,MAAMG,gBAAgB,GAAG,IAAAC,cAAO,EAAgB,MAAM;IAClD,MAAMC,MAAM,GAAGJ,QAAQ,CAACzB,QAAQ,CAAC8B,IAAI,CAAEC,OAAO,IAAKA,OAAO,CAACC,SAAS,KAAKP,QAAQ,CAACxB,eAAe,CAAC;IAClG,OAAO4B,MAAM,EAAEI,SAAS,IAAI,IAAI;EACpC,CAAC,EAAE,CAACR,QAAQ,CAAC,CAAC;EAEd,OAAO;IACHzB,QAAQ,EAAEyB,QAAQ,CAACzB,QAAQ;IAC3BkC,SAAS,EAAET,QAAQ,CAACvB,OAAO;IAC3ByB;EACJ,CAAC;AACL","ignoreList":[]}
@@ -1,221 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useAccounts = exports.useAccountStore = exports.useAccountLoadingSession = exports.useAccountLoading = exports.useAccountError = void 0;
7
- var _zustand = require("zustand");
8
- var _core = require("@oxyhq/core");
9
- const initialState = {
10
- accounts: {},
11
- accountOrder: [],
12
- accountsArray: [],
13
- loading: false,
14
- loadingSessionIds: new Set(),
15
- error: null
16
- };
17
- const useAccountStore = exports.useAccountStore = (0, _zustand.create)((set, get) => ({
18
- ...initialState,
19
- setAccounts: accounts => set(state => {
20
- const accountMap = {};
21
- const order = [];
22
- const seenSessionIds = new Set();
23
- for (const account of accounts) {
24
- if (seenSessionIds.has(account.sessionId)) continue;
25
- seenSessionIds.add(account.sessionId);
26
- accountMap[account.sessionId] = account;
27
- order.push(account.sessionId);
28
- }
29
- const accountsArray = (0, _core.buildAccountsArray)(accountMap, order);
30
- const sameOrder = order.length === state.accountOrder.length && order.every((id, i) => id === state.accountOrder[i]);
31
- const sameAccounts = sameOrder && order.every(id => {
32
- const existing = state.accounts[id];
33
- const newAccount = accountMap[id];
34
- return existing && existing.sessionId === newAccount.sessionId && existing.userId === newAccount.userId && existing.avatar === newAccount.avatar && existing.avatarUrl === newAccount.avatarUrl;
35
- });
36
- if (sameAccounts) return {};
37
- return {
38
- accounts: accountMap,
39
- accountOrder: order,
40
- accountsArray
41
- };
42
- }),
43
- addAccount: account => set(state => {
44
- // Check if account with same sessionId exists
45
- if (state.accounts[account.sessionId]) {
46
- // Update existing
47
- const existing = state.accounts[account.sessionId];
48
- if (existing.avatar === account.avatar && existing.avatarUrl === account.avatarUrl) {
49
- return {}; // No change
50
- }
51
- const newAccounts = {
52
- ...state.accounts,
53
- [account.sessionId]: account
54
- };
55
- return {
56
- accounts: newAccounts,
57
- accountsArray: (0, _core.buildAccountsArray)(newAccounts, state.accountOrder)
58
- };
59
- }
60
- const newAccounts = {
61
- ...state.accounts,
62
- [account.sessionId]: account
63
- };
64
- const newOrder = [account.sessionId, ...state.accountOrder];
65
- return {
66
- accounts: newAccounts,
67
- accountOrder: newOrder,
68
- accountsArray: (0, _core.buildAccountsArray)(newAccounts, newOrder)
69
- };
70
- }),
71
- updateAccount: (sessionId, updates) => set(state => {
72
- const existing = state.accounts[sessionId];
73
- if (!existing) return {};
74
- const updated = {
75
- ...existing,
76
- ...updates
77
- };
78
- if (existing.avatar === updated.avatar && existing.avatarUrl === updated.avatarUrl) {
79
- return {}; // No change
80
- }
81
- const newAccounts = {
82
- ...state.accounts,
83
- [sessionId]: updated
84
- };
85
- return {
86
- accounts: newAccounts,
87
- accountsArray: (0, _core.buildAccountsArray)(newAccounts, state.accountOrder)
88
- };
89
- }),
90
- removeAccount: sessionId => set(state => {
91
- if (!state.accounts[sessionId]) return {};
92
- const {
93
- [sessionId]: _removed,
94
- ...rest
95
- } = state.accounts;
96
- const newOrder = state.accountOrder.filter(id => id !== sessionId);
97
- return {
98
- accounts: rest,
99
- accountOrder: newOrder,
100
- accountsArray: (0, _core.buildAccountsArray)(rest, newOrder)
101
- };
102
- }),
103
- moveAccountToTop: sessionId => set(state => {
104
- if (!state.accounts[sessionId]) return {};
105
- const filtered = state.accountOrder.filter(id => id !== sessionId);
106
- const newOrder = [sessionId, ...filtered];
107
- return {
108
- accountOrder: newOrder,
109
- accountsArray: (0, _core.buildAccountsArray)(state.accounts, newOrder)
110
- };
111
- }),
112
- setLoading: loading => set({
113
- loading
114
- }),
115
- setLoadingSession: (sessionId, loading) => set(state => {
116
- const newSet = new Set(state.loadingSessionIds);
117
- if (loading) {
118
- newSet.add(sessionId);
119
- } else {
120
- newSet.delete(sessionId);
121
- }
122
- return {
123
- loadingSessionIds: newSet
124
- };
125
- }),
126
- setError: error => set({
127
- error
128
- }),
129
- loadAccounts: async (sessionIds, oxyServices, existingAccounts = [], preserveOrder = true) => {
130
- const state = get();
131
- const uniqueSessionIds = Array.from(new Set(sessionIds));
132
- if (uniqueSessionIds.length === 0) {
133
- get().setAccounts([]);
134
- return;
135
- }
136
-
137
- // Try to get data from TanStack Query cache first
138
- try {
139
- // This will be called from a component, so we need to access queryClient differently
140
- // For now, we'll keep the API call but optimize it
141
- const existingMap = new Map(existingAccounts.map(a => [a.sessionId, a]));
142
- for (const account of Object.values(state.accounts)) {
143
- existingMap.set(account.sessionId, account);
144
- }
145
- const missingSessionIds = uniqueSessionIds.filter(id => !existingMap.has(id));
146
- if (missingSessionIds.length === 0) {
147
- const ordered = uniqueSessionIds.map(id => existingMap.get(id)).filter(acc => acc !== undefined);
148
- get().setAccounts(ordered);
149
- return;
150
- }
151
- if (state.loading) {
152
- return;
153
- }
154
- set({
155
- loading: true,
156
- error: null
157
- });
158
- try {
159
- const batchResults = await oxyServices.getUsersBySessions(missingSessionIds);
160
- const accountMap = new Map();
161
- for (const {
162
- sessionId,
163
- user: userData
164
- } of batchResults) {
165
- if (userData && !accountMap.has(sessionId)) {
166
- const existing = existingMap.get(sessionId);
167
- accountMap.set(sessionId, (0, _core.createQuickAccount)(sessionId, userData, existing, (fileId, variant) => oxyServices.getFileDownloadUrl(fileId, variant)));
168
- }
169
- }
170
- for (const [sessionId, account] of accountMap) {
171
- existingMap.set(sessionId, account);
172
- }
173
- const orderToUse = preserveOrder ? uniqueSessionIds : [...uniqueSessionIds, ...state.accountOrder];
174
- const seen = new Set();
175
- const ordered = [];
176
- for (const sessionId of orderToUse) {
177
- if (seen.has(sessionId)) continue;
178
- seen.add(sessionId);
179
- const account = existingMap.get(sessionId);
180
- if (account) ordered.push(account);
181
- }
182
- get().setAccounts(ordered);
183
- } catch (error) {
184
- const errorMessage = error instanceof Error ? error.message : 'Failed to load accounts';
185
- if (__DEV__) {
186
- console.error('AccountStore: Failed to load accounts:', error);
187
- }
188
- set({
189
- error: errorMessage
190
- });
191
- } finally {
192
- set({
193
- loading: false
194
- });
195
- }
196
- } catch (error) {
197
- const errorMessage = error instanceof Error ? error.message : 'Failed to load accounts';
198
- if (__DEV__) {
199
- console.error('AccountStore: Failed to load accounts:', error);
200
- }
201
- set({
202
- error: errorMessage,
203
- loading: false
204
- });
205
- }
206
- },
207
- reset: () => set(initialState)
208
- }));
209
-
210
- // Selectors for performance - return cached array to prevent infinite loops
211
- const useAccounts = () => {
212
- return useAccountStore(state => state.accountsArray);
213
- };
214
- exports.useAccounts = useAccounts;
215
- const useAccountLoading = () => useAccountStore(s => s.loading);
216
- exports.useAccountLoading = useAccountLoading;
217
- const useAccountError = () => useAccountStore(s => s.error);
218
- exports.useAccountError = useAccountError;
219
- const useAccountLoadingSession = sessionId => useAccountStore(s => s.loadingSessionIds.has(sessionId));
220
- exports.useAccountLoadingSession = useAccountLoadingSession;
221
- //# sourceMappingURL=accountStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_zustand","require","_core","initialState","accounts","accountOrder","accountsArray","loading","loadingSessionIds","Set","error","useAccountStore","exports","create","set","get","setAccounts","state","accountMap","order","seenSessionIds","account","has","sessionId","add","push","buildAccountsArray","sameOrder","length","every","id","i","sameAccounts","existing","newAccount","userId","avatar","avatarUrl","addAccount","newAccounts","newOrder","updateAccount","updates","updated","removeAccount","_removed","rest","filter","moveAccountToTop","filtered","setLoading","setLoadingSession","newSet","delete","setError","loadAccounts","sessionIds","oxyServices","existingAccounts","preserveOrder","uniqueSessionIds","Array","from","existingMap","Map","map","a","Object","values","missingSessionIds","ordered","acc","undefined","batchResults","getUsersBySessions","user","userData","createQuickAccount","fileId","variant","getFileDownloadUrl","orderToUse","seen","errorMessage","Error","message","__DEV__","console","reset","useAccounts","useAccountLoading","s","useAccountError","useAccountLoadingSession"],"sourceRoot":"../../../../src","sources":["ui/stores/accountStore.ts"],"mappings":"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","ignoreList":[]}
@@ -1,60 +0,0 @@
1
- "use strict";
2
-
3
- import { useCallback, useMemo, useSyncExternalStore } from 'react';
4
- import { useOxy } from "../context/OxyContext.js";
5
- /**
6
- * Stable empty snapshot for the no-provider loading state, so `useSyncExternalStore`
7
- * always has a getSnapshot that returns a constant reference before mount.
8
- */
9
- const EMPTY_SNAPSHOT = {
10
- view: 'accounts',
11
- accounts: [],
12
- activeAccountId: null,
13
- loading: false,
14
- error: null,
15
- switchingAccountId: null,
16
- signIn: {
17
- phase: 'idle',
18
- authorizeCode: null,
19
- qrPayload: null,
20
- expiresAt: null,
21
- error: null,
22
- route: null,
23
- routeFailed: false,
24
- pushSentAt: null,
25
- openedAt: null,
26
- progress: 'idle'
27
- },
28
- commonsAvailability: 'unknown'
29
- };
30
-
31
- /**
32
- * Every account the signed-in user can switch into — device sign-ins AND linked
33
- * graph accounts (owned orgs + shared-with-you) — as one flat, deduped list with
34
- * real per-account name / email / avatar / color.
35
- *
36
- * This is a thin binding over the shared `AccountDialogController` in
37
- * `@oxyhq/core` (the SAME headless source the {@link OxyAccountDialogScreen} renders),
38
- * so there is ONE projection (`projectSwitchableAccounts`) and one switch path
39
- * (`controller.switchTo`) across the whole SDK — the local duplicate projection
40
- * this hook used to own has been removed. Every switch routes through
41
- * `useOxy().switchToAccount(accountId)` (or the dialog's row press).
42
- */
43
- export function useSwitchableAccounts() {
44
- const {
45
- accountDialogController: controller
46
- } = useOxy();
47
- const subscribe = useCallback(listener => controller ? controller.subscribe(listener) : () => undefined, [controller]);
48
- const getSnapshot = useCallback(() => controller ? controller.getSnapshot() : EMPTY_SNAPSHOT, [controller]);
49
- const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
50
- const currentSessionId = useMemo(() => {
51
- const active = snapshot.accounts.find(account => account.accountId === snapshot.activeAccountId);
52
- return active?.sessionId ?? null;
53
- }, [snapshot]);
54
- return {
55
- accounts: snapshot.accounts,
56
- isLoading: snapshot.loading,
57
- currentSessionId
58
- };
59
- }
60
- //# sourceMappingURL=useSwitchableAccounts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useCallback","useMemo","useSyncExternalStore","useOxy","EMPTY_SNAPSHOT","view","accounts","activeAccountId","loading","error","switchingAccountId","signIn","phase","authorizeCode","qrPayload","expiresAt","route","routeFailed","pushSentAt","openedAt","progress","commonsAvailability","useSwitchableAccounts","accountDialogController","controller","subscribe","listener","undefined","getSnapshot","snapshot","currentSessionId","active","find","account","accountId","sessionId","isLoading"],"sourceRoot":"../../../../src","sources":["ui/hooks/useSwitchableAccounts.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,OAAO,EAAEC,oBAAoB,QAAQ,OAAO;AAElE,SAASC,MAAM,QAAQ,0BAAuB;AAW9C;AACA;AACA;AACA;AACA,MAAMC,cAAqC,GAAG;EAC1CC,IAAI,EAAE,UAAU;EAChBC,QAAQ,EAAE,EAAE;EACZC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,KAAK,EAAE,IAAI;EACXC,kBAAkB,EAAE,IAAI;EACxBC,MAAM,EAAE;IACJC,KAAK,EAAE,MAAM;IACbC,aAAa,EAAE,IAAI;IACnBC,SAAS,EAAE,IAAI;IACfC,SAAS,EAAE,IAAI;IACfN,KAAK,EAAE,IAAI;IACXO,KAAK,EAAE,IAAI;IACXC,WAAW,EAAE,KAAK;IAClBC,UAAU,EAAE,IAAI;IAChBC,QAAQ,EAAE,IAAI;IACdC,QAAQ,EAAE;EACd,CAAC;EACDC,mBAAmB,EAAE;AACzB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAAA,EAAgC;EACjE,MAAM;IAAEC,uBAAuB,EAAEC;EAAW,CAAC,GAAGrB,MAAM,CAAC,CAAC;EAExD,MAAMsB,SAAS,GAAGzB,WAAW,CACxB0B,QAAoB,IAAMF,UAAU,GAAGA,UAAU,CAACC,SAAS,CAACC,QAAQ,CAAC,GAAG,MAAMC,SAAU,EACzF,CAACH,UAAU,CACf,CAAC;EACD,MAAMI,WAAW,GAAG5B,WAAW,CAC3B,MAAOwB,UAAU,GAAGA,UAAU,CAACI,WAAW,CAAC,CAAC,GAAGxB,cAAe,EAC9D,CAACoB,UAAU,CACf,CAAC;EACD,MAAMK,QAAQ,GAAG3B,oBAAoB,CAACuB,SAAS,EAAEG,WAAW,EAAEA,WAAW,CAAC;EAE1E,MAAME,gBAAgB,GAAG7B,OAAO,CAAgB,MAAM;IAClD,MAAM8B,MAAM,GAAGF,QAAQ,CAACvB,QAAQ,CAAC0B,IAAI,CAAEC,OAAO,IAAKA,OAAO,CAACC,SAAS,KAAKL,QAAQ,CAACtB,eAAe,CAAC;IAClG,OAAOwB,MAAM,EAAEI,SAAS,IAAI,IAAI;EACpC,CAAC,EAAE,CAACN,QAAQ,CAAC,CAAC;EAEd,OAAO;IACHvB,QAAQ,EAAEuB,QAAQ,CAACvB,QAAQ;IAC3B8B,SAAS,EAAEP,QAAQ,CAACrB,OAAO;IAC3BsB;EACJ,CAAC;AACL","ignoreList":[]}