@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
package/src/utils/hookUtils.ts
CHANGED
|
@@ -172,8 +172,8 @@ export function useLocalStorage<T>(key: string, initialValue: T) {
|
|
|
172
172
|
try {
|
|
173
173
|
const item = window.localStorage.getItem(key);
|
|
174
174
|
return item ? JSON.parse(item) : initialValue;
|
|
175
|
-
} catch
|
|
176
|
-
|
|
175
|
+
} catch {
|
|
176
|
+
// Silently fail and return initial value
|
|
177
177
|
return initialValue;
|
|
178
178
|
}
|
|
179
179
|
});
|
|
@@ -185,8 +185,8 @@ export function useLocalStorage<T>(key: string, initialValue: T) {
|
|
|
185
185
|
if (hasLocalStorage) {
|
|
186
186
|
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
187
187
|
}
|
|
188
|
-
} catch
|
|
189
|
-
|
|
188
|
+
} catch {
|
|
189
|
+
// Silently fail - storage might be full or blocked
|
|
190
190
|
}
|
|
191
191
|
}, [key, storedValue]);
|
|
192
192
|
|
|
@@ -202,8 +202,8 @@ export function useSessionStorage<T>(key: string, initialValue: T) {
|
|
|
202
202
|
try {
|
|
203
203
|
const item = window.sessionStorage.getItem(key);
|
|
204
204
|
return item ? JSON.parse(item) : initialValue;
|
|
205
|
-
} catch
|
|
206
|
-
|
|
205
|
+
} catch {
|
|
206
|
+
// Silently fail and return initial value
|
|
207
207
|
return initialValue;
|
|
208
208
|
}
|
|
209
209
|
});
|
|
@@ -215,8 +215,8 @@ export function useSessionStorage<T>(key: string, initialValue: T) {
|
|
|
215
215
|
if (hasSessionStorage) {
|
|
216
216
|
window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
|
|
217
217
|
}
|
|
218
|
-
} catch
|
|
219
|
-
|
|
218
|
+
} catch {
|
|
219
|
+
// Silently fail - storage might be full or blocked
|
|
220
220
|
}
|
|
221
221
|
}, [key, storedValue]);
|
|
222
222
|
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides platform detection WITHOUT importing from 'react-native'.
|
|
5
|
+
* This allows core modules to be used in web/Node.js environments
|
|
6
|
+
* without bundlers failing on react-native imports.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type PlatformOS = 'ios' | 'android' | 'web' | 'windows' | 'macos' | 'unknown';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Detect the current platform without importing react-native
|
|
13
|
+
*
|
|
14
|
+
* Detection order:
|
|
15
|
+
* 1. Check for React Native's Platform object on globalThis (set by RN runtime)
|
|
16
|
+
* 2. Check for Node.js environment
|
|
17
|
+
* 3. Check for browser environment
|
|
18
|
+
* 4. Fall back to 'unknown'
|
|
19
|
+
*/
|
|
20
|
+
function detectPlatform(): PlatformOS {
|
|
21
|
+
// Check if React Native Platform is available globally (set by RN runtime)
|
|
22
|
+
// This avoids static imports while still detecting RN environment
|
|
23
|
+
const rnPlatform = (globalThis as any).__REACT_NATIVE_PLATFORM__;
|
|
24
|
+
if (rnPlatform) {
|
|
25
|
+
return rnPlatform as PlatformOS;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Check navigator.product for React Native
|
|
29
|
+
if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
|
|
30
|
+
// We're in React Native but Platform wasn't set globally
|
|
31
|
+
// Try to get OS from userAgent or default to 'unknown'
|
|
32
|
+
return 'unknown';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Check for Node.js environment
|
|
36
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
37
|
+
return 'web'; // Treat Node.js as 'web' for compatibility (no native features)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Check for browser/web environment
|
|
41
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
42
|
+
return 'web';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return 'unknown';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Cache the platform detection result
|
|
49
|
+
let cachedPlatform: PlatformOS | null = null;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get the current platform OS
|
|
53
|
+
* Safe to call from any environment (web, Node.js, React Native)
|
|
54
|
+
*/
|
|
55
|
+
export function getPlatformOS(): PlatformOS {
|
|
56
|
+
if (cachedPlatform === null) {
|
|
57
|
+
cachedPlatform = detectPlatform();
|
|
58
|
+
}
|
|
59
|
+
return cachedPlatform;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Check if running on web platform (browser or Node.js)
|
|
64
|
+
*/
|
|
65
|
+
export function isWeb(): boolean {
|
|
66
|
+
return getPlatformOS() === 'web';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check if running in a native app (iOS or Android)
|
|
71
|
+
*/
|
|
72
|
+
export function isNative(): boolean {
|
|
73
|
+
const os = getPlatformOS();
|
|
74
|
+
return os === 'ios' || os === 'android';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Check if running on iOS
|
|
79
|
+
*/
|
|
80
|
+
export function isIOS(): boolean {
|
|
81
|
+
return getPlatformOS() === 'ios';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Check if running on Android
|
|
86
|
+
*/
|
|
87
|
+
export function isAndroid(): boolean {
|
|
88
|
+
return getPlatformOS() === 'android';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Set the platform OS explicitly
|
|
93
|
+
* Called by React Native entry point to register the platform
|
|
94
|
+
* This allows lazy detection in environments where react-native is available
|
|
95
|
+
*/
|
|
96
|
+
export function setPlatformOS(os: PlatformOS): void {
|
|
97
|
+
cachedPlatform = os;
|
|
98
|
+
(globalThis as any).__REACT_NATIVE_PLATFORM__ = os;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Try to initialize platform from react-native if available
|
|
103
|
+
* This is called lazily when needed, avoiding top-level imports
|
|
104
|
+
*/
|
|
105
|
+
export async function initPlatformFromReactNative(): Promise<void> {
|
|
106
|
+
if (cachedPlatform !== null && cachedPlatform !== 'unknown') {
|
|
107
|
+
return; // Already initialized
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
// Dynamic import to avoid bundler issues
|
|
112
|
+
const { Platform } = await import('react-native');
|
|
113
|
+
setPlatformOS(Platform.OS as PlatformOS);
|
|
114
|
+
} catch {
|
|
115
|
+
// react-native not available, use detected platform
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web-Only Oxy Context
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* Clean implementation with ZERO React Native dependencies.
|
|
5
|
+
* Provides FedCM, popup, and redirect authentication methods.
|
|
6
|
+
* Uses centralized AuthManager for token and session management.
|
|
7
|
+
*
|
|
8
|
+
* @module web/WebOxyContext
|
|
5
9
|
*/
|
|
6
10
|
|
|
7
11
|
import {
|
|
@@ -9,75 +13,215 @@ import {
|
|
|
9
13
|
useCallback,
|
|
10
14
|
useContext,
|
|
11
15
|
useEffect,
|
|
16
|
+
useMemo,
|
|
12
17
|
useState,
|
|
13
18
|
type ReactNode,
|
|
14
19
|
} from 'react';
|
|
15
|
-
import { OxyServices
|
|
20
|
+
import { OxyServices } from '../core/OxyServices';
|
|
21
|
+
import { CrossDomainAuth } from '../core/CrossDomainAuth';
|
|
22
|
+
import { AuthManager, createAuthManager } from '../core/AuthManager';
|
|
16
23
|
import type { User } from '../models/interfaces';
|
|
17
|
-
import type { MinimalUserData } from '../models/session';
|
|
24
|
+
import type { SessionLoginResponse, MinimalUserData } from '../models/session';
|
|
18
25
|
import { QueryClientProvider } from '@tanstack/react-query';
|
|
19
26
|
import { createQueryClient } from '../ui/hooks/queryClient';
|
|
20
27
|
|
|
21
28
|
export interface WebAuthState {
|
|
22
|
-
user:
|
|
29
|
+
user: User | null;
|
|
23
30
|
isAuthenticated: boolean;
|
|
24
31
|
isLoading: boolean;
|
|
25
32
|
error: string | null;
|
|
26
33
|
}
|
|
27
34
|
|
|
28
35
|
export interface WebAuthActions {
|
|
36
|
+
/**
|
|
37
|
+
* Sign in using the best available method (FedCM → Popup → Redirect)
|
|
38
|
+
*/
|
|
29
39
|
signIn: () => Promise<void>;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Sign in using FedCM (browser-native, Google-style)
|
|
43
|
+
* Falls back to popup if FedCM is not supported
|
|
44
|
+
*/
|
|
45
|
+
signInWithFedCM: () => Promise<void>;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Sign in using popup window
|
|
49
|
+
*/
|
|
50
|
+
signInWithPopup: () => Promise<void>;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sign in using redirect (full page redirect to auth.oxy.so)
|
|
54
|
+
*/
|
|
55
|
+
signInWithRedirect: () => void;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Sign out and clear session
|
|
59
|
+
*/
|
|
30
60
|
signOut: () => Promise<void>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Check if FedCM is supported in the current browser
|
|
64
|
+
*/
|
|
65
|
+
isFedCMSupported: () => boolean;
|
|
31
66
|
}
|
|
32
67
|
|
|
33
68
|
export interface WebOxyContextValue extends WebAuthState, WebAuthActions {
|
|
34
69
|
oxyServices: OxyServices;
|
|
70
|
+
crossDomainAuth: CrossDomainAuth;
|
|
71
|
+
authManager: AuthManager;
|
|
35
72
|
}
|
|
36
73
|
|
|
37
74
|
const WebOxyContext = createContext<WebOxyContextValue | null>(null);
|
|
38
75
|
|
|
39
76
|
export interface WebOxyProviderProps {
|
|
40
77
|
children: ReactNode;
|
|
78
|
+
/** Base URL for the Oxy API (e.g., 'https://api.oxy.so') */
|
|
41
79
|
baseURL: string;
|
|
80
|
+
/** Optional auth web URL for popup/redirect (defaults to 'https://auth.oxy.so') */
|
|
42
81
|
authWebUrl?: string;
|
|
43
|
-
|
|
82
|
+
/** Callback when auth state changes */
|
|
83
|
+
onAuthStateChange?: (user: User | null) => void;
|
|
84
|
+
/** Callback when an error occurs */
|
|
85
|
+
onError?: (error: Error) => void;
|
|
86
|
+
/** Preferred auth method: 'auto' (default), 'fedcm', 'popup', or 'redirect' */
|
|
87
|
+
preferredAuthMethod?: 'auto' | 'fedcm' | 'popup' | 'redirect';
|
|
88
|
+
/** Skip automatic session check on mount */
|
|
89
|
+
skipAutoCheck?: boolean;
|
|
44
90
|
}
|
|
45
91
|
|
|
46
92
|
/**
|
|
47
93
|
* Web-only Oxy Provider
|
|
48
|
-
*
|
|
94
|
+
*
|
|
95
|
+
* Provides authentication context for pure web applications (React, Next.js, Vite).
|
|
96
|
+
* Supports FedCM, popup, and redirect authentication methods.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```tsx
|
|
100
|
+
* import { WebOxyProvider, useAuth } from '@oxyhq/services/web';
|
|
101
|
+
*
|
|
102
|
+
* function App() {
|
|
103
|
+
* return (
|
|
104
|
+
* <WebOxyProvider baseURL="https://api.oxy.so">
|
|
105
|
+
* <YourApp />
|
|
106
|
+
* </WebOxyProvider>
|
|
107
|
+
* );
|
|
108
|
+
* }
|
|
109
|
+
*
|
|
110
|
+
* function LoginButton() {
|
|
111
|
+
* const { signIn, isLoading, isFedCMSupported } = useAuth();
|
|
112
|
+
* return (
|
|
113
|
+
* <button onClick={signIn} disabled={isLoading}>
|
|
114
|
+
* {isFedCMSupported() ? 'Sign in with Oxy' : 'Sign in'}
|
|
115
|
+
* </button>
|
|
116
|
+
* );
|
|
117
|
+
* }
|
|
118
|
+
* ```
|
|
49
119
|
*/
|
|
50
120
|
export function WebOxyProvider({
|
|
51
121
|
children,
|
|
52
122
|
baseURL,
|
|
53
123
|
authWebUrl,
|
|
54
124
|
onAuthStateChange,
|
|
125
|
+
onError,
|
|
126
|
+
preferredAuthMethod = 'auto',
|
|
127
|
+
skipAutoCheck = false,
|
|
55
128
|
}: WebOxyProviderProps) {
|
|
129
|
+
// Initialize services with centralized AuthManager
|
|
56
130
|
const [oxyServices] = useState(() => new OxyServices({ baseURL, authWebUrl }));
|
|
57
|
-
const [crossDomainAuth] = useState(() =>
|
|
58
|
-
const [
|
|
59
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
60
|
-
const [error, setError] = useState<string | null>(null);
|
|
131
|
+
const [crossDomainAuth] = useState(() => new CrossDomainAuth(oxyServices));
|
|
132
|
+
const [authManager] = useState(() => createAuthManager(oxyServices, { autoRefresh: true }));
|
|
61
133
|
const [queryClient] = useState(() => createQueryClient());
|
|
62
134
|
|
|
135
|
+
// Auth state
|
|
136
|
+
const [user, setUser] = useState<User | null>(null);
|
|
137
|
+
const [isLoading, setIsLoading] = useState(!skipAutoCheck);
|
|
138
|
+
const [error, setError] = useState<string | null>(null);
|
|
139
|
+
|
|
63
140
|
const isAuthenticated = !!user;
|
|
64
141
|
|
|
65
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Handles successful authentication via AuthManager
|
|
144
|
+
*/
|
|
145
|
+
const handleAuthSuccess = useCallback(async (session: SessionLoginResponse, method: 'fedcm' | 'popup' | 'redirect' | 'credentials' = 'credentials') => {
|
|
146
|
+
// Use centralized AuthManager for token/session storage
|
|
147
|
+
await authManager.handleAuthSuccess(session, method);
|
|
148
|
+
|
|
149
|
+
// Fetch full user profile (session.user only contains MinimalUserData)
|
|
150
|
+
try {
|
|
151
|
+
const fullUser = await oxyServices.getCurrentUser();
|
|
152
|
+
if (fullUser) {
|
|
153
|
+
setUser(fullUser);
|
|
154
|
+
} else {
|
|
155
|
+
// Fallback to minimal data if full profile unavailable
|
|
156
|
+
setUser(session.user as User);
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
// Fallback to minimal data on error
|
|
160
|
+
setUser(session.user as User);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
setError(null);
|
|
164
|
+
setIsLoading(false);
|
|
165
|
+
}, [authManager, oxyServices]);
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Handles authentication errors
|
|
169
|
+
*/
|
|
170
|
+
const handleAuthError = useCallback((err: unknown) => {
|
|
171
|
+
const errorMessage = err instanceof Error ? err.message : 'Authentication failed';
|
|
172
|
+
setError(errorMessage);
|
|
173
|
+
setIsLoading(false);
|
|
174
|
+
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
|
175
|
+
}, [onError]);
|
|
176
|
+
|
|
177
|
+
// Initialize - check for existing session or redirect callback
|
|
66
178
|
useEffect(() => {
|
|
179
|
+
if (skipAutoCheck) return;
|
|
180
|
+
|
|
67
181
|
let mounted = true;
|
|
68
182
|
|
|
69
183
|
const initAuth = async () => {
|
|
70
184
|
try {
|
|
71
|
-
//
|
|
72
|
-
const
|
|
185
|
+
// 1. Check for redirect callback (user returning from auth.oxy.so)
|
|
186
|
+
const callbackSession = crossDomainAuth.handleRedirectCallback();
|
|
187
|
+
if (callbackSession && mounted) {
|
|
188
|
+
await handleAuthSuccess(callbackSession, 'redirect');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
73
191
|
|
|
74
|
-
|
|
75
|
-
|
|
192
|
+
// 2. Try to restore session from AuthManager (handles token refresh automatically)
|
|
193
|
+
const restoredUser = await authManager.initialize();
|
|
194
|
+
if (restoredUser && mounted) {
|
|
195
|
+
// Verify token is still valid by fetching current user
|
|
196
|
+
try {
|
|
197
|
+
const currentUser = await oxyServices.getCurrentUser();
|
|
198
|
+
if (mounted && currentUser) {
|
|
199
|
+
setUser(currentUser);
|
|
200
|
+
setIsLoading(false);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
} catch {
|
|
204
|
+
// Token invalid, AuthManager will handle clearing
|
|
205
|
+
await authManager.signOut();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// 3. Try silent sign-in (FedCM or iframe-based SSO)
|
|
210
|
+
try {
|
|
211
|
+
const session = await crossDomainAuth.silentSignIn();
|
|
212
|
+
if (mounted && session?.user) {
|
|
213
|
+
await handleAuthSuccess(session, 'fedcm');
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
} catch {
|
|
217
|
+
// Silent sign-in failed, that's fine
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// No session found
|
|
221
|
+
if (mounted) {
|
|
222
|
+
setIsLoading(false);
|
|
76
223
|
}
|
|
77
224
|
} catch (err) {
|
|
78
|
-
// No active session - this is fine
|
|
79
|
-
console.log('[WebOxy] No active session');
|
|
80
|
-
} finally {
|
|
81
225
|
if (mounted) {
|
|
82
226
|
setIsLoading(false);
|
|
83
227
|
}
|
|
@@ -89,63 +233,147 @@ export function WebOxyProvider({
|
|
|
89
233
|
return () => {
|
|
90
234
|
mounted = false;
|
|
91
235
|
};
|
|
92
|
-
}, [crossDomainAuth]);
|
|
236
|
+
}, [oxyServices, crossDomainAuth, authManager, skipAutoCheck, handleAuthSuccess]);
|
|
93
237
|
|
|
94
238
|
// Notify parent of auth state changes
|
|
95
239
|
useEffect(() => {
|
|
96
240
|
onAuthStateChange?.(user);
|
|
97
241
|
}, [user, onAuthStateChange]);
|
|
98
242
|
|
|
243
|
+
/**
|
|
244
|
+
* Sign in with automatic method selection
|
|
245
|
+
*/
|
|
99
246
|
const signIn = useCallback(async () => {
|
|
100
247
|
setError(null);
|
|
101
248
|
setIsLoading(true);
|
|
102
249
|
|
|
250
|
+
let selectedMethod: 'fedcm' | 'popup' | 'redirect' = 'popup';
|
|
251
|
+
|
|
103
252
|
try {
|
|
104
|
-
// Sign in with automatic method selection (FedCM → Popup → Redirect)
|
|
105
253
|
const session = await crossDomainAuth.signIn({
|
|
106
|
-
method:
|
|
254
|
+
method: preferredAuthMethod,
|
|
107
255
|
onMethodSelected: (method) => {
|
|
108
|
-
|
|
256
|
+
selectedMethod = method as 'fedcm' | 'popup' | 'redirect';
|
|
109
257
|
},
|
|
110
258
|
});
|
|
111
259
|
|
|
112
|
-
if (session
|
|
113
|
-
|
|
260
|
+
if (session) {
|
|
261
|
+
await handleAuthSuccess(session, selectedMethod);
|
|
262
|
+
} else {
|
|
263
|
+
// Redirect method - page will reload
|
|
264
|
+
setIsLoading(false);
|
|
114
265
|
}
|
|
115
266
|
} catch (err) {
|
|
116
|
-
|
|
117
|
-
setError(err instanceof Error ? err.message : 'Sign in failed');
|
|
118
|
-
} finally {
|
|
119
|
-
setIsLoading(false);
|
|
267
|
+
handleAuthError(err);
|
|
120
268
|
}
|
|
269
|
+
}, [crossDomainAuth, preferredAuthMethod, handleAuthSuccess, handleAuthError]);
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Sign in with FedCM specifically
|
|
273
|
+
*/
|
|
274
|
+
const signInWithFedCM = useCallback(async () => {
|
|
275
|
+
setError(null);
|
|
276
|
+
setIsLoading(true);
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
const session = await crossDomainAuth.signInWithFedCM();
|
|
280
|
+
await handleAuthSuccess(session, 'fedcm');
|
|
281
|
+
} catch (err) {
|
|
282
|
+
handleAuthError(err);
|
|
283
|
+
}
|
|
284
|
+
}, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Sign in with popup specifically
|
|
288
|
+
*/
|
|
289
|
+
const signInWithPopup = useCallback(async () => {
|
|
290
|
+
setError(null);
|
|
291
|
+
setIsLoading(true);
|
|
292
|
+
|
|
293
|
+
try {
|
|
294
|
+
const session = await crossDomainAuth.signInWithPopup();
|
|
295
|
+
await handleAuthSuccess(session, 'popup');
|
|
296
|
+
} catch (err) {
|
|
297
|
+
handleAuthError(err);
|
|
298
|
+
}
|
|
299
|
+
}, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Sign in with redirect specifically
|
|
303
|
+
*/
|
|
304
|
+
const signInWithRedirect = useCallback(() => {
|
|
305
|
+
setError(null);
|
|
306
|
+
crossDomainAuth.signInWithRedirect({
|
|
307
|
+
redirectUri: typeof window !== 'undefined' ? window.location.href : undefined,
|
|
308
|
+
});
|
|
309
|
+
}, [crossDomainAuth]);
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Check if FedCM is supported
|
|
313
|
+
*/
|
|
314
|
+
const isFedCMSupported = useCallback(() => {
|
|
315
|
+
return crossDomainAuth.isFedCMSupported();
|
|
121
316
|
}, [crossDomainAuth]);
|
|
122
317
|
|
|
318
|
+
/**
|
|
319
|
+
* Sign out via AuthManager (handles FedCM revocation and storage cleanup)
|
|
320
|
+
*/
|
|
123
321
|
const signOut = useCallback(async () => {
|
|
124
322
|
setError(null);
|
|
125
323
|
|
|
126
324
|
try {
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
localStorage.removeItem('oxy-session');
|
|
130
|
-
localStorage.removeItem('oxy-access-token');
|
|
131
|
-
}
|
|
325
|
+
// Use centralized AuthManager for sign out (handles FedCM, storage cleanup)
|
|
326
|
+
await authManager.signOut();
|
|
132
327
|
|
|
328
|
+
// Clear user state
|
|
133
329
|
setUser(null);
|
|
134
330
|
} catch (err) {
|
|
135
|
-
|
|
136
|
-
setError(
|
|
331
|
+
const errorMessage = err instanceof Error ? err.message : 'Sign out failed';
|
|
332
|
+
setError(errorMessage);
|
|
333
|
+
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
|
137
334
|
}
|
|
138
|
-
}, []);
|
|
335
|
+
}, [authManager, onError]);
|
|
336
|
+
|
|
337
|
+
// Cleanup on unmount
|
|
338
|
+
useEffect(() => {
|
|
339
|
+
return () => {
|
|
340
|
+
authManager.destroy();
|
|
341
|
+
};
|
|
342
|
+
}, [authManager]);
|
|
139
343
|
|
|
140
|
-
|
|
344
|
+
// Memoize context value to prevent unnecessary re-renders
|
|
345
|
+
const contextValue = useMemo<WebOxyContextValue>(() => ({
|
|
346
|
+
// State
|
|
141
347
|
user,
|
|
142
348
|
isAuthenticated,
|
|
143
349
|
isLoading,
|
|
144
350
|
error,
|
|
351
|
+
// Services
|
|
352
|
+
oxyServices,
|
|
353
|
+
crossDomainAuth,
|
|
354
|
+
authManager,
|
|
355
|
+
// Actions
|
|
145
356
|
signIn,
|
|
357
|
+
signInWithFedCM,
|
|
358
|
+
signInWithPopup,
|
|
359
|
+
signInWithRedirect,
|
|
146
360
|
signOut,
|
|
361
|
+
isFedCMSupported,
|
|
362
|
+
}), [
|
|
363
|
+
user,
|
|
364
|
+
isAuthenticated,
|
|
365
|
+
isLoading,
|
|
366
|
+
error,
|
|
147
367
|
oxyServices,
|
|
148
|
-
|
|
368
|
+
crossDomainAuth,
|
|
369
|
+
authManager,
|
|
370
|
+
signIn,
|
|
371
|
+
signInWithFedCM,
|
|
372
|
+
signInWithPopup,
|
|
373
|
+
signInWithRedirect,
|
|
374
|
+
signOut,
|
|
375
|
+
isFedCMSupported,
|
|
376
|
+
]);
|
|
149
377
|
|
|
150
378
|
return (
|
|
151
379
|
<QueryClientProvider client={queryClient}>
|
|
@@ -156,7 +384,13 @@ export function WebOxyProvider({
|
|
|
156
384
|
);
|
|
157
385
|
}
|
|
158
386
|
|
|
159
|
-
|
|
387
|
+
/**
|
|
388
|
+
* Hook to access the full Web Oxy context.
|
|
389
|
+
*
|
|
390
|
+
* @returns Full context value including oxyServices and crossDomainAuth
|
|
391
|
+
* @throws Error if used outside WebOxyProvider
|
|
392
|
+
*/
|
|
393
|
+
export function useWebOxy(): WebOxyContextValue {
|
|
160
394
|
const context = useContext(WebOxyContext);
|
|
161
395
|
if (!context) {
|
|
162
396
|
throw new Error('useWebOxy must be used within WebOxyProvider');
|
|
@@ -164,17 +398,73 @@ export function useWebOxy() {
|
|
|
164
398
|
return context;
|
|
165
399
|
}
|
|
166
400
|
|
|
401
|
+
/**
|
|
402
|
+
* Hook for authentication in web apps.
|
|
403
|
+
*
|
|
404
|
+
* Provides a simplified interface for common auth operations.
|
|
405
|
+
*
|
|
406
|
+
* @returns Auth state and actions
|
|
407
|
+
* @throws Error if used outside WebOxyProvider
|
|
408
|
+
*
|
|
409
|
+
* @example
|
|
410
|
+
* ```tsx
|
|
411
|
+
* function LoginPage() {
|
|
412
|
+
* const { user, isAuthenticated, isLoading, signIn, signOut, isFedCMSupported } = useAuth();
|
|
413
|
+
*
|
|
414
|
+
* if (isLoading) return <Spinner />;
|
|
415
|
+
*
|
|
416
|
+
* if (isAuthenticated) {
|
|
417
|
+
* return (
|
|
418
|
+
* <div>
|
|
419
|
+
* <p>Welcome, {user.username}!</p>
|
|
420
|
+
* <button onClick={signOut}>Sign Out</button>
|
|
421
|
+
* </div>
|
|
422
|
+
* );
|
|
423
|
+
* }
|
|
424
|
+
*
|
|
425
|
+
* return (
|
|
426
|
+
* <button onClick={signIn}>
|
|
427
|
+
* {isFedCMSupported() ? 'Sign in with Oxy' : 'Sign in'}
|
|
428
|
+
* </button>
|
|
429
|
+
* );
|
|
430
|
+
* }
|
|
431
|
+
* ```
|
|
432
|
+
*/
|
|
167
433
|
export function useAuth() {
|
|
168
|
-
const {
|
|
434
|
+
const {
|
|
435
|
+
user,
|
|
436
|
+
isAuthenticated,
|
|
437
|
+
isLoading,
|
|
438
|
+
error,
|
|
439
|
+
signIn,
|
|
440
|
+
signInWithFedCM,
|
|
441
|
+
signInWithPopup,
|
|
442
|
+
signInWithRedirect,
|
|
443
|
+
signOut,
|
|
444
|
+
isFedCMSupported,
|
|
445
|
+
oxyServices,
|
|
446
|
+
authManager,
|
|
447
|
+
} = useWebOxy();
|
|
169
448
|
|
|
170
449
|
return {
|
|
450
|
+
// State
|
|
171
451
|
user,
|
|
172
452
|
isAuthenticated,
|
|
173
453
|
isLoading,
|
|
174
454
|
isReady: !isLoading,
|
|
175
455
|
error,
|
|
456
|
+
// Actions
|
|
176
457
|
signIn,
|
|
458
|
+
signInWithFedCM,
|
|
459
|
+
signInWithPopup,
|
|
460
|
+
signInWithRedirect,
|
|
177
461
|
signOut,
|
|
462
|
+
// Utilities
|
|
463
|
+
isFedCMSupported,
|
|
178
464
|
oxyServices,
|
|
465
|
+
authManager,
|
|
179
466
|
};
|
|
180
467
|
}
|
|
468
|
+
|
|
469
|
+
// Default export for convenience
|
|
470
|
+
export default WebOxyProvider;
|