@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
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import type { OxyServicesBase } from '../OxyServices.base';
|
|
2
|
+
import { OxyAuthenticationError } from '../OxyServices.errors';
|
|
3
|
+
import type { SessionLoginResponse } from '../../models/session';
|
|
4
|
+
|
|
5
|
+
export interface RedirectAuthOptions {
|
|
6
|
+
redirectUri?: string;
|
|
7
|
+
mode?: 'login' | 'signup';
|
|
8
|
+
preserveUrl?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Redirect-based Cross-Domain Authentication Mixin
|
|
13
|
+
*
|
|
14
|
+
* Implements traditional OAuth2 redirect flow as a fallback when popup or
|
|
15
|
+
* FedCM are not available or fail (e.g., mobile browsers, popup blockers).
|
|
16
|
+
*
|
|
17
|
+
* Flow:
|
|
18
|
+
* 1. Save current URL
|
|
19
|
+
* 2. Redirect to auth.oxy.so/login
|
|
20
|
+
* 3. User signs in
|
|
21
|
+
* 4. Redirect back with token in URL
|
|
22
|
+
* 5. Extract token, restore session, clean URL
|
|
23
|
+
*
|
|
24
|
+
* Features:
|
|
25
|
+
* - Works on all browsers (including old mobile browsers)
|
|
26
|
+
* - Automatic URL cleanup after auth
|
|
27
|
+
* - State preservation option
|
|
28
|
+
* - CSRF protection via state parameter
|
|
29
|
+
*
|
|
30
|
+
* Trade-offs:
|
|
31
|
+
* - Loses JavaScript app state (full page navigation)
|
|
32
|
+
* - Visible redirect (user sees navigation)
|
|
33
|
+
* - Slower perceived performance
|
|
34
|
+
*/
|
|
35
|
+
export function OxyServicesRedirectAuthMixin<T extends typeof OxyServicesBase>(Base: T) {
|
|
36
|
+
return class extends Base {
|
|
37
|
+
constructor(...args: any[]) {
|
|
38
|
+
super(...(args as [any]));
|
|
39
|
+
}
|
|
40
|
+
public static readonly AUTH_URL = 'https://auth.oxy.so';
|
|
41
|
+
public static readonly TOKEN_STORAGE_KEY = 'oxy_access_token';
|
|
42
|
+
public static readonly SESSION_STORAGE_KEY = 'oxy_session_id';
|
|
43
|
+
public static readonly STATE_STORAGE_KEY = 'oxy_auth_state';
|
|
44
|
+
public static readonly PRE_AUTH_URL_KEY = 'oxy_pre_auth_url';
|
|
45
|
+
public static readonly NONCE_STORAGE_KEY = 'oxy_auth_nonce';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Sign in using full page redirect
|
|
49
|
+
*
|
|
50
|
+
* Redirects the user to auth.oxy.so for authentication. After successful
|
|
51
|
+
* sign-in, the user will be redirected back to the current page (or custom
|
|
52
|
+
* redirect URI) with authentication tokens in the URL.
|
|
53
|
+
*
|
|
54
|
+
* Call handleAuthCallback() on app startup to complete the flow.
|
|
55
|
+
*
|
|
56
|
+
* @param options - Redirect configuration options
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* // Initiate sign-in
|
|
61
|
+
* const handleSignIn = () => {
|
|
62
|
+
* oxyServices.signInWithRedirect();
|
|
63
|
+
* };
|
|
64
|
+
*
|
|
65
|
+
* // Handle callback on app startup
|
|
66
|
+
* useEffect(() => {
|
|
67
|
+
* const session = oxyServices.handleAuthCallback();
|
|
68
|
+
* if (session) {
|
|
69
|
+
* setUser(session.user);
|
|
70
|
+
* }
|
|
71
|
+
* }, []);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
signInWithRedirect(options: RedirectAuthOptions = {}): void {
|
|
75
|
+
if (typeof window === 'undefined') {
|
|
76
|
+
throw new OxyAuthenticationError('Redirect authentication requires browser environment');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const redirectUri = options.redirectUri || window.location.href;
|
|
80
|
+
const mode = options.mode || 'login';
|
|
81
|
+
const state = this.generateState();
|
|
82
|
+
const nonce = this.generateNonce();
|
|
83
|
+
|
|
84
|
+
// Store state for CSRF protection
|
|
85
|
+
this.storeAuthState(state, nonce);
|
|
86
|
+
|
|
87
|
+
// Save current URL to restore after auth (optional)
|
|
88
|
+
if (options.preserveUrl !== false) {
|
|
89
|
+
this.savePreAuthUrl(window.location.href);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const authUrl = this.buildAuthUrl({
|
|
93
|
+
mode,
|
|
94
|
+
redirectUri,
|
|
95
|
+
state,
|
|
96
|
+
nonce,
|
|
97
|
+
clientId: window.location.origin,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Perform redirect
|
|
101
|
+
window.location.href = authUrl;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Sign up using full page redirect
|
|
106
|
+
*
|
|
107
|
+
* Same as signInWithRedirect but opens the signup page by default.
|
|
108
|
+
*/
|
|
109
|
+
signUpWithRedirect(options: RedirectAuthOptions = {}): void {
|
|
110
|
+
this.signInWithRedirect({ ...options, mode: 'signup' });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Handle authentication callback
|
|
115
|
+
*
|
|
116
|
+
* Call this on app startup to check if the current page load is a
|
|
117
|
+
* redirect back from the authentication server. If it is, this method
|
|
118
|
+
* will extract the tokens, store them, and clean up the URL.
|
|
119
|
+
*
|
|
120
|
+
* @returns Session data if this is a callback, null otherwise
|
|
121
|
+
* @throws {OxyAuthenticationError} If state validation fails (CSRF attack)
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* // In your app's root component or startup logic
|
|
126
|
+
* useEffect(() => {
|
|
127
|
+
* try {
|
|
128
|
+
* const session = oxyServices.handleAuthCallback();
|
|
129
|
+
* if (session) {
|
|
130
|
+
* console.log('Logged in:', session.user);
|
|
131
|
+
* setUser(session.user);
|
|
132
|
+
* } else {
|
|
133
|
+
* // Not a callback, check for existing session
|
|
134
|
+
* const restored = oxyServices.restoreSession();
|
|
135
|
+
* if (!restored) {
|
|
136
|
+
* // No session, show login button
|
|
137
|
+
* }
|
|
138
|
+
* }
|
|
139
|
+
* } catch (error) {
|
|
140
|
+
* console.error('Auth callback failed:', error);
|
|
141
|
+
* }
|
|
142
|
+
* }, []);
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
handleAuthCallback(): SessionLoginResponse | null {
|
|
146
|
+
if (typeof window === 'undefined') {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const url = new URL(window.location.href);
|
|
151
|
+
const accessToken = url.searchParams.get('access_token');
|
|
152
|
+
const sessionId = url.searchParams.get('session_id');
|
|
153
|
+
const expiresAt = url.searchParams.get('expires_at');
|
|
154
|
+
const state = url.searchParams.get('state');
|
|
155
|
+
const error = url.searchParams.get('error');
|
|
156
|
+
const errorDescription = url.searchParams.get('error_description');
|
|
157
|
+
|
|
158
|
+
// Check if this is an error callback
|
|
159
|
+
if (error) {
|
|
160
|
+
this.clearAuthState();
|
|
161
|
+
throw new OxyAuthenticationError(errorDescription || error);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Check if this is an auth callback
|
|
165
|
+
if (!accessToken || !sessionId) {
|
|
166
|
+
return null; // Not a callback
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Verify state to prevent CSRF attacks
|
|
170
|
+
const savedState = this.getStoredState();
|
|
171
|
+
if (!savedState || state !== savedState) {
|
|
172
|
+
this.clearAuthState();
|
|
173
|
+
throw new OxyAuthenticationError('Invalid state parameter. Possible CSRF attack.');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Store tokens
|
|
177
|
+
this.storeTokens(accessToken, sessionId);
|
|
178
|
+
this.httpService.setTokens(accessToken);
|
|
179
|
+
|
|
180
|
+
// Build session response (minimal - we'll fetch full user data separately)
|
|
181
|
+
const session: SessionLoginResponse = {
|
|
182
|
+
sessionId,
|
|
183
|
+
deviceId: '', // Not available in redirect flow
|
|
184
|
+
expiresAt: expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
|
|
185
|
+
user: {} as any, // Will be fetched separately
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// Clean up URL (remove auth parameters)
|
|
189
|
+
this.cleanAuthCallbackUrl(url);
|
|
190
|
+
|
|
191
|
+
// Clean up storage
|
|
192
|
+
this.clearAuthState();
|
|
193
|
+
|
|
194
|
+
return session;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Restore session from storage
|
|
199
|
+
*
|
|
200
|
+
* Attempts to restore a previously authenticated session from localStorage.
|
|
201
|
+
* Call this on app startup if handleAuthCallback() returns null.
|
|
202
|
+
*
|
|
203
|
+
* @returns True if session was restored, false otherwise
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```typescript
|
|
207
|
+
* useEffect(() => {
|
|
208
|
+
* const session = oxyServices.handleAuthCallback();
|
|
209
|
+
* if (!session) {
|
|
210
|
+
* const restored = oxyServices.restoreSession();
|
|
211
|
+
* if (!restored) {
|
|
212
|
+
* // No session, user needs to sign in
|
|
213
|
+
* setShowLogin(true);
|
|
214
|
+
* }
|
|
215
|
+
* }
|
|
216
|
+
* }, []);
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
restoreSession(): boolean {
|
|
220
|
+
if (typeof window === 'undefined') {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const token = localStorage.getItem((this.constructor as any).TOKEN_STORAGE_KEY);
|
|
225
|
+
const sessionId = localStorage.getItem((this.constructor as any).SESSION_STORAGE_KEY);
|
|
226
|
+
|
|
227
|
+
if (token && sessionId) {
|
|
228
|
+
this.httpService.setTokens(token);
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Clear stored session
|
|
237
|
+
*
|
|
238
|
+
* Removes all authentication data from storage. Call this on logout.
|
|
239
|
+
*/
|
|
240
|
+
clearStoredSession(): void {
|
|
241
|
+
if (typeof window === 'undefined') {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
localStorage.removeItem((this.constructor as any).TOKEN_STORAGE_KEY);
|
|
246
|
+
localStorage.removeItem((this.constructor as any).SESSION_STORAGE_KEY);
|
|
247
|
+
this.httpService.clearTokens();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get stored session ID
|
|
252
|
+
*/
|
|
253
|
+
getStoredSessionId(): string | null {
|
|
254
|
+
if (typeof window === 'undefined') {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return localStorage.getItem((this.constructor as any).SESSION_STORAGE_KEY);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Build authentication URL with query parameters
|
|
263
|
+
*
|
|
264
|
+
* @private
|
|
265
|
+
*/
|
|
266
|
+
public buildAuthUrl(params: {
|
|
267
|
+
mode: string;
|
|
268
|
+
redirectUri: string;
|
|
269
|
+
state: string;
|
|
270
|
+
nonce: string;
|
|
271
|
+
clientId: string;
|
|
272
|
+
}): string {
|
|
273
|
+
const url = new URL(`${(this.constructor as any).AUTH_URL}/${params.mode}`);
|
|
274
|
+
url.searchParams.set('redirect_uri', params.redirectUri);
|
|
275
|
+
url.searchParams.set('state', params.state);
|
|
276
|
+
url.searchParams.set('nonce', params.nonce);
|
|
277
|
+
url.searchParams.set('client_id', params.clientId);
|
|
278
|
+
url.searchParams.set('response_type', 'token');
|
|
279
|
+
return url.toString();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Store tokens in localStorage
|
|
284
|
+
*
|
|
285
|
+
* @private
|
|
286
|
+
*/
|
|
287
|
+
public storeTokens(accessToken: string, sessionId: string): void {
|
|
288
|
+
if (typeof window === 'undefined') {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
localStorage.setItem((this.constructor as any).TOKEN_STORAGE_KEY, accessToken);
|
|
293
|
+
localStorage.setItem((this.constructor as any).SESSION_STORAGE_KEY, sessionId);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Generate cryptographically secure state for CSRF protection
|
|
298
|
+
*
|
|
299
|
+
* @private
|
|
300
|
+
*/
|
|
301
|
+
public generateState(): string {
|
|
302
|
+
if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {
|
|
303
|
+
return window.crypto.randomUUID();
|
|
304
|
+
}
|
|
305
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Generate nonce for replay attack prevention
|
|
310
|
+
*
|
|
311
|
+
* @private
|
|
312
|
+
*/
|
|
313
|
+
public generateNonce(): string {
|
|
314
|
+
if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {
|
|
315
|
+
return window.crypto.randomUUID();
|
|
316
|
+
}
|
|
317
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Store auth state in session storage
|
|
322
|
+
*
|
|
323
|
+
* @private
|
|
324
|
+
*/
|
|
325
|
+
public storeAuthState(state: string, nonce: string): void {
|
|
326
|
+
if (typeof window === 'undefined') {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
sessionStorage.setItem((this.constructor as any).STATE_STORAGE_KEY, state);
|
|
331
|
+
sessionStorage.setItem((this.constructor as any).NONCE_STORAGE_KEY, nonce);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Get stored state
|
|
336
|
+
*
|
|
337
|
+
* @private
|
|
338
|
+
*/
|
|
339
|
+
public getStoredState(): string | null {
|
|
340
|
+
if (typeof window === 'undefined') {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return sessionStorage.getItem((this.constructor as any).STATE_STORAGE_KEY);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Clear auth state from storage
|
|
349
|
+
*
|
|
350
|
+
* @private
|
|
351
|
+
*/
|
|
352
|
+
public clearAuthState(): void {
|
|
353
|
+
if (typeof window === 'undefined') {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
sessionStorage.removeItem((this.constructor as any).STATE_STORAGE_KEY);
|
|
358
|
+
sessionStorage.removeItem((this.constructor as any).NONCE_STORAGE_KEY);
|
|
359
|
+
sessionStorage.removeItem((this.constructor as any).PRE_AUTH_URL_KEY);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Save pre-authentication URL to restore later
|
|
364
|
+
*
|
|
365
|
+
* @private
|
|
366
|
+
*/
|
|
367
|
+
public savePreAuthUrl(url: string): void {
|
|
368
|
+
if (typeof window === 'undefined') {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
sessionStorage.setItem((this.constructor as any).PRE_AUTH_URL_KEY, url);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Clean authentication parameters from URL
|
|
377
|
+
*
|
|
378
|
+
* @private
|
|
379
|
+
*/
|
|
380
|
+
public cleanAuthCallbackUrl(url: URL): void {
|
|
381
|
+
// Remove auth parameters
|
|
382
|
+
url.searchParams.delete('access_token');
|
|
383
|
+
url.searchParams.delete('session_id');
|
|
384
|
+
url.searchParams.delete('expires_at');
|
|
385
|
+
url.searchParams.delete('state');
|
|
386
|
+
url.searchParams.delete('nonce');
|
|
387
|
+
url.searchParams.delete('error');
|
|
388
|
+
url.searchParams.delete('error_description');
|
|
389
|
+
|
|
390
|
+
// Update URL without reloading page
|
|
391
|
+
window.history.replaceState({}, '', url.toString());
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Export the mixin function as both named and default
|
|
397
|
+
export { OxyServicesRedirectAuthMixin as RedirectAuthMixin };
|
|
@@ -16,7 +16,8 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
16
16
|
async getProfileByUsername(username: string): Promise<User> {
|
|
17
17
|
try {
|
|
18
18
|
return await this.makeRequest<User>('GET', `/api/profiles/username/${username}`, undefined, {
|
|
19
|
-
cache:
|
|
19
|
+
cache: true,
|
|
20
|
+
cacheTTL: 5 * 60 * 1000, // 5 minutes cache for profiles
|
|
20
21
|
});
|
|
21
22
|
} catch (error) {
|
|
22
23
|
throw this.handleError(error);
|
|
@@ -37,7 +38,8 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
37
38
|
'/api/profiles/search',
|
|
38
39
|
paramsObj,
|
|
39
40
|
{
|
|
40
|
-
cache:
|
|
41
|
+
cache: true,
|
|
42
|
+
cacheTTL: 2 * 60 * 1000, // 2 minutes cache
|
|
41
43
|
}
|
|
42
44
|
);
|
|
43
45
|
|
|
@@ -95,7 +97,7 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
95
97
|
[key: string]: any;
|
|
96
98
|
}>> {
|
|
97
99
|
return this.withAuthRetry(async () => {
|
|
98
|
-
return await this.makeRequest('GET', '/api/profiles/recommendations', undefined, { cache:
|
|
100
|
+
return await this.makeRequest('GET', '/api/profiles/recommendations', undefined, { cache: true });
|
|
99
101
|
}, 'getProfileRecommendations');
|
|
100
102
|
}
|
|
101
103
|
|
|
@@ -105,7 +107,8 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
105
107
|
async getUserById(userId: string): Promise<User> {
|
|
106
108
|
try {
|
|
107
109
|
return await this.makeRequest<User>('GET', `/api/users/${userId}`, undefined, {
|
|
108
|
-
cache:
|
|
110
|
+
cache: true,
|
|
111
|
+
cacheTTL: 5 * 60 * 1000, // 5 minutes cache
|
|
109
112
|
});
|
|
110
113
|
} catch (error) {
|
|
111
114
|
throw this.handleError(error);
|
|
@@ -114,41 +117,54 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
114
117
|
|
|
115
118
|
/**
|
|
116
119
|
* Get current user
|
|
117
|
-
* Services never caches profile - always fetch fresh from backend
|
|
118
120
|
*/
|
|
119
121
|
async getCurrentUser(): Promise<User> {
|
|
120
122
|
return this.withAuthRetry(async () => {
|
|
121
123
|
return await this.makeRequest<User>('GET', '/api/users/me', undefined, {
|
|
122
|
-
cache:
|
|
124
|
+
cache: true,
|
|
125
|
+
cacheTTL: 1 * 60 * 1000, // 1 minute cache for current user
|
|
123
126
|
});
|
|
124
127
|
}, 'getCurrentUser');
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
/**
|
|
128
131
|
* Update user profile
|
|
132
|
+
* TanStack Query handles offline queuing automatically
|
|
129
133
|
*/
|
|
130
134
|
async updateProfile(updates: Record<string, any>): Promise<User> {
|
|
131
135
|
try {
|
|
132
136
|
return await this.makeRequest<User>('PUT', '/api/users/me', updates, { cache: false });
|
|
133
137
|
} catch (error) {
|
|
138
|
+
const errorAny = error as any;
|
|
139
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
140
|
+
const status = errorAny?.status || errorAny?.response?.status;
|
|
141
|
+
|
|
142
|
+
// Check if it's an authentication error (401)
|
|
143
|
+
const isAuthError = status === 401 ||
|
|
144
|
+
errorMessage.includes('Authentication required') ||
|
|
145
|
+
errorMessage.includes('Invalid or missing authorization header');
|
|
146
|
+
|
|
147
|
+
// If authentication error and we don't have a token, this might be an offline session
|
|
148
|
+
// The caller should handle syncing the session before retrying
|
|
149
|
+
if (isAuthError && !this.hasValidToken()) {
|
|
150
|
+
// Re-throw with a specific message so the caller knows to sync
|
|
151
|
+
throw new Error('AUTH_REQUIRED_OFFLINE_SESSION: Session needs to be synced to get a token');
|
|
152
|
+
}
|
|
153
|
+
|
|
134
154
|
throw this.handleError(error);
|
|
135
155
|
}
|
|
136
156
|
}
|
|
137
157
|
|
|
138
158
|
/**
|
|
139
159
|
* Get privacy settings for a user
|
|
140
|
-
* @param userId - The user ID (
|
|
160
|
+
* @param userId - The user ID (defaults to current user)
|
|
141
161
|
*/
|
|
142
162
|
async getPrivacySettings(userId?: string): Promise<any> {
|
|
143
163
|
try {
|
|
144
|
-
|
|
145
|
-
// Never use getCurrentUser().id as it may be set to publicKey
|
|
146
|
-
const id = userId || this.getCurrentUserId();
|
|
147
|
-
if (!id) {
|
|
148
|
-
throw new Error('User ID is required');
|
|
149
|
-
}
|
|
164
|
+
const id = userId || (await this.getCurrentUser()).id;
|
|
150
165
|
return await this.makeRequest<any>('GET', `/api/privacy/${id}/privacy`, undefined, {
|
|
151
|
-
cache:
|
|
166
|
+
cache: true,
|
|
167
|
+
cacheTTL: 2 * 60 * 1000, // 2 minutes cache
|
|
152
168
|
});
|
|
153
169
|
} catch (error) {
|
|
154
170
|
throw this.handleError(error);
|
|
@@ -158,16 +174,11 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
158
174
|
/**
|
|
159
175
|
* Update privacy settings
|
|
160
176
|
* @param settings - Partial privacy settings object
|
|
161
|
-
* @param userId - The user ID (
|
|
177
|
+
* @param userId - The user ID (defaults to current user)
|
|
162
178
|
*/
|
|
163
179
|
async updatePrivacySettings(settings: Record<string, any>, userId?: string): Promise<any> {
|
|
164
180
|
try {
|
|
165
|
-
|
|
166
|
-
// Never use getCurrentUser().id as it may be set to publicKey
|
|
167
|
-
const id = userId || this.getCurrentUserId();
|
|
168
|
-
if (!id) {
|
|
169
|
-
throw new Error('User ID is required');
|
|
170
|
-
}
|
|
181
|
+
const id = userId || (await this.getCurrentUser()).id;
|
|
171
182
|
return await this.makeRequest<any>('PATCH', `/api/privacy/${id}/privacy`, settings, {
|
|
172
183
|
cache: false,
|
|
173
184
|
});
|
|
@@ -254,7 +265,8 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
254
265
|
async getFollowStatus(userId: string): Promise<{ isFollowing: boolean }> {
|
|
255
266
|
try {
|
|
256
267
|
return await this.makeRequest('GET', `/api/users/${userId}/follow-status`, undefined, {
|
|
257
|
-
cache:
|
|
268
|
+
cache: true,
|
|
269
|
+
cacheTTL: 1 * 60 * 1000, // 1 minute cache
|
|
258
270
|
});
|
|
259
271
|
} catch (error) {
|
|
260
272
|
throw this.handleError(error);
|
|
@@ -271,7 +283,8 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
271
283
|
try {
|
|
272
284
|
const params = buildPaginationParams(pagination || {});
|
|
273
285
|
const response = await this.makeRequest<{ data: User[]; pagination: { total: number; hasMore: boolean } }>('GET', `/api/users/${userId}/followers`, params, {
|
|
274
|
-
cache:
|
|
286
|
+
cache: true,
|
|
287
|
+
cacheTTL: 2 * 60 * 1000, // 2 minutes cache
|
|
275
288
|
});
|
|
276
289
|
return {
|
|
277
290
|
followers: response.data || [],
|
|
@@ -293,7 +306,8 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
293
306
|
try {
|
|
294
307
|
const params = buildPaginationParams(pagination || {});
|
|
295
308
|
const response = await this.makeRequest<{ data: User[]; pagination: { total: number; hasMore: boolean } }>('GET', `/api/users/${userId}/following`, params, {
|
|
296
|
-
cache:
|
|
309
|
+
cache: true,
|
|
310
|
+
cacheTTL: 2 * 60 * 1000, // 2 minutes cache
|
|
297
311
|
});
|
|
298
312
|
return {
|
|
299
313
|
following: response.data || [],
|
|
@@ -375,3 +389,4 @@ export function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T)
|
|
|
375
389
|
}
|
|
376
390
|
};
|
|
377
391
|
}
|
|
392
|
+
|
package/src/core/mixins/index.ts
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
import { OxyServicesBase } from '../OxyServices.base';
|
|
9
9
|
import { OxyServicesAuthMixin } from './OxyServices.auth';
|
|
10
|
+
import { OxyServicesFedCMMixin } from './OxyServices.fedcm';
|
|
11
|
+
import { OxyServicesPopupAuthMixin } from './OxyServices.popup';
|
|
12
|
+
import { OxyServicesRedirectAuthMixin } from './OxyServices.redirect';
|
|
10
13
|
import { OxyServicesUserMixin } from './OxyServices.user';
|
|
11
14
|
import { OxyServicesPrivacyMixin } from './OxyServices.privacy';
|
|
12
15
|
import { OxyServicesLanguageMixin } from './OxyServices.language';
|
|
@@ -22,10 +25,15 @@ import { OxyServicesUtilityMixin } from './OxyServices.utility';
|
|
|
22
25
|
|
|
23
26
|
/**
|
|
24
27
|
* Composes all OxyServices mixins in the correct order
|
|
25
|
-
*
|
|
28
|
+
*
|
|
26
29
|
* Order matters for mixins - dependencies should be applied first.
|
|
27
30
|
* This function ensures consistent composition across the codebase.
|
|
28
|
-
*
|
|
31
|
+
*
|
|
32
|
+
* New cross-domain auth mixins added:
|
|
33
|
+
* - FedCM: Modern browser-native identity federation (Google-style)
|
|
34
|
+
* - Popup: OAuth2-style popup authentication
|
|
35
|
+
* - Redirect: Traditional redirect-based authentication
|
|
36
|
+
*
|
|
29
37
|
* @returns The fully composed OxyServices class with all mixins applied
|
|
30
38
|
*/
|
|
31
39
|
export function composeOxyServices() {
|
|
@@ -41,7 +49,15 @@ export function composeOxyServices() {
|
|
|
41
49
|
OxyServicesLanguageMixin(
|
|
42
50
|
OxyServicesPrivacyMixin(
|
|
43
51
|
OxyServicesUserMixin(
|
|
44
|
-
|
|
52
|
+
// Cross-domain authentication mixins (web-only)
|
|
53
|
+
OxyServicesRedirectAuthMixin(
|
|
54
|
+
OxyServicesPopupAuthMixin(
|
|
55
|
+
OxyServicesFedCMMixin(
|
|
56
|
+
// Base authentication mixin
|
|
57
|
+
OxyServicesAuthMixin(OxyServicesBase)
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
)
|
|
45
61
|
)
|
|
46
62
|
)
|
|
47
63
|
)
|
package/src/crypto/index.ts
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Oxy Crypto Module
|
|
3
3
|
*
|
|
4
|
-
* Provides
|
|
5
|
-
*
|
|
4
|
+
* Provides cryptographic identity management for the Oxy ecosystem.
|
|
5
|
+
* Handles key generation, secure storage, digital signatures, and recovery phrases.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
// Import polyfills first - this ensures Buffer is available for
|
|
8
|
+
// Import polyfills first - this ensures Buffer is available for bip39 and other libraries
|
|
9
9
|
import './polyfill';
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
export {
|
|
11
|
+
export { KeyManager, type KeyPair } from './keyManager';
|
|
12
|
+
export {
|
|
13
|
+
SignatureService,
|
|
14
|
+
type SignedMessage,
|
|
15
|
+
type AuthChallenge
|
|
16
|
+
} from './signatureService';
|
|
17
|
+
export {
|
|
18
|
+
RecoveryPhraseService,
|
|
19
|
+
type RecoveryPhraseResult
|
|
20
|
+
} from './recoveryPhrase';
|
|
21
|
+
|
|
22
|
+
// Re-export for convenience
|
|
23
|
+
export { KeyManager as default } from './keyManager';
|
|
13
24
|
|
|
14
25
|
|