@oxyhq/services 5.16.44 → 5.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/README.md +29 -10
  2. package/lib/commonjs/core/OxyServices.js +1 -1
  3. package/lib/commonjs/core/index.js +20 -15
  4. package/lib/commonjs/core/index.js.map +1 -1
  5. package/lib/commonjs/core/mixins/OxyServices.auth.js +36 -53
  6. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
  7. package/lib/commonjs/core/mixins/OxyServices.user.js +10 -17
  8. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  9. package/lib/commonjs/core/services/TokenService.js +27 -13
  10. package/lib/commonjs/core/services/TokenService.js.map +1 -1
  11. package/lib/commonjs/crypto/index.js +0 -16
  12. package/lib/commonjs/crypto/index.js.map +1 -1
  13. package/lib/commonjs/crypto/keyManager.js +21 -22
  14. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  15. package/lib/commonjs/crypto/polyfill.js +1 -10
  16. package/lib/commonjs/crypto/polyfill.js.map +1 -1
  17. package/lib/commonjs/crypto/signatureService.js +18 -32
  18. package/lib/commonjs/crypto/signatureService.js.map +1 -1
  19. package/lib/commonjs/index.js +13 -134
  20. package/lib/commonjs/index.js.map +1 -1
  21. package/lib/commonjs/models/interfaces.js +0 -7
  22. package/lib/commonjs/models/interfaces.js.map +1 -1
  23. package/lib/commonjs/node/index.js +1 -10
  24. package/lib/commonjs/node/index.js.map +1 -1
  25. package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -9
  26. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  27. package/lib/commonjs/ui/components/OxyProvider.js +9 -20
  28. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  29. package/lib/commonjs/ui/context/OxyContext.js +779 -450
  30. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  31. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +551 -0
  32. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -0
  33. package/lib/commonjs/ui/context/hooks/useDeviceManagement.js +73 -0
  34. package/lib/commonjs/ui/context/hooks/useDeviceManagement.js.map +1 -0
  35. package/lib/commonjs/ui/context/hooks/useStorage.js +79 -0
  36. package/lib/commonjs/ui/context/hooks/useStorage.js.map +1 -0
  37. package/lib/commonjs/ui/hooks/index.js +0 -20
  38. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  39. package/lib/commonjs/ui/hooks/mutations/index.js +0 -12
  40. package/lib/commonjs/ui/hooks/mutations/index.js.map +1 -1
  41. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +23 -74
  42. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  43. package/lib/commonjs/ui/hooks/queries/index.js +0 -12
  44. package/lib/commonjs/ui/hooks/queries/index.js.map +1 -1
  45. package/lib/commonjs/ui/hooks/queries/queryKeys.js +1 -3
  46. package/lib/commonjs/ui/hooks/queries/queryKeys.js.map +1 -1
  47. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +28 -64
  48. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  49. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +6 -4
  50. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  51. package/lib/commonjs/ui/hooks/useDeviceManagement.js +73 -0
  52. package/lib/commonjs/ui/hooks/useDeviceManagement.js.map +1 -0
  53. package/lib/commonjs/ui/hooks/useProfileEditing.js +5 -3
  54. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  55. package/lib/commonjs/ui/hooks/useSessionManagement.js +284 -0
  56. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -0
  57. package/lib/commonjs/ui/index.js +2 -10
  58. package/lib/commonjs/ui/index.js.map +1 -1
  59. package/lib/commonjs/ui/navigation/routes.js +1 -5
  60. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  61. package/lib/commonjs/ui/screens/AccountCenterScreen.js +4 -9
  62. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  63. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +19 -37
  64. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  65. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +5 -5
  66. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  67. package/lib/commonjs/ui/screens/OxyAuthScreen.js +15 -2
  68. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  69. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +97 -76
  70. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  71. package/lib/commonjs/ui/screens/ProfileScreen.js +6 -6
  72. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  73. package/lib/commonjs/ui/stores/authStore.js +6 -54
  74. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  75. package/lib/commonjs/ui/styles/spacing.js +2 -54
  76. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  77. package/lib/commonjs/ui/utils/avatarUtils.js +12 -9
  78. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  79. package/lib/commonjs/ui/utils/sessionHelpers.js +1 -7
  80. package/lib/commonjs/ui/utils/sessionHelpers.js.map +1 -1
  81. package/lib/commonjs/utils/deviceManager.js +177 -0
  82. package/lib/commonjs/utils/deviceManager.js.map +1 -0
  83. package/lib/commonjs/utils/errorUtils.js +0 -13
  84. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  85. package/lib/commonjs/utils/index.js +7 -0
  86. package/lib/commonjs/utils/index.js.map +1 -1
  87. package/lib/commonjs/utils/sessionUtils.js +1 -8
  88. package/lib/commonjs/utils/sessionUtils.js.map +1 -1
  89. package/lib/commonjs/utils/validationUtils.js +1 -15
  90. package/lib/commonjs/utils/validationUtils.js.map +1 -1
  91. package/lib/module/core/OxyServices.js +1 -1
  92. package/lib/module/core/index.js +4 -6
  93. package/lib/module/core/index.js.map +1 -1
  94. package/lib/module/core/mixins/OxyServices.auth.js +36 -53
  95. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
  96. package/lib/module/core/mixins/OxyServices.user.js +10 -17
  97. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  98. package/lib/module/core/services/TokenService.js +27 -13
  99. package/lib/module/core/services/TokenService.js.map +1 -1
  100. package/lib/module/crypto/index.js +0 -3
  101. package/lib/module/crypto/index.js.map +1 -1
  102. package/lib/module/crypto/keyManager.js +21 -22
  103. package/lib/module/crypto/keyManager.js.map +1 -1
  104. package/lib/module/crypto/polyfill.js +1 -2
  105. package/lib/module/crypto/polyfill.js.map +1 -1
  106. package/lib/module/crypto/signatureService.js +18 -32
  107. package/lib/module/crypto/signatureService.js.map +1 -1
  108. package/lib/module/index.js +7 -19
  109. package/lib/module/index.js.map +1 -1
  110. package/lib/module/models/interfaces.js +0 -7
  111. package/lib/module/models/interfaces.js.map +1 -1
  112. package/lib/module/node/index.js +0 -3
  113. package/lib/module/node/index.js.map +1 -1
  114. package/lib/module/ui/components/BottomSheetRouter.js +2 -6
  115. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  116. package/lib/module/ui/components/OxyProvider.js +9 -20
  117. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  118. package/lib/module/ui/context/OxyContext.js +779 -450
  119. package/lib/module/ui/context/OxyContext.js.map +1 -1
  120. package/lib/module/ui/context/hooks/useAuthOperations.js +545 -0
  121. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -0
  122. package/lib/module/ui/context/hooks/useDeviceManagement.js +68 -0
  123. package/lib/module/ui/context/hooks/useDeviceManagement.js.map +1 -0
  124. package/lib/module/ui/context/hooks/useStorage.js +74 -0
  125. package/lib/module/ui/context/hooks/useStorage.js.map +1 -0
  126. package/lib/module/ui/hooks/index.js +0 -1
  127. package/lib/module/ui/hooks/index.js.map +1 -1
  128. package/lib/module/ui/hooks/mutations/index.js +1 -1
  129. package/lib/module/ui/hooks/mutations/index.js.map +1 -1
  130. package/lib/module/ui/hooks/mutations/useAccountMutations.js +21 -71
  131. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  132. package/lib/module/ui/hooks/queries/index.js +1 -1
  133. package/lib/module/ui/hooks/queries/index.js.map +1 -1
  134. package/lib/module/ui/hooks/queries/queryKeys.js +1 -3
  135. package/lib/module/ui/hooks/queries/queryKeys.js.map +1 -1
  136. package/lib/module/ui/hooks/queries/useAccountQueries.js +27 -61
  137. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  138. package/lib/module/ui/hooks/queries/useServicesQueries.js +6 -4
  139. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  140. package/lib/module/ui/hooks/useDeviceManagement.js +68 -0
  141. package/lib/module/ui/hooks/useDeviceManagement.js.map +1 -0
  142. package/lib/module/ui/hooks/useProfileEditing.js +5 -3
  143. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  144. package/lib/module/ui/hooks/useSessionManagement.js +279 -0
  145. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -0
  146. package/lib/module/ui/index.js +1 -2
  147. package/lib/module/ui/index.js.map +1 -1
  148. package/lib/module/ui/navigation/routes.js +1 -5
  149. package/lib/module/ui/navigation/routes.js.map +1 -1
  150. package/lib/module/ui/screens/AccountCenterScreen.js +4 -9
  151. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  152. package/lib/module/ui/screens/AccountSettingsScreen.js +19 -37
  153. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  154. package/lib/module/ui/screens/AccountSwitcherScreen.js +5 -5
  155. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  156. package/lib/module/ui/screens/OxyAuthScreen.js +15 -2
  157. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  158. package/lib/module/ui/screens/PrivacySettingsScreen.js +98 -77
  159. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  160. package/lib/module/ui/screens/ProfileScreen.js +6 -6
  161. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  162. package/lib/module/ui/stores/authStore.js +6 -54
  163. package/lib/module/ui/stores/authStore.js.map +1 -1
  164. package/lib/module/ui/styles/spacing.js +2 -6
  165. package/lib/module/ui/styles/spacing.js.map +1 -1
  166. package/lib/module/ui/utils/avatarUtils.js +12 -9
  167. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  168. package/lib/module/ui/utils/sessionHelpers.js +1 -7
  169. package/lib/module/ui/utils/sessionHelpers.js.map +1 -1
  170. package/lib/module/utils/deviceManager.js +171 -0
  171. package/lib/module/utils/deviceManager.js.map +1 -0
  172. package/lib/module/utils/errorUtils.js +0 -7
  173. package/lib/module/utils/errorUtils.js.map +1 -1
  174. package/lib/module/utils/index.js +1 -2
  175. package/lib/module/utils/index.js.map +1 -1
  176. package/lib/module/utils/sessionUtils.js +1 -8
  177. package/lib/module/utils/sessionUtils.js.map +1 -1
  178. package/lib/module/utils/validationUtils.js +0 -13
  179. package/lib/module/utils/validationUtils.js.map +1 -1
  180. package/lib/typescript/core/OxyServices.d.ts +1 -1
  181. package/lib/typescript/core/index.d.ts +3 -3
  182. package/lib/typescript/core/index.d.ts.map +1 -1
  183. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +21 -44
  184. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  185. package/lib/typescript/core/mixins/OxyServices.user.d.ts +1 -0
  186. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  187. package/lib/typescript/core/mixins/index.d.ts +8 -15
  188. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  189. package/lib/typescript/core/services/TokenService.d.ts.map +1 -1
  190. package/lib/typescript/crypto/index.d.ts +0 -1
  191. package/lib/typescript/crypto/index.d.ts.map +1 -1
  192. package/lib/typescript/crypto/keyManager.d.ts +2 -15
  193. package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
  194. package/lib/typescript/crypto/polyfill.d.ts +1 -2
  195. package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
  196. package/lib/typescript/crypto/signatureService.d.ts +0 -13
  197. package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
  198. package/lib/typescript/index.d.ts +7 -12
  199. package/lib/typescript/index.d.ts.map +1 -1
  200. package/lib/typescript/models/interfaces.d.ts +36 -5
  201. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  202. package/lib/typescript/models/session.d.ts +18 -3
  203. package/lib/typescript/models/session.d.ts.map +1 -1
  204. package/lib/typescript/node/index.d.ts +0 -1
  205. package/lib/typescript/node/index.d.ts.map +1 -1
  206. package/lib/typescript/ui/components/BottomSheetRouter.d.ts +0 -5
  207. package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
  208. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  209. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
  210. package/lib/typescript/ui/components/TextField/helpers.d.ts +2 -2
  211. package/lib/typescript/ui/components/TextField/types.d.ts +0 -1
  212. package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
  213. package/lib/typescript/ui/context/OxyContext.d.ts +28 -5
  214. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  215. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +59 -0
  216. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -0
  217. package/lib/typescript/ui/context/hooks/useDeviceManagement.d.ts +27 -0
  218. package/lib/typescript/ui/context/hooks/useDeviceManagement.d.ts.map +1 -0
  219. package/lib/typescript/ui/context/hooks/useStorage.d.ts +22 -0
  220. package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +1 -0
  221. package/lib/typescript/ui/hooks/index.d.ts +0 -1
  222. package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
  223. package/lib/typescript/ui/hooks/mutations/index.d.ts +1 -1
  224. package/lib/typescript/ui/hooks/mutations/index.d.ts.map +1 -1
  225. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +8 -19
  226. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  227. package/lib/typescript/ui/hooks/mutations/useServicesMutations.d.ts +1 -1
  228. package/lib/typescript/ui/hooks/mutations/useServicesMutations.d.ts.map +1 -1
  229. package/lib/typescript/ui/hooks/queries/index.d.ts +1 -1
  230. package/lib/typescript/ui/hooks/queries/index.d.ts.map +1 -1
  231. package/lib/typescript/ui/hooks/queries/queryKeys.d.ts +0 -2
  232. package/lib/typescript/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  233. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +5 -17
  234. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  235. package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  236. package/lib/typescript/ui/hooks/useDeviceManagement.d.ts +27 -0
  237. package/lib/typescript/ui/hooks/useDeviceManagement.d.ts.map +1 -0
  238. package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
  239. package/lib/typescript/ui/hooks/useSessionManagement.d.ts +41 -0
  240. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -0
  241. package/lib/typescript/ui/index.d.ts +0 -1
  242. package/lib/typescript/ui/index.d.ts.map +1 -1
  243. package/lib/typescript/ui/navigation/routes.d.ts +1 -1
  244. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  245. package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  246. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  247. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  248. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  249. package/lib/typescript/ui/stores/authStore.d.ts +1 -8
  250. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  251. package/lib/typescript/ui/styles/spacing.d.ts +0 -5
  252. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
  253. package/lib/typescript/ui/utils/avatarUtils.d.ts +4 -1
  254. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  255. package/lib/typescript/ui/utils/sessionHelpers.d.ts +0 -1
  256. package/lib/typescript/ui/utils/sessionHelpers.d.ts.map +1 -1
  257. package/lib/typescript/utils/deviceManager.d.ts +66 -0
  258. package/lib/typescript/utils/deviceManager.d.ts.map +1 -0
  259. package/lib/typescript/utils/errorUtils.d.ts +0 -6
  260. package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
  261. package/lib/typescript/utils/index.d.ts +2 -0
  262. package/lib/typescript/utils/index.d.ts.map +1 -1
  263. package/lib/typescript/utils/sessionUtils.d.ts.map +1 -1
  264. package/lib/typescript/utils/validationUtils.d.ts +0 -8
  265. package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
  266. package/package.json +1 -6
  267. package/src/core/OxyServices.ts +1 -1
  268. package/src/core/index.ts +5 -8
  269. package/src/core/mixins/OxyServices.auth.ts +44 -87
  270. package/src/core/mixins/OxyServices.user.ts +10 -18
  271. package/src/core/services/TokenService.ts +27 -16
  272. package/src/crypto/index.ts +1 -3
  273. package/src/crypto/keyManager.ts +21 -30
  274. package/src/crypto/polyfill.ts +1 -2
  275. package/src/crypto/signatureService.ts +19 -43
  276. package/src/index.ts +6 -41
  277. package/src/models/interfaces.ts +39 -12
  278. package/src/models/session.ts +19 -7
  279. package/src/node/index.ts +0 -3
  280. package/src/ui/components/BottomSheetRouter.tsx +1 -6
  281. package/src/ui/components/OxyProvider.tsx +10 -17
  282. package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
  283. package/src/ui/components/TextField/helpers.tsx +2 -2
  284. package/src/ui/components/TextField/types.tsx +1 -1
  285. package/src/ui/context/OxyContext.tsx +831 -463
  286. package/src/ui/context/hooks/useAuthOperations.ts +620 -0
  287. package/src/ui/context/hooks/useDeviceManagement.ts +108 -0
  288. package/src/ui/context/hooks/useStorage.ts +104 -0
  289. package/src/ui/hooks/index.ts +1 -2
  290. package/src/ui/hooks/mutations/index.ts +0 -2
  291. package/src/ui/hooks/mutations/useAccountMutations.ts +20 -66
  292. package/src/ui/hooks/queries/index.ts +0 -2
  293. package/src/ui/hooks/queries/queryKeys.ts +0 -2
  294. package/src/ui/hooks/queries/useAccountQueries.ts +19 -53
  295. package/src/ui/hooks/queries/useServicesQueries.ts +5 -5
  296. package/src/ui/hooks/useDeviceManagement.ts +108 -0
  297. package/src/ui/hooks/useProfileEditing.ts +3 -3
  298. package/src/ui/hooks/useSessionManagement.ts +405 -0
  299. package/src/ui/index.ts +1 -2
  300. package/src/ui/navigation/routes.ts +2 -6
  301. package/src/ui/screens/AccountCenterScreen.tsx +4 -9
  302. package/src/ui/screens/AccountSettingsScreen.tsx +31 -49
  303. package/src/ui/screens/AccountSwitcherScreen.tsx +5 -5
  304. package/src/ui/screens/OxyAuthScreen.tsx +19 -4
  305. package/src/ui/screens/PrivacySettingsScreen.tsx +101 -67
  306. package/src/ui/screens/ProfileScreen.tsx +10 -10
  307. package/src/ui/stores/authStore.ts +8 -48
  308. package/src/ui/styles/spacing.ts +2 -15
  309. package/src/ui/utils/avatarUtils.ts +21 -19
  310. package/src/ui/utils/sessionHelpers.ts +0 -7
  311. package/src/utils/__tests__/validationUtils.test.ts +1 -16
  312. package/src/utils/deviceManager.ts +198 -0
  313. package/src/utils/errorUtils.ts +1 -8
  314. package/src/utils/index.ts +2 -1
  315. package/src/utils/sessionUtils.ts +0 -8
  316. package/src/utils/validationUtils.ts +0 -12
  317. package/lib/commonjs/adapters/expo/crypto.js +0 -56
  318. package/lib/commonjs/adapters/expo/crypto.js.map +0 -1
  319. package/lib/commonjs/adapters/expo/fetch.js +0 -30
  320. package/lib/commonjs/adapters/expo/fetch.js.map +0 -1
  321. package/lib/commonjs/adapters/expo/index.js +0 -48
  322. package/lib/commonjs/adapters/expo/index.js.map +0 -1
  323. package/lib/commonjs/adapters/expo/storage.js +0 -201
  324. package/lib/commonjs/adapters/expo/storage.js.map +0 -1
  325. package/lib/commonjs/adapters/index.js +0 -48
  326. package/lib/commonjs/adapters/index.js.map +0 -1
  327. package/lib/commonjs/adapters/node/crypto.js +0 -40
  328. package/lib/commonjs/adapters/node/crypto.js.map +0 -1
  329. package/lib/commonjs/adapters/node/fetch.js +0 -62
  330. package/lib/commonjs/adapters/node/fetch.js.map +0 -1
  331. package/lib/commonjs/adapters/node/index.js +0 -34
  332. package/lib/commonjs/adapters/node/index.js.map +0 -1
  333. package/lib/commonjs/adapters/node/storage.js +0 -163
  334. package/lib/commonjs/adapters/node/storage.js.map +0 -1
  335. package/lib/commonjs/core/identity-session/DeviceManager.js +0 -237
  336. package/lib/commonjs/core/identity-session/DeviceManager.js.map +0 -1
  337. package/lib/commonjs/core/identity-session/INTEGRATION_GUIDE.md +0 -287
  338. package/lib/commonjs/core/identity-session/IdentityManager.js +0 -400
  339. package/lib/commonjs/core/identity-session/IdentityManager.js.map +0 -1
  340. package/lib/commonjs/core/identity-session/IdentitySessionCore.js +0 -394
  341. package/lib/commonjs/core/identity-session/IdentitySessionCore.js.map +0 -1
  342. package/lib/commonjs/core/identity-session/RefreshManager.js +0 -137
  343. package/lib/commonjs/core/identity-session/RefreshManager.js.map +0 -1
  344. package/lib/commonjs/core/identity-session/SessionManager.js +0 -427
  345. package/lib/commonjs/core/identity-session/SessionManager.js.map +0 -1
  346. package/lib/commonjs/core/identity-session/createIdentitySessionCore.js +0 -24
  347. package/lib/commonjs/core/identity-session/createIdentitySessionCore.js.map +0 -1
  348. package/lib/commonjs/core/identity-session/errors.js +0 -176
  349. package/lib/commonjs/core/identity-session/errors.js.map +0 -1
  350. package/lib/commonjs/core/identity-session/index.js +0 -80
  351. package/lib/commonjs/core/identity-session/index.js.map +0 -1
  352. package/lib/commonjs/core/identity-session/types.js +0 -2
  353. package/lib/commonjs/core/identity-session/types.js.map +0 -1
  354. package/lib/commonjs/crypto/README.md +0 -142
  355. package/lib/commonjs/crypto/core.js +0 -147
  356. package/lib/commonjs/crypto/core.js.map +0 -1
  357. package/lib/commonjs/node/signatureService.js +0 -107
  358. package/lib/commonjs/node/signatureService.js.map +0 -1
  359. package/lib/commonjs/ui/hooks/auth/index.js +0 -37
  360. package/lib/commonjs/ui/hooks/auth/index.js.map +0 -1
  361. package/lib/commonjs/ui/hooks/auth/useUsernameValidation.js +0 -171
  362. package/lib/commonjs/ui/hooks/auth/useUsernameValidation.js.map +0 -1
  363. package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -52
  364. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
  365. package/lib/commonjs/ui/hooks/useIdentityTransfer.js +0 -125
  366. package/lib/commonjs/ui/hooks/useIdentityTransfer.js.map +0 -1
  367. package/lib/commonjs/ui/hooks/useTransferCodesPersistence.js +0 -81
  368. package/lib/commonjs/ui/hooks/useTransferCodesPersistence.js.map +0 -1
  369. package/lib/commonjs/ui/hooks/useTransferQueries.js +0 -85
  370. package/lib/commonjs/ui/hooks/useTransferQueries.js.map +0 -1
  371. package/lib/commonjs/ui/stores/transferStore.js +0 -157
  372. package/lib/commonjs/ui/stores/transferStore.js.map +0 -1
  373. package/lib/module/adapters/expo/crypto.js +0 -51
  374. package/lib/module/adapters/expo/crypto.js.map +0 -1
  375. package/lib/module/adapters/expo/fetch.js +0 -26
  376. package/lib/module/adapters/expo/fetch.js.map +0 -1
  377. package/lib/module/adapters/expo/index.js +0 -45
  378. package/lib/module/adapters/expo/index.js.map +0 -1
  379. package/lib/module/adapters/expo/storage.js +0 -198
  380. package/lib/module/adapters/expo/storage.js.map +0 -1
  381. package/lib/module/adapters/index.js +0 -45
  382. package/lib/module/adapters/index.js.map +0 -1
  383. package/lib/module/adapters/node/crypto.js +0 -36
  384. package/lib/module/adapters/node/crypto.js.map +0 -1
  385. package/lib/module/adapters/node/fetch.js +0 -57
  386. package/lib/module/adapters/node/fetch.js.map +0 -1
  387. package/lib/module/adapters/node/index.js +0 -31
  388. package/lib/module/adapters/node/index.js.map +0 -1
  389. package/lib/module/adapters/node/storage.js +0 -159
  390. package/lib/module/adapters/node/storage.js.map +0 -1
  391. package/lib/module/core/identity-session/DeviceManager.js +0 -232
  392. package/lib/module/core/identity-session/DeviceManager.js.map +0 -1
  393. package/lib/module/core/identity-session/INTEGRATION_GUIDE.md +0 -287
  394. package/lib/module/core/identity-session/IdentityManager.js +0 -395
  395. package/lib/module/core/identity-session/IdentityManager.js.map +0 -1
  396. package/lib/module/core/identity-session/IdentitySessionCore.js +0 -390
  397. package/lib/module/core/identity-session/IdentitySessionCore.js.map +0 -1
  398. package/lib/module/core/identity-session/RefreshManager.js +0 -132
  399. package/lib/module/core/identity-session/RefreshManager.js.map +0 -1
  400. package/lib/module/core/identity-session/SessionManager.js +0 -422
  401. package/lib/module/core/identity-session/SessionManager.js.map +0 -1
  402. package/lib/module/core/identity-session/createIdentitySessionCore.js +0 -21
  403. package/lib/module/core/identity-session/createIdentitySessionCore.js.map +0 -1
  404. package/lib/module/core/identity-session/errors.js +0 -170
  405. package/lib/module/core/identity-session/errors.js.map +0 -1
  406. package/lib/module/core/identity-session/index.js +0 -17
  407. package/lib/module/core/identity-session/index.js.map +0 -1
  408. package/lib/module/core/identity-session/types.js +0 -2
  409. package/lib/module/core/identity-session/types.js.map +0 -1
  410. package/lib/module/crypto/README.md +0 -142
  411. package/lib/module/crypto/core.js +0 -133
  412. package/lib/module/crypto/core.js.map +0 -1
  413. package/lib/module/node/signatureService.js +0 -101
  414. package/lib/module/node/signatureService.js.map +0 -1
  415. package/lib/module/ui/hooks/auth/index.js +0 -7
  416. package/lib/module/ui/hooks/auth/index.js.map +0 -1
  417. package/lib/module/ui/hooks/auth/useUsernameValidation.js +0 -167
  418. package/lib/module/ui/hooks/auth/useUsernameValidation.js.map +0 -1
  419. package/lib/module/ui/hooks/useAvatarPicker.js +0 -48
  420. package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
  421. package/lib/module/ui/hooks/useIdentityTransfer.js +0 -121
  422. package/lib/module/ui/hooks/useIdentityTransfer.js.map +0 -1
  423. package/lib/module/ui/hooks/useTransferCodesPersistence.js +0 -77
  424. package/lib/module/ui/hooks/useTransferCodesPersistence.js.map +0 -1
  425. package/lib/module/ui/hooks/useTransferQueries.js +0 -80
  426. package/lib/module/ui/hooks/useTransferQueries.js.map +0 -1
  427. package/lib/module/ui/stores/transferStore.js +0 -152
  428. package/lib/module/ui/stores/transferStore.js.map +0 -1
  429. package/lib/typescript/adapters/expo/crypto.d.ts +0 -17
  430. package/lib/typescript/adapters/expo/crypto.d.ts.map +0 -1
  431. package/lib/typescript/adapters/expo/fetch.d.ts +0 -16
  432. package/lib/typescript/adapters/expo/fetch.d.ts.map +0 -1
  433. package/lib/typescript/adapters/expo/index.d.ts +0 -23
  434. package/lib/typescript/adapters/expo/index.d.ts.map +0 -1
  435. package/lib/typescript/adapters/expo/storage.d.ts +0 -23
  436. package/lib/typescript/adapters/expo/storage.d.ts.map +0 -1
  437. package/lib/typescript/adapters/index.d.ts +0 -17
  438. package/lib/typescript/adapters/index.d.ts.map +0 -1
  439. package/lib/typescript/adapters/node/crypto.d.ts +0 -17
  440. package/lib/typescript/adapters/node/crypto.d.ts.map +0 -1
  441. package/lib/typescript/adapters/node/fetch.d.ts +0 -16
  442. package/lib/typescript/adapters/node/fetch.d.ts.map +0 -1
  443. package/lib/typescript/adapters/node/index.d.ts +0 -23
  444. package/lib/typescript/adapters/node/index.d.ts.map +0 -1
  445. package/lib/typescript/adapters/node/storage.d.ts +0 -23
  446. package/lib/typescript/adapters/node/storage.d.ts.map +0 -1
  447. package/lib/typescript/core/identity-session/DeviceManager.d.ts +0 -64
  448. package/lib/typescript/core/identity-session/DeviceManager.d.ts.map +0 -1
  449. package/lib/typescript/core/identity-session/IdentityManager.d.ts +0 -88
  450. package/lib/typescript/core/identity-session/IdentityManager.d.ts.map +0 -1
  451. package/lib/typescript/core/identity-session/IdentitySessionCore.d.ts +0 -141
  452. package/lib/typescript/core/identity-session/IdentitySessionCore.d.ts.map +0 -1
  453. package/lib/typescript/core/identity-session/RefreshManager.d.ts +0 -36
  454. package/lib/typescript/core/identity-session/RefreshManager.d.ts.map +0 -1
  455. package/lib/typescript/core/identity-session/SessionManager.d.ts +0 -104
  456. package/lib/typescript/core/identity-session/SessionManager.d.ts.map +0 -1
  457. package/lib/typescript/core/identity-session/createIdentitySessionCore.d.ts +0 -11
  458. package/lib/typescript/core/identity-session/createIdentitySessionCore.d.ts.map +0 -1
  459. package/lib/typescript/core/identity-session/errors.d.ts +0 -63
  460. package/lib/typescript/core/identity-session/errors.d.ts.map +0 -1
  461. package/lib/typescript/core/identity-session/index.d.ts +0 -14
  462. package/lib/typescript/core/identity-session/index.d.ts.map +0 -1
  463. package/lib/typescript/core/identity-session/types.d.ts +0 -196
  464. package/lib/typescript/core/identity-session/types.d.ts.map +0 -1
  465. package/lib/typescript/crypto/core.d.ts +0 -56
  466. package/lib/typescript/crypto/core.d.ts.map +0 -1
  467. package/lib/typescript/node/signatureService.d.ts +0 -55
  468. package/lib/typescript/node/signatureService.d.ts.map +0 -1
  469. package/lib/typescript/ui/hooks/auth/index.d.ts +0 -6
  470. package/lib/typescript/ui/hooks/auth/index.d.ts.map +0 -1
  471. package/lib/typescript/ui/hooks/auth/useUsernameValidation.d.ts +0 -32
  472. package/lib/typescript/ui/hooks/auth/useUsernameValidation.d.ts.map +0 -1
  473. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -18
  474. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
  475. package/lib/typescript/ui/hooks/useIdentityTransfer.d.ts +0 -24
  476. package/lib/typescript/ui/hooks/useIdentityTransfer.d.ts.map +0 -1
  477. package/lib/typescript/ui/hooks/useTransferCodesPersistence.d.ts +0 -6
  478. package/lib/typescript/ui/hooks/useTransferCodesPersistence.d.ts.map +0 -1
  479. package/lib/typescript/ui/hooks/useTransferQueries.d.ts +0 -26
  480. package/lib/typescript/ui/hooks/useTransferQueries.d.ts.map +0 -1
  481. package/lib/typescript/ui/stores/transferStore.d.ts +0 -36
  482. package/lib/typescript/ui/stores/transferStore.d.ts.map +0 -1
  483. package/src/adapters/expo/crypto.ts +0 -55
  484. package/src/adapters/expo/fetch.ts +0 -28
  485. package/src/adapters/expo/index.ts +0 -51
  486. package/src/adapters/expo/storage.ts +0 -228
  487. package/src/adapters/index.ts +0 -48
  488. package/src/adapters/node/crypto.ts +0 -39
  489. package/src/adapters/node/fetch.ts +0 -59
  490. package/src/adapters/node/index.ts +0 -37
  491. package/src/adapters/node/storage.ts +0 -170
  492. package/src/core/identity-session/DeviceManager.ts +0 -273
  493. package/src/core/identity-session/INTEGRATION_GUIDE.md +0 -287
  494. package/src/core/identity-session/IdentityManager.ts +0 -474
  495. package/src/core/identity-session/IdentitySessionCore.ts +0 -464
  496. package/src/core/identity-session/RefreshManager.ts +0 -189
  497. package/src/core/identity-session/SessionManager.ts +0 -500
  498. package/src/core/identity-session/createIdentitySessionCore.ts +0 -19
  499. package/src/core/identity-session/errors.ts +0 -197
  500. package/src/core/identity-session/index.ts +0 -15
  501. package/src/core/identity-session/types.ts +0 -188
  502. package/src/crypto/README.md +0 -142
  503. package/src/crypto/__tests__/core.test.ts +0 -203
  504. package/src/crypto/core.ts +0 -142
  505. package/src/node/signatureService.ts +0 -126
  506. package/src/ui/hooks/auth/index.ts +0 -9
  507. package/src/ui/hooks/auth/useUsernameValidation.ts +0 -177
  508. package/src/ui/hooks/useAvatarPicker.ts +0 -62
  509. package/src/ui/hooks/useIdentityTransfer.ts +0 -135
  510. package/src/ui/hooks/useTransferCodesPersistence.ts +0 -80
  511. package/src/ui/hooks/useTransferQueries.ts +0 -102
  512. package/src/ui/stores/transferStore.ts +0 -201
