@oxyhq/services 5.17.16 → 5.17.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.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 +27 -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/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/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/context/OxyContext.js +110 -192
- 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/mutations/useAccountMutations.js +78 -64
- 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/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/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 +5 -1
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +2 -2
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- 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/OxyAuthScreen.js +134 -66
- package/lib/commonjs/ui/screens/OxyAuthScreen.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/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.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 +15 -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/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/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/context/OxyContext.js +112 -184
- 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/mutations/useAccountMutations.js +79 -64
- 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/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/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 +5 -1
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +2 -2
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- 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/OxyAuthScreen.js +135 -68
- package/lib/module/ui/screens/OxyAuthScreen.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/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.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 +220 -8
- 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/IconButton/utils.d.ts +1 -1
- package/lib/typescript/ui/components/OxyProvider.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/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/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/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/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/AccountSettingsScreen.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/PrivacySettingsScreen.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.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 +19 -3
- 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/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/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/types.tsx +6 -0
- package/src/ui/context/OxyContext.tsx +173 -185
- package/src/ui/context/hooks/useAuthOperations.ts +177 -36
- package/src/ui/context/hooks/useSessionManagement.ts +399 -0
- package/src/ui/hooks/mutations/useAccountMutations.ts +82 -65
- 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/useProfileEditing.ts +3 -3
- package/src/ui/hooks/useSessionManagement.ts +5 -10
- package/src/ui/hooks/useSessionSocket.ts +46 -175
- package/src/ui/hooks/useStorage.ts +24 -76
- package/src/ui/index.ts +22 -13
- package/src/ui/navigation/routes.ts +6 -2
- package/src/ui/screens/AccountCenterScreen.tsx +2 -2
- package/src/ui/screens/AccountOverviewScreen.tsx +1 -1
- package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
- package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
- package/src/ui/screens/OxyAuthScreen.tsx +138 -64
- package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
- 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
|
@@ -1,45 +1,91 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import {
|
|
3
|
+
createContext,
|
|
3
4
|
useCallback,
|
|
5
|
+
useContext,
|
|
4
6
|
useEffect,
|
|
5
7
|
useMemo,
|
|
6
8
|
useRef,
|
|
7
9
|
useState,
|
|
10
|
+
type ReactNode,
|
|
8
11
|
} from 'react';
|
|
9
|
-
import { useQueryClient, useQuery, useMutation } from '@tanstack/react-query';
|
|
10
|
-
import { toast } from '../../lib/sonner';
|
|
11
12
|
import { OxyServices } from '../../core';
|
|
12
|
-
import type { User } from '../../models/interfaces';
|
|
13
|
+
import type { User, ApiError } from '../../models/interfaces';
|
|
13
14
|
import type { ClientSession } from '../../models/session';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { toast } from '../../lib/sonner';
|
|
16
|
+
import { useAuthStore, type AuthState } from '../stores/authStore';
|
|
17
|
+
import { useShallow } from 'zustand/react/shallow';
|
|
17
18
|
import { useSessionSocket } from '../hooks/useSessionSocket';
|
|
18
19
|
import type { UseFollowHook } from '../hooks/useFollow.types';
|
|
19
|
-
import { useDeviceManagement } from '../hooks/useDeviceManagement';
|
|
20
20
|
import { useLanguageManagement } from '../hooks/useLanguageManagement';
|
|
21
21
|
import { useSessionManagement } from '../hooks/useSessionManagement';
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import { clearQueryCache } from '../hooks/queryClient';
|
|
22
|
+
import { useAuthOperations } from './hooks/useAuthOperations';
|
|
23
|
+
import { useDeviceManagement } from '../hooks/useDeviceManagement';
|
|
24
|
+
import { getStorageKeys, createPlatformStorage, type StorageInterface } from '../utils/storageHelpers';
|
|
25
|
+
import { isInvalidSessionError, isTimeoutOrNetworkError } from '../utils/errorHandlers';
|
|
27
26
|
import type { RouteName } from '../navigation/routes';
|
|
28
27
|
import { showBottomSheet as globalShowBottomSheet } from '../navigation/bottomSheetManager';
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
|
|
34
|
-
import {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
29
|
+
import { clearQueryCache } from '../hooks/queryClient';
|
|
30
|
+
import { translate } from '../../i18n';
|
|
31
|
+
import { updateAvatarVisibility, updateProfileWithAvatar } from '../utils/avatarUtils';
|
|
32
|
+
import { useAccountStore } from '../stores/accountStore';
|
|
33
|
+
import { logger as loggerUtil } from '../../utils/loggerUtils';
|
|
34
|
+
|
|
35
|
+
export interface OxyContextState {
|
|
36
|
+
user: User | null;
|
|
37
|
+
sessions: ClientSession[];
|
|
38
|
+
activeSessionId: string | null;
|
|
39
|
+
isAuthenticated: boolean;
|
|
40
|
+
isLoading: boolean;
|
|
41
|
+
isTokenReady: boolean;
|
|
42
|
+
error: string | null;
|
|
43
|
+
currentLanguage: string;
|
|
44
|
+
currentLanguageMetadata: ReturnType<typeof useLanguageManagement>['metadata'];
|
|
45
|
+
currentLanguageName: string;
|
|
46
|
+
currentNativeLanguageName: string;
|
|
47
|
+
|
|
48
|
+
// Authentication
|
|
49
|
+
signIn: (publicKey: string, deviceName?: string) => Promise<User>;
|
|
50
|
+
|
|
51
|
+
// Session management
|
|
52
|
+
logout: (targetSessionId?: string) => Promise<void>;
|
|
53
|
+
logoutAll: () => Promise<void>;
|
|
54
|
+
switchSession: (sessionId: string) => Promise<void>;
|
|
55
|
+
removeSession: (sessionId: string) => Promise<void>;
|
|
56
|
+
refreshSessions: () => Promise<void>;
|
|
57
|
+
setLanguage: (languageId: string) => Promise<void>;
|
|
58
|
+
getDeviceSessions: () => Promise<
|
|
59
|
+
Array<{
|
|
60
|
+
sessionId: string;
|
|
61
|
+
deviceId: string;
|
|
62
|
+
deviceName?: string;
|
|
63
|
+
lastActive?: string;
|
|
64
|
+
expiresAt?: string;
|
|
65
|
+
}>
|
|
66
|
+
>;
|
|
67
|
+
logoutAllDeviceSessions: () => Promise<void>;
|
|
68
|
+
updateDeviceName: (deviceName: string) => Promise<void>;
|
|
69
|
+
clearSessionState: () => Promise<void>;
|
|
70
|
+
clearAllAccountData: () => Promise<void>;
|
|
71
|
+
oxyServices: OxyServices;
|
|
72
|
+
useFollow?: UseFollowHook;
|
|
73
|
+
showBottomSheet?: (screenOrConfig: RouteName | { screen: RouteName; props?: Record<string, unknown> }) => void;
|
|
74
|
+
openAvatarPicker: () => void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const OxyContext = createContext<OxyContextState | null>(null);
|
|
78
|
+
|
|
79
|
+
export interface OxyContextProviderProps {
|
|
80
|
+
children: ReactNode;
|
|
81
|
+
oxyServices?: OxyServices;
|
|
82
|
+
baseURL?: string;
|
|
83
|
+
authWebUrl?: string;
|
|
84
|
+
authRedirectUri?: string;
|
|
85
|
+
storageKeyPrefix?: string;
|
|
86
|
+
onAuthStateChange?: (user: User | null) => void;
|
|
87
|
+
onError?: (error: ApiError) => void;
|
|
88
|
+
}
|
|
43
89
|
|
|
44
90
|
let cachedUseFollowHook: UseFollowHook | null = null;
|
|
45
91
|
|
|
@@ -55,7 +101,7 @@ const loadUseFollowHook = (): UseFollowHook => {
|
|
|
55
101
|
return cachedUseFollowHook;
|
|
56
102
|
} catch (error) {
|
|
57
103
|
if (__DEV__) {
|
|
58
|
-
|
|
104
|
+
loggerUtil.warn(
|
|
59
105
|
'useFollow hook is not available. Please import useFollow from @oxyhq/services directly.',
|
|
60
106
|
{ component: 'OxyContext', method: 'loadUseFollowHook' },
|
|
61
107
|
error
|
|
@@ -75,6 +121,8 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
75
121
|
children,
|
|
76
122
|
oxyServices: providedOxyServices,
|
|
77
123
|
baseURL,
|
|
124
|
+
authWebUrl,
|
|
125
|
+
authRedirectUri,
|
|
78
126
|
storageKeyPrefix = 'oxy_session',
|
|
79
127
|
onAuthStateChange,
|
|
80
128
|
onError,
|
|
@@ -85,7 +133,11 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
85
133
|
if (providedOxyServices) {
|
|
86
134
|
oxyServicesRef.current = providedOxyServices;
|
|
87
135
|
} else if (baseURL) {
|
|
88
|
-
oxyServicesRef.current = new OxyServices({
|
|
136
|
+
oxyServicesRef.current = new OxyServices({
|
|
137
|
+
baseURL,
|
|
138
|
+
authWebUrl,
|
|
139
|
+
authRedirectUri,
|
|
140
|
+
});
|
|
89
141
|
} else {
|
|
90
142
|
throw new Error('Either oxyServices or baseURL must be provided to OxyContextProvider');
|
|
91
143
|
}
|
|
@@ -94,21 +146,19 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
94
146
|
const oxyServices = oxyServicesRef.current;
|
|
95
147
|
|
|
96
148
|
const {
|
|
149
|
+
user,
|
|
97
150
|
isAuthenticated,
|
|
98
|
-
isOnline,
|
|
99
151
|
isLoading,
|
|
100
152
|
error,
|
|
101
|
-
setOnline,
|
|
102
153
|
loginSuccess,
|
|
103
154
|
loginFailure,
|
|
104
155
|
logoutStore,
|
|
105
156
|
} = useAuthStore(
|
|
106
157
|
useShallow((state: AuthState) => ({
|
|
158
|
+
user: state.user,
|
|
107
159
|
isAuthenticated: state.isAuthenticated,
|
|
108
|
-
isOnline: state.isOnline,
|
|
109
160
|
isLoading: state.isLoading,
|
|
110
161
|
error: state.error,
|
|
111
|
-
setOnline: state.setOnline,
|
|
112
162
|
loginSuccess: state.loginSuccess,
|
|
113
163
|
loginFailure: state.loginFailure,
|
|
114
164
|
logoutStore: state.logout,
|
|
@@ -121,17 +171,44 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
121
171
|
|
|
122
172
|
const logger = useCallback((message: string, err?: unknown) => {
|
|
123
173
|
if (__DEV__) {
|
|
124
|
-
|
|
125
|
-
console.warn(`[OxyContext] ${message}`, err);
|
|
126
|
-
} else {
|
|
127
|
-
console.warn(`[OxyContext] ${message}`);
|
|
128
|
-
}
|
|
174
|
+
console.warn(`[OxyContext] ${message}`, err);
|
|
129
175
|
}
|
|
130
176
|
}, []);
|
|
131
177
|
|
|
132
178
|
const storageKeys = useMemo(() => getStorageKeys(storageKeyPrefix), [storageKeyPrefix]);
|
|
133
179
|
|
|
134
|
-
|
|
180
|
+
// Simple storage initialization - no complex hook needed
|
|
181
|
+
const storageRef = useRef<StorageInterface | null>(null);
|
|
182
|
+
const [storage, setStorage] = useState<StorageInterface | null>(null);
|
|
183
|
+
|
|
184
|
+
useEffect(() => {
|
|
185
|
+
let mounted = true;
|
|
186
|
+
createPlatformStorage()
|
|
187
|
+
.then((storageInstance) => {
|
|
188
|
+
if (mounted) {
|
|
189
|
+
storageRef.current = storageInstance;
|
|
190
|
+
setStorage(storageInstance);
|
|
191
|
+
}
|
|
192
|
+
})
|
|
193
|
+
.catch((err) => {
|
|
194
|
+
if (mounted) {
|
|
195
|
+
logger('Failed to initialize storage', err);
|
|
196
|
+
onError?.({
|
|
197
|
+
message: 'Failed to initialize storage',
|
|
198
|
+
code: 'STORAGE_INIT_ERROR',
|
|
199
|
+
status: 500,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
return () => {
|
|
205
|
+
mounted = false;
|
|
206
|
+
};
|
|
207
|
+
}, [logger, onError]);
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
// Offline queuing is now handled by TanStack Query mutations
|
|
211
|
+
// No need for custom offline queue
|
|
135
212
|
|
|
136
213
|
const {
|
|
137
214
|
currentLanguage,
|
|
@@ -174,76 +251,8 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
174
251
|
queryClient,
|
|
175
252
|
});
|
|
176
253
|
|
|
177
|
-
const { data: userData } = useQuery({
|
|
178
|
-
queryKey: queryKeys.accounts.current(),
|
|
179
|
-
queryFn: async () => {
|
|
180
|
-
appLogger.debug('Fetching current user', {
|
|
181
|
-
component: 'OxyContext',
|
|
182
|
-
sessionId: activeSessionId ?? undefined
|
|
183
|
-
});
|
|
184
|
-
if (!activeSessionId) {
|
|
185
|
-
throw new Error('No active session');
|
|
186
|
-
}
|
|
187
|
-
const data = await oxyServices.getUserBySession(activeSessionId);
|
|
188
|
-
appLogger.debug('Current user fetched', {
|
|
189
|
-
component: 'OxyContext',
|
|
190
|
-
username: data.username
|
|
191
|
-
});
|
|
192
|
-
return data;
|
|
193
|
-
},
|
|
194
|
-
enabled: isAuthenticated && !!activeSessionId && tokenReady,
|
|
195
|
-
staleTime: 30000, // 30 seconds - reduces unnecessary refetches
|
|
196
|
-
gcTime: 5 * 60 * 1000, // 5 minutes - keeps data in cache longer
|
|
197
|
-
retry: false,
|
|
198
|
-
refetchOnMount: 'always',
|
|
199
|
-
refetchOnWindowFocus: false,
|
|
200
|
-
});
|
|
201
|
-
const user = userData ?? null;
|
|
202
|
-
|
|
203
|
-
// Profile update mutation - defined inline to avoid circular dependency with useOxy()
|
|
204
|
-
const updateProfileMutation = useMutation({
|
|
205
|
-
mutationFn: async (updates: Partial<User>) => {
|
|
206
|
-
appLogger.debug('Updating profile', { component: 'OxyContext', updates });
|
|
207
|
-
return await oxyServices.updateProfile(updates);
|
|
208
|
-
},
|
|
209
|
-
onSuccess: async (data, updates) => {
|
|
210
|
-
appLogger.debug('Profile update successful', {
|
|
211
|
-
component: 'OxyContext',
|
|
212
|
-
username: data.username,
|
|
213
|
-
updatedFields: Object.keys(updates)
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
// Update cache with server response
|
|
217
|
-
queryClient.setQueryData(queryKeys.accounts.current(), data);
|
|
218
|
-
if (activeSessionId) {
|
|
219
|
-
queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Refresh accountStore with all updated profile data (synchronizes immediately)
|
|
223
|
-
if (activeSessionId && oxyServices) {
|
|
224
|
-
refreshAccountInStore(activeSessionId, data, oxyServices);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Only invalidate specific queries that need refresh (not everything)
|
|
228
|
-
invalidateAccountQueries(queryClient);
|
|
229
|
-
|
|
230
|
-
appLogger.debug('Profile update complete', { component: 'OxyContext' });
|
|
231
|
-
},
|
|
232
|
-
onError: (error) => {
|
|
233
|
-
appLogger.error('Profile update failed', error, { component: 'OxyContext' });
|
|
234
|
-
toast.error(error instanceof Error ? error.message : 'Failed to update profile');
|
|
235
|
-
},
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
const updateProfile = useCallback(
|
|
239
|
-
async (updates: Partial<User>): Promise<User> => {
|
|
240
|
-
return await updateProfileMutation.mutateAsync(updates);
|
|
241
|
-
},
|
|
242
|
-
[updateProfileMutation]
|
|
243
|
-
);
|
|
244
|
-
|
|
245
254
|
const {
|
|
246
|
-
|
|
255
|
+
signIn,
|
|
247
256
|
logout,
|
|
248
257
|
logoutAll,
|
|
249
258
|
} = useAuthOperations({
|
|
@@ -266,9 +275,12 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
266
275
|
logger,
|
|
267
276
|
});
|
|
268
277
|
|
|
278
|
+
// Clear all account data (sessions, cache, etc.)
|
|
269
279
|
const clearAllAccountData = useCallback(async (): Promise<void> => {
|
|
280
|
+
// Clear TanStack Query cache (in-memory)
|
|
270
281
|
queryClient.clear();
|
|
271
282
|
|
|
283
|
+
// Clear persisted query cache
|
|
272
284
|
if (storage) {
|
|
273
285
|
try {
|
|
274
286
|
await clearQueryCache(storage);
|
|
@@ -277,68 +289,16 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
277
289
|
}
|
|
278
290
|
}
|
|
279
291
|
|
|
292
|
+
// Clear session state (sessions, activeSessionId, storage)
|
|
280
293
|
await clearSessionState();
|
|
281
294
|
|
|
295
|
+
// Reset account store
|
|
282
296
|
useAccountStore.getState().reset();
|
|
283
297
|
|
|
298
|
+
// Clear HTTP service cache
|
|
284
299
|
oxyServices.clearCache();
|
|
285
300
|
}, [queryClient, storage, clearSessionState, logger, oxyServices]);
|
|
286
301
|
|
|
287
|
-
useEffect(() => {
|
|
288
|
-
if (!storage) return;
|
|
289
|
-
|
|
290
|
-
let wasOffline = false;
|
|
291
|
-
let checkTimeout: NodeJS.Timeout | null = null;
|
|
292
|
-
|
|
293
|
-
const scheduleNextCheck = () => {
|
|
294
|
-
if (checkTimeout) {
|
|
295
|
-
clearTimeout(checkTimeout);
|
|
296
|
-
}
|
|
297
|
-
checkTimeout = setTimeout(() => {
|
|
298
|
-
checkNetworkStatus();
|
|
299
|
-
}, 30000); // Check every 30 seconds
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
const checkNetworkStatus = async () => {
|
|
303
|
-
try {
|
|
304
|
-
// Try a lightweight health check to see if we're online
|
|
305
|
-
await oxyServices.healthCheck();
|
|
306
|
-
|
|
307
|
-
// If we were offline and now we're online
|
|
308
|
-
if (wasOffline) {
|
|
309
|
-
logger('Network reconnected - setting online state');
|
|
310
|
-
setOnline(true);
|
|
311
|
-
// TanStack Query will automatically retry pending mutations
|
|
312
|
-
// Session management will handle token refresh if needed
|
|
313
|
-
wasOffline = false;
|
|
314
|
-
} else {
|
|
315
|
-
// We're online and were already online
|
|
316
|
-
setOnline(true);
|
|
317
|
-
}
|
|
318
|
-
} catch (error) {
|
|
319
|
-
// Network check failed - we're offline
|
|
320
|
-
if (!wasOffline) {
|
|
321
|
-
if (__DEV__) {
|
|
322
|
-
logger('Network appears offline - suspending authentication');
|
|
323
|
-
}
|
|
324
|
-
setOnline(false); // This will set isAuthenticated to false
|
|
325
|
-
}
|
|
326
|
-
wasOffline = true;
|
|
327
|
-
} finally {
|
|
328
|
-
scheduleNextCheck();
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
// Check immediately
|
|
333
|
-
checkNetworkStatus();
|
|
334
|
-
|
|
335
|
-
return () => {
|
|
336
|
-
if (checkTimeout) {
|
|
337
|
-
clearTimeout(checkTimeout);
|
|
338
|
-
}
|
|
339
|
-
};
|
|
340
|
-
}, [oxyServices, storage, logger, setOnline]);
|
|
341
|
-
|
|
342
302
|
const { getDeviceSessions, logoutAllDeviceSessions, updateDeviceName } = useDeviceManagement({
|
|
343
303
|
oxyServices,
|
|
344
304
|
activeSessionId,
|
|
@@ -385,7 +345,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
385
345
|
logger('Session validation failed during init', validationError);
|
|
386
346
|
} else if (__DEV__ && isTimeoutOrNetworkError(validationError)) {
|
|
387
347
|
// Only log timeouts in dev mode for debugging
|
|
388
|
-
|
|
348
|
+
loggerUtil.debug('Session validation timeout (expected when offline)', { component: 'OxyContext', method: 'restoreSessionsFromStorage' }, validationError as unknown);
|
|
389
349
|
}
|
|
390
350
|
}
|
|
391
351
|
}
|
|
@@ -410,7 +370,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
410
370
|
} else if (isTimeoutOrNetworkError(switchError)) {
|
|
411
371
|
// Timeout/network error - non-critical, don't block
|
|
412
372
|
if (__DEV__) {
|
|
413
|
-
|
|
373
|
+
loggerUtil.debug('Active session validation timeout (expected when offline)', { component: 'OxyContext', method: 'restoreSessionsFromStorage' }, switchError as unknown);
|
|
414
374
|
}
|
|
415
375
|
} else {
|
|
416
376
|
// Only log unexpected errors
|
|
@@ -420,7 +380,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
420
380
|
}
|
|
421
381
|
} catch (error) {
|
|
422
382
|
if (__DEV__) {
|
|
423
|
-
|
|
383
|
+
loggerUtil.error('Auth init error', error instanceof Error ? error : new Error(String(error)), { component: 'OxyContext', method: 'restoreSessionsFromStorage' });
|
|
424
384
|
}
|
|
425
385
|
await clearSessionState();
|
|
426
386
|
} finally {
|
|
@@ -451,11 +411,10 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
451
411
|
: undefined;
|
|
452
412
|
const currentDeviceId = activeSession?.deviceId ?? null;
|
|
453
413
|
|
|
454
|
-
|
|
455
|
-
const userId = oxyServices.getCurrentUserId();
|
|
414
|
+
const userId = user?.id;
|
|
456
415
|
|
|
457
416
|
const refreshSessionsWithUser = useCallback(
|
|
458
|
-
() => refreshSessions(userId
|
|
417
|
+
() => refreshSessions(userId),
|
|
459
418
|
[refreshSessions, userId],
|
|
460
419
|
);
|
|
461
420
|
|
|
@@ -479,7 +438,6 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
479
438
|
logout,
|
|
480
439
|
clearSessionState,
|
|
481
440
|
baseURL: oxyServices.getBaseURL(),
|
|
482
|
-
getAccessToken: () => oxyServices.getAccessToken(),
|
|
483
441
|
onRemoteSignOut: handleRemoteSignOut,
|
|
484
442
|
onSessionRemoved: handleSessionRemoved,
|
|
485
443
|
});
|
|
@@ -498,30 +456,55 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
498
456
|
},
|
|
499
457
|
[],
|
|
500
458
|
);
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
459
|
+
|
|
460
|
+
// Create openAvatarPicker function
|
|
461
|
+
const openAvatarPicker = useCallback(() => {
|
|
462
|
+
showBottomSheetForContext({
|
|
463
|
+
screen: 'FileManagement' as RouteName,
|
|
464
|
+
props: {
|
|
465
|
+
selectMode: true,
|
|
466
|
+
multiSelect: false,
|
|
467
|
+
disabledMimeTypes: ['video/', 'audio/', 'application/pdf'],
|
|
468
|
+
afterSelect: 'none', // Don't navigate away - stay on current screen
|
|
469
|
+
onSelect: async (file: any) => {
|
|
470
|
+
if (!file.contentType.startsWith('image/')) {
|
|
471
|
+
toast.error(translate(currentLanguage, 'editProfile.toasts.selectImage') || 'Please select an image file');
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
try {
|
|
475
|
+
// Update file visibility to public for avatar
|
|
476
|
+
await updateAvatarVisibility(file.id, oxyServices, 'OxyContext');
|
|
477
|
+
|
|
478
|
+
// Update user profile (handles query invalidation and accountStore update)
|
|
479
|
+
await updateProfileWithAvatar(
|
|
480
|
+
{ avatar: file.id },
|
|
481
|
+
oxyServices,
|
|
482
|
+
activeSessionId,
|
|
483
|
+
queryClient
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
toast.success(translate(currentLanguage, 'editProfile.toasts.avatarUpdated') || 'Avatar updated');
|
|
487
|
+
} catch (e: any) {
|
|
488
|
+
toast.error(e.message || translate(currentLanguage, 'editProfile.toasts.updateAvatarFailed') || 'Failed to update avatar');
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
});
|
|
493
|
+
}, [oxyServices, currentLanguage, showBottomSheetForContext, activeSessionId, queryClient]);
|
|
509
494
|
|
|
510
495
|
const contextValue: OxyContextState = useMemo(() => ({
|
|
511
496
|
user,
|
|
512
497
|
sessions,
|
|
513
498
|
activeSessionId,
|
|
514
|
-
currentDeviceId,
|
|
515
499
|
isAuthenticated,
|
|
516
500
|
isLoading,
|
|
517
501
|
isTokenReady: tokenReady,
|
|
518
|
-
isStorageReady,
|
|
519
502
|
error,
|
|
520
503
|
currentLanguage,
|
|
521
504
|
currentLanguageMetadata,
|
|
522
505
|
currentLanguageName,
|
|
523
506
|
currentNativeLanguageName,
|
|
524
|
-
|
|
507
|
+
signIn,
|
|
525
508
|
logout,
|
|
526
509
|
logoutAll,
|
|
527
510
|
switchSession: switchSessionForContext,
|
|
@@ -537,11 +520,9 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
537
520
|
useFollow: useFollowHook,
|
|
538
521
|
showBottomSheet: showBottomSheetForContext,
|
|
539
522
|
openAvatarPicker,
|
|
540
|
-
updateProfile,
|
|
541
523
|
}), [
|
|
542
524
|
activeSessionId,
|
|
543
|
-
|
|
544
|
-
completeSignIn,
|
|
525
|
+
signIn,
|
|
545
526
|
currentLanguage,
|
|
546
527
|
currentLanguageMetadata,
|
|
547
528
|
currentLanguageName,
|
|
@@ -559,14 +540,12 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
559
540
|
setLanguage,
|
|
560
541
|
switchSessionForContext,
|
|
561
542
|
tokenReady,
|
|
562
|
-
isStorageReady,
|
|
563
543
|
updateDeviceName,
|
|
564
544
|
clearAllAccountData,
|
|
565
545
|
useFollowHook,
|
|
566
546
|
user,
|
|
567
547
|
showBottomSheetForContext,
|
|
568
548
|
openAvatarPicker,
|
|
569
|
-
updateProfile,
|
|
570
549
|
]);
|
|
571
550
|
|
|
572
551
|
return (
|
|
@@ -578,4 +557,13 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
578
557
|
|
|
579
558
|
export const OxyContextProvider = OxyProvider;
|
|
580
559
|
|
|
560
|
+
export const useOxy = (): OxyContextState => {
|
|
561
|
+
const context = useContext(OxyContext);
|
|
562
|
+
if (!context) {
|
|
563
|
+
throw new Error('useOxy must be used within an OxyContextProvider');
|
|
564
|
+
}
|
|
565
|
+
return context;
|
|
566
|
+
};
|
|
567
|
+
|
|
581
568
|
export default OxyContext;
|
|
569
|
+
|