@oxyhq/services 5.24.0 → 5.26.0
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/index.js +321 -18
- package/lib/commonjs/index.js.map +1 -1
- 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/components/BottomSheetRouter.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 +9 -1
- 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/context/OxyContext.js +2 -1
- package/lib/commonjs/ui/context/OxyContext.js.map +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 +6 -12
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +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 +7 -7
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +6 -6
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +2 -2
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +4 -4
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +1 -1
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +1 -1
- 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 +1 -1
- package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HistoryViewScreen.js +1 -1
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +1 -1
- 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 +1 -1
- 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 +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 +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/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/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/web/WebOxyContext.js +277 -72
- 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/index.js +27 -2
- package/lib/module/index.js.map +1 -1
- 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/components/BottomSheetRouter.js +1 -1
- package/lib/module/ui/components/BottomSheetRouter.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 +9 -1
- 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/context/OxyContext.js +1 -1
- package/lib/module/ui/context/OxyContext.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 +6 -12
- package/lib/module/ui/hooks/useSessionSocket.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 +7 -7
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +6 -6
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +2 -2
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +4 -4
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +1 -1
- 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 +1 -1
- package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/module/ui/screens/HistoryViewScreen.js +1 -1
- package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
- 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 +1 -1
- 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 +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.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 +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.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/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/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/web/WebOxyContext.js +276 -72
- 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/index.d.ts +16 -2
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- 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/web/WebOxyContext.d.ts +113 -4
- package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/web/index.d.ts +20 -9
- 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/index.d.ts +16 -2
- package/lib/typescript/module/index.d.ts.map +1 -1
- 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/web/WebOxyContext.d.ts +113 -4
- package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
- package/lib/typescript/module/web/index.d.ts +20 -9
- 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/index.ts +76 -11
- 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/web/WebOxyContext.tsx +330 -72
- package/src/web/index.ts +77 -7
- 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
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web-Only Oxy Context
|
|
3
|
-
*
|
|
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
|
|
4
9
|
*/
|
|
5
10
|
|
|
6
11
|
import {
|
|
@@ -8,11 +13,15 @@ import {
|
|
|
8
13
|
useCallback,
|
|
9
14
|
useContext,
|
|
10
15
|
useEffect,
|
|
16
|
+
useMemo,
|
|
11
17
|
useState,
|
|
12
18
|
type ReactNode,
|
|
13
19
|
} from 'react';
|
|
14
|
-
import { OxyServices } from '../core';
|
|
20
|
+
import { OxyServices } from '../core/OxyServices';
|
|
21
|
+
import { CrossDomainAuth } from '../core/CrossDomainAuth';
|
|
22
|
+
import { AuthManager, createAuthManager } from '../core/AuthManager';
|
|
15
23
|
import type { User } from '../models/interfaces';
|
|
24
|
+
import type { SessionLoginResponse, MinimalUserData } from '../models/session';
|
|
16
25
|
import { QueryClientProvider } from '@tanstack/react-query';
|
|
17
26
|
import { createQueryClient } from '../ui/hooks/queryClient';
|
|
18
27
|
|
|
@@ -24,57 +33,195 @@ export interface WebAuthState {
|
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
export interface WebAuthActions {
|
|
36
|
+
/**
|
|
37
|
+
* Sign in using the best available method (FedCM → Popup → Redirect)
|
|
38
|
+
*/
|
|
27
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
|
+
*/
|
|
28
60
|
signOut: () => Promise<void>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Check if FedCM is supported in the current browser
|
|
64
|
+
*/
|
|
65
|
+
isFedCMSupported: () => boolean;
|
|
29
66
|
}
|
|
30
67
|
|
|
31
68
|
export interface WebOxyContextValue extends WebAuthState, WebAuthActions {
|
|
32
69
|
oxyServices: OxyServices;
|
|
70
|
+
crossDomainAuth: CrossDomainAuth;
|
|
71
|
+
authManager: AuthManager;
|
|
33
72
|
}
|
|
34
73
|
|
|
35
74
|
const WebOxyContext = createContext<WebOxyContextValue | null>(null);
|
|
36
75
|
|
|
37
76
|
export interface WebOxyProviderProps {
|
|
38
77
|
children: ReactNode;
|
|
78
|
+
/** Base URL for the Oxy API (e.g., 'https://api.oxy.so') */
|
|
39
79
|
baseURL: string;
|
|
80
|
+
/** Optional auth web URL for popup/redirect (defaults to 'https://auth.oxy.so') */
|
|
40
81
|
authWebUrl?: string;
|
|
82
|
+
/** Callback when auth state changes */
|
|
41
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;
|
|
42
90
|
}
|
|
43
91
|
|
|
44
92
|
/**
|
|
45
93
|
* Web-only Oxy Provider
|
|
46
|
-
*
|
|
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
|
+
* ```
|
|
47
119
|
*/
|
|
48
120
|
export function WebOxyProvider({
|
|
49
121
|
children,
|
|
50
122
|
baseURL,
|
|
51
123
|
authWebUrl,
|
|
52
124
|
onAuthStateChange,
|
|
125
|
+
onError,
|
|
126
|
+
preferredAuthMethod = 'auto',
|
|
127
|
+
skipAutoCheck = false,
|
|
53
128
|
}: WebOxyProviderProps) {
|
|
129
|
+
// Initialize services with centralized AuthManager
|
|
54
130
|
const [oxyServices] = useState(() => new OxyServices({ baseURL, authWebUrl }));
|
|
131
|
+
const [crossDomainAuth] = useState(() => new CrossDomainAuth(oxyServices));
|
|
132
|
+
const [authManager] = useState(() => createAuthManager(oxyServices, { autoRefresh: true }));
|
|
133
|
+
const [queryClient] = useState(() => createQueryClient());
|
|
134
|
+
|
|
135
|
+
// Auth state
|
|
55
136
|
const [user, setUser] = useState<User | null>(null);
|
|
56
|
-
const [isLoading, setIsLoading] = useState(
|
|
137
|
+
const [isLoading, setIsLoading] = useState(!skipAutoCheck);
|
|
57
138
|
const [error, setError] = useState<string | null>(null);
|
|
58
|
-
const [queryClient] = useState(() => createQueryClient());
|
|
59
139
|
|
|
60
140
|
const isAuthenticated = !!user;
|
|
61
141
|
|
|
62
|
-
|
|
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
|
|
63
178
|
useEffect(() => {
|
|
179
|
+
if (skipAutoCheck) return;
|
|
180
|
+
|
|
64
181
|
let mounted = true;
|
|
65
182
|
|
|
66
183
|
const initAuth = async () => {
|
|
67
184
|
try {
|
|
68
|
-
//
|
|
69
|
-
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
|
+
}
|
|
70
191
|
|
|
71
|
-
|
|
72
|
-
|
|
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);
|
|
73
223
|
}
|
|
74
224
|
} catch (err) {
|
|
75
|
-
// No active session - this is fine
|
|
76
|
-
console.log('[WebOxy] No active session');
|
|
77
|
-
} finally {
|
|
78
225
|
if (mounted) {
|
|
79
226
|
setIsLoading(false);
|
|
80
227
|
}
|
|
@@ -86,98 +233,147 @@ export function WebOxyProvider({
|
|
|
86
233
|
return () => {
|
|
87
234
|
mounted = false;
|
|
88
235
|
};
|
|
89
|
-
}, [oxyServices]);
|
|
236
|
+
}, [oxyServices, crossDomainAuth, authManager, skipAutoCheck, handleAuthSuccess]);
|
|
90
237
|
|
|
91
238
|
// Notify parent of auth state changes
|
|
92
239
|
useEffect(() => {
|
|
93
240
|
onAuthStateChange?.(user);
|
|
94
241
|
}, [user, onAuthStateChange]);
|
|
95
242
|
|
|
243
|
+
/**
|
|
244
|
+
* Sign in with automatic method selection
|
|
245
|
+
*/
|
|
96
246
|
const signIn = useCallback(async () => {
|
|
97
247
|
setError(null);
|
|
98
248
|
setIsLoading(true);
|
|
99
249
|
|
|
250
|
+
let selectedMethod: 'fedcm' | 'popup' | 'redirect' = 'popup';
|
|
251
|
+
|
|
100
252
|
try {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
if (
|
|
109
|
-
|
|
253
|
+
const session = await crossDomainAuth.signIn({
|
|
254
|
+
method: preferredAuthMethod,
|
|
255
|
+
onMethodSelected: (method) => {
|
|
256
|
+
selectedMethod = method as 'fedcm' | 'popup' | 'redirect';
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
if (session) {
|
|
261
|
+
await handleAuthSuccess(session, selectedMethod);
|
|
262
|
+
} else {
|
|
263
|
+
// Redirect method - page will reload
|
|
264
|
+
setIsLoading(false);
|
|
110
265
|
}
|
|
266
|
+
} catch (err) {
|
|
267
|
+
handleAuthError(err);
|
|
268
|
+
}
|
|
269
|
+
}, [crossDomainAuth, preferredAuthMethod, handleAuthSuccess, handleAuthError]);
|
|
111
270
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
if (event.data.type === 'oxy-auth-success') {
|
|
119
|
-
const { accessToken, user: authUser } = event.data;
|
|
120
|
-
|
|
121
|
-
// Store the access token for API requests
|
|
122
|
-
if (typeof window !== 'undefined' && accessToken) {
|
|
123
|
-
localStorage.setItem('oxy-access-token', accessToken);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
setUser(authUser);
|
|
127
|
-
setIsLoading(false);
|
|
271
|
+
/**
|
|
272
|
+
* Sign in with FedCM specifically
|
|
273
|
+
*/
|
|
274
|
+
const signInWithFedCM = useCallback(async () => {
|
|
275
|
+
setError(null);
|
|
276
|
+
setIsLoading(true);
|
|
128
277
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
};
|
|
278
|
+
try {
|
|
279
|
+
const session = await crossDomainAuth.signInWithFedCM();
|
|
280
|
+
await handleAuthSuccess(session, 'fedcm');
|
|
281
|
+
} catch (err) {
|
|
282
|
+
handleAuthError(err);
|
|
283
|
+
}
|
|
284
|
+
}, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
|
|
138
285
|
|
|
139
|
-
|
|
286
|
+
/**
|
|
287
|
+
* Sign in with popup specifically
|
|
288
|
+
*/
|
|
289
|
+
const signInWithPopup = useCallback(async () => {
|
|
290
|
+
setError(null);
|
|
291
|
+
setIsLoading(true);
|
|
140
292
|
|
|
141
|
-
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
clearInterval(checkClosed);
|
|
145
|
-
window.removeEventListener('message', handleMessage);
|
|
146
|
-
setIsLoading(false);
|
|
147
|
-
}
|
|
148
|
-
}, 500);
|
|
293
|
+
try {
|
|
294
|
+
const session = await crossDomainAuth.signInWithPopup();
|
|
295
|
+
await handleAuthSuccess(session, 'popup');
|
|
149
296
|
} catch (err) {
|
|
150
|
-
|
|
151
|
-
setError(err instanceof Error ? err.message : 'Sign in failed');
|
|
152
|
-
setIsLoading(false);
|
|
297
|
+
handleAuthError(err);
|
|
153
298
|
}
|
|
154
|
-
}, [
|
|
299
|
+
}, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
|
|
155
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();
|
|
316
|
+
}, [crossDomainAuth]);
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Sign out via AuthManager (handles FedCM revocation and storage cleanup)
|
|
320
|
+
*/
|
|
156
321
|
const signOut = useCallback(async () => {
|
|
157
322
|
setError(null);
|
|
158
323
|
|
|
159
324
|
try {
|
|
160
|
-
//
|
|
161
|
-
|
|
162
|
-
localStorage.removeItem('oxy-access-token');
|
|
163
|
-
}
|
|
325
|
+
// Use centralized AuthManager for sign out (handles FedCM, storage cleanup)
|
|
326
|
+
await authManager.signOut();
|
|
164
327
|
|
|
328
|
+
// Clear user state
|
|
165
329
|
setUser(null);
|
|
166
330
|
} catch (err) {
|
|
167
|
-
|
|
168
|
-
setError(
|
|
331
|
+
const errorMessage = err instanceof Error ? err.message : 'Sign out failed';
|
|
332
|
+
setError(errorMessage);
|
|
333
|
+
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
|
169
334
|
}
|
|
170
|
-
}, []);
|
|
335
|
+
}, [authManager, onError]);
|
|
171
336
|
|
|
172
|
-
|
|
337
|
+
// Cleanup on unmount
|
|
338
|
+
useEffect(() => {
|
|
339
|
+
return () => {
|
|
340
|
+
authManager.destroy();
|
|
341
|
+
};
|
|
342
|
+
}, [authManager]);
|
|
343
|
+
|
|
344
|
+
// Memoize context value to prevent unnecessary re-renders
|
|
345
|
+
const contextValue = useMemo<WebOxyContextValue>(() => ({
|
|
346
|
+
// State
|
|
173
347
|
user,
|
|
174
348
|
isAuthenticated,
|
|
175
349
|
isLoading,
|
|
176
350
|
error,
|
|
351
|
+
// Services
|
|
352
|
+
oxyServices,
|
|
353
|
+
crossDomainAuth,
|
|
354
|
+
authManager,
|
|
355
|
+
// Actions
|
|
177
356
|
signIn,
|
|
357
|
+
signInWithFedCM,
|
|
358
|
+
signInWithPopup,
|
|
359
|
+
signInWithRedirect,
|
|
178
360
|
signOut,
|
|
361
|
+
isFedCMSupported,
|
|
362
|
+
}), [
|
|
363
|
+
user,
|
|
364
|
+
isAuthenticated,
|
|
365
|
+
isLoading,
|
|
366
|
+
error,
|
|
179
367
|
oxyServices,
|
|
180
|
-
|
|
368
|
+
crossDomainAuth,
|
|
369
|
+
authManager,
|
|
370
|
+
signIn,
|
|
371
|
+
signInWithFedCM,
|
|
372
|
+
signInWithPopup,
|
|
373
|
+
signInWithRedirect,
|
|
374
|
+
signOut,
|
|
375
|
+
isFedCMSupported,
|
|
376
|
+
]);
|
|
181
377
|
|
|
182
378
|
return (
|
|
183
379
|
<QueryClientProvider client={queryClient}>
|
|
@@ -188,7 +384,13 @@ export function WebOxyProvider({
|
|
|
188
384
|
);
|
|
189
385
|
}
|
|
190
386
|
|
|
191
|
-
|
|
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 {
|
|
192
394
|
const context = useContext(WebOxyContext);
|
|
193
395
|
if (!context) {
|
|
194
396
|
throw new Error('useWebOxy must be used within WebOxyProvider');
|
|
@@ -196,17 +398,73 @@ export function useWebOxy() {
|
|
|
196
398
|
return context;
|
|
197
399
|
}
|
|
198
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
|
+
*/
|
|
199
433
|
export function useAuth() {
|
|
200
|
-
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();
|
|
201
448
|
|
|
202
449
|
return {
|
|
450
|
+
// State
|
|
203
451
|
user,
|
|
204
452
|
isAuthenticated,
|
|
205
453
|
isLoading,
|
|
206
454
|
isReady: !isLoading,
|
|
207
455
|
error,
|
|
456
|
+
// Actions
|
|
208
457
|
signIn,
|
|
458
|
+
signInWithFedCM,
|
|
459
|
+
signInWithPopup,
|
|
460
|
+
signInWithRedirect,
|
|
209
461
|
signOut,
|
|
462
|
+
// Utilities
|
|
463
|
+
isFedCMSupported,
|
|
210
464
|
oxyServices,
|
|
465
|
+
authManager,
|
|
211
466
|
};
|
|
212
467
|
}
|
|
468
|
+
|
|
469
|
+
// Default export for convenience
|
|
470
|
+
export default WebOxyProvider;
|
package/src/web/index.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Features:
|
|
8
8
|
* - WebOxyProvider for React context
|
|
9
9
|
* - useAuth hook for authentication
|
|
10
|
-
* - Cross-domain SSO via FedCM
|
|
10
|
+
* - Cross-domain SSO via FedCM, popup, or redirect
|
|
11
11
|
* - Full TypeScript support
|
|
12
12
|
* - Zero bundler configuration needed
|
|
13
13
|
*
|
|
@@ -24,8 +24,13 @@
|
|
|
24
24
|
* }
|
|
25
25
|
*
|
|
26
26
|
* function YourApp() {
|
|
27
|
-
* const { user, isAuthenticated, signIn, signOut } = useAuth();
|
|
28
|
-
*
|
|
27
|
+
* const { user, isAuthenticated, signIn, signOut, isFedCMSupported } = useAuth();
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <button onClick={signIn}>
|
|
31
|
+
* {isFedCMSupported() ? 'Sign in with Oxy' : 'Sign in'}
|
|
32
|
+
* </button>
|
|
33
|
+
* );
|
|
29
34
|
* }
|
|
30
35
|
* ```
|
|
31
36
|
*/
|
|
@@ -41,17 +46,79 @@ export {
|
|
|
41
46
|
CrossDomainAuth,
|
|
42
47
|
createCrossDomainAuth,
|
|
43
48
|
DeviceManager,
|
|
49
|
+
// Centralized auth management
|
|
50
|
+
AuthManager,
|
|
51
|
+
createAuthManager,
|
|
44
52
|
} from '../core';
|
|
45
53
|
|
|
46
54
|
export type {
|
|
47
55
|
CrossDomainAuthOptions,
|
|
48
56
|
DeviceFingerprint,
|
|
49
57
|
StoredDeviceInfo,
|
|
58
|
+
// Auth manager types
|
|
59
|
+
StorageAdapter,
|
|
60
|
+
AuthStateChangeCallback,
|
|
61
|
+
AuthMethod,
|
|
62
|
+
AuthManagerConfig,
|
|
50
63
|
} from '../core';
|
|
51
64
|
|
|
52
65
|
// ==================== Web Components ====================
|
|
53
|
-
export {
|
|
54
|
-
|
|
66
|
+
export {
|
|
67
|
+
WebOxyProvider,
|
|
68
|
+
useWebOxy,
|
|
69
|
+
useAuth,
|
|
70
|
+
} from './WebOxyContext';
|
|
71
|
+
|
|
72
|
+
export type {
|
|
73
|
+
WebOxyProviderProps,
|
|
74
|
+
WebAuthState,
|
|
75
|
+
WebAuthActions,
|
|
76
|
+
WebOxyContextValue,
|
|
77
|
+
} from './WebOxyContext';
|
|
78
|
+
|
|
79
|
+
// ==================== Shared Utilities ====================
|
|
80
|
+
// Re-export shared utilities that work everywhere
|
|
81
|
+
export {
|
|
82
|
+
// Color utilities
|
|
83
|
+
darkenColor,
|
|
84
|
+
lightenColor,
|
|
85
|
+
hexToRgb,
|
|
86
|
+
rgbToHex,
|
|
87
|
+
withOpacity,
|
|
88
|
+
isLightColor,
|
|
89
|
+
getContrastTextColor,
|
|
90
|
+
} from '../shared/utils/colorUtils';
|
|
91
|
+
|
|
92
|
+
export {
|
|
93
|
+
// Theme utilities
|
|
94
|
+
normalizeTheme,
|
|
95
|
+
normalizeColorScheme,
|
|
96
|
+
getOppositeTheme,
|
|
97
|
+
systemPrefersDarkMode,
|
|
98
|
+
getSystemColorScheme,
|
|
99
|
+
} from '../shared/utils/themeUtils';
|
|
100
|
+
export type { ThemeValue } from '../shared/utils/themeUtils';
|
|
101
|
+
|
|
102
|
+
export {
|
|
103
|
+
// Error utilities
|
|
104
|
+
HttpStatus,
|
|
105
|
+
getErrorStatus,
|
|
106
|
+
getErrorMessage,
|
|
107
|
+
isAlreadyRegisteredError,
|
|
108
|
+
isUnauthorizedError,
|
|
109
|
+
isForbiddenError,
|
|
110
|
+
isNotFoundError,
|
|
111
|
+
isRateLimitError,
|
|
112
|
+
isServerError,
|
|
113
|
+
isNetworkError,
|
|
114
|
+
isRetryableError,
|
|
115
|
+
} from '../shared/utils/errorUtils';
|
|
116
|
+
|
|
117
|
+
export {
|
|
118
|
+
// Network utilities
|
|
119
|
+
delay,
|
|
120
|
+
withRetry,
|
|
121
|
+
} from '../shared/utils/networkUtils';
|
|
55
122
|
|
|
56
123
|
// ==================== Models & Types ====================
|
|
57
124
|
// Re-export commonly used types
|
|
@@ -66,12 +133,15 @@ export type {
|
|
|
66
133
|
KarmaRule,
|
|
67
134
|
Transaction,
|
|
68
135
|
DeviceSession,
|
|
136
|
+
LoginResponse,
|
|
69
137
|
} from '../models/interfaces';
|
|
70
138
|
|
|
139
|
+
export type { SessionLoginResponse } from '../models/session';
|
|
140
|
+
|
|
71
141
|
// Re-export session types
|
|
72
|
-
export type { ClientSession } from '../models/session';
|
|
142
|
+
export type { ClientSession, MinimalUserData } from '../models/session';
|
|
73
143
|
|
|
74
|
-
// ==================== Utilities ====================
|
|
144
|
+
// ==================== Language Utilities ====================
|
|
75
145
|
export {
|
|
76
146
|
SUPPORTED_LANGUAGES,
|
|
77
147
|
getLanguageMetadata,
|