@oxyhq/services 5.25.0 → 5.26.1
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 +60 -8
- package/lib/commonjs/core/AuthManager.js +405 -0
- package/lib/commonjs/core/AuthManager.js.map +1 -0
- package/lib/commonjs/core/HttpService.js +39 -1
- package/lib/commonjs/core/HttpService.js.map +1 -1
- package/lib/commonjs/core/index.js +16 -0
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js +38 -44
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.popup.js +9 -7
- package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +16 -21
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/index.js +386 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/lib/sonner.js +13 -17
- package/lib/commonjs/lib/sonner.js.map +1 -1
- package/lib/commonjs/lib/sonner.native.js +24 -0
- package/lib/commonjs/lib/sonner.native.js.map +1 -0
- package/lib/commonjs/lib/sonner.web.js +24 -0
- package/lib/commonjs/lib/sonner.web.js.map +1 -0
- package/lib/commonjs/shared/index.js +227 -0
- package/lib/commonjs/shared/index.js.map +1 -0
- package/lib/commonjs/shared/utils/colorUtils.js +161 -0
- package/lib/commonjs/shared/utils/colorUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/debugUtils.js +84 -0
- package/lib/commonjs/shared/utils/debugUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/errorUtils.js +190 -0
- package/lib/commonjs/shared/utils/errorUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/index.js +196 -0
- package/lib/commonjs/shared/utils/index.js.map +1 -0
- package/lib/commonjs/shared/utils/networkUtils.js +213 -0
- package/lib/commonjs/shared/utils/networkUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/themeUtils.js +118 -0
- package/lib/commonjs/shared/utils/themeUtils.js.map +1 -0
- package/lib/commonjs/ui/client.js +1 -1
- package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -1
- package/lib/commonjs/ui/components/FollowButton.js +1 -1
- package/lib/commonjs/ui/components/FontLoader.js +1 -1
- package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedItem.js +1 -1
- package/lib/commonjs/ui/components/Header.js +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +10 -2
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/OxySignInButton.js +19 -20
- package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileCard.js +1 -1
- package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
- package/lib/commonjs/ui/components/QuickActions.js +1 -1
- package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
- package/lib/commonjs/ui/components/Section.js +1 -1
- package/lib/commonjs/ui/components/SectionTitle.js +1 -1
- package/lib/commonjs/ui/components/SignInModal.js +546 -0
- package/lib/commonjs/ui/components/SignInModal.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +3 -2
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +1 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +1 -1
- package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +1 -1
- package/lib/commonjs/ui/hooks/useAsyncAction.js +1 -1
- package/lib/commonjs/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
- package/lib/commonjs/ui/hooks/useColorScheme.js.map +1 -0
- package/lib/commonjs/ui/hooks/useSessionSocket.js +7 -13
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSettingToggle.js +1 -1
- package/lib/commonjs/ui/hooks/useThemeColors.js +1 -1
- package/lib/commonjs/ui/hooks/useThemeStyles.js +1 -1
- package/lib/commonjs/ui/navigation/bottomSheetManager.js +5 -2
- package/lib/commonjs/ui/navigation/bottomSheetManager.js.map +1 -1
- package/lib/commonjs/ui/navigation/routes.js +7 -8
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +8 -8
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +7 -7
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +3 -3
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +5 -5
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountVerificationScreen.js +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +2 -2
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +2 -2
- package/lib/commonjs/ui/screens/FAQScreen.js +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +2 -2
- package/lib/commonjs/ui/screens/FollowersListScreen.js +18 -0
- package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/FollowingListScreen.js +18 -0
- package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/HelpSupportScreen.js +2 -2
- package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HistoryViewScreen.js +2 -2
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +2 -2
- package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +229 -0
- package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +2 -2
- package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +9 -21
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +2 -2
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +2 -2
- package/lib/commonjs/ui/screens/SessionManagementScreen.js +1 -1
- package/lib/commonjs/ui/screens/UserListScreen.js +411 -0
- package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +1 -1
- package/lib/commonjs/ui/stores/authStore.js +4 -6
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/commonjs/ui/utils/colorUtils.js +43 -46
- package/lib/commonjs/ui/utils/colorUtils.js.map +1 -1
- package/lib/commonjs/ui/utils/fileManagement.js +1 -1
- package/lib/commonjs/ui/utils/themeUtils.js +29 -39
- package/lib/commonjs/ui/utils/themeUtils.js.map +1 -1
- package/lib/commonjs/ui/utils/{user-utils.js → userUtils.js} +1 -1
- package/lib/commonjs/ui/utils/userUtils.js.map +1 -0
- package/lib/commonjs/utils/errorUtils.js +0 -13
- package/lib/commonjs/utils/errorUtils.js.map +1 -1
- package/lib/commonjs/utils/hookUtils.js +8 -8
- package/lib/commonjs/utils/hookUtils.js.map +1 -1
- package/lib/commonjs/utils/platform.js +129 -0
- package/lib/commonjs/utils/platform.js.map +1 -0
- package/lib/commonjs/web/WebOxyContext.js +273 -41
- package/lib/commonjs/web/WebOxyContext.js.map +1 -1
- package/lib/commonjs/web/index.js +177 -4
- package/lib/commonjs/web/index.js.map +1 -1
- package/lib/commonjs/web.js +12 -12
- package/lib/commonjs/web.js.map +1 -1
- package/lib/module/core/AuthManager.js +399 -0
- package/lib/module/core/AuthManager.js.map +1 -0
- package/lib/module/core/HttpService.js +39 -1
- package/lib/module/core/HttpService.js.map +1 -1
- package/lib/module/core/index.js +2 -0
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.fedcm.js +38 -44
- package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.popup.js +9 -7
- package/lib/module/core/mixins/OxyServices.popup.js.map +1 -1
- package/lib/module/crypto/keyManager.js +16 -21
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/index.js +34 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/lib/sonner.js +11 -16
- package/lib/module/lib/sonner.js.map +1 -1
- package/lib/module/lib/sonner.native.js +19 -0
- package/lib/module/lib/sonner.native.js.map +1 -0
- package/lib/module/lib/sonner.web.js +19 -0
- package/lib/module/lib/sonner.web.js.map +1 -0
- package/lib/module/shared/index.js +37 -0
- package/lib/module/shared/index.js.map +1 -0
- package/lib/module/shared/utils/colorUtils.js +150 -0
- package/lib/module/shared/utils/colorUtils.js.map +1 -0
- package/lib/module/shared/utils/debugUtils.js +75 -0
- package/lib/module/shared/utils/debugUtils.js.map +1 -0
- package/lib/module/shared/utils/errorUtils.js +176 -0
- package/lib/module/shared/utils/errorUtils.js.map +1 -0
- package/lib/module/shared/utils/index.js +21 -0
- package/lib/module/shared/utils/index.js.map +1 -0
- package/lib/module/shared/utils/networkUtils.js +202 -0
- package/lib/module/shared/utils/networkUtils.js.map +1 -0
- package/lib/module/shared/utils/themeUtils.js +109 -0
- package/lib/module/shared/utils/themeUtils.js.map +1 -0
- package/lib/module/ui/client.js +1 -1
- package/lib/module/ui/client.js.map +1 -1
- package/lib/module/ui/components/BottomSheetRouter.js +1 -1
- package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
- package/lib/module/ui/components/FollowButton.js +1 -1
- package/lib/module/ui/components/FollowButton.js.map +1 -1
- package/lib/module/ui/components/FontLoader.js +1 -1
- package/lib/module/ui/components/FontLoader.js.map +1 -1
- package/lib/module/ui/components/GroupedItem.js +1 -1
- package/lib/module/ui/components/GroupedItem.js.map +1 -1
- package/lib/module/ui/components/Header.js +1 -1
- package/lib/module/ui/components/Header.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +10 -2
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/OxySignInButton.js +20 -21
- package/lib/module/ui/components/OxySignInButton.js.map +1 -1
- package/lib/module/ui/components/ProfileCard.js +1 -1
- package/lib/module/ui/components/ProfileCard.js.map +1 -1
- package/lib/module/ui/components/QuickActions.js +1 -1
- package/lib/module/ui/components/QuickActions.js.map +1 -1
- package/lib/module/ui/components/Section.js +1 -1
- package/lib/module/ui/components/Section.js.map +1 -1
- package/lib/module/ui/components/SectionTitle.js +1 -1
- package/lib/module/ui/components/SectionTitle.js.map +1 -1
- package/lib/module/ui/components/SignInModal.js +536 -0
- package/lib/module/ui/components/SignInModal.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +2 -2
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/mutations/mutationFactory.js +1 -1
- package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useServicesMutations.js +1 -1
- package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
- package/lib/module/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
- package/lib/module/ui/hooks/useColorScheme.js.map +1 -0
- package/lib/module/ui/hooks/useSessionSocket.js +7 -13
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
- package/lib/module/ui/hooks/useThemeColors.js +1 -1
- package/lib/module/ui/hooks/useThemeColors.js.map +1 -1
- package/lib/module/ui/hooks/useThemeStyles.js +1 -1
- package/lib/module/ui/hooks/useThemeStyles.js.map +1 -1
- package/lib/module/ui/navigation/bottomSheetManager.js +5 -2
- package/lib/module/ui/navigation/bottomSheetManager.js.map +1 -1
- package/lib/module/ui/navigation/routes.js +7 -8
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +8 -8
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +7 -7
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +3 -3
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +5 -5
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +2 -2
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js +2 -2
- package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/module/ui/screens/FAQScreen.js +1 -1
- package/lib/module/ui/screens/FAQScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +2 -2
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/FollowersListScreen.js +13 -0
- package/lib/module/ui/screens/FollowersListScreen.js.map +1 -0
- package/lib/module/ui/screens/FollowingListScreen.js +13 -0
- package/lib/module/ui/screens/FollowingListScreen.js.map +1 -0
- package/lib/module/ui/screens/HelpSupportScreen.js +2 -2
- package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/module/ui/screens/HistoryViewScreen.js +2 -2
- package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js +2 -2
- package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +224 -0
- package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
- package/lib/module/ui/screens/LegalDocumentsScreen.js +2 -2
- package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +9 -21
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +1 -1
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.js +2 -2
- package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/UserListScreen.js +405 -0
- package/lib/module/ui/screens/UserListScreen.js.map +1 -0
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaAboutScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaFAQScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaRulesScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +4 -6
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/module/ui/utils/colorUtils.js +7 -40
- package/lib/module/ui/utils/colorUtils.js.map +1 -1
- package/lib/module/ui/utils/fileManagement.js +1 -1
- package/lib/module/ui/utils/fileManagement.js.map +1 -1
- package/lib/module/ui/utils/themeUtils.js +7 -35
- package/lib/module/ui/utils/themeUtils.js.map +1 -1
- package/lib/module/ui/utils/{user-utils.js → userUtils.js} +1 -1
- package/lib/module/ui/utils/userUtils.js.map +1 -0
- package/lib/module/utils/errorUtils.js +0 -7
- package/lib/module/utils/errorUtils.js.map +1 -1
- package/lib/module/utils/hookUtils.js +8 -8
- package/lib/module/utils/hookUtils.js.map +1 -1
- package/lib/module/utils/platform.js +118 -0
- package/lib/module/utils/platform.js.map +1 -0
- package/lib/module/web/WebOxyContext.js +272 -41
- package/lib/module/web/WebOxyContext.js.map +1 -1
- package/lib/module/web/index.js +26 -5
- package/lib/module/web/index.js.map +1 -1
- package/lib/module/web.js +2 -1
- package/lib/module/web.js.map +1 -1
- package/lib/typescript/commonjs/core/AuthManager.d.ts +144 -0
- package/lib/typescript/commonjs/core/AuthManager.d.ts.map +1 -0
- package/lib/typescript/commonjs/core/HttpService.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/index.d.ts +2 -0
- package/lib/typescript/commonjs/core/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts.map +1 -1
- package/lib/typescript/commonjs/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +16 -2
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/lib/sonner.d.ts +11 -14
- package/lib/typescript/commonjs/lib/sonner.d.ts.map +1 -1
- package/lib/typescript/commonjs/lib/sonner.native.d.ts +15 -0
- package/lib/typescript/commonjs/lib/sonner.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/lib/sonner.web.d.ts +15 -0
- package/lib/typescript/commonjs/lib/sonner.web.d.ts.map +1 -0
- package/lib/typescript/commonjs/models/session.d.ts +4 -0
- package/lib/typescript/commonjs/models/session.d.ts.map +1 -1
- package/lib/typescript/commonjs/shared/index.d.ts +29 -0
- package/lib/typescript/commonjs/shared/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts +105 -0
- package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts +49 -0
- package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts +98 -0
- package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/index.d.ts +14 -0
- package/lib/typescript/commonjs/shared/utils/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts +140 -0
- package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts +91 -0
- package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/FontLoader.d.ts +1 -1
- package/lib/typescript/commonjs/ui/components/FontLoader.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/SignInModal.d.ts +18 -0
- package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +1 -2
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
- package/lib/typescript/commonjs/ui/hooks/useColorScheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts +2 -0
- package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +9 -0
- package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +9 -0
- package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
- package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +11 -0
- package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts +7 -11
- package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts +6 -19
- package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
- package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/utils/errorUtils.d.ts +0 -6
- package/lib/typescript/commonjs/utils/errorUtils.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/platform.d.ts +41 -0
- package/lib/typescript/commonjs/utils/platform.d.ts.map +1 -0
- package/lib/typescript/commonjs/web/WebOxyContext.d.ts +117 -9
- package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/web/index.d.ts +19 -8
- package/lib/typescript/commonjs/web/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/web.d.ts +2 -1
- package/lib/typescript/commonjs/web.d.ts.map +1 -1
- package/lib/typescript/module/core/AuthManager.d.ts +144 -0
- package/lib/typescript/module/core/AuthManager.d.ts.map +1 -0
- package/lib/typescript/module/core/HttpService.d.ts.map +1 -1
- package/lib/typescript/module/core/index.d.ts +2 -0
- package/lib/typescript/module/core/index.d.ts.map +1 -1
- package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
- package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts.map +1 -1
- package/lib/typescript/module/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +16 -2
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/lib/sonner.d.ts +11 -14
- package/lib/typescript/module/lib/sonner.d.ts.map +1 -1
- package/lib/typescript/module/lib/sonner.native.d.ts +15 -0
- package/lib/typescript/module/lib/sonner.native.d.ts.map +1 -0
- package/lib/typescript/module/lib/sonner.web.d.ts +15 -0
- package/lib/typescript/module/lib/sonner.web.d.ts.map +1 -0
- package/lib/typescript/module/models/session.d.ts +4 -0
- package/lib/typescript/module/models/session.d.ts.map +1 -1
- package/lib/typescript/module/shared/index.d.ts +29 -0
- package/lib/typescript/module/shared/index.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/colorUtils.d.ts +105 -0
- package/lib/typescript/module/shared/utils/colorUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/debugUtils.d.ts +49 -0
- package/lib/typescript/module/shared/utils/debugUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/errorUtils.d.ts +98 -0
- package/lib/typescript/module/shared/utils/errorUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/index.d.ts +14 -0
- package/lib/typescript/module/shared/utils/index.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/networkUtils.d.ts +140 -0
- package/lib/typescript/module/shared/utils/networkUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/themeUtils.d.ts +91 -0
- package/lib/typescript/module/shared/utils/themeUtils.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/FontLoader.d.ts +1 -1
- package/lib/typescript/module/ui/components/FontLoader.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/SignInModal.d.ts +18 -0
- package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -0
- package/lib/typescript/module/ui/context/OxyContext.d.ts +1 -2
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
- package/lib/typescript/module/ui/hooks/useColorScheme.d.ts.map +1 -0
- package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts +2 -0
- package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts.map +1 -1
- package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +9 -0
- package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +9 -0
- package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
- package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/UserListScreen.d.ts +11 -0
- package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/colorUtils.d.ts +7 -11
- package/lib/typescript/module/ui/utils/colorUtils.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/themeUtils.d.ts +6 -19
- package/lib/typescript/module/ui/utils/themeUtils.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
- package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -0
- package/lib/typescript/module/utils/errorUtils.d.ts +0 -6
- package/lib/typescript/module/utils/errorUtils.d.ts.map +1 -1
- package/lib/typescript/module/utils/platform.d.ts +41 -0
- package/lib/typescript/module/utils/platform.d.ts.map +1 -0
- package/lib/typescript/module/web/WebOxyContext.d.ts +117 -9
- package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
- package/lib/typescript/module/web/index.d.ts +19 -8
- package/lib/typescript/module/web/index.d.ts.map +1 -1
- package/lib/typescript/module/web.d.ts +2 -1
- package/lib/typescript/module/web.d.ts.map +1 -1
- package/package.json +8 -2
- package/src/core/AuthManager.ts +436 -0
- package/src/core/HttpService.ts +43 -1
- package/src/core/index.ts +4 -0
- package/src/core/mixins/OxyServices.fedcm.ts +37 -42
- package/src/core/mixins/OxyServices.popup.ts +10 -7
- package/src/crypto/keyManager.ts +16 -21
- package/src/index.ts +83 -12
- package/src/lib/sonner.native.ts +28 -0
- package/src/lib/sonner.ts +11 -28
- package/src/lib/sonner.web.ts +28 -0
- package/src/models/session.ts +4 -0
- package/src/shared/index.ts +82 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/debugUtils.ts +73 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/ui/components/BottomSheetRouter.tsx +1 -1
- package/src/ui/components/FontLoader.tsx +1 -2
- package/src/ui/components/GroupedItem.tsx +1 -1
- package/src/ui/components/Header.tsx +1 -1
- package/src/ui/components/OxyProvider.tsx +10 -0
- package/src/ui/components/OxySignInButton.tsx +20 -22
- package/src/ui/components/ProfileCard.tsx +1 -1
- package/src/ui/components/QuickActions.tsx +1 -1
- package/src/ui/components/Section.tsx +1 -1
- package/src/ui/components/SectionTitle.tsx +1 -1
- package/src/ui/components/SignInModal.tsx +534 -0
- package/src/ui/context/OxyContext.tsx +1 -2
- package/src/ui/hooks/queries/queryKeys.ts +2 -2
- package/src/ui/hooks/useSessionSocket.ts +12 -17
- package/src/ui/hooks/useThemeColors.ts +1 -1
- package/src/ui/hooks/useThemeStyles.ts +1 -1
- package/src/ui/navigation/bottomSheetManager.ts +5 -1
- package/src/ui/navigation/routes.ts +8 -9
- package/src/ui/screens/AccountCenterScreen.tsx +7 -7
- package/src/ui/screens/AccountOverviewScreen.tsx +6 -6
- package/src/ui/screens/AccountSettingsScreen.tsx +2 -2
- package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
- package/src/ui/screens/AppInfoScreen.tsx +1 -1
- package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
- package/src/ui/screens/FileManagementScreen.tsx +1 -1
- package/src/ui/screens/FollowersListScreen.tsx +14 -0
- package/src/ui/screens/FollowingListScreen.tsx +14 -0
- package/src/ui/screens/HelpSupportScreen.tsx +1 -1
- package/src/ui/screens/HistoryViewScreen.tsx +1 -1
- package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
- package/src/ui/screens/LearnMoreUsernamesScreen.tsx +231 -0
- package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
- package/src/ui/screens/OxyAuthScreen.tsx +10 -21
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
- package/src/ui/screens/ProfileScreen.tsx +1 -1
- package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
- package/src/ui/screens/UserListScreen.tsx +416 -0
- package/src/ui/screens/karma/KarmaAboutScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaCenterScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaFAQScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaRewardsScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaRulesScreen.tsx +1 -1
- package/src/ui/stores/authStore.ts +5 -6
- package/src/ui/utils/colorUtils.ts +15 -43
- package/src/ui/utils/themeUtils.ts +14 -39
- package/src/utils/errorUtils.ts +1 -6
- package/src/utils/hookUtils.ts +8 -8
- package/src/utils/platform.ts +117 -0
- package/src/web/WebOxyContext.tsx +331 -41
- package/src/web/index.ts +76 -6
- package/src/web.ts +1 -1
- package/lib/commonjs/ui/hooks/use-color-scheme.js.map +0 -1
- package/lib/commonjs/ui/utils/user-utils.js.map +0 -1
- package/lib/module/ui/hooks/use-color-scheme.js.map +0 -1
- package/lib/module/ui/utils/user-utils.js.map +0 -1
- package/lib/typescript/commonjs/ui/hooks/use-color-scheme.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/utils/user-utils.d.ts.map +0 -1
- package/lib/typescript/module/ui/hooks/use-color-scheme.d.ts.map +0 -1
- package/lib/typescript/module/ui/utils/user-utils.d.ts.map +0 -1
- /package/src/ui/hooks/{use-color-scheme.ts → useColorScheme.ts} +0 -0
- /package/src/ui/utils/{user-utils.ts → userUtils.ts} +0 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuthManager - Centralized Authentication Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified authentication interface for all platforms.
|
|
5
|
+
* Handles token storage, session management, and auth state changes.
|
|
6
|
+
*
|
|
7
|
+
* @module core/AuthManager
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { OxyServices } from './OxyServices';
|
|
11
|
+
import type { HttpService } from './HttpService';
|
|
12
|
+
import type { SessionLoginResponse, MinimalUserData } from '../models/session';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* OxyServices with optional FedCM methods (provided by FedCM mixin).
|
|
16
|
+
*/
|
|
17
|
+
interface OxyServicesWithFedCM extends OxyServices {
|
|
18
|
+
revokeFedCMCredential?: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Storage adapter interface for platform-agnostic storage.
|
|
23
|
+
*/
|
|
24
|
+
export interface StorageAdapter {
|
|
25
|
+
getItem: (key: string) => Promise<string | null> | string | null;
|
|
26
|
+
setItem: (key: string, value: string) => Promise<void> | void;
|
|
27
|
+
removeItem: (key: string) => Promise<void> | void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Auth state change callback type.
|
|
32
|
+
*/
|
|
33
|
+
export type AuthStateChangeCallback = (user: MinimalUserData | null) => void;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Auth method types.
|
|
37
|
+
*/
|
|
38
|
+
export type AuthMethod = 'fedcm' | 'popup' | 'redirect' | 'credentials' | 'identity';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Auth manager configuration.
|
|
42
|
+
*/
|
|
43
|
+
export interface AuthManagerConfig {
|
|
44
|
+
/** Storage adapter (localStorage, AsyncStorage, etc.) */
|
|
45
|
+
storage?: StorageAdapter;
|
|
46
|
+
/** Whether to auto-refresh tokens */
|
|
47
|
+
autoRefresh?: boolean;
|
|
48
|
+
/** Token refresh interval in milliseconds (default: 5 minutes before expiry) */
|
|
49
|
+
refreshBuffer?: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Storage keys used by AuthManager.
|
|
54
|
+
*/
|
|
55
|
+
const STORAGE_KEYS = {
|
|
56
|
+
ACCESS_TOKEN: 'oxy_access_token',
|
|
57
|
+
REFRESH_TOKEN: 'oxy_refresh_token',
|
|
58
|
+
SESSION: 'oxy_session',
|
|
59
|
+
USER: 'oxy_user',
|
|
60
|
+
AUTH_METHOD: 'oxy_auth_method',
|
|
61
|
+
} as const;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Default in-memory storage for non-browser environments.
|
|
65
|
+
*/
|
|
66
|
+
class MemoryStorage implements StorageAdapter {
|
|
67
|
+
private store = new Map<string, string>();
|
|
68
|
+
|
|
69
|
+
getItem(key: string): string | null {
|
|
70
|
+
return this.store.get(key) ?? null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
setItem(key: string, value: string): void {
|
|
74
|
+
this.store.set(key, value);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
removeItem(key: string): void {
|
|
78
|
+
this.store.delete(key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Browser localStorage adapter.
|
|
84
|
+
*/
|
|
85
|
+
class LocalStorageAdapter implements StorageAdapter {
|
|
86
|
+
getItem(key: string): string | null {
|
|
87
|
+
if (typeof window === 'undefined') return null;
|
|
88
|
+
try {
|
|
89
|
+
return localStorage.getItem(key);
|
|
90
|
+
} catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
setItem(key: string, value: string): void {
|
|
96
|
+
if (typeof window === 'undefined') return;
|
|
97
|
+
try {
|
|
98
|
+
localStorage.setItem(key, value);
|
|
99
|
+
} catch {
|
|
100
|
+
// Storage full or blocked
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
removeItem(key: string): void {
|
|
105
|
+
if (typeof window === 'undefined') return;
|
|
106
|
+
try {
|
|
107
|
+
localStorage.removeItem(key);
|
|
108
|
+
} catch {
|
|
109
|
+
// Ignore errors
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* AuthManager - Centralized authentication management.
|
|
116
|
+
*
|
|
117
|
+
* Provides a single point of control for:
|
|
118
|
+
* - Token storage and retrieval
|
|
119
|
+
* - Session management
|
|
120
|
+
* - Auth state change notifications
|
|
121
|
+
* - Multiple auth method support
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* const authManager = new AuthManager(oxyServices);
|
|
126
|
+
*
|
|
127
|
+
* // Listen for auth changes
|
|
128
|
+
* authManager.onAuthStateChange((user) => {
|
|
129
|
+
* console.log('Auth state changed:', user);
|
|
130
|
+
* });
|
|
131
|
+
*
|
|
132
|
+
* // Handle successful auth
|
|
133
|
+
* await authManager.handleAuthSuccess(session);
|
|
134
|
+
*
|
|
135
|
+
* // Sign out
|
|
136
|
+
* await authManager.signOut();
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export class AuthManager {
|
|
140
|
+
private oxyServices: OxyServices;
|
|
141
|
+
private storage: StorageAdapter;
|
|
142
|
+
private listeners: Set<AuthStateChangeCallback> = new Set();
|
|
143
|
+
private currentUser: MinimalUserData | null = null;
|
|
144
|
+
private refreshTimer: ReturnType<typeof setTimeout> | null = null;
|
|
145
|
+
private config: Required<AuthManagerConfig>;
|
|
146
|
+
|
|
147
|
+
constructor(oxyServices: OxyServices, config: AuthManagerConfig = {}) {
|
|
148
|
+
this.oxyServices = oxyServices;
|
|
149
|
+
this.config = {
|
|
150
|
+
storage: config.storage ?? this.getDefaultStorage(),
|
|
151
|
+
autoRefresh: config.autoRefresh ?? true,
|
|
152
|
+
refreshBuffer: config.refreshBuffer ?? 5 * 60 * 1000, // 5 minutes
|
|
153
|
+
};
|
|
154
|
+
this.storage = this.config.storage;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get default storage based on environment.
|
|
159
|
+
*/
|
|
160
|
+
private getDefaultStorage(): StorageAdapter {
|
|
161
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
162
|
+
return new LocalStorageAdapter();
|
|
163
|
+
}
|
|
164
|
+
return new MemoryStorage();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Subscribe to auth state changes.
|
|
169
|
+
*
|
|
170
|
+
* @param callback - Function called when auth state changes
|
|
171
|
+
* @returns Unsubscribe function
|
|
172
|
+
*/
|
|
173
|
+
onAuthStateChange(callback: AuthStateChangeCallback): () => void {
|
|
174
|
+
this.listeners.add(callback);
|
|
175
|
+
// Call immediately with current state
|
|
176
|
+
callback(this.currentUser);
|
|
177
|
+
return () => {
|
|
178
|
+
this.listeners.delete(callback);
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Notify all listeners of auth state change.
|
|
184
|
+
*/
|
|
185
|
+
private notifyListeners(): void {
|
|
186
|
+
for (const listener of this.listeners) {
|
|
187
|
+
try {
|
|
188
|
+
listener(this.currentUser);
|
|
189
|
+
} catch {
|
|
190
|
+
// Ignore listener errors
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Handle successful authentication.
|
|
197
|
+
*
|
|
198
|
+
* @param session - Session response from auth
|
|
199
|
+
* @param method - Auth method used
|
|
200
|
+
*/
|
|
201
|
+
async handleAuthSuccess(
|
|
202
|
+
session: SessionLoginResponse,
|
|
203
|
+
method: AuthMethod = 'credentials'
|
|
204
|
+
): Promise<void> {
|
|
205
|
+
// Store tokens
|
|
206
|
+
if (session.accessToken) {
|
|
207
|
+
await this.storage.setItem(STORAGE_KEYS.ACCESS_TOKEN, session.accessToken);
|
|
208
|
+
this.oxyServices.httpService.setTokens(session.accessToken);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Store refresh token if available
|
|
212
|
+
if (session.refreshToken) {
|
|
213
|
+
await this.storage.setItem(STORAGE_KEYS.REFRESH_TOKEN, session.refreshToken);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Store session info
|
|
217
|
+
await this.storage.setItem(STORAGE_KEYS.SESSION, JSON.stringify({
|
|
218
|
+
sessionId: session.sessionId,
|
|
219
|
+
deviceId: session.deviceId,
|
|
220
|
+
expiresAt: session.expiresAt,
|
|
221
|
+
}));
|
|
222
|
+
|
|
223
|
+
// Store user only if it has valid required fields (not an empty placeholder)
|
|
224
|
+
if (session.user && typeof (session.user as any).id === 'string' && (session.user as any).id.length > 0) {
|
|
225
|
+
await this.storage.setItem(STORAGE_KEYS.USER, JSON.stringify(session.user));
|
|
226
|
+
this.currentUser = session.user;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Store auth method
|
|
230
|
+
await this.storage.setItem(STORAGE_KEYS.AUTH_METHOD, method);
|
|
231
|
+
|
|
232
|
+
// Setup auto-refresh if enabled
|
|
233
|
+
if (this.config.autoRefresh && session.expiresAt) {
|
|
234
|
+
this.setupTokenRefresh(session.expiresAt);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Notify listeners
|
|
238
|
+
this.notifyListeners();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Setup automatic token refresh.
|
|
243
|
+
*/
|
|
244
|
+
private setupTokenRefresh(expiresAt: string): void {
|
|
245
|
+
if (this.refreshTimer) {
|
|
246
|
+
clearTimeout(this.refreshTimer);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const expiresAtMs = new Date(expiresAt).getTime();
|
|
250
|
+
const now = Date.now();
|
|
251
|
+
const refreshAt = expiresAtMs - this.config.refreshBuffer;
|
|
252
|
+
const delay = Math.max(0, refreshAt - now);
|
|
253
|
+
|
|
254
|
+
if (delay > 0) {
|
|
255
|
+
this.refreshTimer = setTimeout(() => {
|
|
256
|
+
this.refreshToken().catch(() => {
|
|
257
|
+
// Refresh failed, user will need to re-auth
|
|
258
|
+
});
|
|
259
|
+
}, delay);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Refresh the access token.
|
|
265
|
+
*/
|
|
266
|
+
async refreshToken(): Promise<boolean> {
|
|
267
|
+
const refreshToken = await this.storage.getItem(STORAGE_KEYS.REFRESH_TOKEN);
|
|
268
|
+
if (!refreshToken) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
// Cast httpService to proper type (needed due to mixin composition)
|
|
274
|
+
const httpService = this.oxyServices.httpService as HttpService;
|
|
275
|
+
const response = await httpService.request<SessionLoginResponse>({
|
|
276
|
+
method: 'POST',
|
|
277
|
+
url: '/api/auth/refresh',
|
|
278
|
+
data: { refreshToken },
|
|
279
|
+
cache: false,
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
await this.handleAuthSuccess(response, 'credentials');
|
|
283
|
+
return true;
|
|
284
|
+
} catch {
|
|
285
|
+
// Refresh failed, clear session and update state
|
|
286
|
+
await this.clearSession();
|
|
287
|
+
this.currentUser = null;
|
|
288
|
+
this.notifyListeners();
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Sign out and clear all auth data.
|
|
295
|
+
*/
|
|
296
|
+
async signOut(): Promise<void> {
|
|
297
|
+
// Clear refresh timer
|
|
298
|
+
if (this.refreshTimer) {
|
|
299
|
+
clearTimeout(this.refreshTimer);
|
|
300
|
+
this.refreshTimer = null;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Revoke FedCM credential if supported
|
|
304
|
+
try {
|
|
305
|
+
const services = this.oxyServices as OxyServicesWithFedCM;
|
|
306
|
+
if (services.revokeFedCMCredential) {
|
|
307
|
+
await services.revokeFedCMCredential();
|
|
308
|
+
}
|
|
309
|
+
} catch {
|
|
310
|
+
// Ignore FedCM errors
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Clear HTTP client tokens
|
|
314
|
+
this.oxyServices.httpService.setTokens('');
|
|
315
|
+
|
|
316
|
+
// Clear storage
|
|
317
|
+
await this.clearSession();
|
|
318
|
+
|
|
319
|
+
// Update state and notify
|
|
320
|
+
this.currentUser = null;
|
|
321
|
+
this.notifyListeners();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Clear session data from storage.
|
|
326
|
+
*/
|
|
327
|
+
private async clearSession(): Promise<void> {
|
|
328
|
+
await this.storage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);
|
|
329
|
+
await this.storage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);
|
|
330
|
+
await this.storage.removeItem(STORAGE_KEYS.SESSION);
|
|
331
|
+
await this.storage.removeItem(STORAGE_KEYS.USER);
|
|
332
|
+
await this.storage.removeItem(STORAGE_KEYS.AUTH_METHOD);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Get current user.
|
|
337
|
+
*/
|
|
338
|
+
getCurrentUser(): MinimalUserData | null {
|
|
339
|
+
return this.currentUser;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Check if user is authenticated.
|
|
344
|
+
*/
|
|
345
|
+
isAuthenticated(): boolean {
|
|
346
|
+
return this.currentUser !== null;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Get stored access token.
|
|
351
|
+
*/
|
|
352
|
+
async getAccessToken(): Promise<string | null> {
|
|
353
|
+
return this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Get the auth method used for current session.
|
|
358
|
+
*/
|
|
359
|
+
async getAuthMethod(): Promise<AuthMethod | null> {
|
|
360
|
+
const method = await this.storage.getItem(STORAGE_KEYS.AUTH_METHOD);
|
|
361
|
+
return method as AuthMethod | null;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Initialize auth state from storage.
|
|
366
|
+
*
|
|
367
|
+
* Call this on app startup to restore previous session.
|
|
368
|
+
*/
|
|
369
|
+
async initialize(): Promise<MinimalUserData | null> {
|
|
370
|
+
try {
|
|
371
|
+
// Try to restore user from storage
|
|
372
|
+
const userJson = await this.storage.getItem(STORAGE_KEYS.USER);
|
|
373
|
+
if (userJson) {
|
|
374
|
+
this.currentUser = JSON.parse(userJson);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Restore token to HTTP client
|
|
378
|
+
const token = await this.storage.getItem(STORAGE_KEYS.ACCESS_TOKEN);
|
|
379
|
+
if (token) {
|
|
380
|
+
this.oxyServices.httpService.setTokens(token);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Check session expiry
|
|
384
|
+
const sessionJson = await this.storage.getItem(STORAGE_KEYS.SESSION);
|
|
385
|
+
if (sessionJson) {
|
|
386
|
+
const session = JSON.parse(sessionJson);
|
|
387
|
+
if (session.expiresAt) {
|
|
388
|
+
const expiresAt = new Date(session.expiresAt).getTime();
|
|
389
|
+
if (expiresAt <= Date.now()) {
|
|
390
|
+
// Session expired, try refresh
|
|
391
|
+
const refreshed = await this.refreshToken();
|
|
392
|
+
if (!refreshed) {
|
|
393
|
+
await this.clearSession();
|
|
394
|
+
this.currentUser = null;
|
|
395
|
+
}
|
|
396
|
+
} else if (this.config.autoRefresh) {
|
|
397
|
+
// Setup refresh timer
|
|
398
|
+
this.setupTokenRefresh(session.expiresAt);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return this.currentUser;
|
|
404
|
+
} catch {
|
|
405
|
+
// Failed to restore, start fresh
|
|
406
|
+
await this.clearSession();
|
|
407
|
+
this.currentUser = null;
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Destroy the auth manager and clean up resources.
|
|
414
|
+
*/
|
|
415
|
+
destroy(): void {
|
|
416
|
+
if (this.refreshTimer) {
|
|
417
|
+
clearTimeout(this.refreshTimer);
|
|
418
|
+
this.refreshTimer = null;
|
|
419
|
+
}
|
|
420
|
+
this.listeners.clear();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Create an AuthManager instance.
|
|
426
|
+
*
|
|
427
|
+
* @param oxyServices - OxyServices instance
|
|
428
|
+
* @param config - Optional configuration
|
|
429
|
+
* @returns AuthManager instance
|
|
430
|
+
*/
|
|
431
|
+
export function createAuthManager(
|
|
432
|
+
oxyServices: OxyServices,
|
|
433
|
+
config?: AuthManagerConfig
|
|
434
|
+
): AuthManager {
|
|
435
|
+
return new AuthManager(oxyServices, config);
|
|
436
|
+
}
|
package/src/core/HttpService.ts
CHANGED
|
@@ -18,8 +18,15 @@ import { RequestDeduplicator, RequestQueue, SimpleLogger } from '../utils/reques
|
|
|
18
18
|
import { retryAsync } from '../utils/asyncUtils';
|
|
19
19
|
import { handleHttpError } from '../utils/errorUtils';
|
|
20
20
|
import { jwtDecode } from 'jwt-decode';
|
|
21
|
+
import { isNative, getPlatformOS } from '../utils/platform';
|
|
21
22
|
import type { OxyConfig } from '../models/interfaces';
|
|
22
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Check if we're running in a native app environment (React Native, not web)
|
|
26
|
+
* This is used to determine CSRF handling mode
|
|
27
|
+
*/
|
|
28
|
+
const isNativeApp = isNative();
|
|
29
|
+
|
|
23
30
|
interface JwtPayload {
|
|
24
31
|
exp?: number;
|
|
25
32
|
userId?: string;
|
|
@@ -264,6 +271,26 @@ export class HttpService {
|
|
|
264
271
|
headers['X-CSRF-Token'] = csrfToken;
|
|
265
272
|
}
|
|
266
273
|
|
|
274
|
+
// Add native app header for React Native (required for CSRF validation)
|
|
275
|
+
// Native apps can't persist cookies like browsers, so the server uses
|
|
276
|
+
// header-only CSRF validation when this header is present
|
|
277
|
+
if (isNativeApp && isStateChangingMethod) {
|
|
278
|
+
headers['X-Native-App'] = 'true';
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Debug logging for CSRF issues
|
|
282
|
+
if (isStateChangingMethod && __DEV__) {
|
|
283
|
+
console.log('[HttpService] CSRF Debug:', {
|
|
284
|
+
url,
|
|
285
|
+
method,
|
|
286
|
+
isNativeApp,
|
|
287
|
+
platformOS: getPlatformOS(),
|
|
288
|
+
hasCsrfToken: !!csrfToken,
|
|
289
|
+
csrfTokenLength: csrfToken?.length,
|
|
290
|
+
hasNativeAppHeader: headers['X-Native-App'] === 'true',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
267
294
|
// Merge custom headers if provided
|
|
268
295
|
if (config.headers) {
|
|
269
296
|
Object.entries(config.headers).forEach(([key, value]) => {
|
|
@@ -457,26 +484,39 @@ export class HttpService {
|
|
|
457
484
|
// Return cached token if available
|
|
458
485
|
const cachedToken = this.tokenStore.getCsrfToken();
|
|
459
486
|
if (cachedToken) {
|
|
487
|
+
if (__DEV__) console.log('[HttpService] Using cached CSRF token');
|
|
460
488
|
return cachedToken;
|
|
461
489
|
}
|
|
462
490
|
|
|
463
491
|
// Deduplicate concurrent CSRF token fetches
|
|
464
492
|
const existingPromise = this.tokenStore.getCsrfTokenFetchPromise();
|
|
465
493
|
if (existingPromise) {
|
|
494
|
+
if (__DEV__) console.log('[HttpService] Waiting for existing CSRF fetch');
|
|
466
495
|
return existingPromise;
|
|
467
496
|
}
|
|
468
497
|
|
|
469
498
|
const fetchPromise = (async () => {
|
|
470
499
|
try {
|
|
500
|
+
if (__DEV__) console.log('[HttpService] Fetching CSRF token from:', `${this.baseURL}/api/csrf-token`);
|
|
501
|
+
|
|
502
|
+
// Use AbortController for timeout (more compatible than AbortSignal.timeout)
|
|
503
|
+
const controller = new AbortController();
|
|
504
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
505
|
+
|
|
471
506
|
const response = await fetch(`${this.baseURL}/api/csrf-token`, {
|
|
472
507
|
method: 'GET',
|
|
473
508
|
headers: { 'Accept': 'application/json' },
|
|
474
509
|
credentials: 'include', // Required to receive and send cookies
|
|
475
|
-
signal:
|
|
510
|
+
signal: controller.signal,
|
|
476
511
|
});
|
|
477
512
|
|
|
513
|
+
clearTimeout(timeoutId);
|
|
514
|
+
|
|
515
|
+
if (__DEV__) console.log('[HttpService] CSRF fetch response:', response.status, response.ok);
|
|
516
|
+
|
|
478
517
|
if (response.ok) {
|
|
479
518
|
const data = await response.json() as { csrfToken?: string };
|
|
519
|
+
if (__DEV__) console.log('[HttpService] CSRF response data:', data);
|
|
480
520
|
const token = data.csrfToken || null;
|
|
481
521
|
this.tokenStore.setCsrfToken(token);
|
|
482
522
|
this.logger.debug('CSRF token fetched');
|
|
@@ -491,9 +531,11 @@ export class HttpService {
|
|
|
491
531
|
return headerToken;
|
|
492
532
|
}
|
|
493
533
|
|
|
534
|
+
if (__DEV__) console.log('[HttpService] CSRF fetch failed with status:', response.status);
|
|
494
535
|
this.logger.warn('Failed to fetch CSRF token:', response.status);
|
|
495
536
|
return null;
|
|
496
537
|
} catch (error) {
|
|
538
|
+
if (__DEV__) console.log('[HttpService] CSRF fetch error:', error);
|
|
497
539
|
this.logger.warn('CSRF token fetch error:', error);
|
|
498
540
|
return null;
|
|
499
541
|
} finally {
|
package/src/core/index.ts
CHANGED
|
@@ -13,6 +13,10 @@ export { OXY_CLOUD_URL, oxyClient } from './OxyServices';
|
|
|
13
13
|
export { CrossDomainAuth, createCrossDomainAuth } from './CrossDomainAuth';
|
|
14
14
|
export type { CrossDomainAuthOptions } from './CrossDomainAuth';
|
|
15
15
|
|
|
16
|
+
// Centralized auth management
|
|
17
|
+
export { AuthManager, createAuthManager } from './AuthManager';
|
|
18
|
+
export type { StorageAdapter, AuthStateChangeCallback, AuthMethod, AuthManagerConfig } from './AuthManager';
|
|
19
|
+
|
|
16
20
|
// Re-export all models and types for convenience
|
|
17
21
|
export * from '../models/interfaces';
|
|
18
22
|
export * from '../models/session';
|