@@ -0,0 +1,108 @@
1
+ import { useCallback } from 'react';
2
+ import type { ApiError } from '../../models/interfaces';
3
+ import { DeviceManager } from '../../utils/deviceManager';
4
+ import type { OxyServices } from '../../core';
5
+ import { handleAuthError } from '../utils/errorHandlers';
6
+
7
+ export interface UseDeviceManagementOptions {
8
+ oxyServices: OxyServices;
9
+ activeSessionId: string | null;
10
+ onError?: (error: ApiError) => void;
11
+ clearSessionState: () => Promise<void>;
12
+ logger?: (message: string, error?: unknown) => void;
13
+ }
14
+
15
+ export interface UseDeviceManagementResult {
16
+ getDeviceSessions: () => Promise<
17
+ Array<{
18
+ sessionId: string;
19
+ deviceId: string;
20
+ deviceName?: string;
21
+ lastActive?: string;
22
+ expiresAt?: string;
23
+ }>
24
+ >;
25
+ logoutAllDeviceSessions: () => Promise<void>;
26
+ updateDeviceName: (deviceName: string) => Promise<void>;
27
+ }
28
+
29
+ /**
30
+ * Provide device session management helpers tied to the current active session.
31
+ *
32
+ * @param options - Device management configuration
33
+ */
34
+ export const useDeviceManagement = ({
35
+ oxyServices,
36
+ activeSessionId,
37
+ onError,
38
+ clearSessionState,
39
+ logger,
40
+ }: UseDeviceManagementOptions): UseDeviceManagementResult => {
41
+ const getDeviceSessions = useCallback(async (): Promise<
42
+ Array<{
43
+ sessionId: string;
44
+ deviceId: string;
45
+ deviceName?: string;
46
+ lastActive?: string;
47
+ expiresAt?: string;
48
+ }>
49
+ > => {
50
+ if (!activeSessionId) throw new Error('No active session');
51
+ try {
52
+ return await oxyServices.getDeviceSessions(activeSessionId);
53
+ } catch (error) {
54
+ handleAuthError(error, {
55
+ defaultMessage: 'Failed to get device sessions',
56
+ code: 'GET_DEVICE_SESSIONS_ERROR',
57
+ onError,
58
+ logger,
59
+ });
60
+ throw error instanceof Error ? error : new Error('Failed to get device sessions');
61
+ }
62
+ }, [activeSessionId, logger, onError, oxyServices]);
63
+
64
+ const logoutAllDeviceSessions = useCallback(async (): Promise<void> => {
65
+ if (!activeSessionId) throw new Error('No active session');
66
+
67
+ try {
68
+ await oxyServices.logoutAllDeviceSessions(activeSessionId);
69
+ await clearSessionState();
70
+ } catch (error) {
71
+ handleAuthError(error, {
72
+ defaultMessage: 'Failed to logout all device sessions',
73
+ code: 'LOGOUT_ALL_DEVICES_ERROR',
74
+ onError,
75
+ logger,
76
+ });
77
+ throw error instanceof Error ? error : new Error('Failed to logout all device sessions');
78
+ }
79
+ }, [activeSessionId, clearSessionState, logger, onError, oxyServices]);
80
+
81
+ const updateDeviceName = useCallback(
82
+ async (deviceName: string): Promise<void> => {
83
+ if (!activeSessionId) throw new Error('No active session');
84
+
85
+ try {
86
+ await oxyServices.updateDeviceName(activeSessionId, deviceName);
87
+ await DeviceManager.updateDeviceName(deviceName);
88
+ } catch (error) {
89
+ handleAuthError(error, {
90
+ defaultMessage: 'Failed to update device name',
91
+ code: 'UPDATE_DEVICE_NAME_ERROR',
92
+ onError,
93
+ logger,
94
+ });
95
+ throw error instanceof Error ? error : new Error('Failed to update device name');
96
+ }
97
+ },
98
+ [activeSessionId, logger, onError, oxyServices],
99
+ );
100
+
101
+ return {
102
+ getDeviceSessions,
103
+ logoutAllDeviceSessions,
104
+ updateDeviceName,
105
+ };
106
+ };
107
+
108
+
@@ -1,7 +1,7 @@
1
1
  import { useCallback } from 'react';
