@oxyhq/services 5.17.17 → 5.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) 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.features.js +372 -0
  17. package/lib/commonjs/core/mixins/OxyServices.features.js.map +1 -0
  18. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +289 -0
  19. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -0
  20. package/lib/commonjs/core/mixins/OxyServices.popup.js +352 -0
  21. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -0
  22. package/lib/commonjs/core/mixins/OxyServices.redirect.js +378 -0
  23. package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +1 -0
  24. package/lib/commonjs/core/mixins/OxyServices.user.js +35 -24
  25. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  26. package/lib/commonjs/core/mixins/index.js +28 -15
  27. package/lib/commonjs/core/mixins/index.js.map +1 -1
  28. package/lib/commonjs/crypto/index.js +30 -0
  29. package/lib/commonjs/crypto/index.js.map +1 -1
  30. package/lib/commonjs/crypto/keyManager.js +902 -0
  31. package/lib/commonjs/crypto/keyManager.js.map +1 -0
  32. package/lib/commonjs/crypto/polyfill.js +14 -5
  33. package/lib/commonjs/crypto/polyfill.js.map +1 -1
  34. package/lib/commonjs/crypto/recoveryPhrase.js +152 -0
  35. package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
  36. package/lib/commonjs/crypto/signatureService.js +289 -0
  37. package/lib/commonjs/crypto/signatureService.js.map +1 -0
  38. package/lib/commonjs/i18n/locales/en-US.json +1 -1
  39. package/lib/commonjs/index.js +40 -26
  40. package/lib/commonjs/index.js.map +1 -1
  41. package/lib/commonjs/models/interfaces.js +0 -15
  42. package/lib/commonjs/models/interfaces.js.map +1 -1
  43. package/lib/commonjs/ui/components/BottomSheetRouter.js +9 -1
  44. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  45. package/lib/commonjs/ui/components/GroupedItem.js +11 -1
  46. package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
  47. package/lib/commonjs/ui/components/Icon.js.map +1 -1
  48. package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -1
  49. package/lib/commonjs/ui/components/OxyProvider.js +41 -11
  50. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  51. package/lib/commonjs/ui/components/SettingRow.js +17 -4
  52. package/lib/commonjs/ui/components/SettingRow.js.map +1 -1
  53. package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -1
  54. package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -1
  55. package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -1
  56. package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -1
  57. package/lib/commonjs/ui/components/feedback/FormInput.js +72 -0
  58. package/lib/commonjs/ui/components/feedback/FormInput.js.map +1 -0
  59. package/lib/commonjs/ui/components/feedback/ProgressIndicator.js +33 -0
  60. package/lib/commonjs/ui/components/feedback/ProgressIndicator.js.map +1 -0
  61. package/lib/commonjs/ui/components/feedback/constants.js +59 -0
  62. package/lib/commonjs/ui/components/feedback/constants.js.map +1 -0
  63. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +262 -0
  64. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -0
  65. package/lib/commonjs/ui/components/feedback/index.js +54 -0
  66. package/lib/commonjs/ui/components/feedback/index.js.map +1 -0
  67. package/lib/commonjs/ui/components/feedback/types.js +6 -0
  68. package/lib/commonjs/ui/components/feedback/types.js.map +1 -0
  69. package/lib/commonjs/ui/components/feedback/useFeedbackForm.js +52 -0
  70. package/lib/commonjs/ui/components/feedback/useFeedbackForm.js.map +1 -0
  71. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +282 -0
  72. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -0
  73. package/lib/commonjs/ui/components/modals/index.js +14 -0
  74. package/lib/commonjs/ui/components/modals/index.js.map +1 -0
  75. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +309 -0
  76. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -0
  77. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +79 -0
  78. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -0
  79. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +108 -0
  80. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -0
  81. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +79 -0
  82. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -0
  83. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +176 -0
  84. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -0
  85. package/lib/commonjs/ui/components/payment/constants.js +53 -0
  86. package/lib/commonjs/ui/components/payment/constants.js.map +1 -0
  87. package/lib/commonjs/ui/components/payment/index.js +80 -0
  88. package/lib/commonjs/ui/components/payment/index.js.map +1 -0
  89. package/lib/commonjs/ui/components/payment/paymentStyles.js +409 -0
  90. package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -0
  91. package/lib/commonjs/ui/components/payment/types.js +6 -0
  92. package/lib/commonjs/ui/components/payment/types.js.map +1 -0
  93. package/lib/commonjs/ui/context/OxyContext.js +110 -199
  94. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  95. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +150 -19
  96. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  97. package/lib/commonjs/ui/context/hooks/useSessionManagement.js +279 -0
  98. package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
  99. package/lib/commonjs/ui/hooks/index.js +26 -0
  100. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  101. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +79 -72
  102. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  103. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +38 -51
  104. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  105. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +3 -3
  106. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  107. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +18 -12
  108. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  109. package/lib/commonjs/ui/hooks/useAsyncAction.js +95 -0
  110. package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -0
  111. package/lib/commonjs/ui/hooks/useProfileEditing.js +3 -5
  112. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  113. package/lib/commonjs/ui/hooks/useSessionManagement.js +4 -8
  114. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  115. package/lib/commonjs/ui/hooks/useSessionSocket.js +162 -315
  116. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  117. package/lib/commonjs/ui/hooks/useSettingToggle.js +126 -0
  118. package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -0
  119. package/lib/commonjs/ui/hooks/useStorage.js +24 -58
  120. package/lib/commonjs/ui/hooks/useStorage.js.map +1 -1
  121. package/lib/commonjs/ui/index.js +50 -21
  122. package/lib/commonjs/ui/index.js.map +1 -1
  123. package/lib/commonjs/ui/navigation/routes.js +6 -1
  124. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  125. package/lib/commonjs/ui/screens/AccountCenterScreen.js +6 -4
  126. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  127. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +33 -30
  128. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  129. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +29 -24
  130. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  131. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +3 -3
  132. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  133. package/lib/commonjs/ui/screens/FAQScreen.js +315 -0
  134. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -0
  135. package/lib/commonjs/ui/screens/FeedbackScreen.js +73 -590
  136. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  137. package/lib/commonjs/ui/screens/HelpSupportScreen.js +8 -7
  138. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  139. package/lib/commonjs/ui/screens/OxyAuthScreen.js +134 -66
  140. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  141. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +67 -1395
  142. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  143. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +6 -13
  144. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  145. package/lib/commonjs/ui/screens/ProfileScreen.js +13 -5
  146. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  147. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +16 -10
  148. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  149. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +23 -11
  150. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  151. package/lib/commonjs/ui/stores/accountStore.js +2 -4
  152. package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
  153. package/lib/commonjs/ui/stores/authStore.js +45 -32
  154. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  155. package/lib/commonjs/ui/styles/spacing.js +54 -2
  156. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  157. package/lib/commonjs/ui/utils/avatarUtils.js +37 -41
  158. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  159. package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -1
  160. package/lib/commonjs/utils/errorUtils.js +13 -0
  161. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  162. package/lib/commonjs/utils/validationUtils.js +15 -1
  163. package/lib/commonjs/utils/validationUtils.js.map +1 -1
  164. package/lib/module/core/CrossDomainAuth.js +271 -0
  165. package/lib/module/core/CrossDomainAuth.js.map +1 -0
  166. package/lib/module/core/HttpService.js +82 -15
  167. package/lib/module/core/HttpService.js.map +1 -1
  168. package/lib/module/core/OxyServices.base.js +11 -4
  169. package/lib/module/core/OxyServices.base.js.map +1 -1
  170. package/lib/module/core/OxyServices.js +4 -1
  171. package/lib/module/core/OxyServices.js.map +1 -1
  172. package/lib/module/core/index.js +6 -1
  173. package/lib/module/core/index.js.map +1 -1
  174. package/lib/module/core/mixins/OxyServices.assets.js +16 -3
  175. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  176. package/lib/module/core/mixins/OxyServices.auth.js +73 -32
  177. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
  178. package/lib/module/core/mixins/OxyServices.features.js +369 -0
  179. package/lib/module/core/mixins/OxyServices.features.js.map +1 -0
  180. package/lib/module/core/mixins/OxyServices.fedcm.js +286 -0
  181. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -0
  182. package/lib/module/core/mixins/OxyServices.popup.js +349 -0
  183. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -0
  184. package/lib/module/core/mixins/OxyServices.redirect.js +375 -0
  185. package/lib/module/core/mixins/OxyServices.redirect.js.map +1 -0
  186. package/lib/module/core/mixins/OxyServices.user.js +35 -24
  187. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  188. package/lib/module/core/mixins/index.js +16 -3
  189. package/lib/module/core/mixins/index.js.map +1 -1
  190. package/lib/module/crypto/index.js +8 -4
  191. package/lib/module/crypto/index.js.map +1 -1
  192. package/lib/module/crypto/keyManager.js +899 -0
  193. package/lib/module/crypto/keyManager.js.map +1 -0
  194. package/lib/module/crypto/polyfill.js +6 -5
  195. package/lib/module/crypto/polyfill.js.map +1 -1
  196. package/lib/module/crypto/recoveryPhrase.js +147 -0
  197. package/lib/module/crypto/recoveryPhrase.js.map +1 -0
  198. package/lib/module/crypto/signatureService.js +286 -0
  199. package/lib/module/crypto/signatureService.js.map +1 -0
  200. package/lib/module/i18n/locales/en-US.json +1 -1
  201. package/lib/module/index.js +6 -9
  202. package/lib/module/index.js.map +1 -1
  203. package/lib/module/models/interfaces.js +0 -15
  204. package/lib/module/models/interfaces.js.map +1 -1
  205. package/lib/module/ui/components/BottomSheetRouter.js +6 -2
  206. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  207. package/lib/module/ui/components/GroupedItem.js +11 -1
  208. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  209. package/lib/module/ui/components/Icon.js.map +1 -1
  210. package/lib/module/ui/components/IconButton/utils.js.map +1 -1
  211. package/lib/module/ui/components/OxyProvider.js +41 -11
  212. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  213. package/lib/module/ui/components/SettingRow.js +17 -4
  214. package/lib/module/ui/components/SettingRow.js.map +1 -1
  215. package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -1
  216. package/lib/module/ui/components/TextField/helpers.js.map +1 -1
  217. package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -1
  218. package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -1
  219. package/lib/module/ui/components/feedback/FormInput.js +67 -0
  220. package/lib/module/ui/components/feedback/FormInput.js.map +1 -0
  221. package/lib/module/ui/components/feedback/ProgressIndicator.js +28 -0
  222. package/lib/module/ui/components/feedback/ProgressIndicator.js.map +1 -0
  223. package/lib/module/ui/components/feedback/constants.js +55 -0
  224. package/lib/module/ui/components/feedback/constants.js.map +1 -0
  225. package/lib/module/ui/components/feedback/feedbackStyles.js +257 -0
  226. package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -0
  227. package/lib/module/ui/components/feedback/index.js +8 -0
  228. package/lib/module/ui/components/feedback/index.js.map +1 -0
  229. package/lib/module/ui/components/feedback/types.js +4 -0
  230. package/lib/module/ui/components/feedback/types.js.map +1 -0
  231. package/lib/module/ui/components/feedback/useFeedbackForm.js +47 -0
  232. package/lib/module/ui/components/feedback/useFeedbackForm.js.map +1 -0
  233. package/lib/module/ui/components/modals/DeleteAccountModal.js +276 -0
  234. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -0
  235. package/lib/module/ui/components/modals/index.js +4 -0
  236. package/lib/module/ui/components/modals/index.js.map +1 -0
  237. package/lib/module/ui/components/payment/PaymentDetailsStep.js +303 -0
  238. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -0
  239. package/lib/module/ui/components/payment/PaymentMethodStep.js +73 -0
  240. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -0
  241. package/lib/module/ui/components/payment/PaymentReviewStep.js +102 -0
  242. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -0
  243. package/lib/module/ui/components/payment/PaymentSuccessStep.js +73 -0
  244. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -0
  245. package/lib/module/ui/components/payment/PaymentSummaryStep.js +170 -0
  246. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -0
  247. package/lib/module/ui/components/payment/constants.js +47 -0
  248. package/lib/module/ui/components/payment/constants.js.map +1 -0
  249. package/lib/module/ui/components/payment/index.js +10 -0
  250. package/lib/module/ui/components/payment/index.js.map +1 -0
  251. package/lib/module/ui/components/payment/paymentStyles.js +404 -0
  252. package/lib/module/ui/components/payment/paymentStyles.js.map +1 -0
  253. package/lib/module/ui/components/payment/types.js +4 -0
  254. package/lib/module/ui/components/payment/types.js.map +1 -0
  255. package/lib/module/ui/context/OxyContext.js +112 -191
  256. package/lib/module/ui/context/OxyContext.js.map +1 -1
  257. package/lib/module/ui/context/hooks/useAuthOperations.js +150 -19
  258. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  259. package/lib/module/ui/context/hooks/useSessionManagement.js +274 -0
  260. package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
  261. package/lib/module/ui/hooks/index.js +2 -0
  262. package/lib/module/ui/hooks/index.js.map +1 -1
  263. package/lib/module/ui/hooks/mutations/useAccountMutations.js +80 -72
  264. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  265. package/lib/module/ui/hooks/queries/useAccountQueries.js +31 -44
  266. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  267. package/lib/module/ui/hooks/queries/useSecurityQueries.js +1 -1
  268. package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  269. package/lib/module/ui/hooks/queries/useServicesQueries.js +13 -7
  270. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  271. package/lib/module/ui/hooks/useAsyncAction.js +89 -0
  272. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -0
  273. package/lib/module/ui/hooks/useProfileEditing.js +3 -5
  274. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  275. package/lib/module/ui/hooks/useSessionManagement.js +4 -8
  276. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  277. package/lib/module/ui/hooks/useSessionSocket.js +162 -315
  278. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  279. package/lib/module/ui/hooks/useSettingToggle.js +120 -0
  280. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -0
  281. package/lib/module/ui/hooks/useStorage.js +25 -59
  282. package/lib/module/ui/hooks/useStorage.js.map +1 -1
  283. package/lib/module/ui/index.js +15 -10
  284. package/lib/module/ui/index.js.map +1 -1
  285. package/lib/module/ui/navigation/routes.js +6 -1
  286. package/lib/module/ui/navigation/routes.js.map +1 -1
  287. package/lib/module/ui/screens/AccountCenterScreen.js +6 -4
  288. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  289. package/lib/module/ui/screens/AccountOverviewScreen.js +33 -30
  290. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  291. package/lib/module/ui/screens/AccountSettingsScreen.js +29 -24
  292. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  293. package/lib/module/ui/screens/AccountSwitcherScreen.js +3 -3
  294. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  295. package/lib/module/ui/screens/FAQScreen.js +310 -0
  296. package/lib/module/ui/screens/FAQScreen.js.map +1 -0
  297. package/lib/module/ui/screens/FeedbackScreen.js +64 -581
  298. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  299. package/lib/module/ui/screens/HelpSupportScreen.js +8 -7
  300. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  301. package/lib/module/ui/screens/OxyAuthScreen.js +135 -68
  302. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  303. package/lib/module/ui/screens/PaymentGatewayScreen.js +67 -1397
  304. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  305. package/lib/module/ui/screens/PrivacySettingsScreen.js +6 -13
  306. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  307. package/lib/module/ui/screens/ProfileScreen.js +13 -5
  308. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  309. package/lib/module/ui/screens/SavesCollectionsScreen.js +16 -10
  310. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  311. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +23 -11
  312. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  313. package/lib/module/ui/stores/accountStore.js +2 -4
  314. package/lib/module/ui/stores/accountStore.js.map +1 -1
  315. package/lib/module/ui/stores/authStore.js +45 -32
  316. package/lib/module/ui/stores/authStore.js.map +1 -1
  317. package/lib/module/ui/styles/spacing.js +6 -2
  318. package/lib/module/ui/styles/spacing.js.map +1 -1
  319. package/lib/module/ui/utils/avatarUtils.js +37 -40
  320. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  321. package/lib/module/ui/utils/storageHelpers.js.map +1 -1
  322. package/lib/module/utils/errorUtils.js +7 -0
  323. package/lib/module/utils/errorUtils.js.map +1 -1
  324. package/lib/module/utils/validationUtils.js +13 -0
  325. package/lib/module/utils/validationUtils.js.map +1 -1
  326. package/lib/typescript/core/CrossDomainAuth.d.ts +161 -0
  327. package/lib/typescript/core/CrossDomainAuth.d.ts.map +1 -0
  328. package/lib/typescript/core/HttpService.d.ts +1 -1
  329. package/lib/typescript/core/HttpService.d.ts.map +1 -1
  330. package/lib/typescript/core/OxyServices.base.d.ts +0 -6
  331. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  332. package/lib/typescript/core/OxyServices.d.ts +5 -36
  333. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  334. package/lib/typescript/core/index.d.ts +4 -0
  335. package/lib/typescript/core/index.d.ts.map +1 -1
  336. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  337. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  338. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +40 -20
  339. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  340. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  341. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  342. package/lib/typescript/core/mixins/OxyServices.features.d.ts +229 -0
  343. package/lib/typescript/core/mixins/OxyServices.features.d.ts.map +1 -0
  344. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts +195 -0
  345. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts.map +1 -0
  346. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  347. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  348. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  349. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  350. package/lib/typescript/core/mixins/OxyServices.popup.d.ts +206 -0
  351. package/lib/typescript/core/mixins/OxyServices.popup.d.ts.map +1 -0
  352. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  353. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts +246 -0
  354. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts.map +1 -0
  355. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  356. package/lib/typescript/core/mixins/OxyServices.user.d.ts +6 -4
  357. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  358. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  359. package/lib/typescript/core/mixins/index.d.ts +291 -9
  360. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  361. package/lib/typescript/crypto/index.d.ts +6 -3
  362. package/lib/typescript/crypto/index.d.ts.map +1 -1
  363. package/lib/typescript/crypto/keyManager.d.ts +190 -0
  364. package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
  365. package/lib/typescript/crypto/polyfill.d.ts +4 -3
  366. package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
  367. package/lib/typescript/crypto/recoveryPhrase.d.ts +59 -0
  368. package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
  369. package/lib/typescript/crypto/signatureService.d.ts +87 -0
  370. package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
  371. package/lib/typescript/index.d.ts +5 -6
  372. package/lib/typescript/index.d.ts.map +1 -1
  373. package/lib/typescript/models/interfaces.d.ts +2 -14
  374. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  375. package/lib/typescript/models/session.d.ts +0 -9
  376. package/lib/typescript/models/session.d.ts.map +1 -1
  377. package/lib/typescript/types/bip39.d.ts +32 -0
  378. package/lib/typescript/ui/components/BottomSheetRouter.d.ts +5 -0
  379. package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
  380. package/lib/typescript/ui/components/GroupedItem.d.ts +5 -1
  381. package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
  382. package/lib/typescript/ui/components/IconButton/utils.d.ts +1 -1
  383. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  384. package/lib/typescript/ui/components/SettingRow.d.ts +6 -0
  385. package/lib/typescript/ui/components/SettingRow.d.ts.map +1 -1
  386. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
  387. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +1 -1
  388. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -1
  389. package/lib/typescript/ui/components/TextField/helpers.d.ts +8 -8
  390. package/lib/typescript/ui/components/TextField/types.d.ts +1 -0
  391. package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
  392. package/lib/typescript/ui/components/feedback/FormInput.d.ts +20 -0
  393. package/lib/typescript/ui/components/feedback/FormInput.d.ts.map +1 -0
  394. package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts +11 -0
  395. package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts.map +1 -0
  396. package/lib/typescript/ui/components/feedback/constants.d.ts +5 -0
  397. package/lib/typescript/ui/components/feedback/constants.d.ts.map +1 -0
  398. package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts +280 -0
  399. package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts.map +1 -0
  400. package/lib/typescript/ui/components/feedback/index.d.ts +7 -0
  401. package/lib/typescript/ui/components/feedback/index.d.ts.map +1 -0
  402. package/lib/typescript/ui/components/feedback/types.d.ts +46 -0
  403. package/lib/typescript/ui/components/feedback/types.d.ts.map +1 -0
  404. package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts +9 -0
  405. package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts.map +1 -0
  406. package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts +19 -0
  407. package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts.map +1 -0
  408. package/lib/typescript/ui/components/modals/index.d.ts +2 -0
  409. package/lib/typescript/ui/components/modals/index.d.ts.map +1 -0
  410. package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts +21 -0
  411. package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -0
  412. package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts +14 -0
  413. package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts.map +1 -0
  414. package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts +16 -0
  415. package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts.map +1 -0
  416. package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts +10 -0
  417. package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -0
  418. package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts +15 -0
  419. package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -0
  420. package/lib/typescript/ui/components/payment/constants.d.ts +7 -0
  421. package/lib/typescript/ui/components/payment/constants.d.ts.map +1 -0
  422. package/lib/typescript/ui/components/payment/index.d.ts +9 -0
  423. package/lib/typescript/ui/components/payment/index.d.ts.map +1 -0
  424. package/lib/typescript/ui/components/payment/paymentStyles.d.ts +396 -0
  425. package/lib/typescript/ui/components/payment/paymentStyles.d.ts.map +1 -0
  426. package/lib/typescript/ui/components/payment/types.d.ts +40 -0
  427. package/lib/typescript/ui/components/payment/types.d.ts.map +1 -0
  428. package/lib/typescript/ui/components/types.d.ts +4 -0
  429. package/lib/typescript/ui/components/types.d.ts.map +1 -1
  430. package/lib/typescript/ui/context/OxyContext.d.ts +57 -3
  431. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  432. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +10 -3
  433. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  434. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +41 -0
  435. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
  436. package/lib/typescript/ui/hooks/index.d.ts +2 -0
  437. package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
  438. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  439. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  440. package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  441. package/lib/typescript/ui/hooks/useAsyncAction.d.ts +51 -0
  442. package/lib/typescript/ui/hooks/useAsyncAction.d.ts.map +1 -0
  443. package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
  444. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  445. package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -2
  446. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
  447. package/lib/typescript/ui/hooks/useSettingToggle.d.ts +55 -0
  448. package/lib/typescript/ui/hooks/useSettingToggle.d.ts.map +1 -0
  449. package/lib/typescript/ui/hooks/useStorage.d.ts +3 -9
  450. package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -1
  451. package/lib/typescript/ui/index.d.ts +6 -2
  452. package/lib/typescript/ui/index.d.ts.map +1 -1
  453. package/lib/typescript/ui/navigation/routes.d.ts +1 -1
  454. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  455. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  456. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  457. package/lib/typescript/ui/screens/FAQScreen.d.ts +5 -0
  458. package/lib/typescript/ui/screens/FAQScreen.d.ts.map +1 -0
  459. package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
  460. package/lib/typescript/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  461. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +1 -1
  462. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  463. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +3 -15
  464. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  465. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  466. package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
  467. package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  468. package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  469. package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
  470. package/lib/typescript/ui/stores/authStore.d.ts +8 -7
  471. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  472. package/lib/typescript/ui/styles/spacing.d.ts +5 -0
  473. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
  474. package/lib/typescript/ui/types/navigation.d.ts +2 -1
  475. package/lib/typescript/ui/types/navigation.d.ts.map +1 -1
  476. package/lib/typescript/ui/utils/avatarUtils.d.ts +2 -13
  477. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  478. package/lib/typescript/ui/utils/storageHelpers.d.ts +0 -3
  479. package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -1
  480. package/lib/typescript/utils/errorUtils.d.ts +6 -0
  481. package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
  482. package/lib/typescript/utils/validationUtils.d.ts +8 -0
  483. package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
  484. package/package.json +8 -7
  485. package/src/core/CrossDomainAuth.ts +307 -0
  486. package/src/core/HttpService.ts +99 -16
  487. package/src/core/OxyServices.base.ts +20 -3
  488. package/src/core/OxyServices.ts +7 -3
  489. package/src/core/index.ts +9 -1
  490. package/src/core/mixins/OxyServices.assets.ts +14 -3
  491. package/src/core/mixins/OxyServices.auth.ts +105 -36
  492. package/src/core/mixins/OxyServices.features.ts +428 -0
  493. package/src/core/mixins/OxyServices.fedcm.ts +315 -0
  494. package/src/core/mixins/OxyServices.popup.ts +402 -0
  495. package/src/core/mixins/OxyServices.redirect.ts +397 -0
  496. package/src/core/mixins/OxyServices.user.ts +39 -24
  497. package/src/core/mixins/index.ts +33 -14
  498. package/src/crypto/index.ts +16 -5
  499. package/src/crypto/keyManager.ts +966 -0
  500. package/src/crypto/polyfill.ts +6 -5
  501. package/src/crypto/recoveryPhrase.ts +166 -0
  502. package/src/crypto/signatureService.ts +323 -0
  503. package/src/i18n/locales/en-US.json +1 -1
  504. package/src/index.ts +19 -15
  505. package/src/models/interfaces.ts +4 -16
  506. package/src/models/session.ts +2 -11
  507. package/src/types/bip39.d.ts +32 -0
  508. package/src/ui/components/BottomSheetRouter.tsx +6 -1
  509. package/src/ui/components/GroupedItem.tsx +19 -1
  510. package/src/ui/components/Icon.tsx +1 -1
  511. package/src/ui/components/IconButton/utils.ts +1 -1
  512. package/src/ui/components/OxyProvider.tsx +44 -12
  513. package/src/ui/components/SettingRow.tsx +26 -4
  514. package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
  515. package/src/ui/components/TextField/Adornment/utils.ts +2 -2
  516. package/src/ui/components/TextField/helpers.tsx +10 -10
  517. package/src/ui/components/TextField/types.tsx +1 -1
  518. package/src/ui/components/TouchableRipple/utils.ts +2 -2
  519. package/src/ui/components/Typography/AnimatedText.tsx +2 -2
  520. package/src/ui/components/feedback/FormInput.tsx +84 -0
  521. package/src/ui/components/feedback/ProgressIndicator.tsx +35 -0
  522. package/src/ui/components/feedback/constants.ts +22 -0
  523. package/src/ui/components/feedback/feedbackStyles.ts +247 -0
  524. package/src/ui/components/feedback/index.ts +6 -0
  525. package/src/ui/components/feedback/types.ts +52 -0
  526. package/src/ui/components/feedback/useFeedbackForm.ts +44 -0
  527. package/src/ui/components/modals/DeleteAccountModal.tsx +294 -0
  528. package/src/ui/components/modals/index.ts +1 -0
  529. package/src/ui/components/payment/PaymentDetailsStep.tsx +222 -0
  530. package/src/ui/components/payment/PaymentMethodStep.tsx +89 -0
  531. package/src/ui/components/payment/PaymentReviewStep.tsx +126 -0
  532. package/src/ui/components/payment/PaymentSuccessStep.tsx +71 -0
  533. package/src/ui/components/payment/PaymentSummaryStep.tsx +159 -0
  534. package/src/ui/components/payment/constants.ts +39 -0
  535. package/src/ui/components/payment/index.ts +9 -0
  536. package/src/ui/components/payment/paymentStyles.ts +397 -0
  537. package/src/ui/components/payment/types.ts +45 -0
  538. package/src/ui/components/types.tsx +6 -0
  539. package/src/ui/context/OxyContext.tsx +173 -195
  540. package/src/ui/context/hooks/useAuthOperations.ts +177 -36
  541. package/src/ui/context/hooks/useSessionManagement.ts +399 -0
  542. package/src/ui/hooks/index.ts +3 -1
  543. package/src/ui/hooks/mutations/useAccountMutations.ts +83 -76
  544. package/src/ui/hooks/queries/useAccountQueries.ts +29 -35
  545. package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
  546. package/src/ui/hooks/queries/useServicesQueries.ts +14 -6
  547. package/src/ui/hooks/useAsyncAction.ts +129 -0
  548. package/src/ui/hooks/useProfileEditing.ts +3 -3
  549. package/src/ui/hooks/useSessionManagement.ts +5 -10
  550. package/src/ui/hooks/useSessionSocket.ts +46 -175
  551. package/src/ui/hooks/useSettingToggle.ts +147 -0
  552. package/src/ui/hooks/useStorage.ts +24 -76
  553. package/src/ui/index.ts +22 -13
  554. package/src/ui/navigation/routes.ts +8 -2
  555. package/src/ui/screens/AccountCenterScreen.tsx +4 -4
  556. package/src/ui/screens/AccountOverviewScreen.tsx +36 -38
  557. package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
  558. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  559. package/src/ui/screens/FAQScreen.tsx +332 -0
  560. package/src/ui/screens/FeedbackScreen.tsx +91 -626
  561. package/src/ui/screens/HelpSupportScreen.tsx +7 -5
  562. package/src/ui/screens/OxyAuthScreen.tsx +138 -64
  563. package/src/ui/screens/PaymentGatewayScreen.tsx +96 -1275
  564. package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
  565. package/src/ui/screens/ProfileScreen.tsx +11 -6
  566. package/src/ui/screens/SavesCollectionsScreen.tsx +19 -10
  567. package/src/ui/screens/karma/KarmaCenterScreen.tsx +10 -10
  568. package/src/ui/stores/accountStore.ts +1 -11
  569. package/src/ui/stores/authStore.ts +43 -44
  570. package/src/ui/styles/spacing.ts +15 -2
  571. package/src/ui/types/navigation.ts +2 -2
  572. package/src/ui/utils/avatarUtils.ts +39 -46
  573. package/src/ui/utils/storageHelpers.ts +0 -4
  574. package/src/utils/__tests__/validationUtils.test.ts +16 -1
  575. package/src/utils/errorUtils.ts +8 -1
  576. package/src/utils/validationUtils.ts +12 -0
  577. package/lib/commonjs/core/services/SessionService.js +0 -163
  578. package/lib/commonjs/core/services/SessionService.js.map +0 -1
  579. package/lib/commonjs/core/services/TokenService.js +0 -220
  580. package/lib/commonjs/core/services/TokenService.js.map +0 -1
  581. package/lib/commonjs/crypto/types.js +0 -2
  582. package/lib/commonjs/crypto/types.js.map +0 -1
  583. package/lib/commonjs/ui/context/OxyContextBase.js +0 -21
  584. package/lib/commonjs/ui/context/OxyContextBase.js.map +0 -1
  585. package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
  586. package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
  587. package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -56
  588. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
  589. package/lib/module/core/services/SessionService.js +0 -159
  590. package/lib/module/core/services/SessionService.js.map +0 -1
  591. package/lib/module/core/services/TokenService.js +0 -217
  592. package/lib/module/core/services/TokenService.js.map +0 -1
  593. package/lib/module/crypto/types.js +0 -2
  594. package/lib/module/crypto/types.js.map +0 -1
  595. package/lib/module/ui/context/OxyContextBase.js +0 -16
  596. package/lib/module/ui/context/OxyContextBase.js.map +0 -1
  597. package/lib/module/ui/context/hooks/useStorage.js +0 -74
  598. package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
  599. package/lib/module/ui/hooks/useAvatarPicker.js +0 -50
  600. package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
  601. package/lib/typescript/core/services/SessionService.d.ts +0 -78
  602. package/lib/typescript/core/services/SessionService.d.ts.map +0 -1
  603. package/lib/typescript/core/services/TokenService.d.ts +0 -72
  604. package/lib/typescript/core/services/TokenService.d.ts.map +0 -1
  605. package/lib/typescript/crypto/types.d.ts +0 -22
  606. package/lib/typescript/crypto/types.d.ts.map +0 -1
  607. package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -63
  608. package/lib/typescript/ui/context/OxyContextBase.d.ts.map +0 -1
  609. package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
  610. package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
  611. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -19
  612. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
  613. package/src/core/services/SessionService.ts +0 -173
  614. package/src/core/services/TokenService.ts +0 -237
  615. package/src/crypto/types.ts +0 -23
  616. package/src/ui/context/OxyContextBase.tsx +0 -78
  617. package/src/ui/context/hooks/useStorage.ts +0 -104
  618. package/src/ui/hooks/useAvatarPicker.ts +0 -61
