@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.
- package/README.md +32 -38
- package/lib/commonjs/core/CrossDomainAuth.js +277 -0
- package/lib/commonjs/core/CrossDomainAuth.js.map +1 -0
- package/lib/commonjs/core/HttpService.js +82 -15
- package/lib/commonjs/core/HttpService.js.map +1 -1
- package/lib/commonjs/core/OxyServices.base.js +11 -3
- package/lib/commonjs/core/OxyServices.base.js.map +1 -1
- package/lib/commonjs/core/OxyServices.js +4 -1
- package/lib/commonjs/core/OxyServices.js.map +1 -1
- package/lib/commonjs/core/index.js +30 -0
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.assets.js +16 -3
- package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.auth.js +73 -32
- package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.features.js +372 -0
- package/lib/commonjs/core/mixins/OxyServices.features.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js +289 -0
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.popup.js +352 -0
- package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.redirect.js +378 -0
- package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.user.js +35 -24
- package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/commonjs/core/mixins/index.js +28 -15
- package/lib/commonjs/core/mixins/index.js.map +1 -1
- package/lib/commonjs/crypto/index.js +30 -0
- package/lib/commonjs/crypto/index.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +902 -0
- package/lib/commonjs/crypto/keyManager.js.map +1 -0
- package/lib/commonjs/crypto/polyfill.js +14 -5
- package/lib/commonjs/crypto/polyfill.js.map +1 -1
- package/lib/commonjs/crypto/recoveryPhrase.js +152 -0
- package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
- package/lib/commonjs/crypto/signatureService.js +289 -0
- package/lib/commonjs/crypto/signatureService.js.map +1 -0
- package/lib/commonjs/i18n/locales/en-US.json +1 -1
- package/lib/commonjs/index.js +40 -26
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/interfaces.js +0 -15
- package/lib/commonjs/models/interfaces.js.map +1 -1
- package/lib/commonjs/ui/components/BottomSheetRouter.js +9 -1
- package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedItem.js +11 -1
- package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
- package/lib/commonjs/ui/components/Icon.js.map +1 -1
- package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +41 -11
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/SettingRow.js +17 -4
- package/lib/commonjs/ui/components/SettingRow.js.map +1 -1
- package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -1
- package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -1
- package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -1
- package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -1
- package/lib/commonjs/ui/components/feedback/FormInput.js +72 -0
- package/lib/commonjs/ui/components/feedback/FormInput.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/ProgressIndicator.js +33 -0
- package/lib/commonjs/ui/components/feedback/ProgressIndicator.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/constants.js +59 -0
- package/lib/commonjs/ui/components/feedback/constants.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/feedbackStyles.js +262 -0
- package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/index.js +54 -0
- package/lib/commonjs/ui/components/feedback/index.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/types.js +6 -0
- package/lib/commonjs/ui/components/feedback/types.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/useFeedbackForm.js +52 -0
- package/lib/commonjs/ui/components/feedback/useFeedbackForm.js.map +1 -0
- package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +282 -0
- package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -0
- package/lib/commonjs/ui/components/modals/index.js +14 -0
- package/lib/commonjs/ui/components/modals/index.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +309 -0
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +79 -0
- package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +108 -0
- package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +79 -0
- package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +176 -0
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/constants.js +53 -0
- package/lib/commonjs/ui/components/payment/constants.js.map +1 -0
- package/lib/commonjs/ui/components/payment/index.js +80 -0
- package/lib/commonjs/ui/components/payment/index.js.map +1 -0
- package/lib/commonjs/ui/components/payment/paymentStyles.js +409 -0
- package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -0
- package/lib/commonjs/ui/components/payment/types.js +6 -0
- package/lib/commonjs/ui/components/payment/types.js.map +1 -0
- package/lib/commonjs/ui/context/OxyContext.js +110 -199
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +150 -19
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js +279 -0
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
- package/lib/commonjs/ui/hooks/index.js +26 -0
- package/lib/commonjs/ui/hooks/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +79 -72
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +38 -51
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +3 -3
- package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +18 -12
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAsyncAction.js +95 -0
- package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -0
- package/lib/commonjs/ui/hooks/useProfileEditing.js +3 -5
- package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionManagement.js +4 -8
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionSocket.js +162 -315
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSettingToggle.js +126 -0
- package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -0
- package/lib/commonjs/ui/hooks/useStorage.js +24 -58
- package/lib/commonjs/ui/hooks/useStorage.js.map +1 -1
- package/lib/commonjs/ui/index.js +50 -21
- package/lib/commonjs/ui/index.js.map +1 -1
- package/lib/commonjs/ui/navigation/routes.js +6 -1
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +6 -4
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +33 -30
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +29 -24
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +3 -3
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FAQScreen.js +315 -0
- package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/FeedbackScreen.js +73 -590
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HelpSupportScreen.js +8 -7
- package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +134 -66
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +67 -1395
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +6 -13
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +13 -5
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +16 -10
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +23 -11
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/stores/accountStore.js +2 -4
- package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
- package/lib/commonjs/ui/stores/authStore.js +45 -32
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/commonjs/ui/styles/spacing.js +54 -2
- package/lib/commonjs/ui/styles/spacing.js.map +1 -1
- package/lib/commonjs/ui/utils/avatarUtils.js +37 -41
- package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
- package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -1
- package/lib/commonjs/utils/errorUtils.js +13 -0
- package/lib/commonjs/utils/errorUtils.js.map +1 -1
- package/lib/commonjs/utils/validationUtils.js +15 -1
- package/lib/commonjs/utils/validationUtils.js.map +1 -1
- package/lib/module/core/CrossDomainAuth.js +271 -0
- package/lib/module/core/CrossDomainAuth.js.map +1 -0
- package/lib/module/core/HttpService.js +82 -15
- package/lib/module/core/HttpService.js.map +1 -1
- package/lib/module/core/OxyServices.base.js +11 -4
- package/lib/module/core/OxyServices.base.js.map +1 -1
- package/lib/module/core/OxyServices.js +4 -1
- package/lib/module/core/OxyServices.js.map +1 -1
- package/lib/module/core/index.js +6 -1
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.assets.js +16 -3
- package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.auth.js +73 -32
- package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.features.js +369 -0
- package/lib/module/core/mixins/OxyServices.features.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.fedcm.js +286 -0
- package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.popup.js +349 -0
- package/lib/module/core/mixins/OxyServices.popup.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.redirect.js +375 -0
- package/lib/module/core/mixins/OxyServices.redirect.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.user.js +35 -24
- package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/module/core/mixins/index.js +16 -3
- package/lib/module/core/mixins/index.js.map +1 -1
- package/lib/module/crypto/index.js +8 -4
- package/lib/module/crypto/index.js.map +1 -1
- package/lib/module/crypto/keyManager.js +899 -0
- package/lib/module/crypto/keyManager.js.map +1 -0
- package/lib/module/crypto/polyfill.js +6 -5
- package/lib/module/crypto/polyfill.js.map +1 -1
- package/lib/module/crypto/recoveryPhrase.js +147 -0
- package/lib/module/crypto/recoveryPhrase.js.map +1 -0
- package/lib/module/crypto/signatureService.js +286 -0
- package/lib/module/crypto/signatureService.js.map +1 -0
- package/lib/module/i18n/locales/en-US.json +1 -1
- package/lib/module/index.js +6 -9
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/interfaces.js +0 -15
- package/lib/module/models/interfaces.js.map +1 -1
- package/lib/module/ui/components/BottomSheetRouter.js +6 -2
- package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
- package/lib/module/ui/components/GroupedItem.js +11 -1
- package/lib/module/ui/components/GroupedItem.js.map +1 -1
- package/lib/module/ui/components/Icon.js.map +1 -1
- package/lib/module/ui/components/IconButton/utils.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +41 -11
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/SettingRow.js +17 -4
- package/lib/module/ui/components/SettingRow.js.map +1 -1
- package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -1
- package/lib/module/ui/components/TextField/helpers.js.map +1 -1
- package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -1
- package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -1
- package/lib/module/ui/components/feedback/FormInput.js +67 -0
- package/lib/module/ui/components/feedback/FormInput.js.map +1 -0
- package/lib/module/ui/components/feedback/ProgressIndicator.js +28 -0
- package/lib/module/ui/components/feedback/ProgressIndicator.js.map +1 -0
- package/lib/module/ui/components/feedback/constants.js +55 -0
- package/lib/module/ui/components/feedback/constants.js.map +1 -0
- package/lib/module/ui/components/feedback/feedbackStyles.js +257 -0
- package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -0
- package/lib/module/ui/components/feedback/index.js +8 -0
- package/lib/module/ui/components/feedback/index.js.map +1 -0
- package/lib/module/ui/components/feedback/types.js +4 -0
- package/lib/module/ui/components/feedback/types.js.map +1 -0
- package/lib/module/ui/components/feedback/useFeedbackForm.js +47 -0
- package/lib/module/ui/components/feedback/useFeedbackForm.js.map +1 -0
- package/lib/module/ui/components/modals/DeleteAccountModal.js +276 -0
- package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -0
- package/lib/module/ui/components/modals/index.js +4 -0
- package/lib/module/ui/components/modals/index.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentDetailsStep.js +303 -0
- package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentMethodStep.js +73 -0
- package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentReviewStep.js +102 -0
- package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentSuccessStep.js +73 -0
- package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentSummaryStep.js +170 -0
- package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -0
- package/lib/module/ui/components/payment/constants.js +47 -0
- package/lib/module/ui/components/payment/constants.js.map +1 -0
- package/lib/module/ui/components/payment/index.js +10 -0
- package/lib/module/ui/components/payment/index.js.map +1 -0
- package/lib/module/ui/components/payment/paymentStyles.js +404 -0
- package/lib/module/ui/components/payment/paymentStyles.js.map +1 -0
- package/lib/module/ui/components/payment/types.js +4 -0
- package/lib/module/ui/components/payment/types.js.map +1 -0
- package/lib/module/ui/context/OxyContext.js +112 -191
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +150 -19
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/hooks/useSessionManagement.js +274 -0
- package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
- package/lib/module/ui/hooks/index.js +2 -0
- package/lib/module/ui/hooks/index.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +80 -72
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/queries/useAccountQueries.js +31 -44
- package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/module/ui/hooks/queries/useSecurityQueries.js +1 -1
- package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
- package/lib/module/ui/hooks/queries/useServicesQueries.js +13 -7
- package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js +89 -0
- package/lib/module/ui/hooks/useAsyncAction.js.map +1 -0
- package/lib/module/ui/hooks/useProfileEditing.js +3 -5
- package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
- package/lib/module/ui/hooks/useSessionManagement.js +4 -8
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/hooks/useSessionSocket.js +162 -315
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js +120 -0
- package/lib/module/ui/hooks/useSettingToggle.js.map +1 -0
- package/lib/module/ui/hooks/useStorage.js +25 -59
- package/lib/module/ui/hooks/useStorage.js.map +1 -1
- package/lib/module/ui/index.js +15 -10
- package/lib/module/ui/index.js.map +1 -1
- package/lib/module/ui/navigation/routes.js +6 -1
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +6 -4
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +33 -30
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +29 -24
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +3 -3
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/FAQScreen.js +310 -0
- package/lib/module/ui/screens/FAQScreen.js.map +1 -0
- package/lib/module/ui/screens/FeedbackScreen.js +64 -581
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/HelpSupportScreen.js +8 -7
- package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +135 -68
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js +67 -1397
- package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +6 -13
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +13 -5
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.js +16 -10
- package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js +23 -11
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/module/ui/stores/accountStore.js +2 -4
- package/lib/module/ui/stores/accountStore.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +45 -32
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/module/ui/styles/spacing.js +6 -2
- package/lib/module/ui/styles/spacing.js.map +1 -1
- package/lib/module/ui/utils/avatarUtils.js +37 -40
- package/lib/module/ui/utils/avatarUtils.js.map +1 -1
- package/lib/module/ui/utils/storageHelpers.js.map +1 -1
- package/lib/module/utils/errorUtils.js +7 -0
- package/lib/module/utils/errorUtils.js.map +1 -1
- package/lib/module/utils/validationUtils.js +13 -0
- package/lib/module/utils/validationUtils.js.map +1 -1
- package/lib/typescript/core/CrossDomainAuth.d.ts +161 -0
- package/lib/typescript/core/CrossDomainAuth.d.ts.map +1 -0
- package/lib/typescript/core/HttpService.d.ts +1 -1
- package/lib/typescript/core/HttpService.d.ts.map +1 -1
- package/lib/typescript/core/OxyServices.base.d.ts +0 -6
- package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
- package/lib/typescript/core/OxyServices.d.ts +5 -36
- package/lib/typescript/core/OxyServices.d.ts.map +1 -1
- package/lib/typescript/core/index.d.ts +4 -0
- package/lib/typescript/core/index.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts +40 -20
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.features.d.ts +229 -0
- package/lib/typescript/core/mixins/OxyServices.features.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts +195 -0
- package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.popup.d.ts +206 -0
- package/lib/typescript/core/mixins/OxyServices.popup.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.redirect.d.ts +246 -0
- package/lib/typescript/core/mixins/OxyServices.redirect.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts +6 -4
- package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
- package/lib/typescript/core/mixins/index.d.ts +291 -9
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/crypto/index.d.ts +6 -3
- package/lib/typescript/crypto/index.d.ts.map +1 -1
- package/lib/typescript/crypto/keyManager.d.ts +190 -0
- package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
- package/lib/typescript/crypto/polyfill.d.ts +4 -3
- package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
- package/lib/typescript/crypto/recoveryPhrase.d.ts +59 -0
- package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
- package/lib/typescript/crypto/signatureService.d.ts +87 -0
- package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +5 -6
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/models/interfaces.d.ts +2 -14
- package/lib/typescript/models/interfaces.d.ts.map +1 -1
- package/lib/typescript/models/session.d.ts +0 -9
- package/lib/typescript/models/session.d.ts.map +1 -1
- package/lib/typescript/types/bip39.d.ts +32 -0
- package/lib/typescript/ui/components/BottomSheetRouter.d.ts +5 -0
- package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts +5 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
- package/lib/typescript/ui/components/IconButton/utils.d.ts +1 -1
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/SettingRow.d.ts +6 -0
- package/lib/typescript/ui/components/SettingRow.d.ts.map +1 -1
- package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
- package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +1 -1
- package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -1
- package/lib/typescript/ui/components/TextField/helpers.d.ts +8 -8
- package/lib/typescript/ui/components/TextField/types.d.ts +1 -0
- package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
- package/lib/typescript/ui/components/feedback/FormInput.d.ts +20 -0
- package/lib/typescript/ui/components/feedback/FormInput.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts +11 -0
- package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/constants.d.ts +5 -0
- package/lib/typescript/ui/components/feedback/constants.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts +280 -0
- package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/index.d.ts +7 -0
- package/lib/typescript/ui/components/feedback/index.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/types.d.ts +46 -0
- package/lib/typescript/ui/components/feedback/types.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts +9 -0
- package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts.map +1 -0
- package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts +19 -0
- package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts.map +1 -0
- package/lib/typescript/ui/components/modals/index.d.ts +2 -0
- package/lib/typescript/ui/components/modals/index.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts +21 -0
- package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts +14 -0
- package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts +16 -0
- package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts +10 -0
- package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts +15 -0
- package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/constants.d.ts +7 -0
- package/lib/typescript/ui/components/payment/constants.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/index.d.ts +9 -0
- package/lib/typescript/ui/components/payment/index.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/paymentStyles.d.ts +396 -0
- package/lib/typescript/ui/components/payment/paymentStyles.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/types.d.ts +40 -0
- package/lib/typescript/ui/components/payment/types.d.ts.map +1 -0
- package/lib/typescript/ui/components/types.d.ts +4 -0
- package/lib/typescript/ui/components/types.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +57 -3
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +10 -3
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +41 -0
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/index.d.ts +2 -0
- package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useAsyncAction.d.ts +51 -0
- package/lib/typescript/ui/hooks/useAsyncAction.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -2
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSettingToggle.d.ts +55 -0
- package/lib/typescript/ui/hooks/useSettingToggle.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/useStorage.d.ts +3 -9
- package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -1
- package/lib/typescript/ui/index.d.ts +6 -2
- package/lib/typescript/ui/index.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/FAQScreen.d.ts +5 -0
- package/lib/typescript/ui/screens/FAQScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/HelpSupportScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +1 -1
- package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +3 -15
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
- package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +8 -7
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/ui/styles/spacing.d.ts +5 -0
- package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
- package/lib/typescript/ui/types/navigation.d.ts +2 -1
- package/lib/typescript/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/ui/utils/avatarUtils.d.ts +2 -13
- package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
- package/lib/typescript/ui/utils/storageHelpers.d.ts +0 -3
- package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -1
- package/lib/typescript/utils/errorUtils.d.ts +6 -0
- package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
- package/lib/typescript/utils/validationUtils.d.ts +8 -0
- package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/core/CrossDomainAuth.ts +307 -0
- package/src/core/HttpService.ts +99 -16
- package/src/core/OxyServices.base.ts +20 -3
- package/src/core/OxyServices.ts +7 -3
- package/src/core/index.ts +9 -1
- package/src/core/mixins/OxyServices.assets.ts +14 -3
- package/src/core/mixins/OxyServices.auth.ts +105 -36
- package/src/core/mixins/OxyServices.features.ts +428 -0
- package/src/core/mixins/OxyServices.fedcm.ts +315 -0
- package/src/core/mixins/OxyServices.popup.ts +402 -0
- package/src/core/mixins/OxyServices.redirect.ts +397 -0
- package/src/core/mixins/OxyServices.user.ts +39 -24
- package/src/core/mixins/index.ts +33 -14
- package/src/crypto/index.ts +16 -5
- package/src/crypto/keyManager.ts +966 -0
- package/src/crypto/polyfill.ts +6 -5
- package/src/crypto/recoveryPhrase.ts +166 -0
- package/src/crypto/signatureService.ts +323 -0
- package/src/i18n/locales/en-US.json +1 -1
- package/src/index.ts +19 -15
- package/src/models/interfaces.ts +4 -16
- package/src/models/session.ts +2 -11
- package/src/types/bip39.d.ts +32 -0
- package/src/ui/components/BottomSheetRouter.tsx +6 -1
- package/src/ui/components/GroupedItem.tsx +19 -1
- package/src/ui/components/Icon.tsx +1 -1
- package/src/ui/components/IconButton/utils.ts +1 -1
- package/src/ui/components/OxyProvider.tsx +44 -12
- package/src/ui/components/SettingRow.tsx +26 -4
- package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
- package/src/ui/components/TextField/Adornment/utils.ts +2 -2
- package/src/ui/components/TextField/helpers.tsx +10 -10
- package/src/ui/components/TextField/types.tsx +1 -1
- package/src/ui/components/TouchableRipple/utils.ts +2 -2
- package/src/ui/components/Typography/AnimatedText.tsx +2 -2
- package/src/ui/components/feedback/FormInput.tsx +84 -0
- package/src/ui/components/feedback/ProgressIndicator.tsx +35 -0
- package/src/ui/components/feedback/constants.ts +22 -0
- package/src/ui/components/feedback/feedbackStyles.ts +247 -0
- package/src/ui/components/feedback/index.ts +6 -0
- package/src/ui/components/feedback/types.ts +52 -0
- package/src/ui/components/feedback/useFeedbackForm.ts +44 -0
- package/src/ui/components/modals/DeleteAccountModal.tsx +294 -0
- package/src/ui/components/modals/index.ts +1 -0
- package/src/ui/components/payment/PaymentDetailsStep.tsx +222 -0
- package/src/ui/components/payment/PaymentMethodStep.tsx +89 -0
- package/src/ui/components/payment/PaymentReviewStep.tsx +126 -0
- package/src/ui/components/payment/PaymentSuccessStep.tsx +71 -0
- package/src/ui/components/payment/PaymentSummaryStep.tsx +159 -0
- package/src/ui/components/payment/constants.ts +39 -0
- package/src/ui/components/payment/index.ts +9 -0
- package/src/ui/components/payment/paymentStyles.ts +397 -0
- package/src/ui/components/payment/types.ts +45 -0
- package/src/ui/components/types.tsx +6 -0
- package/src/ui/context/OxyContext.tsx +173 -195
- package/src/ui/context/hooks/useAuthOperations.ts +177 -36
- package/src/ui/context/hooks/useSessionManagement.ts +399 -0
- package/src/ui/hooks/index.ts +3 -1
- package/src/ui/hooks/mutations/useAccountMutations.ts +83 -76
- package/src/ui/hooks/queries/useAccountQueries.ts +29 -35
- package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
- package/src/ui/hooks/queries/useServicesQueries.ts +14 -6
- package/src/ui/hooks/useAsyncAction.ts +129 -0
- package/src/ui/hooks/useProfileEditing.ts +3 -3
- package/src/ui/hooks/useSessionManagement.ts +5 -10
- package/src/ui/hooks/useSessionSocket.ts +46 -175
- package/src/ui/hooks/useSettingToggle.ts +147 -0
- package/src/ui/hooks/useStorage.ts +24 -76
- package/src/ui/index.ts +22 -13
- package/src/ui/navigation/routes.ts +8 -2
- package/src/ui/screens/AccountCenterScreen.tsx +4 -4
- package/src/ui/screens/AccountOverviewScreen.tsx +36 -38
- package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
- package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
- package/src/ui/screens/FAQScreen.tsx +332 -0
- package/src/ui/screens/FeedbackScreen.tsx +91 -626
- package/src/ui/screens/HelpSupportScreen.tsx +7 -5
- package/src/ui/screens/OxyAuthScreen.tsx +138 -64
- package/src/ui/screens/PaymentGatewayScreen.tsx +96 -1275
- package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
- package/src/ui/screens/ProfileScreen.tsx +11 -6
- package/src/ui/screens/SavesCollectionsScreen.tsx +19 -10
- package/src/ui/screens/karma/KarmaCenterScreen.tsx +10 -10
- package/src/ui/stores/accountStore.ts +1 -11
- package/src/ui/stores/authStore.ts +43 -44
- package/src/ui/styles/spacing.ts +15 -2
- package/src/ui/types/navigation.ts +2 -2
- package/src/ui/utils/avatarUtils.ts +39 -46
- package/src/ui/utils/storageHelpers.ts +0 -4
- package/src/utils/__tests__/validationUtils.test.ts +16 -1
- package/src/utils/errorUtils.ts +8 -1
- package/src/utils/validationUtils.ts +12 -0
- package/lib/commonjs/core/services/SessionService.js +0 -163
- package/lib/commonjs/core/services/SessionService.js.map +0 -1
- package/lib/commonjs/core/services/TokenService.js +0 -220
- package/lib/commonjs/core/services/TokenService.js.map +0 -1
- package/lib/commonjs/crypto/types.js +0 -2
- package/lib/commonjs/crypto/types.js.map +0 -1
- package/lib/commonjs/ui/context/OxyContextBase.js +0 -21
- package/lib/commonjs/ui/context/OxyContextBase.js.map +0 -1
- package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
- package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
- package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -56
- package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
- package/lib/module/core/services/SessionService.js +0 -159
- package/lib/module/core/services/SessionService.js.map +0 -1
- package/lib/module/core/services/TokenService.js +0 -217
- package/lib/module/core/services/TokenService.js.map +0 -1
- package/lib/module/crypto/types.js +0 -2
- package/lib/module/crypto/types.js.map +0 -1
- package/lib/module/ui/context/OxyContextBase.js +0 -16
- package/lib/module/ui/context/OxyContextBase.js.map +0 -1
- package/lib/module/ui/context/hooks/useStorage.js +0 -74
- package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
- package/lib/module/ui/hooks/useAvatarPicker.js +0 -50
- package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
- package/lib/typescript/core/services/SessionService.d.ts +0 -78
- package/lib/typescript/core/services/SessionService.d.ts.map +0 -1
- package/lib/typescript/core/services/TokenService.d.ts +0 -72
- package/lib/typescript/core/services/TokenService.d.ts.map +0 -1
- package/lib/typescript/crypto/types.d.ts +0 -22
- package/lib/typescript/crypto/types.d.ts.map +0 -1
- package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -63
- package/lib/typescript/ui/context/OxyContextBase.d.ts.map +0 -1
- package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
- package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
- package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -19
- package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
- package/src/core/services/SessionService.ts +0 -173
- package/src/core/services/TokenService.ts +0 -237
- package/src/crypto/types.ts +0 -23
- package/src/ui/context/OxyContextBase.tsx +0 -78
- package/src/ui/context/hooks/useStorage.ts +0 -104
- 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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
|
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
|
-
//
|
|
139
|
-
setPostsCount(
|
|
140
|
-
setCommentsCount(
|
|
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
|
-
//
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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 :
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
9
|
+
lastUserFetch: number | null; // Timestamp of last user fetch for caching
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
loginSuccess: () => void;
|
|
11
|
+
loginSuccess: (user: User) => void;
|
|
14
12
|
loginFailure: (error: string) => void;
|
|
15
13
|
logout: () => void;
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
+
loginSuccess: (user: User) => set({
|
|
43
26
|
isLoading: false,
|
|
44
|
-
isAuthenticated:
|
|
45
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
33
|
+
user: null,
|
|
34
|
+
isAuthenticated: false,
|
|
35
|
+
lastUserFetch: null,
|
|
52
36
|
}),
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
+
}));
|
package/src/ui/styles/spacing.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
78
|
+
await oxyServices.getTokenBySession(activeSessionId);
|
|
115
79
|
} catch (tokenError) {
|
|
116
|
-
|
|
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
|
-
//
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
145
|
-
|
|
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
|
+
|
|
@@ -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
|
+
});
|
package/src/utils/errorUtils.ts
CHANGED
|
@@ -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
|
*/
|