@oxyhq/services 5.17.16 → 5.17.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -38
- package/lib/commonjs/core/CrossDomainAuth.js +277 -0
- package/lib/commonjs/core/CrossDomainAuth.js.map +1 -0
- package/lib/commonjs/core/HttpService.js +82 -15
- package/lib/commonjs/core/HttpService.js.map +1 -1
- package/lib/commonjs/core/OxyServices.base.js +11 -3
- package/lib/commonjs/core/OxyServices.base.js.map +1 -1
- package/lib/commonjs/core/OxyServices.js +4 -1
- package/lib/commonjs/core/OxyServices.js.map +1 -1
- package/lib/commonjs/core/index.js +30 -0
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.assets.js +16 -3
- package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.auth.js +73 -32
- package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js +289 -0
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.popup.js +352 -0
- package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.redirect.js +378 -0
- package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +1 -0
- package/lib/commonjs/core/mixins/OxyServices.user.js +35 -24
- package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/commonjs/core/mixins/index.js +27 -15
- package/lib/commonjs/core/mixins/index.js.map +1 -1
- package/lib/commonjs/crypto/index.js +30 -0
- package/lib/commonjs/crypto/index.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +902 -0
- package/lib/commonjs/crypto/keyManager.js.map +1 -0
- package/lib/commonjs/crypto/polyfill.js +14 -5
- package/lib/commonjs/crypto/polyfill.js.map +1 -1
- package/lib/commonjs/crypto/recoveryPhrase.js +152 -0
- package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
- package/lib/commonjs/crypto/signatureService.js +289 -0
- package/lib/commonjs/crypto/signatureService.js.map +1 -0
- package/lib/commonjs/i18n/locales/en-US.json +1 -1
- package/lib/commonjs/index.js +40 -26
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/interfaces.js +0 -15
- package/lib/commonjs/models/interfaces.js.map +1 -1
- package/lib/commonjs/ui/components/BottomSheetRouter.js +9 -1
- package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
- package/lib/commonjs/ui/components/Icon.js.map +1 -1
- package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +41 -11
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -1
- package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -1
- package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -1
- package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +110 -192
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +150 -19
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js +279 -0
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +78 -64
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +38 -51
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +3 -3
- package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +18 -12
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
- package/lib/commonjs/ui/hooks/useProfileEditing.js +3 -5
- package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionManagement.js +4 -8
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionSocket.js +162 -315
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/commonjs/ui/hooks/useStorage.js +24 -58
- package/lib/commonjs/ui/hooks/useStorage.js.map +1 -1
- package/lib/commonjs/ui/index.js +50 -21
- package/lib/commonjs/ui/index.js.map +1 -1
- package/lib/commonjs/ui/navigation/routes.js +5 -1
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +2 -2
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +29 -24
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +3 -3
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +134 -66
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +6 -13
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/stores/accountStore.js +2 -4
- package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
- package/lib/commonjs/ui/stores/authStore.js +45 -32
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/commonjs/ui/styles/spacing.js +54 -2
- package/lib/commonjs/ui/styles/spacing.js.map +1 -1
- package/lib/commonjs/ui/utils/avatarUtils.js +37 -41
- package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
- package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -1
- package/lib/commonjs/utils/errorUtils.js +13 -0
- package/lib/commonjs/utils/errorUtils.js.map +1 -1
- package/lib/commonjs/utils/validationUtils.js +15 -1
- package/lib/commonjs/utils/validationUtils.js.map +1 -1
- package/lib/module/core/CrossDomainAuth.js +271 -0
- package/lib/module/core/CrossDomainAuth.js.map +1 -0
- package/lib/module/core/HttpService.js +82 -15
- package/lib/module/core/HttpService.js.map +1 -1
- package/lib/module/core/OxyServices.base.js +11 -4
- package/lib/module/core/OxyServices.base.js.map +1 -1
- package/lib/module/core/OxyServices.js +4 -1
- package/lib/module/core/OxyServices.js.map +1 -1
- package/lib/module/core/index.js +6 -1
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.assets.js +16 -3
- package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.auth.js +73 -32
- package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.fedcm.js +286 -0
- package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.popup.js +349 -0
- package/lib/module/core/mixins/OxyServices.popup.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.redirect.js +375 -0
- package/lib/module/core/mixins/OxyServices.redirect.js.map +1 -0
- package/lib/module/core/mixins/OxyServices.user.js +35 -24
- package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/module/core/mixins/index.js +15 -3
- package/lib/module/core/mixins/index.js.map +1 -1
- package/lib/module/crypto/index.js +8 -4
- package/lib/module/crypto/index.js.map +1 -1
- package/lib/module/crypto/keyManager.js +899 -0
- package/lib/module/crypto/keyManager.js.map +1 -0
- package/lib/module/crypto/polyfill.js +6 -5
- package/lib/module/crypto/polyfill.js.map +1 -1
- package/lib/module/crypto/recoveryPhrase.js +147 -0
- package/lib/module/crypto/recoveryPhrase.js.map +1 -0
- package/lib/module/crypto/signatureService.js +286 -0
- package/lib/module/crypto/signatureService.js.map +1 -0
- package/lib/module/i18n/locales/en-US.json +1 -1
- package/lib/module/index.js +6 -9
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/interfaces.js +0 -15
- package/lib/module/models/interfaces.js.map +1 -1
- package/lib/module/ui/components/BottomSheetRouter.js +6 -2
- package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
- package/lib/module/ui/components/Icon.js.map +1 -1
- package/lib/module/ui/components/IconButton/utils.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +41 -11
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -1
- package/lib/module/ui/components/TextField/helpers.js.map +1 -1
- package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -1
- package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +112 -184
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +150 -19
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/hooks/useSessionManagement.js +274 -0
- package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +79 -64
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/queries/useAccountQueries.js +31 -44
- package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/module/ui/hooks/queries/useSecurityQueries.js +1 -1
- package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
- package/lib/module/ui/hooks/queries/useServicesQueries.js +13 -7
- package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
- package/lib/module/ui/hooks/useProfileEditing.js +3 -5
- package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
- package/lib/module/ui/hooks/useSessionManagement.js +4 -8
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/hooks/useSessionSocket.js +162 -315
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/module/ui/hooks/useStorage.js +25 -59
- package/lib/module/ui/hooks/useStorage.js.map +1 -1
- package/lib/module/ui/index.js +15 -10
- package/lib/module/ui/index.js.map +1 -1
- package/lib/module/ui/navigation/routes.js +5 -1
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +2 -2
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +29 -24
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +3 -3
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +135 -68
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +6 -13
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/ui/stores/accountStore.js +2 -4
- package/lib/module/ui/stores/accountStore.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +45 -32
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/module/ui/styles/spacing.js +6 -2
- package/lib/module/ui/styles/spacing.js.map +1 -1
- package/lib/module/ui/utils/avatarUtils.js +37 -40
- package/lib/module/ui/utils/avatarUtils.js.map +1 -1
- package/lib/module/ui/utils/storageHelpers.js.map +1 -1
- package/lib/module/utils/errorUtils.js +7 -0
- package/lib/module/utils/errorUtils.js.map +1 -1
- package/lib/module/utils/validationUtils.js +13 -0
- package/lib/module/utils/validationUtils.js.map +1 -1
- package/lib/typescript/core/CrossDomainAuth.d.ts +161 -0
- package/lib/typescript/core/CrossDomainAuth.d.ts.map +1 -0
- package/lib/typescript/core/HttpService.d.ts +1 -1
- package/lib/typescript/core/HttpService.d.ts.map +1 -1
- package/lib/typescript/core/OxyServices.base.d.ts +0 -6
- package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
- package/lib/typescript/core/OxyServices.d.ts +5 -36
- package/lib/typescript/core/OxyServices.d.ts.map +1 -1
- package/lib/typescript/core/index.d.ts +4 -0
- package/lib/typescript/core/index.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts +40 -20
- package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts +195 -0
- package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.popup.d.ts +206 -0
- package/lib/typescript/core/mixins/OxyServices.popup.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.redirect.d.ts +246 -0
- package/lib/typescript/core/mixins/OxyServices.redirect.d.ts.map +1 -0
- package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts +6 -4
- package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
- package/lib/typescript/core/mixins/index.d.ts +220 -8
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/crypto/index.d.ts +6 -3
- package/lib/typescript/crypto/index.d.ts.map +1 -1
- package/lib/typescript/crypto/keyManager.d.ts +190 -0
- package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
- package/lib/typescript/crypto/polyfill.d.ts +4 -3
- package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
- package/lib/typescript/crypto/recoveryPhrase.d.ts +59 -0
- package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
- package/lib/typescript/crypto/signatureService.d.ts +87 -0
- package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +5 -6
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/models/interfaces.d.ts +2 -14
- package/lib/typescript/models/interfaces.d.ts.map +1 -1
- package/lib/typescript/models/session.d.ts +0 -9
- package/lib/typescript/models/session.d.ts.map +1 -1
- package/lib/typescript/types/bip39.d.ts +32 -0
- package/lib/typescript/ui/components/BottomSheetRouter.d.ts +5 -0
- package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
- package/lib/typescript/ui/components/IconButton/utils.d.ts +1 -1
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
- package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +1 -1
- package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -1
- package/lib/typescript/ui/components/TextField/helpers.d.ts +8 -8
- package/lib/typescript/ui/components/TextField/types.d.ts +1 -0
- package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
- package/lib/typescript/ui/components/types.d.ts +4 -0
- package/lib/typescript/ui/components/types.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +57 -3
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +10 -3
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +41 -0
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -2
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useStorage.d.ts +3 -9
- package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -1
- package/lib/typescript/ui/index.d.ts +6 -2
- package/lib/typescript/ui/index.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +1 -1
- package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +8 -7
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/ui/styles/spacing.d.ts +5 -0
- package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
- package/lib/typescript/ui/types/navigation.d.ts +2 -1
- package/lib/typescript/ui/types/navigation.d.ts.map +1 -1
- package/lib/typescript/ui/utils/avatarUtils.d.ts +2 -13
- package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
- package/lib/typescript/ui/utils/storageHelpers.d.ts +0 -3
- package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -1
- package/lib/typescript/utils/errorUtils.d.ts +6 -0
- package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
- package/lib/typescript/utils/validationUtils.d.ts +8 -0
- package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/core/CrossDomainAuth.ts +307 -0
- package/src/core/HttpService.ts +99 -16
- package/src/core/OxyServices.base.ts +20 -3
- package/src/core/OxyServices.ts +7 -3
- package/src/core/index.ts +9 -1
- package/src/core/mixins/OxyServices.assets.ts +14 -3
- package/src/core/mixins/OxyServices.auth.ts +105 -36
- package/src/core/mixins/OxyServices.fedcm.ts +315 -0
- package/src/core/mixins/OxyServices.popup.ts +402 -0
- package/src/core/mixins/OxyServices.redirect.ts +397 -0
- package/src/core/mixins/OxyServices.user.ts +39 -24
- package/src/core/mixins/index.ts +19 -3
- package/src/crypto/index.ts +16 -5
- package/src/crypto/keyManager.ts +966 -0
- package/src/crypto/polyfill.ts +6 -5
- package/src/crypto/recoveryPhrase.ts +166 -0
- package/src/crypto/signatureService.ts +323 -0
- package/src/i18n/locales/en-US.json +1 -1
- package/src/index.ts +19 -15
- package/src/models/interfaces.ts +4 -16
- package/src/models/session.ts +2 -11
- package/src/types/bip39.d.ts +32 -0
- package/src/ui/components/BottomSheetRouter.tsx +6 -1
- package/src/ui/components/Icon.tsx +1 -1
- package/src/ui/components/IconButton/utils.ts +1 -1
- package/src/ui/components/OxyProvider.tsx +44 -12
- package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
- package/src/ui/components/TextField/Adornment/utils.ts +2 -2
- package/src/ui/components/TextField/helpers.tsx +10 -10
- package/src/ui/components/TextField/types.tsx +1 -1
- package/src/ui/components/TouchableRipple/utils.ts +2 -2
- package/src/ui/components/Typography/AnimatedText.tsx +2 -2
- package/src/ui/components/types.tsx +6 -0
- package/src/ui/context/OxyContext.tsx +173 -185
- package/src/ui/context/hooks/useAuthOperations.ts +177 -36
- package/src/ui/context/hooks/useSessionManagement.ts +399 -0
- package/src/ui/hooks/mutations/useAccountMutations.ts +82 -65
- package/src/ui/hooks/queries/useAccountQueries.ts +29 -35
- package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
- package/src/ui/hooks/queries/useServicesQueries.ts +14 -6
- package/src/ui/hooks/useProfileEditing.ts +3 -3
- package/src/ui/hooks/useSessionManagement.ts +5 -10
- package/src/ui/hooks/useSessionSocket.ts +46 -175
- package/src/ui/hooks/useStorage.ts +24 -76
- package/src/ui/index.ts +22 -13
- package/src/ui/navigation/routes.ts +6 -2
- package/src/ui/screens/AccountCenterScreen.tsx +2 -2
- package/src/ui/screens/AccountOverviewScreen.tsx +1 -1
- package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
- package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
- package/src/ui/screens/OxyAuthScreen.tsx +138 -64
- package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
- package/src/ui/stores/accountStore.ts +1 -11
- package/src/ui/stores/authStore.ts +43 -44
- package/src/ui/styles/spacing.ts +15 -2
- package/src/ui/types/navigation.ts +2 -2
- package/src/ui/utils/avatarUtils.ts +39 -46
- package/src/ui/utils/storageHelpers.ts +0 -4
- package/src/utils/__tests__/validationUtils.test.ts +16 -1
- package/src/utils/errorUtils.ts +8 -1
- package/src/utils/validationUtils.ts +12 -0
- package/lib/commonjs/core/services/SessionService.js +0 -163
- package/lib/commonjs/core/services/SessionService.js.map +0 -1
- package/lib/commonjs/core/services/TokenService.js +0 -220
- package/lib/commonjs/core/services/TokenService.js.map +0 -1
- package/lib/commonjs/crypto/types.js +0 -2
- package/lib/commonjs/crypto/types.js.map +0 -1
- package/lib/commonjs/ui/context/OxyContextBase.js +0 -21
- package/lib/commonjs/ui/context/OxyContextBase.js.map +0 -1
- package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
- package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
- package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -56
- package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
- package/lib/module/core/services/SessionService.js +0 -159
- package/lib/module/core/services/SessionService.js.map +0 -1
- package/lib/module/core/services/TokenService.js +0 -217
- package/lib/module/core/services/TokenService.js.map +0 -1
- package/lib/module/crypto/types.js +0 -2
- package/lib/module/crypto/types.js.map +0 -1
- package/lib/module/ui/context/OxyContextBase.js +0 -16
- package/lib/module/ui/context/OxyContextBase.js.map +0 -1
- package/lib/module/ui/context/hooks/useStorage.js +0 -74
- package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
- package/lib/module/ui/hooks/useAvatarPicker.js +0 -50
- package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
- package/lib/typescript/core/services/SessionService.d.ts +0 -78
- package/lib/typescript/core/services/SessionService.d.ts.map +0 -1
- package/lib/typescript/core/services/TokenService.d.ts +0 -72
- package/lib/typescript/core/services/TokenService.d.ts.map +0 -1
- package/lib/typescript/crypto/types.d.ts +0 -22
- package/lib/typescript/crypto/types.d.ts.map +0 -1
- package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -63
- package/lib/typescript/ui/context/OxyContextBase.d.ts.map +0 -1
- package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
- package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
- package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -19
- package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
- package/src/core/services/SessionService.ts +0 -173
- package/src/core/services/TokenService.ts +0 -237
- package/src/crypto/types.ts +0 -23
- package/src/ui/context/OxyContextBase.tsx +0 -78
- package/src/ui/context/hooks/useStorage.ts +0 -104
- package/src/ui/hooks/useAvatarPicker.ts +0 -61
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import type { OxyServicesBase } from '../OxyServices.base';
|
|
2
|
+
import { OxyAuthenticationError } from '../OxyServices.errors';
|
|
3
|
+
import type { SessionLoginResponse } from '../../models/session';
|
|
4
|
+
|
|
5
|
+
export interface PopupAuthOptions {
|
|
6
|
+
width?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
timeout?: number;
|
|
9
|
+
mode?: 'login' | 'signup';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface SilentAuthOptions {
|
|
13
|
+
timeout?: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Popup-based Cross-Domain Authentication Mixin
|
|
18
|
+
*
|
|
19
|
+
* Implements OAuth2-style authentication using popup windows and postMessage.
|
|
20
|
+
* This is the primary authentication method for modern browsers, providing a
|
|
21
|
+
* Google-like experience without full page redirects.
|
|
22
|
+
*
|
|
23
|
+
* Flow:
|
|
24
|
+
* 1. Opens small popup window to auth.oxy.so
|
|
25
|
+
* 2. User signs in (auth.oxy.so sets its own first-party cookie)
|
|
26
|
+
* 3. auth.oxy.so sends token back via postMessage
|
|
27
|
+
* 4. Popup closes, parent app has the session
|
|
28
|
+
*
|
|
29
|
+
* Features:
|
|
30
|
+
* - No full page redirect (preserves app state)
|
|
31
|
+
* - Works across different domains (homiio.com, mention.earth, etc.)
|
|
32
|
+
* - Silent refresh using hidden iframe for seamless SSO
|
|
33
|
+
* - CSRF protection via state parameter
|
|
34
|
+
* - XSS protection via origin validation
|
|
35
|
+
*
|
|
36
|
+
* Browser Support: All modern browsers (IE11+)
|
|
37
|
+
*/
|
|
38
|
+
export function OxyServicesPopupAuthMixin<T extends typeof OxyServicesBase>(Base: T) {
|
|
39
|
+
return class extends Base {
|
|
40
|
+
constructor(...args: any[]) {
|
|
41
|
+
super(...(args as [any]));
|
|
42
|
+
}
|
|
43
|
+
public static readonly AUTH_URL = 'https://auth.oxy.so';
|
|
44
|
+
public static readonly POPUP_WIDTH = 500;
|
|
45
|
+
public static readonly POPUP_HEIGHT = 700;
|
|
46
|
+
public static readonly POPUP_TIMEOUT = 60000; // 1 minute
|
|
47
|
+
public static readonly SILENT_TIMEOUT = 5000; // 5 seconds
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Sign in using popup window
|
|
51
|
+
*
|
|
52
|
+
* Opens a centered popup window to auth.oxy.so where the user can sign in.
|
|
53
|
+
* The popup automatically closes after successful authentication and the
|
|
54
|
+
* session is returned to the parent window.
|
|
55
|
+
*
|
|
56
|
+
* @param options - Popup configuration options
|
|
57
|
+
* @returns Session with access token and user data
|
|
58
|
+
* @throws {OxyAuthenticationError} If popup is blocked or auth fails
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const handleSignIn = async () => {
|
|
63
|
+
* try {
|
|
64
|
+
* const session = await oxyServices.signInWithPopup();
|
|
65
|
+
* console.log('Signed in:', session.user);
|
|
66
|
+
* } catch (error) {
|
|
67
|
+
* if (error.message.includes('blocked')) {
|
|
68
|
+
* alert('Please allow popups for this site');
|
|
69
|
+
* }
|
|
70
|
+
* }
|
|
71
|
+
* };
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
async signInWithPopup(options: PopupAuthOptions = {}): Promise<SessionLoginResponse> {
|
|
75
|
+
if (typeof window === 'undefined') {
|
|
76
|
+
throw new OxyAuthenticationError('Popup authentication requires browser environment');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const state = this.generateState();
|
|
80
|
+
const nonce = this.generateNonce();
|
|
81
|
+
|
|
82
|
+
// Store state for CSRF protection
|
|
83
|
+
this.storeAuthState(state, nonce);
|
|
84
|
+
|
|
85
|
+
const width = options.width || (this.constructor as any).POPUP_WIDTH;
|
|
86
|
+
const height = options.height || (this.constructor as any).POPUP_HEIGHT;
|
|
87
|
+
const timeout = options.timeout || (this.constructor as any).POPUP_TIMEOUT;
|
|
88
|
+
const mode = options.mode || 'login';
|
|
89
|
+
|
|
90
|
+
const authUrl = this.buildAuthUrl({
|
|
91
|
+
mode,
|
|
92
|
+
state,
|
|
93
|
+
nonce,
|
|
94
|
+
clientId: window.location.origin,
|
|
95
|
+
redirectUri: `${(this.constructor as any).AUTH_URL}/auth/callback`,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const popup = this.openCenteredPopup(authUrl, 'Oxy Sign In', width, height);
|
|
99
|
+
|
|
100
|
+
if (!popup) {
|
|
101
|
+
throw new OxyAuthenticationError(
|
|
102
|
+
'Popup blocked. Please allow popups for this site and try again.'
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
const session = await this.waitForPopupAuth(popup, state, timeout);
|
|
108
|
+
|
|
109
|
+
// Store access token if present
|
|
110
|
+
if (session && (session as any).accessToken) {
|
|
111
|
+
this.httpService.setTokens((session as any).accessToken);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return session;
|
|
115
|
+
} catch (error) {
|
|
116
|
+
throw error;
|
|
117
|
+
} finally {
|
|
118
|
+
this.clearAuthState(state);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Sign up using popup window
|
|
124
|
+
*
|
|
125
|
+
* Same as signInWithPopup but opens the signup page by default.
|
|
126
|
+
*
|
|
127
|
+
* @param options - Popup configuration options
|
|
128
|
+
* @returns Session with access token and user data
|
|
129
|
+
*/
|
|
130
|
+
async signUpWithPopup(options: PopupAuthOptions = {}): Promise<SessionLoginResponse> {
|
|
131
|
+
return this.signInWithPopup({ ...options, mode: 'signup' });
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Silent sign-in using hidden iframe
|
|
136
|
+
*
|
|
137
|
+
* Attempts to automatically re-authenticate the user without any UI.
|
|
138
|
+
* This is what enables seamless SSO across all Oxy domains.
|
|
139
|
+
*
|
|
140
|
+
* How it works:
|
|
141
|
+
* 1. Creates hidden iframe pointing to auth.oxy.so/silent-auth
|
|
142
|
+
* 2. If user has valid session at auth.oxy.so, it sends token via postMessage
|
|
143
|
+
* 3. If not, iframe responds with null (no error thrown)
|
|
144
|
+
*
|
|
145
|
+
* This should be called on app startup to check for existing sessions.
|
|
146
|
+
*
|
|
147
|
+
* @param options - Silent auth options
|
|
148
|
+
* @returns Session if user is signed in, null otherwise
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* useEffect(() => {
|
|
153
|
+
* const checkAuth = async () => {
|
|
154
|
+
* const session = await oxyServices.silentSignIn();
|
|
155
|
+
* if (session) {
|
|
156
|
+
* setUser(session.user);
|
|
157
|
+
* }
|
|
158
|
+
* };
|
|
159
|
+
* checkAuth();
|
|
160
|
+
* }, []);
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
async silentSignIn(options: SilentAuthOptions = {}): Promise<SessionLoginResponse | null> {
|
|
164
|
+
if (typeof window === 'undefined') {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const timeout = options.timeout || (this.constructor as any).SILENT_TIMEOUT;
|
|
169
|
+
const nonce = this.generateNonce();
|
|
170
|
+
const clientId = window.location.origin;
|
|
171
|
+
|
|
172
|
+
const iframe = document.createElement('iframe');
|
|
173
|
+
iframe.style.display = 'none';
|
|
174
|
+
iframe.style.position = 'absolute';
|
|
175
|
+
iframe.style.width = '0';
|
|
176
|
+
iframe.style.height = '0';
|
|
177
|
+
iframe.style.border = 'none';
|
|
178
|
+
|
|
179
|
+
const silentUrl = `${(this.constructor as any).AUTH_URL}/auth/silent?` + `client_id=${encodeURIComponent(clientId)}&` + `nonce=${nonce}`;
|
|
180
|
+
|
|
181
|
+
iframe.src = silentUrl;
|
|
182
|
+
document.body.appendChild(iframe);
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
const session = await this.waitForIframeAuth(iframe, timeout, clientId);
|
|
186
|
+
|
|
187
|
+
if (session && (session as any).accessToken) {
|
|
188
|
+
this.httpService.setTokens((session as any).accessToken);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return session;
|
|
192
|
+
} catch (error) {
|
|
193
|
+
return null;
|
|
194
|
+
} finally {
|
|
195
|
+
document.body.removeChild(iframe);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Open a centered popup window
|
|
201
|
+
*
|
|
202
|
+
* @private
|
|
203
|
+
*/
|
|
204
|
+
public openCenteredPopup(url: string, title: string, width: number, height: number): Window | null {
|
|
205
|
+
const left = window.screenX + (window.outerWidth - width) / 2;
|
|
206
|
+
const top = window.screenY + (window.outerHeight - height) / 2;
|
|
207
|
+
|
|
208
|
+
const features = [
|
|
209
|
+
`width=${width}`,
|
|
210
|
+
`height=${height}`,
|
|
211
|
+
`left=${left}`,
|
|
212
|
+
`top=${top}`,
|
|
213
|
+
'toolbar=no',
|
|
214
|
+
'menubar=no',
|
|
215
|
+
'scrollbars=yes',
|
|
216
|
+
'resizable=yes',
|
|
217
|
+
'status=no',
|
|
218
|
+
'location=no',
|
|
219
|
+
].join(',');
|
|
220
|
+
|
|
221
|
+
return window.open(url, title, features);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Wait for authentication response from popup
|
|
226
|
+
*
|
|
227
|
+
* @private
|
|
228
|
+
*/
|
|
229
|
+
public async waitForPopupAuth(
|
|
230
|
+
popup: Window,
|
|
231
|
+
expectedState: string,
|
|
232
|
+
timeout: number
|
|
233
|
+
): Promise<SessionLoginResponse> {
|
|
234
|
+
return new Promise((resolve, reject) => {
|
|
235
|
+
const timeoutId = setTimeout(() => {
|
|
236
|
+
cleanup();
|
|
237
|
+
reject(new OxyAuthenticationError('Authentication timeout'));
|
|
238
|
+
}, timeout);
|
|
239
|
+
|
|
240
|
+
const messageHandler = (event: MessageEvent) => {
|
|
241
|
+
// CRITICAL: Verify origin to prevent XSS attacks
|
|
242
|
+
if (event.origin !== (this.constructor as any).AUTH_URL) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const { type, state, session, error } = event.data;
|
|
247
|
+
|
|
248
|
+
if (type !== 'oxy_auth_response') {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Verify state parameter to prevent CSRF attacks
|
|
253
|
+
if (state !== expectedState) {
|
|
254
|
+
cleanup();
|
|
255
|
+
reject(new OxyAuthenticationError('Invalid state parameter. Possible CSRF attack.'));
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
cleanup();
|
|
260
|
+
|
|
261
|
+
if (error) {
|
|
262
|
+
reject(new OxyAuthenticationError(error));
|
|
263
|
+
} else if (session) {
|
|
264
|
+
resolve(session);
|
|
265
|
+
} else {
|
|
266
|
+
reject(new OxyAuthenticationError('No session received from authentication server'));
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// Poll to detect if user closed the popup
|
|
271
|
+
const pollInterval = setInterval(() => {
|
|
272
|
+
if (popup.closed) {
|
|
273
|
+
cleanup();
|
|
274
|
+
reject(new OxyAuthenticationError('Authentication cancelled by user'));
|
|
275
|
+
}
|
|
276
|
+
}, 500);
|
|
277
|
+
|
|
278
|
+
const cleanup = () => {
|
|
279
|
+
clearTimeout(timeoutId);
|
|
280
|
+
clearInterval(pollInterval);
|
|
281
|
+
window.removeEventListener('message', messageHandler);
|
|
282
|
+
if (!popup.closed) {
|
|
283
|
+
popup.close();
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
window.addEventListener('message', messageHandler);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Wait for authentication response from iframe
|
|
293
|
+
*
|
|
294
|
+
* @private
|
|
295
|
+
*/
|
|
296
|
+
public async waitForIframeAuth(
|
|
297
|
+
iframe: HTMLIFrameElement,
|
|
298
|
+
timeout: number,
|
|
299
|
+
expectedOrigin: string
|
|
300
|
+
): Promise<SessionLoginResponse | null> {
|
|
301
|
+
return new Promise((resolve) => {
|
|
302
|
+
const timeoutId = setTimeout(() => {
|
|
303
|
+
cleanup();
|
|
304
|
+
resolve(null); // Silent failure - don't throw
|
|
305
|
+
}, timeout);
|
|
306
|
+
|
|
307
|
+
const messageHandler = (event: MessageEvent) => {
|
|
308
|
+
// Verify origin
|
|
309
|
+
if (event.origin !== (this.constructor as any).AUTH_URL) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const { type, session } = event.data;
|
|
314
|
+
|
|
315
|
+
if (type !== 'oxy_silent_auth') {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
cleanup();
|
|
320
|
+
resolve(session || null);
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
const cleanup = () => {
|
|
324
|
+
clearTimeout(timeoutId);
|
|
325
|
+
window.removeEventListener('message', messageHandler);
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
window.addEventListener('message', messageHandler);
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Build authentication URL with query parameters
|
|
334
|
+
*
|
|
335
|
+
* @private
|
|
336
|
+
*/
|
|
337
|
+
public buildAuthUrl(params: {
|
|
338
|
+
mode: string;
|
|
339
|
+
state: string;
|
|
340
|
+
nonce: string;
|
|
341
|
+
clientId: string;
|
|
342
|
+
redirectUri: string;
|
|
343
|
+
}): string {
|
|
344
|
+
const url = new URL(`${(this.constructor as any).AUTH_URL}/${params.mode}`);
|
|
345
|
+
url.searchParams.set('response_type', 'token');
|
|
346
|
+
url.searchParams.set('client_id', params.clientId);
|
|
347
|
+
url.searchParams.set('redirect_uri', params.redirectUri);
|
|
348
|
+
url.searchParams.set('state', params.state);
|
|
349
|
+
url.searchParams.set('nonce', params.nonce);
|
|
350
|
+
return url.toString();
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Generate cryptographically secure state for CSRF protection
|
|
355
|
+
*
|
|
356
|
+
* @private
|
|
357
|
+
*/
|
|
358
|
+
public generateState(): string {
|
|
359
|
+
if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {
|
|
360
|
+
return window.crypto.randomUUID();
|
|
361
|
+
}
|
|
362
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Generate nonce for replay attack prevention
|
|
367
|
+
*
|
|
368
|
+
* @private
|
|
369
|
+
*/
|
|
370
|
+
public generateNonce(): string {
|
|
371
|
+
if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {
|
|
372
|
+
return window.crypto.randomUUID();
|
|
373
|
+
}
|
|
374
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Store auth state in session storage
|
|
379
|
+
*
|
|
380
|
+
* @private
|
|
381
|
+
*/
|
|
382
|
+
public storeAuthState(state: string, nonce: string): void {
|
|
383
|
+
if (typeof window !== 'undefined' && window.sessionStorage) {
|
|
384
|
+
sessionStorage.setItem(`oxy_auth_state_${state}`, JSON.stringify({ nonce, timestamp: Date.now() }));
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Clear auth state from session storage
|
|
390
|
+
*
|
|
391
|
+
* @private
|
|
392
|
+
*/
|
|
393
|
+
public clearAuthState(state: string): void {
|
|
394
|
+
if (typeof window !== 'undefined' && window.sessionStorage) {
|
|
395
|
+
sessionStorage.removeItem(`oxy_auth_state_${state}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Export the mixin function as both named and default
|
|
402
|
+
export { OxyServicesPopupAuthMixin as PopupAuthMixin };
|