@oxyhq/services 5.17.16 → 5.17.18

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 (403) hide show
  1. package/README.md +32 -38
  2. package/lib/commonjs/core/CrossDomainAuth.js +277 -0
  3. package/lib/commonjs/core/CrossDomainAuth.js.map +1 -0
  4. package/lib/commonjs/core/HttpService.js +82 -15
  5. package/lib/commonjs/core/HttpService.js.map +1 -1
  6. package/lib/commonjs/core/OxyServices.base.js +11 -3
  7. package/lib/commonjs/core/OxyServices.base.js.map +1 -1
  8. package/lib/commonjs/core/OxyServices.js +4 -1
  9. package/lib/commonjs/core/OxyServices.js.map +1 -1
  10. package/lib/commonjs/core/index.js +30 -0
  11. package/lib/commonjs/core/index.js.map +1 -1
  12. package/lib/commonjs/core/mixins/OxyServices.assets.js +16 -3
  13. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
  14. package/lib/commonjs/core/mixins/OxyServices.auth.js +73 -32
  15. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
  16. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +289 -0
  17. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -0
  18. package/lib/commonjs/core/mixins/OxyServices.popup.js +352 -0
  19. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -0
  20. package/lib/commonjs/core/mixins/OxyServices.redirect.js +378 -0
  21. package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +1 -0
  22. package/lib/commonjs/core/mixins/OxyServices.user.js +35 -24
  23. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  24. package/lib/commonjs/core/mixins/index.js +27 -15
  25. package/lib/commonjs/core/mixins/index.js.map +1 -1
  26. package/lib/commonjs/crypto/index.js +30 -0
  27. package/lib/commonjs/crypto/index.js.map +1 -1
  28. package/lib/commonjs/crypto/keyManager.js +902 -0
  29. package/lib/commonjs/crypto/keyManager.js.map +1 -0
  30. package/lib/commonjs/crypto/polyfill.js +14 -5
  31. package/lib/commonjs/crypto/polyfill.js.map +1 -1
  32. package/lib/commonjs/crypto/recoveryPhrase.js +152 -0
  33. package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
  34. package/lib/commonjs/crypto/signatureService.js +289 -0
  35. package/lib/commonjs/crypto/signatureService.js.map +1 -0
  36. package/lib/commonjs/i18n/locales/en-US.json +1 -1
  37. package/lib/commonjs/index.js +40 -26
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/models/interfaces.js +0 -15
  40. package/lib/commonjs/models/interfaces.js.map +1 -1
  41. package/lib/commonjs/ui/components/BottomSheetRouter.js +9 -1
  42. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  43. package/lib/commonjs/ui/components/Icon.js.map +1 -1
  44. package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -1
  45. package/lib/commonjs/ui/components/OxyProvider.js +41 -11
  46. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  47. package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -1
  48. package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -1
  49. package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -1
  50. package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -1
  51. package/lib/commonjs/ui/context/OxyContext.js +110 -192
  52. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  53. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +150 -19
  54. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  55. package/lib/commonjs/ui/context/hooks/useSessionManagement.js +279 -0
  56. package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
  57. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +78 -64
  58. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  59. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +38 -51
  60. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  61. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +3 -3
  62. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  63. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +18 -12
  64. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  65. package/lib/commonjs/ui/hooks/useProfileEditing.js +3 -5
  66. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  67. package/lib/commonjs/ui/hooks/useSessionManagement.js +4 -8
  68. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  69. package/lib/commonjs/ui/hooks/useSessionSocket.js +162 -315
  70. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  71. package/lib/commonjs/ui/hooks/useStorage.js +24 -58
  72. package/lib/commonjs/ui/hooks/useStorage.js.map +1 -1
  73. package/lib/commonjs/ui/index.js +50 -21
  74. package/lib/commonjs/ui/index.js.map +1 -1
  75. package/lib/commonjs/ui/navigation/routes.js +5 -1
  76. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  77. package/lib/commonjs/ui/screens/AccountCenterScreen.js +2 -2
  78. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  79. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +29 -24
  81. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +3 -3
  83. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/OxyAuthScreen.js +134 -66
  85. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +6 -13
  87. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  88. package/lib/commonjs/ui/stores/accountStore.js +2 -4
  89. package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
  90. package/lib/commonjs/ui/stores/authStore.js +45 -32
  91. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  92. package/lib/commonjs/ui/styles/spacing.js +54 -2
  93. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  94. package/lib/commonjs/ui/utils/avatarUtils.js +37 -41
  95. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  96. package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -1
  97. package/lib/commonjs/utils/errorUtils.js +13 -0
  98. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  99. package/lib/commonjs/utils/validationUtils.js +15 -1
  100. package/lib/commonjs/utils/validationUtils.js.map +1 -1
  101. package/lib/module/core/CrossDomainAuth.js +271 -0
  102. package/lib/module/core/CrossDomainAuth.js.map +1 -0
  103. package/lib/module/core/HttpService.js +82 -15
  104. package/lib/module/core/HttpService.js.map +1 -1
  105. package/lib/module/core/OxyServices.base.js +11 -4
  106. package/lib/module/core/OxyServices.base.js.map +1 -1
  107. package/lib/module/core/OxyServices.js +4 -1
  108. package/lib/module/core/OxyServices.js.map +1 -1
  109. package/lib/module/core/index.js +6 -1
  110. package/lib/module/core/index.js.map +1 -1
  111. package/lib/module/core/mixins/OxyServices.assets.js +16 -3
  112. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  113. package/lib/module/core/mixins/OxyServices.auth.js +73 -32
  114. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
  115. package/lib/module/core/mixins/OxyServices.fedcm.js +286 -0
  116. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -0
  117. package/lib/module/core/mixins/OxyServices.popup.js +349 -0
  118. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -0
  119. package/lib/module/core/mixins/OxyServices.redirect.js +375 -0
  120. package/lib/module/core/mixins/OxyServices.redirect.js.map +1 -0
  121. package/lib/module/core/mixins/OxyServices.user.js +35 -24
  122. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  123. package/lib/module/core/mixins/index.js +15 -3
  124. package/lib/module/core/mixins/index.js.map +1 -1
  125. package/lib/module/crypto/index.js +8 -4
  126. package/lib/module/crypto/index.js.map +1 -1
  127. package/lib/module/crypto/keyManager.js +899 -0
  128. package/lib/module/crypto/keyManager.js.map +1 -0
  129. package/lib/module/crypto/polyfill.js +6 -5
  130. package/lib/module/crypto/polyfill.js.map +1 -1
  131. package/lib/module/crypto/recoveryPhrase.js +147 -0
  132. package/lib/module/crypto/recoveryPhrase.js.map +1 -0
  133. package/lib/module/crypto/signatureService.js +286 -0
  134. package/lib/module/crypto/signatureService.js.map +1 -0
  135. package/lib/module/i18n/locales/en-US.json +1 -1
  136. package/lib/module/index.js +6 -9
  137. package/lib/module/index.js.map +1 -1
  138. package/lib/module/models/interfaces.js +0 -15
  139. package/lib/module/models/interfaces.js.map +1 -1
  140. package/lib/module/ui/components/BottomSheetRouter.js +6 -2
  141. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  142. package/lib/module/ui/components/Icon.js.map +1 -1
  143. package/lib/module/ui/components/IconButton/utils.js.map +1 -1
  144. package/lib/module/ui/components/OxyProvider.js +41 -11
  145. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  146. package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -1
  147. package/lib/module/ui/components/TextField/helpers.js.map +1 -1
  148. package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -1
  149. package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -1
  150. package/lib/module/ui/context/OxyContext.js +112 -184
  151. package/lib/module/ui/context/OxyContext.js.map +1 -1
  152. package/lib/module/ui/context/hooks/useAuthOperations.js +150 -19
  153. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  154. package/lib/module/ui/context/hooks/useSessionManagement.js +274 -0
  155. package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
  156. package/lib/module/ui/hooks/mutations/useAccountMutations.js +79 -64
  157. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  158. package/lib/module/ui/hooks/queries/useAccountQueries.js +31 -44
  159. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  160. package/lib/module/ui/hooks/queries/useSecurityQueries.js +1 -1
  161. package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  162. package/lib/module/ui/hooks/queries/useServicesQueries.js +13 -7
  163. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  164. package/lib/module/ui/hooks/useProfileEditing.js +3 -5
  165. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  166. package/lib/module/ui/hooks/useSessionManagement.js +4 -8
  167. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  168. package/lib/module/ui/hooks/useSessionSocket.js +162 -315
  169. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  170. package/lib/module/ui/hooks/useStorage.js +25 -59
  171. package/lib/module/ui/hooks/useStorage.js.map +1 -1
  172. package/lib/module/ui/index.js +15 -10
  173. package/lib/module/ui/index.js.map +1 -1
  174. package/lib/module/ui/navigation/routes.js +5 -1
  175. package/lib/module/ui/navigation/routes.js.map +1 -1
  176. package/lib/module/ui/screens/AccountCenterScreen.js +2 -2
  177. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  178. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  179. package/lib/module/ui/screens/AccountSettingsScreen.js +29 -24
  180. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  181. package/lib/module/ui/screens/AccountSwitcherScreen.js +3 -3
  182. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  183. package/lib/module/ui/screens/OxyAuthScreen.js +135 -68
  184. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  185. package/lib/module/ui/screens/PrivacySettingsScreen.js +6 -13
  186. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  187. package/lib/module/ui/stores/accountStore.js +2 -4
  188. package/lib/module/ui/stores/accountStore.js.map +1 -1
  189. package/lib/module/ui/stores/authStore.js +45 -32
  190. package/lib/module/ui/stores/authStore.js.map +1 -1
  191. package/lib/module/ui/styles/spacing.js +6 -2
  192. package/lib/module/ui/styles/spacing.js.map +1 -1
  193. package/lib/module/ui/utils/avatarUtils.js +37 -40
  194. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  195. package/lib/module/ui/utils/storageHelpers.js.map +1 -1
  196. package/lib/module/utils/errorUtils.js +7 -0
  197. package/lib/module/utils/errorUtils.js.map +1 -1
  198. package/lib/module/utils/validationUtils.js +13 -0
  199. package/lib/module/utils/validationUtils.js.map +1 -1
  200. package/lib/typescript/core/CrossDomainAuth.d.ts +161 -0
  201. package/lib/typescript/core/CrossDomainAuth.d.ts.map +1 -0
  202. package/lib/typescript/core/HttpService.d.ts +1 -1
  203. package/lib/typescript/core/HttpService.d.ts.map +1 -1
  204. package/lib/typescript/core/OxyServices.base.d.ts +0 -6
  205. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  206. package/lib/typescript/core/OxyServices.d.ts +5 -36
  207. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  208. package/lib/typescript/core/index.d.ts +4 -0
  209. package/lib/typescript/core/index.d.ts.map +1 -1
  210. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  211. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  212. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +40 -20
  213. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  214. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  215. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  216. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts +195 -0
  217. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts.map +1 -0
  218. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  219. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  220. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  221. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  222. package/lib/typescript/core/mixins/OxyServices.popup.d.ts +206 -0
  223. package/lib/typescript/core/mixins/OxyServices.popup.d.ts.map +1 -0
  224. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  225. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts +246 -0
  226. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts.map +1 -0
  227. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  228. package/lib/typescript/core/mixins/OxyServices.user.d.ts +6 -4
  229. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  230. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  231. package/lib/typescript/core/mixins/index.d.ts +220 -8
  232. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  233. package/lib/typescript/crypto/index.d.ts +6 -3
  234. package/lib/typescript/crypto/index.d.ts.map +1 -1
  235. package/lib/typescript/crypto/keyManager.d.ts +190 -0
  236. package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
  237. package/lib/typescript/crypto/polyfill.d.ts +4 -3
  238. package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
  239. package/lib/typescript/crypto/recoveryPhrase.d.ts +59 -0
  240. package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
  241. package/lib/typescript/crypto/signatureService.d.ts +87 -0
  242. package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
  243. package/lib/typescript/index.d.ts +5 -6
  244. package/lib/typescript/index.d.ts.map +1 -1
  245. package/lib/typescript/models/interfaces.d.ts +2 -14
  246. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  247. package/lib/typescript/models/session.d.ts +0 -9
  248. package/lib/typescript/models/session.d.ts.map +1 -1
  249. package/lib/typescript/types/bip39.d.ts +32 -0
  250. package/lib/typescript/ui/components/BottomSheetRouter.d.ts +5 -0
  251. package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
  252. package/lib/typescript/ui/components/IconButton/utils.d.ts +1 -1
  253. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  254. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
  255. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +1 -1
  256. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -1
  257. package/lib/typescript/ui/components/TextField/helpers.d.ts +8 -8
  258. package/lib/typescript/ui/components/TextField/types.d.ts +1 -0
  259. package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
  260. package/lib/typescript/ui/components/types.d.ts +4 -0
  261. package/lib/typescript/ui/components/types.d.ts.map +1 -1
  262. package/lib/typescript/ui/context/OxyContext.d.ts +57 -3
  263. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  264. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +10 -3
  265. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  266. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +41 -0
  267. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
  268. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  269. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  270. package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  271. package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
  272. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  273. package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -2
  274. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
  275. package/lib/typescript/ui/hooks/useStorage.d.ts +3 -9
  276. package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -1
  277. package/lib/typescript/ui/index.d.ts +6 -2
  278. package/lib/typescript/ui/index.d.ts.map +1 -1
  279. package/lib/typescript/ui/navigation/routes.d.ts +1 -1
  280. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  281. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  282. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +1 -1
  283. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  284. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  285. package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
  286. package/lib/typescript/ui/stores/authStore.d.ts +8 -7
  287. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  288. package/lib/typescript/ui/styles/spacing.d.ts +5 -0
  289. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
  290. package/lib/typescript/ui/types/navigation.d.ts +2 -1
  291. package/lib/typescript/ui/types/navigation.d.ts.map +1 -1
  292. package/lib/typescript/ui/utils/avatarUtils.d.ts +2 -13
  293. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  294. package/lib/typescript/ui/utils/storageHelpers.d.ts +0 -3
  295. package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -1
  296. package/lib/typescript/utils/errorUtils.d.ts +6 -0
  297. package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
  298. package/lib/typescript/utils/validationUtils.d.ts +8 -0
  299. package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
  300. package/package.json +8 -7
  301. package/src/core/CrossDomainAuth.ts +307 -0
  302. package/src/core/HttpService.ts +99 -16
  303. package/src/core/OxyServices.base.ts +20 -3
  304. package/src/core/OxyServices.ts +7 -3
  305. package/src/core/index.ts +9 -1
  306. package/src/core/mixins/OxyServices.assets.ts +14 -3
  307. package/src/core/mixins/OxyServices.auth.ts +105 -36
  308. package/src/core/mixins/OxyServices.fedcm.ts +315 -0
  309. package/src/core/mixins/OxyServices.popup.ts +402 -0
  310. package/src/core/mixins/OxyServices.redirect.ts +397 -0
  311. package/src/core/mixins/OxyServices.user.ts +39 -24
  312. package/src/core/mixins/index.ts +19 -3
  313. package/src/crypto/index.ts +16 -5
  314. package/src/crypto/keyManager.ts +966 -0
  315. package/src/crypto/polyfill.ts +6 -5
  316. package/src/crypto/recoveryPhrase.ts +166 -0
  317. package/src/crypto/signatureService.ts +323 -0
  318. package/src/i18n/locales/en-US.json +1 -1
  319. package/src/index.ts +19 -15
  320. package/src/models/interfaces.ts +4 -16
  321. package/src/models/session.ts +2 -11
  322. package/src/types/bip39.d.ts +32 -0
  323. package/src/ui/components/BottomSheetRouter.tsx +6 -1
  324. package/src/ui/components/Icon.tsx +1 -1
  325. package/src/ui/components/IconButton/utils.ts +1 -1
  326. package/src/ui/components/OxyProvider.tsx +44 -12
  327. package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
  328. package/src/ui/components/TextField/Adornment/utils.ts +2 -2
  329. package/src/ui/components/TextField/helpers.tsx +10 -10
  330. package/src/ui/components/TextField/types.tsx +1 -1
  331. package/src/ui/components/TouchableRipple/utils.ts +2 -2
  332. package/src/ui/components/Typography/AnimatedText.tsx +2 -2
  333. package/src/ui/components/types.tsx +6 -0
  334. package/src/ui/context/OxyContext.tsx +173 -185
  335. package/src/ui/context/hooks/useAuthOperations.ts +177 -36
  336. package/src/ui/context/hooks/useSessionManagement.ts +399 -0
  337. package/src/ui/hooks/mutations/useAccountMutations.ts +82 -65
  338. package/src/ui/hooks/queries/useAccountQueries.ts +29 -35
  339. package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
  340. package/src/ui/hooks/queries/useServicesQueries.ts +14 -6
  341. package/src/ui/hooks/useProfileEditing.ts +3 -3
  342. package/src/ui/hooks/useSessionManagement.ts +5 -10
  343. package/src/ui/hooks/useSessionSocket.ts +46 -175
  344. package/src/ui/hooks/useStorage.ts +24 -76
  345. package/src/ui/index.ts +22 -13
  346. package/src/ui/navigation/routes.ts +6 -2
  347. package/src/ui/screens/AccountCenterScreen.tsx +2 -2
  348. package/src/ui/screens/AccountOverviewScreen.tsx +1 -1
  349. package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
  350. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  351. package/src/ui/screens/OxyAuthScreen.tsx +138 -64
  352. package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
  353. package/src/ui/stores/accountStore.ts +1 -11
  354. package/src/ui/stores/authStore.ts +43 -44
  355. package/src/ui/styles/spacing.ts +15 -2
  356. package/src/ui/types/navigation.ts +2 -2
  357. package/src/ui/utils/avatarUtils.ts +39 -46
  358. package/src/ui/utils/storageHelpers.ts +0 -4
  359. package/src/utils/__tests__/validationUtils.test.ts +16 -1
  360. package/src/utils/errorUtils.ts +8 -1
  361. package/src/utils/validationUtils.ts +12 -0
  362. package/lib/commonjs/core/services/SessionService.js +0 -163
  363. package/lib/commonjs/core/services/SessionService.js.map +0 -1
  364. package/lib/commonjs/core/services/TokenService.js +0 -220
  365. package/lib/commonjs/core/services/TokenService.js.map +0 -1
  366. package/lib/commonjs/crypto/types.js +0 -2
  367. package/lib/commonjs/crypto/types.js.map +0 -1
  368. package/lib/commonjs/ui/context/OxyContextBase.js +0 -21
  369. package/lib/commonjs/ui/context/OxyContextBase.js.map +0 -1
  370. package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
  371. package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
  372. package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -56
  373. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
  374. package/lib/module/core/services/SessionService.js +0 -159
  375. package/lib/module/core/services/SessionService.js.map +0 -1
  376. package/lib/module/core/services/TokenService.js +0 -217
  377. package/lib/module/core/services/TokenService.js.map +0 -1
  378. package/lib/module/crypto/types.js +0 -2
  379. package/lib/module/crypto/types.js.map +0 -1
  380. package/lib/module/ui/context/OxyContextBase.js +0 -16
  381. package/lib/module/ui/context/OxyContextBase.js.map +0 -1
  382. package/lib/module/ui/context/hooks/useStorage.js +0 -74
  383. package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
  384. package/lib/module/ui/hooks/useAvatarPicker.js +0 -50
  385. package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
  386. package/lib/typescript/core/services/SessionService.d.ts +0 -78
  387. package/lib/typescript/core/services/SessionService.d.ts.map +0 -1
  388. package/lib/typescript/core/services/TokenService.d.ts +0 -72
  389. package/lib/typescript/core/services/TokenService.d.ts.map +0 -1
  390. package/lib/typescript/crypto/types.d.ts +0 -22
  391. package/lib/typescript/crypto/types.d.ts.map +0 -1
  392. package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -63
  393. package/lib/typescript/ui/context/OxyContextBase.d.ts.map +0 -1
  394. package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
  395. package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
  396. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -19
  397. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
  398. package/src/core/services/SessionService.ts +0 -173
  399. package/src/core/services/TokenService.ts +0 -237
  400. package/src/crypto/types.ts +0 -23
  401. package/src/ui/context/OxyContextBase.tsx +0 -78
  402. package/src/ui/context/hooks/useStorage.ts +0 -104
  403. package/src/ui/hooks/useAvatarPicker.ts +0 -61
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Cross-Domain Authentication Helper
3
+ *
4
+ * Provides a simplified API for cross-domain SSO authentication that automatically
5
+ * selects the best authentication method based on browser capabilities:
6
+ *
7
+ * 1. FedCM (if supported) - Modern, Google-style browser-native auth
8
+ * 2. Popup (fallback) - OAuth2-style popup window
9
+ * 3. Redirect (final fallback) - Traditional full-page redirect
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * import { CrossDomainAuth } from '@oxyhq/services';
14
+ *
15
+ * const auth = new CrossDomainAuth(oxyServices);
16
+ *
17
+ * // Automatic method selection
18
+ * const session = await auth.signIn();
19
+ *
20
+ * // Or use specific method
21
+ * const session = await auth.signInWithPopup();
22
+ * ```
23
+ */
24
+
25
+ import type { OxyServices } from './OxyServices';
26
+ import type { SessionLoginResponse } from '../models/session';
27
+
28
+ export interface CrossDomainAuthOptions {
29
+ /**
30
+ * Preferred authentication method
31
+ * - 'auto': Automatically select best method (default)
32
+ * - 'fedcm': Use FedCM (browser-native)
33
+ * - 'popup': Use popup window
34
+ * - 'redirect': Use full-page redirect
35
+ */
36
+ method?: 'auto' | 'fedcm' | 'popup' | 'redirect';
37
+
38
+ /**
39
+ * Custom redirect URI (for redirect method)
40
+ */
41
+ redirectUri?: string;
42
+
43
+ /**
44
+ * Whether to open signup page instead of login
45
+ */
46
+ isSignup?: boolean;
47
+
48
+ /**
49
+ * Popup window dimensions (for popup method)
50
+ */
51
+ popupDimensions?: {
52
+ width?: number;
53
+ height?: number;
54
+ };
55
+
56
+ /**
57
+ * Callback when auth method is selected
58
+ */
59
+ onMethodSelected?: (method: 'fedcm' | 'popup' | 'redirect') => void;
60
+ }
61
+
62
+ export class CrossDomainAuth {
63
+ constructor(private oxyServices: OxyServices) {}
64
+
65
+ /**
66
+ * Sign in with automatic method selection
67
+ *
68
+ * Tries methods in this order:
69
+ * 1. FedCM (if supported and not in private browsing)
70
+ * 2. Popup (if not blocked)
71
+ * 3. Redirect (always works)
72
+ *
73
+ * @param options - Authentication options
74
+ * @returns Session with user data and access token
75
+ */
76
+ async signIn(options: CrossDomainAuthOptions = {}): Promise<SessionLoginResponse | null> {
77
+ const method = options.method || 'auto';
78
+
79
+ // If specific method requested, use it directly
80
+ if (method === 'fedcm') {
81
+ return this.signInWithFedCM(options);
82
+ }
83
+
84
+ if (method === 'popup') {
85
+ return this.signInWithPopup(options);
86
+ }
87
+
88
+ if (method === 'redirect') {
89
+ this.signInWithRedirect(options);
90
+ return null; // Redirect doesn't return immediately
91
+ }
92
+
93
+ // Auto mode: Try methods in order of preference
94
+ return this.autoSignIn(options);
95
+ }
96
+
97
+ /**
98
+ * Automatic sign-in with progressive enhancement
99
+ *
100
+ * @private
101
+ */
102
+ private async autoSignIn(options: CrossDomainAuthOptions): Promise<SessionLoginResponse | null> {
103
+ // 1. Try FedCM first (best UX, most modern)
104
+ if (this.isFedCMSupported()) {
105
+ try {
106
+ options.onMethodSelected?.('fedcm');
107
+ return await this.signInWithFedCM(options);
108
+ } catch (error) {
109
+ console.warn('[CrossDomainAuth] FedCM failed, trying popup...', error);
110
+ }
111
+ }
112
+
113
+ // 2. Try popup (good UX, widely supported)
114
+ try {
115
+ options.onMethodSelected?.('popup');
116
+ return await this.signInWithPopup(options);
117
+ } catch (error) {
118
+ console.warn('[CrossDomainAuth] Popup failed, falling back to redirect...', error);
119
+ }
120
+
121
+ // 3. Fallback to redirect (always works)
122
+ options.onMethodSelected?.('redirect');
123
+ this.signInWithRedirect(options);
124
+ return null;
125
+ }
126
+
127
+ /**
128
+ * Sign in using FedCM (Federated Credential Management)
129
+ *
130
+ * Best method - browser-native, no popups, Google-like experience
131
+ */
132
+ async signInWithFedCM(options: CrossDomainAuthOptions = {}): Promise<SessionLoginResponse> {
133
+ return (this.oxyServices as any).signInWithFedCM({
134
+ context: options.isSignup ? 'signup' : 'signin',
135
+ });
136
+ }
137
+
138
+ /**
139
+ * Sign in using popup window
140
+ *
141
+ * Good method - preserves app state, no full page reload
142
+ */
143
+ async signInWithPopup(options: CrossDomainAuthOptions = {}): Promise<SessionLoginResponse> {
144
+ return (this.oxyServices as any).signInWithPopup({
145
+ mode: options.isSignup ? 'signup' : 'login',
146
+ width: options.popupDimensions?.width,
147
+ height: options.popupDimensions?.height,
148
+ });
149
+ }
150
+
151
+ /**
152
+ * Sign in using full-page redirect
153
+ *
154
+ * Fallback method - works everywhere but loses app state
155
+ */
156
+ signInWithRedirect(options: CrossDomainAuthOptions = {}): void {
157
+ (this.oxyServices as any).signInWithRedirect({
158
+ redirectUri: options.redirectUri,
159
+ mode: options.isSignup ? 'signup' : 'login',
160
+ });
161
+ }
162
+
163
+ /**
164
+ * Handle redirect callback
165
+ *
166
+ * Call this on app startup to check if we're returning from auth redirect
167
+ */
168
+ handleRedirectCallback(): SessionLoginResponse | null {
169
+ return (this.oxyServices as any).handleAuthCallback();
170
+ }
171
+
172
+ /**
173
+ * Silent sign-in (check for existing session)
174
+ *
175
+ * Tries to automatically sign in without user interaction.
176
+ * Works with both FedCM and popup/iframe methods.
177
+ *
178
+ * @returns Session if user is already signed in, null otherwise
179
+ */
180
+ async silentSignIn(): Promise<SessionLoginResponse | null> {
181
+ // Try FedCM silent sign-in first (if supported)
182
+ if (this.isFedCMSupported()) {
183
+ try {
184
+ const session = await (this.oxyServices as any).silentSignInWithFedCM();
185
+ if (session) {
186
+ return session;
187
+ }
188
+ } catch (error) {
189
+ console.warn('[CrossDomainAuth] FedCM silent sign-in failed:', error);
190
+ }
191
+ }
192
+
193
+ // Fallback to iframe-based silent auth
194
+ try {
195
+ return await (this.oxyServices as any).silentSignIn();
196
+ } catch (error) {
197
+ console.warn('[CrossDomainAuth] Silent sign-in failed:', error);
198
+ return null;
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Restore session from storage
204
+ *
205
+ * For redirect method - restores previously authenticated session from localStorage
206
+ */
207
+ restoreSession(): boolean {
208
+ return (this.oxyServices as any).restoreSession?.() || false;
209
+ }
210
+
211
+ /**
212
+ * Check if FedCM is supported in current browser
213
+ */
214
+ isFedCMSupported(): boolean {
215
+ return (this.oxyServices as any).constructor.isFedCMSupported?.() || false;
216
+ }
217
+
218
+ /**
219
+ * Get recommended authentication method for current environment
220
+ *
221
+ * @returns Recommended method name and reason
222
+ */
223
+ getRecommendedMethod(): { method: 'fedcm' | 'popup' | 'redirect'; reason: string } {
224
+ if (this.isFedCMSupported()) {
225
+ return {
226
+ method: 'fedcm',
227
+ reason: 'FedCM is supported - provides best UX with browser-native auth',
228
+ };
229
+ }
230
+
231
+ if (typeof window !== 'undefined') {
232
+ return {
233
+ method: 'popup',
234
+ reason: 'Browser environment - popup preserves app state',
235
+ };
236
+ }
237
+
238
+ return {
239
+ method: 'redirect',
240
+ reason: 'Fallback method - works in all environments',
241
+ };
242
+ }
243
+
244
+ /**
245
+ * Initialize cross-domain auth on app startup
246
+ *
247
+ * This handles:
248
+ * 1. Redirect callback (if returning from auth.oxy.so)
249
+ * 2. Session restoration (from localStorage)
250
+ * 3. Silent sign-in (check for existing SSO session)
251
+ *
252
+ * @returns Session if user is authenticated, null otherwise
253
+ */
254
+ async initialize(): Promise<SessionLoginResponse | null> {
255
+ // 1. Check if this is a redirect callback
256
+ const callbackSession = this.handleRedirectCallback();
257
+ if (callbackSession) {
258
+ return callbackSession;
259
+ }
260
+
261
+ // 2. Try to restore existing session from storage
262
+ const restored = this.restoreSession();
263
+ if (restored) {
264
+ // Verify session is still valid by fetching user
265
+ try {
266
+ const user = await (this.oxyServices as any).getCurrentUser();
267
+ if (user) {
268
+ return {
269
+ sessionId: (this.oxyServices as any).getStoredSessionId?.() || '',
270
+ deviceId: '',
271
+ expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
272
+ user,
273
+ };
274
+ }
275
+ } catch (error) {
276
+ console.warn('[CrossDomainAuth] Stored session invalid:', error);
277
+ }
278
+ }
279
+
280
+ // 3. Try silent sign-in (check for SSO session at auth.oxy.so)
281
+ return await this.silentSignIn();
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Helper function to create CrossDomainAuth instance
287
+ *
288
+ * @example
289
+ * ```typescript
290
+ * import { createCrossDomainAuth } from '@oxyhq/services';
291
+ *
292
+ * const oxyServices = new OxyServices({ baseURL: 'https://api.oxy.so' });
293
+ * const auth = createCrossDomainAuth(oxyServices);
294
+ *
295
+ * // On app startup
296
+ * const session = await auth.initialize();
297
+ * if (session) {
298
+ * console.log('User is signed in:', session.user);
299
+ * }
300
+ *
301
+ * // Sign in button click
302
+ * const session = await auth.signIn();
303
+ * ```
304
+ */
305
+ export function createCrossDomainAuth(oxyServices: OxyServices): CrossDomainAuth {
306
+ return new CrossDomainAuth(oxyServices);
307
+ }
@@ -17,8 +17,17 @@ import { TTLCache, registerCacheForCleanup } from '../utils/cache';
17
17
  import { RequestDeduplicator, RequestQueue, SimpleLogger } from '../utils/requestUtils';
18
18
  import { retryAsync } from '../utils/asyncUtils';
19
19
  import { handleHttpError } from '../utils/errorUtils';
20
+ import { jwtDecode } from 'jwt-decode';
20
21
  import type { OxyConfig } from '../models/interfaces';
21
22
 
23
+ interface JwtPayload {
24
+ exp?: number;
25
+ userId?: string;
26
+ id?: string;
27
+ sessionId?: string;
28
+ [key: string]: any;
29
+ }
30
+
22
31
  export interface RequestOptions {
23
32
  cache?: boolean;
24
33
  cacheTTL?: number;
@@ -37,8 +46,45 @@ interface RequestConfig extends RequestOptions {
37
46
  params?: Record<string, unknown>;
38
47
  }
39
48
 
40
- // Token management moved to TokenService - import it instead
41
- import { tokenService } from './services/TokenService';
49
+ /**
50
+ * Token store for authentication (singleton)
51
+ */
52
+ class TokenStore {
53
+ private static instance: TokenStore;
54
+ private accessToken: string | null = null;
55
+ private refreshToken: string | null = null;
56
+
57
+ private constructor() {}
58
+
59
+ static getInstance(): TokenStore {
60
+ if (!TokenStore.instance) {
61
+ TokenStore.instance = new TokenStore();
62
+ }
63
+ return TokenStore.instance;
64
+ }
65
+
66
+ setTokens(accessToken: string, refreshToken = ''): void {
67
+ this.accessToken = accessToken;
68
+ this.refreshToken = refreshToken;
69
+ }
70
+
71
+ getAccessToken(): string | null {
72
+ return this.accessToken;
73
+ }
74
+
75
+ getRefreshToken(): string | null {
76
+ return this.refreshToken;
77
+ }
78
+
79
+ clearTokens(): void {
80
+ this.accessToken = null;
81
+ this.refreshToken = null;
82
+ }
83
+
84
+ hasAccessToken(): boolean {
85
+ return !!this.accessToken;
86
+ }
87
+ }
42
88
 
43
89
  /**
44
90
  * Unified HTTP Service
@@ -48,6 +94,7 @@ import { tokenService } from './services/TokenService';
48
94
  */
49
95
  export class HttpService {
50
96
  private baseURL: string;
97
+ private tokenStore: TokenStore;
51
98
  private cache: TTLCache<any>;
52
99
  private deduplicator: RequestDeduplicator;
53
100
  private requestQueue: RequestQueue;
@@ -67,9 +114,7 @@ export class HttpService {
67
114
  constructor(config: OxyConfig) {
68
115
  this.config = config;
69
116
  this.baseURL = config.baseURL;
70
-
71
- // Initialize TokenService with baseURL
72
- tokenService.initialize(this.baseURL);
117
+ this.tokenStore = TokenStore.getInstance();
73
118
 
74
119
  this.logger = new SimpleLogger(
75
120
  config.enableLogging || false,
@@ -216,7 +261,7 @@ export class HttpService {
216
261
  // Handle response
217
262
  if (!response.ok) {
218
263
  if (response.status === 401) {
219
- tokenService.clearTokens();
264
+ this.tokenStore.clearTokens();
220
265
  }
221
266
 
222
267
  // Try to parse error response (handle empty/malformed JSON)
@@ -224,9 +269,12 @@ export class HttpService {
224
269
  const contentType = response.headers.get('content-type');
225
270
  if (contentType && contentType.includes('application/json')) {
226
271
  try {
227
- const errorData = await response.json() as { message?: string } | null;
272
+ const errorData = await response.json() as { message?: string; error?: string } | null;
273
+ // Check both 'message' and 'error' fields for backwards compatibility
228
274
  if (errorData?.message) {
229
275
  errorMessage = errorData.message;
276
+ } else if (errorData?.error) {
277
+ errorMessage = errorData.error;
230
278
  }
231
279
  } catch (parseError) {
232
280
  // Malformed JSON or empty response - use status text
@@ -370,10 +418,45 @@ export class HttpService {
370
418
 
371
419
  /**
372
420
  * Get auth header with automatic token refresh
373
- * Uses TokenService for all token operations
374
421
  */
375
422
  private async getAuthHeader(): Promise<string | null> {
376
- return await tokenService.getAuthHeader();
423
+ const accessToken = this.tokenStore.getAccessToken();
424
+ if (!accessToken) {
425
+ return null;
426
+ }
427
+
428
+ try {
429
+ const decoded = jwtDecode<JwtPayload>(accessToken);
430
+ const currentTime = Math.floor(Date.now() / 1000);
431
+
432
+ // If token expires in less than 60 seconds, refresh it
433
+ if (decoded.exp && decoded.exp - currentTime < 60 && decoded.sessionId) {
434
+ try {
435
+ const refreshUrl = `${this.baseURL}/api/session/token/${decoded.sessionId}`;
436
+
437
+ // Use AbortSignal.timeout for consistent timeout handling
438
+ const response = await fetch(refreshUrl, {
439
+ method: 'GET',
440
+ headers: { 'Accept': 'application/json' },
441
+ signal: AbortSignal.timeout(5000),
442
+ });
443
+
444
+ if (response.ok) {
445
+ const { accessToken: newToken } = await response.json();
446
+ this.tokenStore.setTokens(newToken);
447
+ this.logger.debug('Token refreshed');
448
+ return `Bearer ${newToken}`;
449
+ }
450
+ } catch (refreshError) {
451
+ this.logger.warn('Token refresh failed, using current token');
452
+ }
453
+ }
454
+
455
+ return `Bearer ${accessToken}`;
456
+ } catch (error) {
457
+ this.logger.error('Error processing token:', error);
458
+ return `Bearer ${accessToken}`;
459
+ }
377
460
  }
378
461
 
379
462
  /**
@@ -478,21 +561,21 @@ export class HttpService {
478
561
  return { data: result as T };
479
562
  }
480
563
 
481
- // Token management - delegates to TokenService
564
+ // Token management
482
565
  setTokens(accessToken: string, refreshToken = ''): void {
483
- tokenService.setTokens(accessToken, refreshToken);
566
+ this.tokenStore.setTokens(accessToken, refreshToken);
484
567
  }
485
568
 
486
569
  clearTokens(): void {
487
- tokenService.clearTokens();
570
+ this.tokenStore.clearTokens();
488
571
  }
489
572
 
490
573
  getAccessToken(): string | null {
491
- return tokenService.getAccessToken();
574
+ return this.tokenStore.getAccessToken();
492
575
  }
493
576
 
494
577
  hasAccessToken(): boolean {
495
- return tokenService.hasAccessToken();
578
+ return this.tokenStore.hasAccessToken();
496
579
  }
497
580
 
498
581
  getBaseURL(): string {
@@ -526,10 +609,10 @@ export class HttpService {
526
609
  // Test-only utility
527
610
  static __resetTokensForTests(): void {
528
611
  try {
529
- tokenService.clearTokens();
612
+ TokenStore.getInstance().clearTokens();
530
613
  } catch (error) {
531
614
  // Silently fail in test cleanup - this is expected behavior
532
- // TokenService might not be initialized in some test scenarios
615
+ // TokenStore might not be initialized in some test scenarios
533
616
  }
534
617
  }
535
618
  }
@@ -3,16 +3,24 @@
3
3
  *
4
4
  * Contains core infrastructure, HTTP client, request management, and error handling
5
5
  */
6
+ import { jwtDecode } from 'jwt-decode';
6
7
  import type { OxyConfig as OxyConfigBase, ApiError, User } from '../models/interfaces';
7
8
  import { handleHttpError } from '../utils/errorUtils';
8
9
  import { HttpService, type RequestOptions } from './HttpService';
9
10
  import { OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices.errors';
10
- import { tokenService } from './services/TokenService';
11
11
 
12
12
  export interface OxyConfig extends OxyConfigBase {
13
13
  cloudURL?: string;
14
14
  }
15
15
 
16
+ interface JwtPayload {
17
+ exp?: number;
18
+ userId?: string;
19
+ id?: string;
20
+ sessionId?: string;
21
+ [key: string]: any;
22
+ }
23
+
16
24
  /**
17
25
  * Base class for OxyServices with core infrastructure
18
26
  */
@@ -127,10 +135,19 @@ export class OxyServicesBase {
127
135
 
128
136
  /**
129
137
  * Get the current user ID from the access token
130
- * Returns MongoDB ObjectId (never publicKey)
131
138
  */
132
139
  public getCurrentUserId(): string | null {
133
- return tokenService.getUserIdFromToken();
140
+ const accessToken = this.httpService.getAccessToken();
141
+ if (!accessToken) {
142
+ return null;
143
+ }
144
+
145
+ try {
146
+ const decoded = jwtDecode<JwtPayload>(accessToken);
147
+ return decoded.userId || decoded.id || null;
148
+ } catch (error) {
149
+ return null;
150
+ }
134
151
  }
135
152
 
136
153
  /**
@@ -96,20 +96,24 @@ import { composeOxyServices } from './mixins';
96
96
  * ```
