@oxyhq/services 5.17.17 → 5.17.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -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/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/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 -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/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/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 -195
- 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 +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/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,86 +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
|
-
// Force refetch of all active queries to ensure UI updates immediately
|
|
228
|
-
// Using refetchQueries instead of invalidateQueries to bypass staleTime
|
|
229
|
-
await Promise.all([
|
|
230
|
-
queryClient.refetchQueries({
|
|
231
|
-
queryKey: queryKeys.accounts.all,
|
|
232
|
-
type: 'active'
|
|
233
|
-
}),
|
|
234
|
-
queryClient.refetchQueries({
|
|
235
|
-
queryKey: queryKeys.users.all,
|
|
236
|
-
type: 'active'
|
|
237
|
-
})
|
|
238
|
-
]);
|
|
239
|
-
|
|
240
|
-
appLogger.debug('Profile update complete', { component: 'OxyContext' });
|
|
241
|
-
},
|
|
242
|
-
onError: (error) => {
|
|
243
|
-
appLogger.error('Profile update failed', error, { component: 'OxyContext' });
|
|
244
|
-
toast.error(error instanceof Error ? error.message : 'Failed to update profile');
|
|
245
|
-
},
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
const updateProfile = useCallback(
|
|
249
|
-
async (updates: Partial<User>): Promise<User> => {
|
|
250
|
-
return await updateProfileMutation.mutateAsync(updates);
|
|
251
|
-
},
|
|
252
|
-
[updateProfileMutation]
|
|
253
|
-
);
|
|
254
|
-
|
|
255
254
|
const {
|
|
256
|
-
|
|
255
|
+
signIn,
|
|
257
256
|
logout,
|
|
258
257
|
logoutAll,
|
|
259
258
|
} = useAuthOperations({
|
|
@@ -276,9 +275,12 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
276
275
|
logger,
|
|
277
276
|
});
|
|
278
277
|
|
|
278
|
+
// Clear all account data (sessions, cache, etc.)
|
|
279
279
|
const clearAllAccountData = useCallback(async (): Promise<void> => {
|
|
280
|
+
// Clear TanStack Query cache (in-memory)
|
|
280
281
|
queryClient.clear();
|
|
281
282
|
|
|
283
|
+
// Clear persisted query cache
|
|
282
284
|
if (storage) {
|
|
283
285
|
try {
|
|
284
286
|
await clearQueryCache(storage);
|
|
@@ -287,68 +289,16 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
287
289
|
}
|
|
288
290
|
}
|
|
289
291
|
|
|
292
|
+
// Clear session state (sessions, activeSessionId, storage)
|
|
290
293
|
await clearSessionState();
|
|
291
294
|
|
|
295
|
+
// Reset account store
|
|
292
296
|
useAccountStore.getState().reset();
|
|
293
297
|
|
|
298
|
+
// Clear HTTP service cache
|
|
294
299
|
oxyServices.clearCache();
|
|
295
300
|
}, [queryClient, storage, clearSessionState, logger, oxyServices]);
|
|
296
301
|
|
|
297
|
-
useEffect(() => {
|
|
298
|
-
if (!storage) return;
|
|
299
|
-
|
|
300
|
-
let wasOffline = false;
|
|
301
|
-
let checkTimeout: NodeJS.Timeout | null = null;
|
|
302
|
-
|
|
303
|
-
const scheduleNextCheck = () => {
|
|
304
|
-
if (checkTimeout) {
|
|
305
|
-
clearTimeout(checkTimeout);
|
|
306
|
-
}
|
|
307
|
-
checkTimeout = setTimeout(() => {
|
|
308
|
-
checkNetworkStatus();
|
|
309
|
-
}, 30000); // Check every 30 seconds
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
const checkNetworkStatus = async () => {
|
|
313
|
-
try {
|
|
314
|
-
// Try a lightweight health check to see if we're online
|
|
315
|
-
await oxyServices.healthCheck();
|
|
316
|
-
|
|
317
|
-
// If we were offline and now we're online
|
|
318
|
-
if (wasOffline) {
|
|
319
|
-
logger('Network reconnected - setting online state');
|
|
320
|
-
setOnline(true);
|
|
321
|
-
// TanStack Query will automatically retry pending mutations
|
|
322
|
-
// Session management will handle token refresh if needed
|
|
323
|
-
wasOffline = false;
|
|
324
|
-
} else {
|
|
325
|
-
// We're online and were already online
|
|
326
|
-
setOnline(true);
|
|
327
|
-
}
|
|
328
|
-
} catch (error) {
|
|
329
|
-
// Network check failed - we're offline
|
|
330
|
-
if (!wasOffline) {
|
|
331
|
-
if (__DEV__) {
|
|
332
|
-
logger('Network appears offline - suspending authentication');
|
|
333
|
-
}
|
|
334
|
-
setOnline(false); // This will set isAuthenticated to false
|
|
335
|
-
}
|
|
336
|
-
wasOffline = true;
|
|
337
|
-
} finally {
|
|
338
|
-
scheduleNextCheck();
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// Check immediately
|
|
343
|
-
checkNetworkStatus();
|
|
344
|
-
|
|
345
|
-
return () => {
|
|
346
|
-
if (checkTimeout) {
|
|
347
|
-
clearTimeout(checkTimeout);
|
|
348
|
-
}
|
|
349
|
-
};
|
|
350
|
-
}, [oxyServices, storage, logger, setOnline]);
|
|
351
|
-
|
|
352
302
|
const { getDeviceSessions, logoutAllDeviceSessions, updateDeviceName } = useDeviceManagement({
|
|
353
303
|
oxyServices,
|
|
354
304
|
activeSessionId,
|
|
@@ -395,7 +345,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
395
345
|
logger('Session validation failed during init', validationError);
|
|
396
346
|
} else if (__DEV__ && isTimeoutOrNetworkError(validationError)) {
|
|
397
347
|
// Only log timeouts in dev mode for debugging
|
|
398
|
-
|
|
348
|
+
loggerUtil.debug('Session validation timeout (expected when offline)', { component: 'OxyContext', method: 'restoreSessionsFromStorage' }, validationError as unknown);
|
|
399
349
|
}
|
|
400
350
|
}
|
|
401
351
|
}
|
|
@@ -420,7 +370,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
420
370
|
} else if (isTimeoutOrNetworkError(switchError)) {
|
|
421
371
|
// Timeout/network error - non-critical, don't block
|
|
422
372
|
if (__DEV__) {
|
|
423
|
-
|
|
373
|
+
loggerUtil.debug('Active session validation timeout (expected when offline)', { component: 'OxyContext', method: 'restoreSessionsFromStorage' }, switchError as unknown);
|
|
424
374
|
}
|
|
425
375
|
} else {
|
|
426
376
|
// Only log unexpected errors
|
|
@@ -430,7 +380,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
430
380
|
}
|
|
431
381
|
} catch (error) {
|
|
432
382
|
if (__DEV__) {
|
|
433
|
-
|
|
383
|
+
loggerUtil.error('Auth init error', error instanceof Error ? error : new Error(String(error)), { component: 'OxyContext', method: 'restoreSessionsFromStorage' });
|
|
434
384
|
}
|
|
435
385
|
await clearSessionState();
|
|
436
386
|
} finally {
|
|
@@ -461,11 +411,10 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
461
411
|
: undefined;
|
|
462
412
|
const currentDeviceId = activeSession?.deviceId ?? null;
|
|
463
413
|
|
|
464
|
-
|
|
465
|
-
const userId = oxyServices.getCurrentUserId();
|
|
414
|
+
const userId = user?.id;
|
|
466
415
|
|
|
467
416
|
const refreshSessionsWithUser = useCallback(
|
|
468
|
-
() => refreshSessions(userId
|
|
417
|
+
() => refreshSessions(userId),
|
|
469
418
|
[refreshSessions, userId],
|
|
470
419
|
);
|
|
471
420
|
|
|
@@ -489,7 +438,6 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
489
438
|
logout,
|
|
490
439
|
clearSessionState,
|
|
491
440
|
baseURL: oxyServices.getBaseURL(),
|
|
492
|
-
getAccessToken: () => oxyServices.getAccessToken(),
|
|
493
441
|
onRemoteSignOut: handleRemoteSignOut,
|
|
494
442
|
onSessionRemoved: handleSessionRemoved,
|
|
495
443
|
});
|
|
@@ -508,30 +456,55 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
508
456
|
},
|
|
509
457
|
[],
|
|
510
458
|
);
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
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]);
|
|
519
494
|
|
|
520
495
|
const contextValue: OxyContextState = useMemo(() => ({
|
|
521
496
|
user,
|
|
522
497
|
sessions,
|
|
523
498
|
activeSessionId,
|
|
524
|
-
currentDeviceId,
|
|
525
499
|
isAuthenticated,
|
|
526
500
|
isLoading,
|
|
527
501
|
isTokenReady: tokenReady,
|
|
528
|
-
isStorageReady,
|
|
529
502
|
error,
|
|
530
503
|
currentLanguage,
|
|
531
504
|
currentLanguageMetadata,
|
|
532
505
|
currentLanguageName,
|
|
533
506
|
currentNativeLanguageName,
|
|
534
|
-
|
|
507
|
+
signIn,
|
|
535
508
|
logout,
|
|
536
509
|
logoutAll,
|
|
537
510
|
switchSession: switchSessionForContext,
|
|
@@ -547,11 +520,9 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
547
520
|
useFollow: useFollowHook,
|
|
548
521
|
showBottomSheet: showBottomSheetForContext,
|
|
549
522
|
openAvatarPicker,
|
|
550
|
-
updateProfile,
|
|
551
523
|
}), [
|
|
552
524
|
activeSessionId,
|
|
553
|
-
|
|
554
|
-
completeSignIn,
|
|
525
|
+
signIn,
|
|
555
526
|
currentLanguage,
|
|
556
527
|
currentLanguageMetadata,
|
|
557
528
|
currentLanguageName,
|
|
@@ -569,14 +540,12 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
569
540
|
setLanguage,
|
|
570
541
|
switchSessionForContext,
|
|
571
542
|
tokenReady,
|
|
572
|
-
isStorageReady,
|
|
573
543
|
updateDeviceName,
|
|
574
544
|
clearAllAccountData,
|
|
575
545
|
useFollowHook,
|
|
576
546
|
user,
|
|
577
547
|
showBottomSheetForContext,
|
|
578
548
|
openAvatarPicker,
|
|
579
|
-
updateProfile,
|
|
580
549
|
]);
|
|
581
550
|
|
|
582
551
|
return (
|
|
@@ -588,4 +557,13 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
588
557
|
|
|
589
558
|
export const OxyContextProvider = OxyProvider;
|
|
590
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
|
+
|
|
591
568
|
export default OxyContext;
|
|
569
|
+
|