@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
@@ -1,7 +1,7 @@
1
1
  import { useCallback } from 'react';
2
2
  import { useI18n } from './useI18n';
3
3
  import { useUpdateProfile } from './mutations/useAccountMutations';
4
- import { useCurrentUser } from './queries/useAccountQueries';
4
+ import { useAuthStore } from '../stores/authStore';
5
5
 
6
6
  export interface ProfileUpdateData {
7
7
  displayName?: string;
@@ -34,7 +34,6 @@ export interface ProfileUpdateData {
34
34
  export const useProfileEditing = () => {
35
35
  const { t } = useI18n();
36
36
  const updateProfileMutation = useUpdateProfile();
37
- const { data: currentUser } = useCurrentUser();
38
37
 
39
38
  /**
40
39
  * Save profile updates to the server using TanStack Query
@@ -72,6 +71,7 @@ export const useProfileEditing = () => {
72
71
 
73
72
  // Handle name field
74
73
  if (updates.displayName !== undefined || updates.lastName !== undefined) {
74
+ const currentUser = useAuthStore.getState().user;
75
75
  const currentName = currentUser?.name;
76
76
  updateData.name = {
77
77
  first: updates.displayName ?? (typeof currentName === 'object' ? currentName?.first : '') ?? '',
@@ -86,7 +86,7 @@ export const useProfileEditing = () => {
86
86
  // Error toast is handled by the mutation
87
87
  return false;
88
88
  }
89
- }, [updateProfileMutation, t, currentUser]);
89
+ }, [updateProfileMutation, t]);
90
90
 
91
91
  /**
92
92
  * Update a single profile field
@@ -9,9 +9,6 @@ import type { OxyServices } from '../../core';
9
9
  import type { QueryClient } from '@tanstack/react-query';
10
10
  import { clearQueryCache } from './queryClient';
11
11
 
12
- const getDeviceIdForSession = (sessions: ClientSession[] = [], sessionId: string | null) =>
13
- sessionId ? sessions.find((s) => s.sessionId === sessionId)?.deviceId : undefined;
14
-
15
12
  export interface UseSessionManagementOptions {
16
13
  oxyServices: OxyServices;
17
14
  storage: StorageInterface | null;
@@ -147,8 +144,7 @@ export const useSessionManagement = ({
147
144
  try {
148
145
  await storage.removeItem(storageKeys.activeSessionId);
149
146
  await storage.removeItem(storageKeys.sessionIds);
150
- // Clear identity sync state
151
- await storage.removeItem('oxy_identity_synced').catch(() => {});
147
+ // Note: Identity sync state ('oxy_identity_synced') is managed by accounts app
152
148
  } catch (error) {
153
149
  handleAuthError(error, {
154
150
  defaultMessage: CLEAR_STORAGE_ERROR,
@@ -164,7 +160,6 @@ export const useSessionManagement = ({
164
160
  setSessions([]);
165
161
  setActiveSessionId(null);
166
162
  logoutStore();
167
- oxyServices.clearTokens();
168
163
 
169
164
  // Clear TanStack Query cache (in-memory)
170
165
  if (queryClient) {
@@ -184,12 +179,11 @@ export const useSessionManagement = ({
184
179
 
185
180
  await clearSessionStorage();
186
181
  onAuthStateChange?.(null);
187
- }, [clearSessionStorage, logoutStore, onAuthStateChange, queryClient, storage, logger, oxyServices]);
182
+ }, [clearSessionStorage, logoutStore, onAuthStateChange, queryClient, storage, logger]);
188
183
 
189
184
  const activateSession = useCallback(
190
185
  async (sessionId: string, user: User): Promise<void> => {
191
- const deviceId = getDeviceIdForSession(sessions, sessionId);
192
- await oxyServices.getTokenBySession(sessionId, deviceId);
186
+ await oxyServices.getTokenBySession(sessionId);
193
187
  setTokenReady?.(true);
194
188
  setActiveSessionId(sessionId);
195
189
  loginSuccess(user);
@@ -199,7 +193,6 @@ export const useSessionManagement = ({
199
193
  },
200
194
  [
201
195
  applyLanguagePreference,
202
- sessions,
203
196
  loginSuccess,
204
197
  onAuthStateChange,
205
198
  oxyServices,
@@ -403,3 +396,5 @@ export const useSessionManagement = ({
403
396
  isRefreshInFlight,
404
397
  };
405
398
  };
399
+
400
+
@@ -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
+ }
@@ -0,0 +1,147 @@
1
+ import { useState, useCallback, useEffect } from 'react';
2
+ import { toast } from '../../lib/sonner';
3
+
4
+ interface UseSettingToggleOptions {
5
+ /** Initial value of the setting */
6
+ initialValue: boolean;
7
+ /** Function to save the setting to the server */
8
+ onSave: (value: boolean) => Promise<void>;
9
+ /** Success message when saving */
10
+ successMessage?: string;
11
+ /** Error message when save fails */
12
+ errorMessage?: string;
13
+ /** Whether to revert on error (default: true) */
14
+ revertOnError?: boolean;
15
+ /** Whether to show success toast (default: false) */
16
+ showSuccessToast?: boolean;
17
+ }
18
+
19
+ interface UseSettingToggleReturn {
20
+ /** Current value */
21
+ value: boolean;
22
+ /** Whether the setting is being saved */
23
+ isSaving: boolean;
24
+ /** Toggle the setting (optimistic update with revert on error) */
25
+ toggle: () => Promise<void>;
26
+ /** Set the value directly */
27
+ setValue: (value: boolean) => void;
28
+ }
29
+
30
+ /**
31
+ * Hook for handling boolean toggle settings with optimistic updates.
32
+ * Automatically reverts to the previous value if the save fails.
33
+ *
34
+ * @example
35
+ * const { value, toggle, isSaving } = useSettingToggle({
36
+ * initialValue: user.notificationsEnabled,
37
+ * onSave: (value) => api.updateNotifications(value),
38
+ * errorMessage: 'Failed to update notifications',
39
+ * });
40
+ *
41
+ * <Switch value={value} onValueChange={toggle} disabled={isSaving} />
42
+ */
43
+ export function useSettingToggle(options: UseSettingToggleOptions): UseSettingToggleReturn {
44
+ const {
45
+ initialValue,
46
+ onSave,
47
+ successMessage,
48
+ errorMessage = 'Failed to save setting',
49
+ revertOnError = true,
50
+ showSuccessToast = false,
51
+ } = options;
52
+
53
+ const [value, setValue] = useState(initialValue);
54
+ const [isSaving, setIsSaving] = useState(false);
55
+
56
+ // Update value when initialValue changes (e.g., from server)
57
+ useEffect(() => {
58
+ setValue(initialValue);
59
+ }, [initialValue]);
60
+
61
+ const toggle = useCallback(async () => {
62
+ const previousValue = value;
63
+ const newValue = !value;
64
+
65
+ // Optimistic update
66
+ setValue(newValue);
67
+ setIsSaving(true);
68
+
69
+ try {
70
+ await onSave(newValue);
71
+
72
+ if (showSuccessToast && successMessage) {
73
+ toast.success(successMessage);
74
+ }
75
+ } catch (err: any) {
76
+ // Revert on error
77
+ if (revertOnError) {
78
+ setValue(previousValue);
79
+ }
80
+
81
+ toast.error(errorMessage || err?.message || 'An error occurred');
82
+ } finally {
83
+ setIsSaving(false);
84
+ }
85
+ }, [value, onSave, successMessage, errorMessage, revertOnError, showSuccessToast]);
86
+
87
+ return { value, isSaving, toggle, setValue };
88
+ }
89
+
90
+ /**
91
+ * Hook for managing multiple toggle settings at once.
92
+ * Useful when you have several related boolean settings.
93
+ */
94
+ export function useSettingToggles<T extends Record<string, boolean>>(options: {
95
+ initialValues: T;
96
+ onSave: (key: keyof T, value: boolean) => Promise<void>;
97
+ errorMessage?: string | ((key: keyof T) => string);
98
+ revertOnError?: boolean;
99
+ }): {
100
+ values: T;
101
+ savingKeys: Set<keyof T>;
102
+ toggle: (key: keyof T) => Promise<void>;
103
+ setValues: (values: T) => void;
104
+ } {
105
+ const { initialValues, onSave, errorMessage = 'Failed to save setting', revertOnError = true } = options;
106
+
107
+ const [values, setValues] = useState<T>(initialValues);
108
+ const [savingKeys, setSavingKeys] = useState<Set<keyof T>>(new Set());
109
+
110
+ // Update values when initialValues change
111
+ useEffect(() => {
112
+ setValues(initialValues);
113
+ }, [initialValues]);
114
+
115
+ const toggle = useCallback(async (key: keyof T) => {
116
+ const previousValue = values[key];
117
+ const newValue = !previousValue;
118
+
119
+ // Optimistic update
120
+ setValues(prev => ({ ...prev, [key]: newValue }));
121
+ setSavingKeys(prev => new Set(prev).add(key));
122
+
123
+ try {
124
+ await onSave(key, newValue);
125
+ } catch (err: any) {
126
+ // Revert on error
127
+ if (revertOnError) {
128
+ setValues(prev => ({ ...prev, [key]: previousValue }));
129
+ }
130
+
131
+ const message = typeof errorMessage === 'function'
132
+ ? errorMessage(key)
133
+ : errorMessage;
134
+ toast.error(message || err?.message || 'An error occurred');
135
+ } finally {
136
+ setSavingKeys(prev => {
137
+ const next = new Set(prev);
138
+ next.delete(key);
139
+ return next;
140
+ });
141
+ }
142
+ }, [values, onSave, errorMessage, revertOnError]);
143
+
144
+ return { values, savingKeys, toggle, setValues };
145
+ }
146
+
147
+ export default useSettingToggle;
@@ -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
-