2
2
  import { useI18n } from './useI18n';
3
3
  import { useUpdateProfile } from './mutations/useAccountMutations';
4
- import { useAuthStore } from '../stores/authStore';
4
+ import { useCurrentUser } from './queries/useAccountQueries';
5
5
 
6
6
  export interface ProfileUpdateData {
7
7
  displayName?: string;
@@ -34,6 +34,7 @@ export interface ProfileUpdateData {
34
34
  export const useProfileEditing = () => {
35
35
  const { t } = useI18n();
36
36
  const updateProfileMutation = useUpdateProfile();
37
+ const { data: currentUser } = useCurrentUser();
37
38
 
38
39
  /**
39
40
  * Save profile updates to the server using TanStack Query
@@ -71,7 +72,6 @@ export const useProfileEditing = () => {
71
72
 
72
73
  // Handle name field
73
74
  if (updates.displayName !== undefined || updates.lastName !== undefined) {
74
- const currentUser = useAuthStore.getState().user;
75
75
  const currentName = currentUser?.name;
76
76
  updateData.name = {
77
77
  first: updates.displayName ?? (typeof currentName === 'object' ? currentName?.first : '') ?? '',
@@ -86,7 +86,7 @@ export const useProfileEditing = () => {
86
86
  // Error toast is handled by the mutation
87
87
  return false;
88
88
  }
89
- }, [updateProfileMutation, t]);
89
+ }, [updateProfileMutation, t, currentUser]);
90
90
 
91
91
  /**
92
92
  * Update a single profile field
@@ -0,0 +1,405 @@
1
+ import { useCallback, useMemo, useRef, useState } from 'react';
2
+ import type { ApiError, User } from '../../models/interfaces';
3
+ import type { ClientSession } from '../../models/session';
4
+ import { mergeSessions, normalizeAndSortSessions, sessionsArraysEqual } from '../../utils/sessionUtils';
5
+ import { fetchSessionsWithFallback, mapSessionsToClient, validateSessionBatch } from '../utils/sessionHelpers';
6
+ import { getStorageKeys, type StorageInterface } from '../utils/storageHelpers';
7
+ import { handleAuthError, isInvalidSessionError } from '../utils/errorHandlers';
8
+ import type { OxyServices } from '../../core';
9
+ import type { QueryClient } from '@tanstack/react-query';
10
+ import { clearQueryCache } from './queryClient';
11
+
12
+ const getDeviceIdForSession = (sessions: ClientSession[] = [], sessionId: string | null) =>
13
+ sessionId ? sessions.find((s) => s.sessionId === sessionId)?.deviceId : undefined;
14
+
15
+ export interface UseSessionManagementOptions {
16
+ oxyServices: OxyServices;
17
+ storage: StorageInterface | null;
18
+ storageKeyPrefix?: string;
19
+ loginSuccess: (user: User) => void;
20
+ logoutStore: () => void;
21
+ applyLanguagePreference: (user: User) => Promise<void>;
22
+ onAuthStateChange?: (user: User | null) => void;
23
+ onError?: (error: ApiError) => void;
24
+ setAuthError?: (message: string | null) => void;
25
+ logger?: (message: string, error?: unknown) => void;
26
+ setTokenReady?: (ready: boolean) => void;
27
+ queryClient?: QueryClient | null;
28
+ }
29
+
30
+ export interface UseSessionManagementResult {
31
+ sessions: ClientSession[];
32
+ activeSessionId: string | null;
33
+ setActiveSessionId: (sessionId: string | null) => void;
34
+ updateSessions: (incoming: ClientSession[], options?: { merge?: boolean }) => void;
35
+ switchSession: (sessionId: string) => Promise<User>;
36
+ refreshSessions: (activeUserId?: string) => Promise<void>;
37
+ clearSessionState: () => Promise<void>;
38
+ saveActiveSessionId: (sessionId: string) => Promise<void>;
39
+ trackRemovedSession: (sessionId: string) => void;
40
+ storageKeys: ReturnType<typeof getStorageKeys>;
41
+ isRefreshInFlight: boolean;
42
+ }
43
+
44
+ const DEFAULT_SAVE_ERROR_MESSAGE = 'Failed to save session data';
45
+ const CLEAR_STORAGE_ERROR = 'Failed to clear storage';
46
+
47
+ /**
48
+ * Manage session state, persistence, and high-level multi-session operations.
49
+ *
50
+ * @param options - Session management configuration
51
+ */
52
+ export const useSessionManagement = ({
53
+ oxyServices,
54
+ storage,
55
+ storageKeyPrefix,
56
+ loginSuccess,
57
+ logoutStore,
58
+ applyLanguagePreference,
59
+ onAuthStateChange,
60
+ onError,
61
+ setAuthError,
62
+ logger,
63
+ setTokenReady,
64
+ queryClient,
65
+ }: UseSessionManagementOptions): UseSessionManagementResult => {
66
+ const [sessions, setSessions] = useState<ClientSession[]>([]);
67
+ const [activeSessionId, setActiveSessionId] = useState<string | null>(null);
68
+
69
+ const refreshInFlightRef = useRef<Promise<void> | null>(null);
70
+ const removedSessionsRef = useRef<Set<string>>(new Set());
71
+ const lastRefreshRef = useRef<number>(0);
72
+
73
+ const storageKeys = useMemo(() => getStorageKeys(storageKeyPrefix), [storageKeyPrefix]);
74
+
75
+ const saveSessionIds = useCallback(
76
+ async (sessionIds: string[]): Promise<void> => {
77
+ if (!storage) return;
78
+ try {
79
+ const uniqueIds = Array.from(new Set(sessionIds));
80
+ await storage.setItem(storageKeys.sessionIds, JSON.stringify(uniqueIds));
81
+ } catch (error) {
82
+ if (logger) {
83
+ logger(DEFAULT_SAVE_ERROR_MESSAGE, error);
84
+ } else if (__DEV__) {
85
+ console.warn('Failed to save session IDs:', error);
86
+ }
87
+ }
88
+ },
89
+ [logger, storage, storageKeys.sessionIds],
90
+ );
91
+
92
+ const updateSessions = useCallback(
93
+ (incoming: ClientSession[], options: { merge?: boolean } = {}): void => {
94
+ setSessions((prevSessions) => {
95
+ const processed = options.merge
96
+ ? mergeSessions(prevSessions, incoming, activeSessionId, false)
97
+ : normalizeAndSortSessions(incoming, activeSessionId, false);
98
+
99
+ if (storage) {
100
+ void saveSessionIds(processed.map((session) => session.sessionId));
101
+ }
102
+
103
+ if (sessionsArraysEqual(prevSessions, processed)) {
104
+ return prevSessions;
105
+ }
106
+ return processed;
107
+ });
108
+ },
109
+ [activeSessionId, saveSessionIds, storage],
110
+ );
111
+
112
+ const saveActiveSessionId = useCallback(
113
+ async (sessionId: string): Promise<void> => {
114
+ if (!storage) return;
115
+ try {
116
+ await storage.setItem(storageKeys.activeSessionId, sessionId);
117
+ } catch (error) {
118
+ handleAuthError(error, {
119
+ defaultMessage: DEFAULT_SAVE_ERROR_MESSAGE,
120
+ code: 'SESSION_PERSISTENCE_ERROR',
121
+ onError,
122
+ setAuthError,
123
+ logger,
124
+ });
125
+ }
126
+ },
127
+ [logger, onError, setAuthError, storage, storageKeys.activeSessionId],
128
+ );
129
+
130
+ const removeActiveSessionId = useCallback(async (): Promise<void> => {
131
+ if (!storage) return;
132
+ try {
133
+ await storage.removeItem(storageKeys.activeSessionId);
134
+ } catch (error) {
135
+ handleAuthError(error, {
136
+ defaultMessage: DEFAULT_SAVE_ERROR_MESSAGE,
137
+ code: 'SESSION_PERSISTENCE_ERROR',
138
+ onError,
139
+ setAuthError,
140
+ logger,
141
+ });
142
+ }
143
+ }, [logger, onError, setAuthError, storage, storageKeys.activeSessionId]);
144
+
145
+ const clearSessionStorage = useCallback(async (): Promise<void> => {
146
+ if (!storage) return;
147
+ try {
148
+ await storage.removeItem(storageKeys.activeSessionId);
149
+ await storage.removeItem(storageKeys.sessionIds);
150
+ // Clear identity sync state
151
+ await storage.removeItem('oxy_identity_synced').catch(() => {});
152
+ } catch (error) {
153
+ handleAuthError(error, {
154
+ defaultMessage: CLEAR_STORAGE_ERROR,
155
+ code: 'STORAGE_ERROR',
156
+ onError,
157
+ setAuthError,
158
+ logger,
159
+ });
160
+ }
161
+ }, [logger, onError, setAuthError, storage, storageKeys.activeSessionId, storageKeys.sessionIds]);
162
+
163
+ const clearSessionState = useCallback(async (): Promise<void> => {
164
+ setSessions([]);
165
+ setActiveSessionId(null);
166
+ logoutStore();
167
+ oxyServices.clearTokens();
168
+
169
+ // Clear TanStack Query cache (in-memory)
170
+ if (queryClient) {
171
+ queryClient.clear();
172
+ }
173
+
174
+ // Clear persisted query cache
175
+ if (storage) {
176
+ try {
177
+ await clearQueryCache(storage);
178
+ } catch (error) {
179
+ if (logger) {
180
+ logger('Failed to clear persisted query cache', error);
181
+ }
182
+ }
183
+ }
184
+
185
+ await clearSessionStorage();
186
+ onAuthStateChange?.(null);
187
+ }, [clearSessionStorage, logoutStore, onAuthStateChange, queryClient, storage, logger, oxyServices]);
188
+
189
+ const activateSession = useCallback(
190
+ async (sessionId: string, user: User): Promise<void> => {
191
+ const deviceId = getDeviceIdForSession(sessions, sessionId);
192
+ await oxyServices.getTokenBySession(sessionId, deviceId);
193
+ setTokenReady?.(true);
194
+ setActiveSessionId(sessionId);
195
+ loginSuccess(user);
196
+ await saveActiveSessionId(sessionId);
197
+ await applyLanguagePreference(user);
198
+ onAuthStateChange?.(user);
199
+ },
200
+ [
201
+ applyLanguagePreference,
202
+ sessions,
203
+ loginSuccess,
204
+ onAuthStateChange,
205
+ oxyServices,
206
+ saveActiveSessionId,
207
+ setTokenReady,
208
+ ],
209
+ );
210
+
211
+ const trackRemovedSession = useCallback((sessionId: string) => {
212
+ removedSessionsRef.current.add(sessionId);
213
+ setTimeout(() => {
214
+ removedSessionsRef.current.delete(sessionId);
215
+ }, 5000);
216
+ }, []);
217
+
218
+ const findReplacementSession = useCallback(
219
+ async (sessionIds: string[]): Promise<User | null> => {
220
+ if (!sessionIds.length) {
221
+ return null;
222
+ }
223
+
224
+ const validationResults = await validateSessionBatch(oxyServices, sessionIds, {
225
+ maxConcurrency: 3,
226
+ });
227
+
228
+ const validSession = validationResults.find((result) => result.valid);
229
+ if (!validSession) {
230
+ return null;
231
+ }
232
+
233
+ const validation = await oxyServices.validateSession(validSession.sessionId, {
234
+ useHeaderValidation: true,
235
+ });
236
+
237
+ if (!validation?.valid || !validation.user) {
238
+ return null;
239
+ }
240
+
241
+ const user = validation.user as User;
242
+ await activateSession(validSession.sessionId, user);
243
+ return user;
244
+ },
245
+ [activateSession, oxyServices],
246
+ );
247
+
248
+ const switchSession = useCallback(
249
+ async (sessionId: string): Promise<User> => {
250
+ try {
251
+ const validation = await oxyServices.validateSession(sessionId, { useHeaderValidation: true });
252
+ if (!validation?.valid) {
253
+ throw new Error('Session is invalid or expired');
254
+ }
255
+
256
+ if (!validation.user) {
257
+ throw new Error('User data not available from session validation');
258
+ }
259
+
260
+ const user = validation.user as User;
261
+ await activateSession(sessionId, user);
262
+
263
+ try {
264
+ const deviceSessions = await fetchSessionsWithFallback(oxyServices, sessionId, {
265
+ fallbackUserId: user.id,
266
+ logger,
267
+ });
268
+ updateSessions(deviceSessions, { merge: true });
269
+ } catch (error) {
270
+ if (__DEV__) {
271
+ console.warn('Failed to synchronize sessions after switch:', error);
272
+ }
273
+ }
274
+
275
+ return user;
276
+ } catch (error) {
277
+ const invalidSession = isInvalidSessionError(error);
278
+
279
+ if (invalidSession) {
280
+ updateSessions(sessions.filter((session) => session.sessionId !== sessionId), {
281
+ merge: false,
282
+ });
283
+ if (sessionId === activeSessionId) {
284
+ const otherSessionIds = sessions
285
+ .filter(
286
+ (session) =>
287
+ session.sessionId !== sessionId && !removedSessionsRef.current.has(session.sessionId),
288
+ )
289
+ .map((session) => session.sessionId);
290
+
291
+ const replacementUser = await findReplacementSession(otherSessionIds);
292
+ if (replacementUser) {
293
+ return replacementUser;
294
+ }
295
+ }
296
+ }
297
+
298
+ handleAuthError(error, {
299
+ defaultMessage: 'Failed to switch session',
300
+ code: invalidSession ? 'INVALID_SESSION' : 'SESSION_SWITCH_ERROR',
301
+ onError,
302
+ setAuthError,
303
+ logger,
304
+ });
305
+ throw error instanceof Error ? error : new Error('Failed to switch session');
306
+ }
307
+ },
308
+ [
309
+ activateSession,
310
+ activeSessionId,
311
+ findReplacementSession,
312
+ logger,
313
+ loginSuccess,
314
+ onError,
315
+ oxyServices,
316
+ sessions,
317
+ setAuthError,
318
+ updateSessions,
319
+ ],
320
+ );
321
+
322
+ const refreshSessions = useCallback(
323
+ async (activeUserId?: string): Promise<void> => {
324
+ if (!activeSessionId) return;
325
+
326
+ if (refreshInFlightRef.current) {
327
+ await refreshInFlightRef.current;
328
+ return;
329
+ }
330
+
331
+ const now = Date.now();
332
+ if (now - lastRefreshRef.current < 500) {
333
+ return;
334
+ }
335
+ lastRefreshRef.current = now;
336
+
337
+ const refreshPromise = (async () => {
338
+ try {
339
+ const deviceSessions = await fetchSessionsWithFallback(oxyServices, activeSessionId, {
340
+ fallbackUserId: activeUserId,
341
+ logger,
342
+ });
343
+ updateSessions(deviceSessions, { merge: true });
344
+ } catch (error) {
345
+ if (isInvalidSessionError(error)) {
346
+ const otherSessions = sessions
347
+ .filter(
348
+ (session) =>
349
+ session.sessionId !== activeSessionId &&
350
+ !removedSessionsRef.current.has(session.sessionId),
351
+ )
352
+ .map((session) => session.sessionId);
353
+
354
+ const replacementUser = await findReplacementSession(otherSessions);
355
+ if (!replacementUser) {
356
+ await clearSessionState();
357
+ }
358
+ return;
359
+ }
360
+
361
+ handleAuthError(error, {
362
+ defaultMessage: 'Failed to refresh sessions',
363
+ code: 'SESSION_REFRESH_ERROR',
364
+ onError,
365
+ setAuthError,
366
+ logger,
367
+ });
368
+ } finally {
369
+ refreshInFlightRef.current = null;
370
+ lastRefreshRef.current = Date.now();
371
+ }
372
+ })();
373
+
374
+ refreshInFlightRef.current = refreshPromise;
375
+ await refreshPromise;
376
+ },
377
+ [
378
+ activeSessionId,
379
+ clearSessionState,
380
+ findReplacementSession,
381
+ logger,
382
+ onError,
383
+ oxyServices,
384
+ sessions,
385
+ setAuthError,
386
+ updateSessions,
387
+ ],
388
+ );
389
+
390
+ const isRefreshInFlight = Boolean(refreshInFlightRef.current);
391
+
392
+ return {
393
+ sessions,
394
+ activeSessionId,
395
+ setActiveSessionId,
396
+ updateSessions,
397
+ switchSession,
398
+ refreshSessions,
399
+ clearSessionState,
400
+ saveActiveSessionId,
401
+ trackRemovedSession,
402
+ storageKeys,
403
+ isRefreshInFlight,
404
+ };
405
+ };
package/src/ui/index.ts CHANGED
@@ -79,6 +79,5 @@ export {
79
79
  toast
80
80
  };
81
81
 
82
- // Re-export core services for convenience in UI context
83
- export { OxyServices } from '../core';
82
+ // Removed convenience re-export of core services from UI context.
84
83
  export type { User, LoginResponse, ApiError } from '../models/interfaces';
@@ -30,22 +30,18 @@ export type RouteName =
30
30
  | 'UserLinks'
31
31
  | 'HistoryView'
32
32
  | 'SavesCollections'
33
- | 'EditProfile' // For backward compatibility, maps to AccountSettings
34
33
  | 'KarmaCenter'
35
34
  | 'KarmaLeaderboard'
36
35
  | 'KarmaRewards'
37
36
  | 'KarmaRules'
38
37
  | 'AboutKarma'
39
38
  | 'KarmaFAQ'
40
- // Legacy aliases for backward compatibility
41
- | 'SignIn'; // Maps to OxyAuth
39
+ | 'EditProfile'
42
40
 
43
41
  // Lazy screen loaders - functions that return screen components on-demand
44
42
  // This breaks the require cycle by deferring imports until screens are actually needed
45
43
  const screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = {
46
44
  OxyAuth: () => require('../screens/OxyAuthScreen').default,
47
- // Legacy alias - SignIn now maps to OxyAuth
48
- SignIn: () => require('../screens/OxyAuthScreen').default,
49
45
  AccountOverview: () => require('../screens/AccountOverviewScreen').default,
50
46
  AccountSettings: () => require('../screens/AccountSettingsScreen').default,
51
47
  AccountCenter: () => require('../screens/AccountCenterScreen').default,
@@ -67,7 +63,7 @@ const screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = {
67
63
  UserLinks: () => require('../screens/UserLinksScreen').default,
68
64
  HistoryView: () => require('../screens/HistoryViewScreen').default,
69
65
  SavesCollections: () => require('../screens/SavesCollectionsScreen').default,
70
- // Backward compatibility - EditProfile maps to AccountSettings
66
+ // EditProfile kept for historical references
71
67
  EditProfile: () => require('../screens/AccountSettingsScreen').default,
72
68
  // Karma screens
73
69
  KarmaCenter: () => require('../screens/karma/KarmaCenterScreen').default,
@@ -86,14 +86,9 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
86
86
  return (
87
87
  <View style={[styles.container, { backgroundColor }]}>
88
88
  {/* Header with user profile */}
89
- {user && user.username && (
89
+ {user && (
90
90
  <ProfileCard
91
- user={{
92
- username: user.username,
93
- email: user.email,
94
- name: user.name,
95
- avatar: user.avatar,
96
- }}
91
+ user={user}
97
92
  theme={normalizedTheme}
98
93
  onEditPress={() => navigate?.('EditProfile', { activeTab: 'profile' })}
99
94
  onClosePress={onClose}
@@ -194,7 +189,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
194
189
  iconColor: colors.iconPersonalInfo,
195
190
  title: t('accountCenter.items.addAccount.title') || 'Add Another Account',
196
191
  subtitle: t('accountCenter.items.addAccount.subtitle') || 'Sign in with a different account',
197
- onPress: () => navigate?.('SignIn'),
192
+ onPress: () => navigate?.('OxyAuth'),
198
193
  },
199
194
  ], [sessions.length, navigate, t, colors])}
200
195
 
@@ -213,7 +208,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
213
208
  iconColor: colors.iconPersonalInfo,
214
209
  title: t('accountCenter.items.addAccount.title') || 'Add Another Account',
215
210
  subtitle: t('accountCenter.items.addAccount.subtitle') || 'Sign in with a different account',
216
- onPress: () => navigate?.('SignIn'),
211
+ onPress: () => navigate?.('OxyAuth'),
217
212
  },
218
213
  ], [navigate, t, colors])}
219
214