97
97
  */
98
98
  // Compose all mixins into the final OxyServices class
99
- const OxyServicesComposed: ReturnType<typeof composeOxyServices> = composeOxyServices();
99
+ const OxyServicesComposed = composeOxyServices();
100
100
 
101
101
  // Export as a named class to avoid TypeScript issues with anonymous class types
102
- export class OxyServices extends OxyServicesComposed {
102
+ export class OxyServices extends (OxyServicesComposed as any) {
103
103
  constructor(config: OxyConfig) {
104
104
  super(config);
105
105
  }
106
106
  }
107
107
 
108
+ // Type augmentation to expose mixin methods to TypeScript
109
+ // This allows proper type checking while avoiding complex mixin type inference
110
+ export interface OxyServices extends InstanceType<ReturnType<typeof composeOxyServices>> {}
111
+
108
112
  // Re-export error classes for convenience
109
113
  export { OxyAuthenticationError, OxyAuthenticationTimeoutError };
110
114
 
111
115
  /**
112
- * Default Oxy Cloud URL
116
+ * Export the default Oxy Cloud URL (for backward compatibility)
113
117
  */
114
118
  export const OXY_CLOUD_URL = 'https://cloud.oxy.so';
115
119
 
package/src/core/index.ts CHANGED
@@ -9,6 +9,10 @@
9
9
  export { OxyServices, OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices';
10
10
  export { OXY_CLOUD_URL, oxyClient } from './OxyServices';
11
11
 
12
+ // Cross-domain authentication
13
+ export { CrossDomainAuth, createCrossDomainAuth } from './CrossDomainAuth';
14
+ export type { CrossDomainAuthOptions } from './CrossDomainAuth';
15
+
12
16
  // Re-export all models and types for convenience
13
17
  export * from '../models/interfaces';
14
18
  export * from '../models/session';
@@ -27,4 +31,8 @@ export {
27
31
  } from '../utils/languageUtils';
28
32
  export type { LanguageMetadata } from '../utils/languageUtils';
29
33
 
30
- // Default export removed (no longer providing backward compatibility default export)
34
+ // Import for default export
35
+ import { OxyServices } from './OxyServices';
36
+
37
+ // Default export for backward compatibility
38
+ export default OxyServices;
@@ -168,9 +168,20 @@ export function OxyServicesAssetsMixin<T extends typeof OxyServicesBase>(Base: T
168
168
 
169
169
  try {
170
170
  const formData = new FormData();
171
- // In React Native, pass filename as third parameter to avoid read-only name property error
172
- // This prevents "Cannot assign to property 'name' which has only a getter" error
173
- formData.append('file', file as any, fileName);
171
+ // Convert File to Blob to avoid read-only 'name' property error in Expo 54
172
+ // This is a known issue in Expo SDK 52+ where FormData tries to set the read-only 'name' property
173
+ let fileBlob: Blob;
174
+ if (file instanceof Blob) {
175
+ // Already a Blob, use directly
176
+ fileBlob = file;
177
+ } else if (typeof (file as any).blob === 'function') {
178
+ // Use async blob() method if available (Expo 54+ recommended approach)
179
+ fileBlob = await (file as any).blob();
180
+ } else {
181
+ // Fallback: create Blob from File (works in all environments)
182
+ fileBlob = new Blob([file], { type: (file as any).type || 'application/octet-stream' });
183
+ }
184
+ formData.append('file', fileBlob, fileName);
174
185
  if (visibility) {
175
186
  formData.append('visibility', visibility);
176
187
  }