@@ -78,11 +78,8 @@ const PrivacySettingsScreen: React.FC<BaseScreenProps> = ({
78
78
  const loadSettings = async () => {
79
79
  try {
80
80
  setIsLoading(true);
81
- // Use getCurrentUserId() which returns MongoDB ObjectId from JWT token
82
- // Never use user?.id as it may be set to publicKey
83
- const userId = oxyServices?.getCurrentUserId();
84
- if (userId && oxyServices) {
85
- const privacySettings = await oxyServices.getPrivacySettings(userId);
81
+ if (user?.id && oxyServices) {
82
+ const privacySettings = await oxyServices.getPrivacySettings(user.id);
86
83
  if (privacySettings) {
87
84
  setSettings(privacySettings);
88
85
  }
@@ -96,7 +93,7 @@ const PrivacySettingsScreen: React.FC<BaseScreenProps> = ({
96
93
  };
97
94
 
98
95
  loadSettings();
99
- }, [oxyServices, t]);
96
+ }, [user?.id, oxyServices, t]);
100
97
 
101
98
  // Load blocked and restricted users
102
99
  useEffect(() => {
@@ -126,11 +123,8 @@ const PrivacySettingsScreen: React.FC<BaseScreenProps> = ({
126
123
  const newSettings = { ...settings, [key]: value };
127
124
  setSettings(newSettings);
128
125
 
129
- // Use getCurrentUserId() which returns MongoDB ObjectId from JWT token
130
- // Never use user?.id as it may be set to publicKey
131
- const userId = oxyServices?.getCurrentUserId();
132
- if (userId && oxyServices) {
133
- await oxyServices.updatePrivacySettings({ [key]: value }, userId);
126
+ if (user?.id && oxyServices) {
127
+ await oxyServices.updatePrivacySettings({ [key]: value }, user.id);
134
128
  toast.success(t('privacySettings.updated') || 'Privacy settings updated');
135
129
  }
136
130
  } catch (error) {
@@ -141,7 +135,7 @@ const PrivacySettingsScreen: React.FC<BaseScreenProps> = ({
141
135
  } finally {
142
136
  setIsSaving(false);
143
137
  }
144
- }, [settings, oxyServices, t]);
138
+ }, [settings, user?.id, oxyServices, t]);
145
139
 
146
140
  const handleUnblock = useCallback(async (userId: string) => {
147
141
  if (!oxyServices) return;
@@ -77,7 +77,7 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
77
77
  setIsLoading(true);
78
78
  setError(null);
79
79
 
80
- // Load user profile and karma total
80
+ // Load user profile, karma total, and stats
81
81
  Promise.all([
82
82
  oxyServices.getUserById(userId).catch((err: unknown) => {
83
83
  // If this is the current user and the API call fails, use current user data as fallback
@@ -92,9 +92,14 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
92
92
  oxyServices.getUserKarmaTotal(userId).catch(() => {
93
93
  return { total: undefined };
94
94
  }) :
95
- Promise.resolve({ total: undefined })
95
+ Promise.resolve({ total: undefined }),
96
+ oxyServices.getUserStats ?
97
+ oxyServices.getUserStats(userId).catch(() => {
98
+ return { postCount: 0, commentCount: 0 };
99
+ }) :
100
+ Promise.resolve({ postCount: 0, commentCount: 0 })
96
101
  ])
97
- .then(([profileRes, karmaRes]) => {
102
+ .then(([profileRes, karmaRes, statsRes]) => {
98
103
  if (!profileRes) {
99
104
  setError('Profile data is not available');
100
105
  setIsLoading(false);
@@ -135,9 +140,9 @@ const ProfileScreen: React.FC<ProfileScreenProps> = ({ userId, username, theme,
135
140
 
136
141
  // Follower/following counts are managed by the `useFollow` hook.
137
142
 
138
- // Mock data for other stats (these would come from separate API endpoints)
139
- setPostsCount(Math.floor(Math.random() * 50));
140
- setCommentsCount(Math.floor(Math.random() * 100));
143
+ // User stats from API
144
+ setPostsCount(statsRes?.postCount ?? 0);
145
+ setCommentsCount(statsRes?.commentCount ?? 0);
141
146
  })
142
147
  .catch((err: unknown) => {
143
148
  logger.error('Profile loading error', err instanceof Error ? err : new Error(String(err)), { component: 'ProfileScreen' });
@@ -49,21 +49,30 @@ const SavesCollectionsScreen: React.FC<BaseScreenProps> = ({
49
49
  const tabActiveColor = themeStyles.colors.iconSecurity;
50
50
  const tabInactiveColor = themeStyles.isDarkTheme ? '#888888' : '#666666';
51
51
 
52
- // TODO: Implement API integration for saved items and collections
53
- // Currently sets empty arrays. Should fetch from oxyServices.getSavedItems() and oxyServices.getCollections()
54
- // Load saved items and collections
52
+ // Load saved items and collections from API
55
53
  useEffect(() => {
56
54
  const loadData = async () => {
57
55
  try {
58
56
  setIsLoading(true);
59
57
  if (user?.id && oxyServices) {
60
- // TODO: Replace with actual API calls
61
- // const saved = await oxyServices.getSavedItems(user.id);
62
- // const cols = await oxyServices.getCollections(user.id);
63
- // setSavedItems(saved);
64
- // setCollections(cols);
65
- setSavedItems([]);
66
- setCollections([]);
58
+ const [saved, cols] = await Promise.all([
59
+ oxyServices.getSavedItems(user.id),
60
+ oxyServices.getCollections(user.id),
61
+ ]);
62
+ setSavedItems(saved.map((item: any) => ({
63
+ id: item.id,
64
+ title: item.title,
65
+ type: item.itemType === 'post' ? 'post' : 'collection',
66
+ savedAt: new Date(item.createdAt),
67
+ url: item.url,
68
+ })));
69
+ setCollections(cols.map((col: any) => ({
70
+ id: col.id,
71
+ name: col.name,
72
+ description: col.description,
73
+ itemCount: col.itemCount,
74
+ createdAt: col.createdAt ? new Date(col.createdAt) : undefined,
75
+ })));
67
76
  }
68
77
  } catch (error) {
69
78
  toast.error(t('saves.loadError') || 'Failed to load saved items');
@@ -36,6 +36,8 @@ const KarmaCenterScreen: React.FC<BaseScreenProps> = ({
36
36
  const themeStyles = useThemeStyles(theme || 'light', colorScheme);
37
37
  // Override primaryColor for Karma screens (purple instead of blue)
38
38
  const primaryColor = '#d169e5';
39
+ const dangerColor = themeStyles.dangerColor || '#D32F2F';
40
+ const mutedTextColor = themeStyles.isDarkTheme ? '#BBBBBB' : '#888888';
39
41
 
40
42
  // Icon colors from theme
41
43
  const iconLeaderboard = themeStyles.colors.iconPayments;
@@ -92,19 +94,19 @@ const KarmaCenterScreen: React.FC<BaseScreenProps> = ({
92
94
  <View style={[styles.actionIcon, { backgroundColor: iconLeaderboard }]}>
93
95
  <Ionicons name="trophy-outline" size={28} color={darkenColor(iconLeaderboard)} />
94
96
  </View>
95
- <Text style={styles.actionLabel}>{t('karma.center.actions.leaderboard') || 'Leaderboard'}</Text>
97
+ <Text style={[styles.actionLabel, { color: mutedTextColor }]}>{t('karma.center.actions.leaderboard') || 'Leaderboard'}</Text>
96
98
  </TouchableOpacity>
97
99
  <TouchableOpacity style={styles.actionIconWrapper} onPress={() => navigate && navigate('KarmaRules')}>
98
100
  <View style={[styles.actionIcon, { backgroundColor: iconRules }]}>
99
101
  <Ionicons name="document-text-outline" size={28} color={darkenColor(iconRules)} />
100
102
  </View>
101
- <Text style={styles.actionLabel}>{t('karma.center.actions.rules') || 'Rules'}</Text>
103
+ <Text style={[styles.actionLabel, { color: mutedTextColor }]}>{t('karma.center.actions.rules') || 'Rules'}</Text>
102
104
  </TouchableOpacity>
103
105
  <TouchableOpacity style={styles.actionIconWrapper} onPress={() => navigate && navigate('AboutKarma')}>
104
106
  <View style={[styles.actionIcon, { backgroundColor: iconAbout }]}>
105
107
  <Ionicons name="star-outline" size={28} color={darkenColor(iconAbout)} />
106
108
  </View>
107
- <Text style={styles.actionLabel}>{t('karma.center.actions.about') || 'About'}</Text>
109
+ <Text style={[styles.actionLabel, { color: mutedTextColor }]}>{t('karma.center.actions.about') || 'About'}</Text>
108
110
  </TouchableOpacity>
109
111
  </View>
110
112
  <View style={styles.actionRow}>
@@ -112,17 +114,17 @@ const KarmaCenterScreen: React.FC<BaseScreenProps> = ({
112
114
  <View style={[styles.actionIcon, { backgroundColor: iconRewards }]}>
113
115
  <Ionicons name="gift-outline" size={28} color={darkenColor(iconRewards)} />
114
116
  </View>
115
- <Text style={styles.actionLabel}>{t('karma.center.actions.rewards') || 'Rewards'}</Text>
117
+ <Text style={[styles.actionLabel, { color: mutedTextColor }]}>{t('karma.center.actions.rewards') || 'Rewards'}</Text>
116
118
  </TouchableOpacity>
117
119
  <TouchableOpacity style={styles.actionIconWrapper} onPress={() => navigate && navigate('KarmaFAQ')}>
118
120
  <View style={[styles.actionIcon, { backgroundColor: iconFAQ }]}>
119
121
  <Ionicons name="help-circle-outline" size={28} color={darkenColor(iconFAQ)} />
120
122
  </View>
121
- <Text style={styles.actionLabel}>{t('karma.center.actions.faq') || 'FAQ'}</Text>
123
+ <Text style={[styles.actionLabel, { color: mutedTextColor }]}>{t('karma.center.actions.faq') || 'FAQ'}</Text>
122
124
  </TouchableOpacity>
123
125
  </View>
124
126
  </View>
125
- <Text style={styles.infoText}>
127
+ <Text style={[styles.infoText, { color: mutedTextColor }]}>
126
128
  {t('karma.center.info') || 'Karma can only be earned by positive actions in the Oxy Ecosystem. It cannot be sent or received directly.'}
127
129
  </Text>
128
130
  </View>
@@ -137,7 +139,7 @@ const KarmaCenterScreen: React.FC<BaseScreenProps> = ({
137
139
  ) : (
138
140
  karmaHistory.map((entry: any) => (
139
141
  <View key={entry.id} style={[styles.historyItem, { borderColor: themeStyles.borderColor }]}>
140
- <Text style={[styles.historyPoints, { color: entry.points > 0 ? primaryColor : '#D32F2F' }]}>
142
+ <Text style={[styles.historyPoints, { color: entry.points > 0 ? primaryColor : dangerColor }]}>
141
143
  {entry.points > 0 ? '+' : ''}{entry.points}
142
144
  </Text>
143
145
  <Text style={[styles.historyDesc, { color: themeStyles.textColor }]}>
@@ -150,7 +152,7 @@ const KarmaCenterScreen: React.FC<BaseScreenProps> = ({
150
152
  ))
151
153
  )}
152
154
  </View>
153
- {error && <Text style={{ color: '#D32F2F', marginTop: 16, textAlign: 'center' }}>{error}</Text>}
155
+ {error && <Text style={{ color: dangerColor, marginTop: 16, textAlign: 'center' }}>{error}</Text>}
154
156
  </ScrollView>
155
157
  </View>
156
158
  );
@@ -211,11 +213,9 @@ const styles = StyleSheet.create({
211
213
  },
212
214
  actionLabel: {
213
215
  fontSize: 10,
214
- color: '#888',
215
216
  },
216
217
  infoText: {
217
218
  fontSize: 13,
218
- color: '#888',
219
219
  textAlign: 'center',
220
220
  marginTop: 8,
221
221
  marginBottom: 8,
@@ -112,8 +112,6 @@ export const useAccountStore = create<AccountState>((set, get) => ({
112
112
  return existing &&
113
113
  existing.sessionId === newAccount.sessionId &&
114
114
  existing.userId === newAccount.userId &&
115
- existing.username === newAccount.username &&
116
- existing.displayName === newAccount.displayName &&
117
115
  existing.avatar === newAccount.avatar &&
118
116
  existing.avatarUrl === newAccount.avatarUrl;
119
117
  });
@@ -152,15 +150,7 @@ export const useAccountStore = create<AccountState>((set, get) => ({
152
150
  if (!existing) return {} as any;
153
151
 
154
152
  const updated = { ...existing, ...updates };
155
- // Check if any meaningful field has changed
156
- const hasChanges =
157
- existing.username !== updated.username ||
158
- existing.displayName !== updated.displayName ||
159
- existing.avatar !== updated.avatar ||
160
- existing.avatarUrl !== updated.avatarUrl ||
161
- existing.userId !== updated.userId;
162
-
163
- if (!hasChanges) {
153
+ if (existing.avatar === updated.avatar && existing.avatarUrl === updated.avatarUrl) {
164
154
  return {} as any; // No change
165
155
  }
166
156
 
@@ -1,65 +1,64 @@
1
- /** Auth store for Services SDK (sessions/tokens only). */
2
-
3
1
  import { create } from 'zustand';
2
+ import type { User } from '../../models/interfaces';
4
3
 
5
4
  export interface AuthState {
5
+ user: User | null;
6
6
  isAuthenticated: boolean;
7
- isOnline: boolean;
8
7
  isLoading: boolean;
9
8
  error: string | null;
10
- identitySynced: boolean;
9
+ lastUserFetch: number | null; // Timestamp of last user fetch for caching
11
10
 
12
- setOnline: (online: boolean) => void;
13
- loginSuccess: () => void;
11
+ loginSuccess: (user: User) => void;
14
12
  loginFailure: (error: string) => void;
15
13
  logout: () => void;
16
- setIdentitySynced: (synced: boolean) => void;
17
-
18
- canAuthenticate: () => boolean;
14
+ fetchUser: (oxyServices: { getCurrentUser: () => Promise<User> }, forceRefresh?: boolean) => Promise<void>;
15
+ setUser: (user: User) => void; // Direct user setter for caching
19
16
  }
20
17
 
21
- export const useAuthStore = create<AuthState>((set, get) => ({
18
+ export const useAuthStore = create<AuthState>((set: (state: Partial<AuthState>) => void, get: () => AuthState) => ({
19
+ user: null,
22
20
  isAuthenticated: false,
23
- isOnline: true, // Assume online initially
24
21
  isLoading: false,
25
22
  error: null,
26
- identitySynced: false,
27
-
28
- setOnline: (online: boolean) => {
29
- set({ isOnline: online });
30
- // If we go offline, we can't be authenticated
31
- if (!online) {
32
- set({ isAuthenticated: false });
33
- }
34
- },
35
-
36
- loginSuccess: () => set({
37
- isLoading: false,
38
- isAuthenticated: get().isOnline, // Only authenticated if online
39
- error: null,
40
- }),
23
+ lastUserFetch: null,
41
24
 
42
- loginFailure: (error: string) => set({
25
+ loginSuccess: (user: User) => set({
43
26
  isLoading: false,
44
- isAuthenticated: false,
45
- error
27
+ isAuthenticated: true,
28
+ user,
29
+ lastUserFetch: Date.now(),
46
30
  }),
47
-
31
+ loginFailure: (error: string) => set({ isLoading: false, error }),
48
32
  logout: () => set({
49
- isAuthenticated: false,
50
- error: null,
51
- identitySynced: false,
33
+ user: null,
34
+ isAuthenticated: false,
35
+ lastUserFetch: null,
52
36
  }),
53
-
54
- // Track whether identity registration is confirmed with backend
55
- setIdentitySynced: (synced: boolean) => set({ identitySynced: synced }),
56
-
57
- /**
58
- * Check if user can authenticate
59
- * Requires both valid tokens (checked by caller) and network
60
- */
61
- canAuthenticate: () => {
37
+ setUser: (user: User) => set({ user, lastUserFetch: Date.now() }),
38
+ fetchUser: async (oxyServices, forceRefresh = false) => {
62
39
  const state = get();
63
- return state.isOnline;
40
+ const now = Date.now();
41
+ const cacheAge = state.lastUserFetch ? now - state.lastUserFetch : Number.POSITIVE_INFINITY;
42
+ const cacheValid = cacheAge < 5 * 60 * 1000; // 5 minutes cache
43
+
44
+ // Use cached data if available and not forcing refresh
45
+ if (!forceRefresh && state.user && cacheValid) {
46
+ if (__DEV__) {
47
+ console.log('AuthStore: Using cached user data (age:', cacheAge, 'ms)');
48
+ }
49
+ return;
50
+ }
51
+
52
+ set({ isLoading: true, error: null });
53
+ try {
54
+ const user = await oxyServices.getCurrentUser();
55
+ set({ user, isLoading: false, isAuthenticated: true, lastUserFetch: now });
56
+ } catch (error) {
57
+ const errorMessage = error instanceof Error ? error.message : 'Failed to fetch user';
58
+ if (__DEV__) {
59
+ console.error('AuthStore: Error fetching user:', error);
60
+ }
61
+ set({ error: errorMessage, isLoading: false });
62
+ }
64
63
  },
65
- }));
64
+ }));
@@ -8,7 +8,20 @@ import { StyleSheet } from 'react-native';
8
8
  export const STEP_GAP = 12; // Vertical gap between ALL elements (illustration, title, description, textfield, buttons, etc.) - must be consistent everywhere
9
9
  export const STEP_INNER_GAP = 12; // Gap within sections (headers, cards, etc.) - must match STEP_GAP for uniformity
10
10
 
11
- // Import spacing constants directly from '../constants/spacing' where needed.
11
+ /**
12
+ * Re-export screen spacing constants from constants/spacing.ts
13
+ * This allows importing all spacing constants from a single location
14
+ */
15
+ export {
16
+ SCREEN_PADDING_HORIZONTAL,
17
+ SCREEN_PADDING_VERTICAL,
18
+ SECTION_GAP,
19
+ SECTION_GAP_LARGE,
20
+ COMPONENT_GAP,
21
+ COMPONENT_GAP_SMALL,
22
+ HEADER_PADDING_TOP_OVERVIEW,
23
+ HEADER_PADDING_TOP_SETTINGS,
24
+ } from '../constants/spacing';
12
25
 
13
26
  /**
14
27
  * Reusable stylesheet for step components
@@ -24,7 +37,7 @@ export const stepStyles = StyleSheet.create({
24
37
  },
25
38
  sectionSpacing: {
26
39
  // Layout removed - do NOT use for spacing, use explicit marginBottom: 0
27
- // This should not add margins
40
+ // This is kept for backward compatibility but should not add margins
28
41
  marginBottom: 0,
29
42
  },
30
43
  header: {
@@ -50,12 +50,12 @@ export interface BaseScreenProps {
50
50
  export interface OxyProviderProps {
51
51
  oxyServices?: unknown;
52
52
  children?: ReactNode;
53
- contextOnly?: boolean;
54
53
  onAuthStateChange?: (user: unknown) => void;
55
54
  storageKeyPrefix?: string;
56
55
  baseURL?: string;
56
+ authWebUrl?: string;
57
+ authRedirectUri?: string;
57
58
  queryClient?: QueryClient;
58
59
  }
59
60
 
60
61
 
61
-
@@ -1,9 +1,9 @@
1
1
  import type { OxyServices } from '../../core';
2
2
  import type { User } from '../../models/interfaces';
3
3
  import { useAccountStore } from '../stores/accountStore';
4
+ import { useAuthStore } from '../stores/authStore';
4
5
  import { QueryClient } from '@tanstack/react-query';
5
6
  import { queryKeys, invalidateUserQueries, invalidateAccountQueries } from '../hooks/queries/queryKeys';
6
- import { logger } from '../../utils/loggerUtils';
7
7
 
8
8
  /**
9
9
  * Updates file visibility to public for avatar use.
@@ -35,7 +35,6 @@ export async function updateAvatarVisibility(
35
35
  }
36
36
 
37
37
  /**
38
- * @deprecated Use refreshAccountInStore instead for full profile sync
39
38
  * Refreshes avatar in accountStore with cache-busted URL to force image reload.
40
39
  *
41
40
  * @param sessionId - The session ID for the account to update
@@ -55,41 +54,6 @@ export function refreshAvatarInStore(
55
54
  });
56
55
  }
57
56
 
58
- /**
59
- * Refreshes all user profile data in accountStore (username, displayName, avatar).
60
- * This ensures accountStore stays in sync with profile changes.
61
- *
62
- * @param sessionId - The session ID for the account to update
63
- * @param userData - The updated user data
64
- * @param oxyServices - OxyServices instance to generate download URL
65
- */
66
- export function refreshAccountInStore(
67
- sessionId: string,
68
- userData: Partial<User>,
69
- oxyServices: OxyServices
70
- ): void {
71
- const { updateAccount } = useAccountStore.getState();
72
-
73
- const displayName = userData.name?.full || userData.name?.first || userData.username || 'Account';
74
- const avatarUrl = userData.avatar
75
- ? oxyServices.getFileDownloadUrl(userData.avatar, 'thumb') + `?t=${Date.now()}`
76
- : undefined;
77
-
78
- logger.debug('Refreshing account in store', {
79
- component: 'AccountStore',
80
- sessionId,
81
- username: userData.username,
82
- hasAvatar: !!userData.avatar
83
- });
84
-
85
- updateAccount(sessionId, {
86
- username: userData.username,
87
- displayName,
88
- avatar: userData.avatar,
89
- avatarUrl,
90
- });
91
- }
92
-
93
57
  /**
94
58
  * Updates user profile with avatar and handles all side effects (query invalidation, accountStore update).
95
59
  * This function can be used from within OxyContext provider without requiring useOxy hook.
@@ -98,6 +62,7 @@ export function refreshAccountInStore(
98
62
  * @param oxyServices - OxyServices instance
99
63
  * @param activeSessionId - Active session ID
100
64
  * @param queryClient - TanStack Query client
65
+ * @param syncSession - Optional function to sync session/refresh token when auth errors occur
101
66
  * @returns Promise that resolves with updated user data
102
67
  */
103
68
  export async function updateProfileWithAvatar(
@@ -105,15 +70,28 @@ export async function updateProfileWithAvatar(
105
70
  oxyServices: OxyServices,
106
71
  activeSessionId: string | null,
107
72
  queryClient: QueryClient,
108
- options?: { deviceId?: string }
73
+ syncSession?: () => Promise<User>
109
74
  ): Promise<User> {
110
- const { deviceId } = options || {};
111
75
  // Ensure we have a valid token before making the request
112
76
  if (!oxyServices.hasValidToken() && activeSessionId) {
113
77
  try {
114
- await oxyServices.getTokenBySession(activeSessionId, deviceId);
78
+ await oxyServices.getTokenBySession(activeSessionId);
115
79
  } catch (tokenError) {
116
- throw tokenError;
80
+ const errorMessage = tokenError instanceof Error ? tokenError.message : String(tokenError);
81
+ if (errorMessage.includes('AUTH_REQUIRED_OFFLINE_SESSION') || errorMessage.includes('offline')) {
82
+ if (syncSession) {
83
+ try {
84
+ await syncSession();
85
+ await oxyServices.getTokenBySession(activeSessionId);
86
+ } catch (syncError) {
87
+ throw new Error('Session needs to be synced. Please try again.');
88
+ }
89
+ } else {
90
+ throw tokenError;
91
+ }
92
+ } else {
93
+ throw tokenError;
94
+ }
117
95
  }
118
96
  }
119
97
 
@@ -126,9 +104,12 @@ export async function updateProfileWithAvatar(
126
104
  queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);
127
105
  }
128
106
 
129
- // Refresh accountStore with all updated profile data
130
- if (activeSessionId) {
131
- refreshAccountInStore(activeSessionId, data, oxyServices);
107
+ // Update authStore so frontend components see the changes immediately
108
+ useAuthStore.getState().setUser(data);
109
+
110
+ // If avatar was updated, refresh accountStore with cache-busted URL
111
+ if (updates.avatar && activeSessionId) {
112
+ refreshAvatarInStore(activeSessionId, updates.avatar, oxyServices);
132
113
  }
133
114
 
134
115
  // Invalidate all related queries to refresh everywhere
@@ -141,10 +122,22 @@ export async function updateProfileWithAvatar(
141
122
  const status = error?.status || error?.response?.status;
142
123
 
143
124
  // Handle authentication errors
144
- if (status === 401 || errorMessage.includes('Authentication required') || errorMessage.includes('Invalid or missing authorization header')) {
145
- throw new Error('Authentication failed. Please sign in again.');
125
+ if (status === 401 || errorMessage.includes('Authentication required') || errorMessage.includes('Invalid or missing authorization header')) {
126
+ if (activeSessionId && syncSession) {
127
+ try {
128
+ await syncSession();
129
+ await oxyServices.getTokenBySession(activeSessionId);
130
+ // Retry the update after getting token
131
+ return await updateProfileWithAvatar(updates, oxyServices, activeSessionId, queryClient, syncSession);
132
+ } catch (retryError) {
133
+ throw new Error('Authentication failed. Please sign in again.');
134
+ }
135
+ } else {
136
+ throw new Error('No active session. Please sign in.');
137
+ }
146
138
  }
147
139
 
148
140
  throw error;
149
141
  }
150
142
  }
143
+
@@ -11,10 +11,6 @@ export interface SessionStorageKeys {
11
11
  language: string;
12
12
  }
13
13
 
14
- export interface CreateStorageOptions {
15
- prefix?: string;
16
- }
17
-
18
14
  /**
19
15
  * Create an in-memory storage implementation used as a safe fallback.
20
16
  */
@@ -6,6 +6,7 @@ import {
6
6
  isValidObject,
7
7
  isValidEmail,
8
8
  isValidUsername,
9
+ isValidPassword,
9
10
  isValidUUID,
10
11
  isValidDate,
11
12
  isValidFileSize,
@@ -124,6 +125,20 @@ describe('Validation Utils', () => {
124
125
  });
125
126
  });
126
127
 
128
+ describe('isValidPassword', () => {
129
+ it('should return true for valid passwords', () => {
130
+ expect(isValidPassword('password123')).toBe(true);
131
+ expect(isValidPassword('mySecurePass')).toBe(true);
132
+ expect(isValidPassword('12345678')).toBe(true);
133
+ });
134
+
135
+ it('should return false for invalid passwords', () => {
136
+ expect(isValidPassword('')).toBe(false);
137
+ expect(isValidPassword('short')).toBe(false); // too short
138
+ expect(isValidPassword('1234567')).toBe(false); // too short
139
+ });
140
+ });
141
+
127
142
  describe('isValidUUID', () => {
128
143
  it('should return true for valid UUIDs', () => {
129
144
  expect(isValidUUID('123e4567-e89b-12d3-a456-426614174000')).toBe(true);
@@ -218,4 +233,4 @@ describe('Validation Utils', () => {
218
233
  expect(validateAndSanitizeUserInput(123, 'string')).toBeNull();
219
234
  });
220
235
  });
221
- });
236
+ });
@@ -211,4 +211,11 @@ export function logError(error: unknown, context?: string): void {
211
211
  method: 'logError',
212
212
  });
213
213
  }
214
- }
214
+ }
215
+
216
+ /**
217
+ * Retry function with exponential backoff
218
+ * Re-exports retryAsync for backward compatibility
219
+ * @deprecated Use retryAsync from asyncUtils instead
220
+ */
221
+ export { retryAsync as retryWithBackoff } from './asyncUtils';
@@ -12,6 +12,11 @@ export const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
12
12
  */
13
13
  export const USERNAME_REGEX = /^[a-zA-Z0-9_-]{3,30}$/;
14
14
 
15
+ /**
16
+ * Password validation regex (at least 8 chars, 1 uppercase, 1 lowercase, 1 number)
17
+ */
18
+ // At least 8 characters (tests expect len>=8 without complexity requirements)
19
+ export const PASSWORD_REGEX = /^.{8,}$/;
15
20
 
16
21
  /**
17
22
  * Validate email format
@@ -27,6 +32,13 @@ export function isValidUsername(username: string): boolean {
27
32
  return USERNAME_REGEX.test(username);
28
33
  }
29
34
 
35
+ /**
36
+ * Validate password strength
37
+ */
38
+ export function isValidPassword(password: string): boolean {
39
+ return PASSWORD_REGEX.test(password);
40
+ }
41
+
30
42
  /**
31
43
  * Validate required string
32
44
  */