@oxyhq/services 5.17.17 → 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 -199
  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 +79 -72
  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 -191
  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 +80 -72
  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 -195
  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 +83 -76
  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
@@ -2,7 +2,6 @@ import { useEffect, useRef } from 'react';
2
2
  import io from 'socket.io-client';
3
3
  import { toast } from '../../lib/sonner';
4
4
  import { logger } from '../../utils/loggerUtils';
5
- import { tokenService } from '../../core/services/TokenService';
6
5
 
7
6
  interface UseSessionSocketProps {
8
7
  userId: string | null | undefined;
@@ -12,19 +11,15 @@ interface UseSessionSocketProps {
12
11
  logout: () => Promise<void>;
13
12
  clearSessionState: () => Promise<void>;
14
13
  baseURL: string;
15
- getAccessToken: () => string | null;
16
14
  onRemoteSignOut?: () => void;
17
15
  onSessionRemoved?: (sessionId: string) => void;
18
16
  }
19
17
 
20
- export function useSessionSocket({ userId, activeSessionId, currentDeviceId, refreshSessions, logout, clearSessionState, baseURL, getAccessToken, onRemoteSignOut, onSessionRemoved }: UseSessionSocketProps) {
18
+ export function useSessionSocket({ userId, activeSessionId, currentDeviceId, refreshSessions, logout, clearSessionState, baseURL, onRemoteSignOut, onSessionRemoved }: UseSessionSocketProps) {
21
19
  const socketRef = useRef<any>(null);
22
20
  const joinedRoomRef = useRef<string | null>(null);
23
- const accessTokenRef = useRef<string | null>(null);
24
- const handlersSetupRef = useRef<boolean>(false);
25
- const lastRegisteredSocketIdRef = useRef<string | null>(null);
26
- const getAccessTokenRef = useRef(getAccessToken);
27
21
 
22
+ // Store callbacks in refs to avoid re-joining when they change
28
23
  const refreshSessionsRef = useRef(refreshSessions);
29
24
  const logoutRef = useRef(logout);
30
25
  const clearSessionStateRef = useRef(clearSessionState);
@@ -33,6 +28,7 @@ export function useSessionSocket({ userId, activeSessionId, currentDeviceId, ref
33
28
  const activeSessionIdRef = useRef(activeSessionId);
34
29
  const currentDeviceIdRef = useRef(currentDeviceId);
35
30
 
31
+ // Update refs when callbacks change
36
32
  useEffect(() => {
37
33
  refreshSessionsRef.current = refreshSessions;
38
34
  logoutRef.current = logout;
@@ -41,130 +37,47 @@ export function useSessionSocket({ userId, activeSessionId, currentDeviceId, ref
41
37
  onSessionRemovedRef.current = onSessionRemoved;
42
38
  activeSessionIdRef.current = activeSessionId;
43
39
  currentDeviceIdRef.current = currentDeviceId;
44
- getAccessTokenRef.current = getAccessToken;
45
- }, [refreshSessions, logout, clearSessionState, onRemoteSignOut, onSessionRemoved, activeSessionId, currentDeviceId, getAccessToken]);
40
+ }, [refreshSessions, logout, clearSessionState, onRemoteSignOut, onSessionRemoved, activeSessionId, currentDeviceId]);
46
41
 
47
42
  useEffect(() => {
48
43
  if (!userId || !baseURL) {
49
- if (socketRef.current) {
50
- socketRef.current.disconnect();
51
- socketRef.current = null;
52
- joinedRoomRef.current = null;
53
- }
54
- return;
55
- }
56
- const freshToken = getAccessTokenRef.current();
57
- if (!freshToken) {
58
- logger.debug('Deferring socket creation - no access token available yet', { component: 'useSessionSocket', userId });
59
- if (socketRef.current) {
60
- socketRef.current.disconnect();
61
- socketRef.current = null;
44
+ // Clean up if userId or baseURL becomes invalid
45
+ if (socketRef.current && joinedRoomRef.current) {
46
+ socketRef.current.emit('leave', { userId: joinedRoomRef.current });
62
47
  joinedRoomRef.current = null;
63
48
  }
64
49
  return;
65
50
  }
66
51
 
67
- const initializeSocket = async () => {
68
- try {
69
- await tokenService.refreshTokenIfNeeded();
70
- } catch (error) {
71
- logger.debug('Token refresh failed before socket connection', { component: 'useSessionSocket', userId, error });
72
- }
73
-
74
- const accessToken = getAccessTokenRef.current();
75
- const tokenChanged = accessTokenRef.current !== accessToken;
76
- if (!socketRef.current || tokenChanged) {
77
- if (socketRef.current) {
78
- socketRef.current.disconnect();
79
- socketRef.current = null;
80
- }
52
+ const roomId = `user:${userId}`;
53
+
54
+ // Only create socket if it doesn't exist
55
+ if (!socketRef.current) {
56
+ socketRef.current = io(baseURL, {
57
+ transports: ['websocket'],
58
+ });
59
+ }
60
+ const socket = socketRef.current;
81
61
 
82
- const socketOptions: any = {
83
- transports: ['websocket'],
84
- };
85
-
86
- const freshToken = getAccessTokenRef.current();
87
- if (freshToken) {
88
- socketOptions.auth = {
89
- token: freshToken,
90
- };
91
- } else {
92
- logger.debug('No access token available for socket authentication', { component: 'useSessionSocket', userId });
93
- return;
94
- }
95
-
96
- socketRef.current = io(baseURL, socketOptions);
97
- accessTokenRef.current = freshToken;
98
- joinedRoomRef.current = null;
99
- handlersSetupRef.current = false;
62
+ // Only join if we haven't already joined this room
63
+ if (joinedRoomRef.current !== roomId) {
64
+ // Leave previous room if switching users
65
+ if (joinedRoomRef.current) {
66
+ socket.emit('leave', { userId: joinedRoomRef.current });
100
67
  }
101
68
 
102
- const socket = socketRef.current;
103
- if (!socket) return;
69
+ socket.emit('join', { userId: roomId });
70
+ joinedRoomRef.current = roomId;
104
71
 
105
- if (!joinedRoomRef.current && socket.connected) {
106
- joinedRoomRef.current = `user:${userId}`;
107
- }
108
-
109
- const handleConnect = () => {
110
- const currentToken = getAccessTokenRef.current();
111
72
  if (__DEV__) {
112
- console.log('[useSessionSocket] Socket connected', {
113
- socketId: socket.id,
114
- userId,
115
- room: `user:${userId}`,
116
- hasAuth: !!currentToken,
117
- });
118
- logger.debug('Socket connected', { component: 'useSessionSocket', socketId: socket.id, userId });
119
- }
120
- // Server auto-joins room on connection when authenticated
121
- // Just track that we're connected
122
- if (userId) {
123
- joinedRoomRef.current = `user:${userId}`;
73
+ console.log('Emitting join for room:', roomId);
124
74
  }
125
- };
126
-
127
- const handleDisconnect = async (reason: string) => {
128
- logger.debug('Socket disconnected', { component: 'useSessionSocket', reason, userId });
129
- joinedRoomRef.current = null;
130
-
131
- // If disconnected due to auth error, try to refresh token and reconnect
132
- if (reason === 'io server disconnect' || reason.includes('auth') || reason.includes('Authentication')) {
133
- try {
134
- // Refresh token and reconnect
135
- await tokenService.refreshTokenIfNeeded();
136
- const freshToken = getAccessTokenRef.current();
137
- if (freshToken && socketRef.current) {
138
- // Update auth and reconnect
139
- socketRef.current.auth = { token: freshToken };
140
- socketRef.current.connect();
141
- }
142
- } catch (error) {
143
- logger.debug('Failed to refresh token after disconnect', { component: 'useSessionSocket', userId, error });
144
- }
145
- }
146
- };
147
-
148
- const handleError = (error: Error) => {
149
- logger.error('Socket error', error, { component: 'useSessionSocket', userId });
150
- };
75
+ }
151
76
 
152
- const handleConnectError = async (error: Error) => {
153
- logger.debug('Socket connection error', { component: 'useSessionSocket', userId, error: error.message });
154
-
155
- // If error is due to expired/invalid token, try to refresh and reconnect
156
- if (error.message.includes('Authentication') || error.message.includes('expired') || error.message.includes('token')) {
157
- try {
158
- await tokenService.refreshTokenIfNeeded();
159
- const freshToken = getAccessTokenRef.current();
160
- if (freshToken && socketRef.current) {
161
- // Update auth and reconnect
162
- socketRef.current.auth = { token: freshToken };
163
- socketRef.current.connect();
164
- }
165
- } catch (refreshError) {
166
- logger.debug('Failed to refresh token after connection error', { component: 'useSessionSocket', userId, error: refreshError });
167
- }
77
+ // Set up event handlers (only once per socket instance)
78
+ const handleConnect = () => {
79
+ if (__DEV__) {
80
+ console.log('Socket connected:', socket.id);
168
81
  }
169
82
  };
170
83
 
@@ -174,13 +87,9 @@ export function useSessionSocket({ userId, activeSessionId, currentDeviceId, ref
174
87
  deviceId?: string;
175
88
  sessionIds?: string[]
176
89
  }) => {
177
- logger.debug('Received session_update event', {
178
- component: 'useSessionSocket',
179
- type: data.type,
180
- socketId: socket.id,
181
- socketConnected: socket.connected,
182
- roomId: joinedRoomRef.current,
183
- });
90
+ if (__DEV__) {
91
+ console.log('Received session_update:', data);
92
+ }
184
93
 
185
94
  const currentActiveSessionId = activeSessionIdRef.current;
186
95
  const currentDeviceId = currentDeviceIdRef.current;
@@ -304,64 +213,26 @@ export function useSessionSocket({ userId, activeSessionId, currentDeviceId, ref
304
213
  try {
305
214
  await clearSessionStateRef.current();
306
215
  } catch (error) {
307
- logger.error('Failed to clear session state after session_update', error instanceof Error ? error : new Error(String(error)), { component: 'useSessionSocket' });
216
+ if (__DEV__) {
217
+ console.error('Failed to clear session state after session_update:', error);
218
+ }
308
219
  }
309
220
  }
310
221
  }
311
222
  };
312
223
 
313
- // Register event handlers (only once per socket instance)
314
- // Track by socket.id to prevent duplicate registrations when socket reconnects
315
- const currentSocketId = socket.id || 'pending';
316
-
317
- if (!handlersSetupRef.current || lastRegisteredSocketIdRef.current !== currentSocketId) {
318
- // Remove old handlers if socket changed (reconnection)
319
- if (socketRef.current && handlersSetupRef.current && lastRegisteredSocketIdRef.current) {
320
- try {
321
- socketRef.current.off('connect', handleConnect);
322
- socketRef.current.off('disconnect', handleDisconnect);
323
- socketRef.current.off('error', handleError);
324
- socketRef.current.off('session_update', handleSessionUpdate);
325
- } catch (error) {
326
- // Ignore errors when removing handlers
327
- }
328
- }
329
-
330
- // Register handlers on current socket
331
- socket.on('connect', handleConnect);
332
- socket.on('disconnect', handleDisconnect);
333
- socket.on('error', handleError);
334
- socket.on('connect_error', handleConnectError);
335
- socket.on('session_update', handleSessionUpdate);
336
-
337
- handlersSetupRef.current = true;
338
- lastRegisteredSocketIdRef.current = currentSocketId;
339
-
340
- logger.debug('Event handlers set up', { component: 'useSessionSocket', socketId: socket.id, userId });
341
- }
342
-
343
- if (!socket.connected) {
344
- logger.debug('Socket not connected, connecting...', { component: 'useSessionSocket', userId });
345
- socket.connect();
346
- }
347
- };
348
-
349
- initializeSocket();
224
+ socket.on('connect', handleConnect);
225
+ socket.on('session_update', handleSessionUpdate);
350
226
 
351
227
  return () => {
352
- // Only clean up handlers if socket still exists and handlers were set up
353
- if (socketRef.current && handlersSetupRef.current) {
354
- try {
355
- socketRef.current.off('connect');
356
- socketRef.current.off('disconnect');
357
- socketRef.current.off('error');
358
- socketRef.current.off('connect_error');
359
- socketRef.current.off('session_update');
360
- } catch (error) {
361
- // Ignore errors when removing handlers
362
- }
363
- handlersSetupRef.current = false;
228
+ socket.off('connect', handleConnect);
229
+ socket.off('session_update', handleSessionUpdate);
230
+
231
+ // Only leave on unmount if we're still in this room
232
+ if (joinedRoomRef.current === roomId) {
233
+ socket.emit('leave', { userId: roomId });
234
+ joinedRoomRef.current = null;
364
235
  }
365
236
  };
366
- }, [userId, baseURL]); // Only depend on userId and baseURL - functions are in refs
367
- }
237
+ }, [userId, baseURL]); // Only depend on userId and baseURL - callbacks are in refs
238
+ }
@@ -1,104 +1,52 @@
1
- import { useCallback, useEffect, useRef, useState } from 'react';
1
+ import { useEffect, useRef, useState } from 'react';
2
2
  import type { ApiError } from '../../models/interfaces';
3
3
  import { createPlatformStorage, type StorageInterface } from '../utils/storageHelpers';
4
- import { extractErrorMessage } from '../utils/errorHandlers';
5
4
 
6
5
  export interface UseStorageOptions {
7
6
  onError?: (error: ApiError) => void;
8
7
  logger?: (message: string, error?: unknown) => void;
9
- errorCode?: string;
10
8
  }
11
9
 
12
10
  export interface UseStorageResult {
13
11
  storage: StorageInterface | null;
14
12
  isReady: boolean;
15
- error: string | null;
16
- refresh: () => Promise<StorageInterface | null>;
17
- withStorage: <T>(callback: (storage: StorageInterface) => Promise<T>) => Promise<T | null>;
18
13
  }
19
14
 
20
- const DEFAULT_ERROR_CODE = 'STORAGE_INIT_ERROR';
21
-
22
15
  /**
23
- * React hook that exposes a platform-agnostic storage reference.
24
- * Handles initialization, error propagation, and lazy re-initialization.
25
- *
26
- * @param options - Optional configuration for error reporting and logging
16
+ * Simple React hook that initializes platform-appropriate storage.
17
+ * Returns storage instance once ready, or null if initialization failed.
27
18
  */
28
19
  export const useStorage = ({
29
20
  onError,
30
21
  logger,
31
- errorCode = DEFAULT_ERROR_CODE,
32
22
  }: UseStorageOptions = {}): UseStorageResult => {
33
23
  const [storage, setStorage] = useState<StorageInterface | null>(null);
34
- const [error, setError] = useState<string | null>(null);
35
- const initializingRef = useRef<Promise<StorageInterface | null> | null>(null);
36
-
37
- const notifyError = useCallback(
38
- (err: unknown) => {
39
- const message = extractErrorMessage(err, 'Failed to initialize storage');
40
- setError(message);
41
-
42
- if (logger) {
43
- logger(message, err);
44
- }
45
-
46
- onError?.({
47
- message,
48
- code: errorCode,
49
- status: 500,
50
- });
51
- },
52
- [errorCode, logger, onError],
53
- );
54
-
55
- const createStorageInstance = useCallback(async (): Promise<StorageInterface | null> => {
56
- try {
57
- const platformStorage = await createPlatformStorage();
58
- setStorage(platformStorage);
59
- setError(null);
60
- return platformStorage;
61
- } catch (err) {
62
- notifyError(err);
63
- setStorage(null);
64
- return null;
65
- }
66
- }, [notifyError]);
67
-
68
- const refresh = useCallback(async (): Promise<StorageInterface | null> => {
69
- if (!initializingRef.current) {
70
- initializingRef.current = createStorageInstance().finally(() => {
71
- initializingRef.current = null;
72
- });
73
- }
74
-
75
- return initializingRef.current;
76
- }, [createStorageInstance]);
24
+ const initRef = useRef<Promise<void> | null>(null);
77
25
 
78
26
  useEffect(() => {
79
- refresh().catch((err) => {
80
- notifyError(err);
81
- });
82
- }, [refresh, notifyError]);
83
-
84
- const withStorage = useCallback(
85
- async <T,>(callback: (resolvedStorage: StorageInterface) => Promise<T>): Promise<T | null> => {
86
- const resolvedStorage = storage ?? (await refresh());
87
- if (!resolvedStorage) {
88
- return null;
27
+ // Prevent multiple initializations
28
+ if (initRef.current) return;
29
+
30
+ initRef.current = (async () => {
31
+ try {
32
+ const storageInstance = await createPlatformStorage();
33
+ setStorage(storageInstance);
34
+ } catch (err) {
35
+ const message = err instanceof Error ? err.message : 'Failed to initialize storage';
36
+ if (logger) {
37
+ logger(message, err);
38
+ }
39
+ onError?.({
40
+ message,
41
+ code: 'STORAGE_INIT_ERROR',
42
+ status: 500,
43
+ });
89
44
  }
90
- return callback(resolvedStorage);
91
- },
92
- [refresh, storage],
93
- );
45
+ })();
46
+ }, [logger, onError]);
94
47
 
95
48
  return {
96
49
  storage,
97
- isReady: Boolean(storage) && !error,
98
- error,
99
- refresh,
100
- withStorage,
50
+ isReady: storage !== null,
101
51
  };
102
52
  };
103
-
104
-
package/src/ui/index.ts CHANGED
@@ -6,8 +6,8 @@
6
6
  */
7
7
  import isFrontend from './isFrontend';
8
8
 
9
- // Real UI exports
10
- let OxyProvider, OxySignInButton, OxyLogo, Avatar, FollowButton, OxyPayButton, FontLoader, setupFonts, OxyIcon, useOxy, useOxyAuth, useOxyUser, useOxyKarma, useOxyPayments, useOxyDevices, useOxyNotifications, useOxySocket, useOxyQR, OxyContextProvider, OxyContextState, OxyContextProviderProps, useFollow, ProfileScreen, useAuthStore, useAccountStore, fontFamilies, fontStyles, toast;
9
+ // UI exports
10
+ let OxyProvider, OxySignInButton, OxyLogo, Avatar, FollowButton, OxyPayButton, FontLoader, setupFonts, OxyIcon, useOxy, useFollow, ProfileScreen, useAuthStore, useAccountStore, fontFamilies, fontStyles, toast, useStorage;
11
11
 
12
12
  if (isFrontend) {
13
13
  OxyProvider = require('./components/OxyProvider').default;
@@ -20,9 +20,6 @@ if (isFrontend) {
20
20
  setupFonts = require('./components/FontLoader').setupFonts;
21
21
  OxyIcon = require('./components/icon').OxyIcon;
22
22
  useOxy = require('./context/OxyContext').useOxy;
23
- OxyContextProvider = require('./context/OxyContext').OxyContextProvider;
24
- OxyContextState = require('./context/OxyContext').OxyContextState;
25
- OxyContextProviderProps = require('./context/OxyContext').OxyContextProviderProps;
26
23
  useFollow = require('./hooks').useFollow;
27
24
  ProfileScreen = require('./screens/ProfileScreen').default;
28
25
  useAuthStore = require('./stores/authStore').useAuthStore;
@@ -30,10 +27,13 @@ if (isFrontend) {
30
27
  fontFamilies = require('./styles/fonts').fontFamilies;
31
28
  fontStyles = require('./styles/fonts').fontStyles;
32
29
  toast = require('../lib/sonner').toast;
30
+ useStorage = require('./hooks/useStorage').useStorage;
33
31
  } else {
34
32
  // Backend: no-op fallbacks
35
33
  const noopComponent = () => null;
36
34
  const noopHook = () => ({});
35
+ const noopStorageResult = { storage: null, isReady: false };
36
+
37
37
  OxyProvider = noopComponent;
38
38
  OxySignInButton = noopComponent;
39
39
  OxyLogo = noopComponent;
@@ -44,9 +44,6 @@ if (isFrontend) {
44
44
  setupFonts = () => {};
45
45
  OxyIcon = noopComponent;
46
46
  useOxy = noopHook;
47
- OxyContextProvider = noopComponent;
48
- OxyContextState = {};
49
- OxyContextProviderProps = {};
50
47
  useFollow = noopHook;
51
48
  ProfileScreen = noopComponent;
52
49
  useAuthStore = noopHook;
@@ -54,6 +51,7 @@ if (isFrontend) {
54
51
  fontFamilies = {};
55
52
  fontStyles = {};
56
53
  toast = () => {};
54
+ useStorage = () => noopStorageResult;
57
55
  }
58
56
 
59
57
  export {
@@ -67,17 +65,28 @@ export {
67
65
  setupFonts,
68
66
  OxyIcon,
69
67
  useOxy,
70
- OxyContextProvider,
71
- OxyContextState,
72
- OxyContextProviderProps,
73
68
  useFollow,
74
69
  ProfileScreen,
75
70
  useAuthStore,
76
71
  useAccountStore,
77
72
  fontFamilies,
78
73
  fontStyles,
79
- toast
74
+ toast,
75
+ useStorage,
80
76
  };
81
77
 
82
- // Removed convenience re-export of core services from UI context.
78
+ // Re-export core services for convenience in UI context
79
+ export { OxyServices } from '../core';
83
80
  export type { User, LoginResponse, ApiError } from '../models/interfaces';
81
+
82
+ // Export error handler utilities (pure functions, no conditional needed)
83
+ export {
84
+ handleAuthError,
85
+ isInvalidSessionError,
86
+ isTimeoutOrNetworkError,
87
+ extractErrorMessage,
88
+ } from './utils/errorHandlers';
89
+ export type { HandleAuthErrorOptions } from './utils/errorHandlers';
90
+
91
+ // Export useStorage hook and types (kept for external consumers)
92
+ export type { UseStorageOptions, UseStorageResult } from './hooks/useStorage';
@@ -30,18 +30,22 @@ export type RouteName =
30
30
  | 'UserLinks'
31
31
  | 'HistoryView'
32
32
  | 'SavesCollections'
33
+ | 'EditProfile' // For backward compatibility, maps to AccountSettings
33
34
  | 'KarmaCenter'
34
35
  | 'KarmaLeaderboard'
35
36
  | 'KarmaRewards'
36
37
  | 'KarmaRules'
37
38
  | 'AboutKarma'
38
39
  | 'KarmaFAQ'
39
- | 'EditProfile'
40
+ // Legacy aliases for backward compatibility
41
+ | 'SignIn'; // Maps to OxyAuth
40
42
 
41
43
  // Lazy screen loaders - functions that return screen components on-demand
42
44
  // This breaks the require cycle by deferring imports until screens are actually needed
43
45
  const screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = {
44
46
  OxyAuth: () => require('../screens/OxyAuthScreen').default,
47
+ // Legacy alias - SignIn now maps to OxyAuth
48
+ SignIn: () => require('../screens/OxyAuthScreen').default,
45
49
  AccountOverview: () => require('../screens/AccountOverviewScreen').default,
46
50
  AccountSettings: () => require('../screens/AccountSettingsScreen').default,
47
51
  AccountCenter: () => require('../screens/AccountCenterScreen').default,
@@ -63,7 +67,7 @@ const screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = {
63
67
  UserLinks: () => require('../screens/UserLinksScreen').default,
64
68
  HistoryView: () => require('../screens/HistoryViewScreen').default,
65
69
  SavesCollections: () => require('../screens/SavesCollectionsScreen').default,
66
- // EditProfile kept for historical references
70
+ // Backward compatibility - EditProfile maps to AccountSettings
67
71
  EditProfile: () => require('../screens/AccountSettingsScreen').default,
68
72
  // Karma screens
69
73
  KarmaCenter: () => require('../screens/karma/KarmaCenterScreen').default,
@@ -189,7 +189,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
189
189
  iconColor: colors.iconPersonalInfo,
190
190
  title: t('accountCenter.items.addAccount.title') || 'Add Another Account',
191
191
  subtitle: t('accountCenter.items.addAccount.subtitle') || 'Sign in with a different account',
192
- onPress: () => navigate?.('OxyAuth'),
192
+ onPress: () => navigate?.('SignIn'),
193
193
  },
194
194
  ], [sessions.length, navigate, t, colors])}
195
195
 
@@ -208,7 +208,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
208
208
  iconColor: colors.iconPersonalInfo,
209
209
  title: t('accountCenter.items.addAccount.title') || 'Add Another Account',
210
210
  subtitle: t('accountCenter.items.addAccount.subtitle') || 'Sign in with a different account',
211
- onPress: () => navigate?.('OxyAuth'),
211
+ onPress: () => navigate?.('SignIn'),
212
212
  },
213
213
  ], [navigate, t, colors])}
214
214
 
@@ -143,7 +143,7 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
143
143
 
144
144
  React.useEffect(() => {
145
145
  if (usersData && usersData.length > 0) {
146
- const accountsData = usersData.map(({ sessionId, user: userProfile }) => {
146
+ const accountsData = usersData.map(({ sessionId, user: userProfile }: { sessionId: string; user: any }) => {
147
147
  if (!userProfile) {
148
148
  return {
149
149
  id: sessionId,