@oxyhq/services 5.25.0 → 5.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -8
- package/lib/commonjs/core/AuthManager.js +405 -0
- package/lib/commonjs/core/AuthManager.js.map +1 -0
- package/lib/commonjs/core/HttpService.js +39 -1
- package/lib/commonjs/core/HttpService.js.map +1 -1
- package/lib/commonjs/core/index.js +16 -0
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js +38 -44
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
- package/lib/commonjs/core/mixins/OxyServices.popup.js +9 -7
- package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +16 -21
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/index.js +386 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/lib/sonner.js +13 -17
- package/lib/commonjs/lib/sonner.js.map +1 -1
- package/lib/commonjs/lib/sonner.native.js +24 -0
- package/lib/commonjs/lib/sonner.native.js.map +1 -0
- package/lib/commonjs/lib/sonner.web.js +24 -0
- package/lib/commonjs/lib/sonner.web.js.map +1 -0
- package/lib/commonjs/shared/index.js +227 -0
- package/lib/commonjs/shared/index.js.map +1 -0
- package/lib/commonjs/shared/utils/colorUtils.js +161 -0
- package/lib/commonjs/shared/utils/colorUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/debugUtils.js +84 -0
- package/lib/commonjs/shared/utils/debugUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/errorUtils.js +190 -0
- package/lib/commonjs/shared/utils/errorUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/index.js +196 -0
- package/lib/commonjs/shared/utils/index.js.map +1 -0
- package/lib/commonjs/shared/utils/networkUtils.js +213 -0
- package/lib/commonjs/shared/utils/networkUtils.js.map +1 -0
- package/lib/commonjs/shared/utils/themeUtils.js +118 -0
- package/lib/commonjs/shared/utils/themeUtils.js.map +1 -0
- package/lib/commonjs/ui/client.js +1 -1
- package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -1
- package/lib/commonjs/ui/components/FollowButton.js +1 -1
- package/lib/commonjs/ui/components/FontLoader.js +1 -1
- package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedItem.js +1 -1
- package/lib/commonjs/ui/components/Header.js +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +10 -2
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/OxySignInButton.js +19 -20
- package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileCard.js +1 -1
- package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
- package/lib/commonjs/ui/components/QuickActions.js +1 -1
- package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
- package/lib/commonjs/ui/components/Section.js +1 -1
- package/lib/commonjs/ui/components/SectionTitle.js +1 -1
- package/lib/commonjs/ui/components/SignInModal.js +546 -0
- package/lib/commonjs/ui/components/SignInModal.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +3 -2
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +1 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +1 -1
- package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +1 -1
- package/lib/commonjs/ui/hooks/useAsyncAction.js +1 -1
- package/lib/commonjs/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
- package/lib/commonjs/ui/hooks/useColorScheme.js.map +1 -0
- package/lib/commonjs/ui/hooks/useSessionSocket.js +7 -13
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSettingToggle.js +1 -1
- package/lib/commonjs/ui/hooks/useThemeColors.js +1 -1
- package/lib/commonjs/ui/hooks/useThemeStyles.js +1 -1
- package/lib/commonjs/ui/navigation/bottomSheetManager.js +5 -2
- package/lib/commonjs/ui/navigation/bottomSheetManager.js.map +1 -1
- package/lib/commonjs/ui/navigation/routes.js +7 -8
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +8 -8
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +7 -7
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +3 -3
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +5 -5
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountVerificationScreen.js +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +2 -2
- package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +2 -2
- package/lib/commonjs/ui/screens/FAQScreen.js +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +2 -2
- package/lib/commonjs/ui/screens/FollowersListScreen.js +18 -0
- package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/FollowingListScreen.js +18 -0
- package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/HelpSupportScreen.js +2 -2
- package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HistoryViewScreen.js +2 -2
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +2 -2
- package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +229 -0
- package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +2 -2
- package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/OxyAuthScreen.js +9 -21
- package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +2 -2
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +2 -2
- package/lib/commonjs/ui/screens/SessionManagementScreen.js +1 -1
- package/lib/commonjs/ui/screens/UserListScreen.js +411 -0
- package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +1 -1
- package/lib/commonjs/ui/stores/authStore.js +4 -6
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/commonjs/ui/utils/colorUtils.js +43 -46
- package/lib/commonjs/ui/utils/colorUtils.js.map +1 -1
- package/lib/commonjs/ui/utils/fileManagement.js +1 -1
- package/lib/commonjs/ui/utils/themeUtils.js +29 -39
- package/lib/commonjs/ui/utils/themeUtils.js.map +1 -1
- package/lib/commonjs/ui/utils/{user-utils.js → userUtils.js} +1 -1
- package/lib/commonjs/ui/utils/userUtils.js.map +1 -0
- package/lib/commonjs/utils/errorUtils.js +0 -13
- package/lib/commonjs/utils/errorUtils.js.map +1 -1
- package/lib/commonjs/utils/hookUtils.js +8 -8
- package/lib/commonjs/utils/hookUtils.js.map +1 -1
- package/lib/commonjs/utils/platform.js +129 -0
- package/lib/commonjs/utils/platform.js.map +1 -0
- package/lib/commonjs/web/WebOxyContext.js +273 -41
- package/lib/commonjs/web/WebOxyContext.js.map +1 -1
- package/lib/commonjs/web/index.js +177 -4
- package/lib/commonjs/web/index.js.map +1 -1
- package/lib/commonjs/web.js +12 -12
- package/lib/commonjs/web.js.map +1 -1
- package/lib/module/core/AuthManager.js +399 -0
- package/lib/module/core/AuthManager.js.map +1 -0
- package/lib/module/core/HttpService.js +39 -1
- package/lib/module/core/HttpService.js.map +1 -1
- package/lib/module/core/index.js +2 -0
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.fedcm.js +38 -44
- package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.popup.js +9 -7
- package/lib/module/core/mixins/OxyServices.popup.js.map +1 -1
- package/lib/module/crypto/keyManager.js +16 -21
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/index.js +34 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/lib/sonner.js +11 -16
- package/lib/module/lib/sonner.js.map +1 -1
- package/lib/module/lib/sonner.native.js +19 -0
- package/lib/module/lib/sonner.native.js.map +1 -0
- package/lib/module/lib/sonner.web.js +19 -0
- package/lib/module/lib/sonner.web.js.map +1 -0
- package/lib/module/shared/index.js +37 -0
- package/lib/module/shared/index.js.map +1 -0
- package/lib/module/shared/utils/colorUtils.js +150 -0
- package/lib/module/shared/utils/colorUtils.js.map +1 -0
- package/lib/module/shared/utils/debugUtils.js +75 -0
- package/lib/module/shared/utils/debugUtils.js.map +1 -0
- package/lib/module/shared/utils/errorUtils.js +176 -0
- package/lib/module/shared/utils/errorUtils.js.map +1 -0
- package/lib/module/shared/utils/index.js +21 -0
- package/lib/module/shared/utils/index.js.map +1 -0
- package/lib/module/shared/utils/networkUtils.js +202 -0
- package/lib/module/shared/utils/networkUtils.js.map +1 -0
- package/lib/module/shared/utils/themeUtils.js +109 -0
- package/lib/module/shared/utils/themeUtils.js.map +1 -0
- package/lib/module/ui/client.js +1 -1
- package/lib/module/ui/client.js.map +1 -1
- package/lib/module/ui/components/BottomSheetRouter.js +1 -1
- package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
- package/lib/module/ui/components/FollowButton.js +1 -1
- package/lib/module/ui/components/FollowButton.js.map +1 -1
- package/lib/module/ui/components/FontLoader.js +1 -1
- package/lib/module/ui/components/FontLoader.js.map +1 -1
- package/lib/module/ui/components/GroupedItem.js +1 -1
- package/lib/module/ui/components/GroupedItem.js.map +1 -1
- package/lib/module/ui/components/Header.js +1 -1
- package/lib/module/ui/components/Header.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +10 -2
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/OxySignInButton.js +20 -21
- package/lib/module/ui/components/OxySignInButton.js.map +1 -1
- package/lib/module/ui/components/ProfileCard.js +1 -1
- package/lib/module/ui/components/ProfileCard.js.map +1 -1
- package/lib/module/ui/components/QuickActions.js +1 -1
- package/lib/module/ui/components/QuickActions.js.map +1 -1
- package/lib/module/ui/components/Section.js +1 -1
- package/lib/module/ui/components/Section.js.map +1 -1
- package/lib/module/ui/components/SectionTitle.js +1 -1
- package/lib/module/ui/components/SectionTitle.js.map +1 -1
- package/lib/module/ui/components/SignInModal.js +536 -0
- package/lib/module/ui/components/SignInModal.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
- package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +2 -2
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/mutations/mutationFactory.js +1 -1
- package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useServicesMutations.js +1 -1
- package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
- package/lib/module/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
- package/lib/module/ui/hooks/useColorScheme.js.map +1 -0
- package/lib/module/ui/hooks/useSessionSocket.js +7 -13
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js +1 -1
- package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
- package/lib/module/ui/hooks/useThemeColors.js +1 -1
- package/lib/module/ui/hooks/useThemeColors.js.map +1 -1
- package/lib/module/ui/hooks/useThemeStyles.js +1 -1
- package/lib/module/ui/hooks/useThemeStyles.js.map +1 -1
- package/lib/module/ui/navigation/bottomSheetManager.js +5 -2
- package/lib/module/ui/navigation/bottomSheetManager.js.map +1 -1
- package/lib/module/ui/navigation/routes.js +7 -8
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +8 -8
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +7 -7
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +3 -3
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +5 -5
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js +1 -1
- package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +2 -2
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/EditProfileFieldScreen.js +2 -2
- package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
- package/lib/module/ui/screens/FAQScreen.js +1 -1
- package/lib/module/ui/screens/FAQScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +2 -2
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/FollowersListScreen.js +13 -0
- package/lib/module/ui/screens/FollowersListScreen.js.map +1 -0
- package/lib/module/ui/screens/FollowingListScreen.js +13 -0
- package/lib/module/ui/screens/FollowingListScreen.js.map +1 -0
- package/lib/module/ui/screens/HelpSupportScreen.js +2 -2
- package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/module/ui/screens/HistoryViewScreen.js +2 -2
- package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js +2 -2
- package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +224 -0
- package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
- package/lib/module/ui/screens/LegalDocumentsScreen.js +2 -2
- package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
- package/lib/module/ui/screens/OxyAuthScreen.js +9 -21
- package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +1 -1
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.js +2 -2
- package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/UserListScreen.js +405 -0
- package/lib/module/ui/screens/UserListScreen.js.map +1 -0
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaAboutScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaFAQScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaRulesScreen.js +1 -1
- package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +4 -6
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/module/ui/utils/colorUtils.js +7 -40
- package/lib/module/ui/utils/colorUtils.js.map +1 -1
- package/lib/module/ui/utils/fileManagement.js +1 -1
- package/lib/module/ui/utils/fileManagement.js.map +1 -1
- package/lib/module/ui/utils/themeUtils.js +7 -35
- package/lib/module/ui/utils/themeUtils.js.map +1 -1
- package/lib/module/ui/utils/{user-utils.js → userUtils.js} +1 -1
- package/lib/module/ui/utils/userUtils.js.map +1 -0
- package/lib/module/utils/errorUtils.js +0 -7
- package/lib/module/utils/errorUtils.js.map +1 -1
- package/lib/module/utils/hookUtils.js +8 -8
- package/lib/module/utils/hookUtils.js.map +1 -1
- package/lib/module/utils/platform.js +118 -0
- package/lib/module/utils/platform.js.map +1 -0
- package/lib/module/web/WebOxyContext.js +272 -41
- package/lib/module/web/WebOxyContext.js.map +1 -1
- package/lib/module/web/index.js +26 -5
- package/lib/module/web/index.js.map +1 -1
- package/lib/module/web.js +2 -1
- package/lib/module/web.js.map +1 -1
- package/lib/typescript/commonjs/core/AuthManager.d.ts +144 -0
- package/lib/typescript/commonjs/core/AuthManager.d.ts.map +1 -0
- package/lib/typescript/commonjs/core/HttpService.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/index.d.ts +2 -0
- package/lib/typescript/commonjs/core/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts.map +1 -1
- package/lib/typescript/commonjs/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +16 -2
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/lib/sonner.d.ts +11 -14
- package/lib/typescript/commonjs/lib/sonner.d.ts.map +1 -1
- package/lib/typescript/commonjs/lib/sonner.native.d.ts +15 -0
- package/lib/typescript/commonjs/lib/sonner.native.d.ts.map +1 -0
- package/lib/typescript/commonjs/lib/sonner.web.d.ts +15 -0
- package/lib/typescript/commonjs/lib/sonner.web.d.ts.map +1 -0
- package/lib/typescript/commonjs/models/session.d.ts +4 -0
- package/lib/typescript/commonjs/models/session.d.ts.map +1 -1
- package/lib/typescript/commonjs/shared/index.d.ts +29 -0
- package/lib/typescript/commonjs/shared/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts +105 -0
- package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts +49 -0
- package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts +98 -0
- package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/index.d.ts +14 -0
- package/lib/typescript/commonjs/shared/utils/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts +140 -0
- package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts +91 -0
- package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/components/FontLoader.d.ts +1 -1
- package/lib/typescript/commonjs/ui/components/FontLoader.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/SignInModal.d.ts +18 -0
- package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +1 -2
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
- package/lib/typescript/commonjs/ui/hooks/useColorScheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts +2 -0
- package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +9 -0
- package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +9 -0
- package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
- package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +11 -0
- package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts +7 -11
- package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts +6 -19
- package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
- package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/utils/errorUtils.d.ts +0 -6
- package/lib/typescript/commonjs/utils/errorUtils.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/platform.d.ts +41 -0
- package/lib/typescript/commonjs/utils/platform.d.ts.map +1 -0
- package/lib/typescript/commonjs/web/WebOxyContext.d.ts +117 -9
- package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/web/index.d.ts +19 -8
- package/lib/typescript/commonjs/web/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/web.d.ts +2 -1
- package/lib/typescript/commonjs/web.d.ts.map +1 -1
- package/lib/typescript/module/core/AuthManager.d.ts +144 -0
- package/lib/typescript/module/core/AuthManager.d.ts.map +1 -0
- package/lib/typescript/module/core/HttpService.d.ts.map +1 -1
- package/lib/typescript/module/core/index.d.ts +2 -0
- package/lib/typescript/module/core/index.d.ts.map +1 -1
- package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
- package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts.map +1 -1
- package/lib/typescript/module/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +16 -2
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/lib/sonner.d.ts +11 -14
- package/lib/typescript/module/lib/sonner.d.ts.map +1 -1
- package/lib/typescript/module/lib/sonner.native.d.ts +15 -0
- package/lib/typescript/module/lib/sonner.native.d.ts.map +1 -0
- package/lib/typescript/module/lib/sonner.web.d.ts +15 -0
- package/lib/typescript/module/lib/sonner.web.d.ts.map +1 -0
- package/lib/typescript/module/models/session.d.ts +4 -0
- package/lib/typescript/module/models/session.d.ts.map +1 -1
- package/lib/typescript/module/shared/index.d.ts +29 -0
- package/lib/typescript/module/shared/index.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/colorUtils.d.ts +105 -0
- package/lib/typescript/module/shared/utils/colorUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/debugUtils.d.ts +49 -0
- package/lib/typescript/module/shared/utils/debugUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/errorUtils.d.ts +98 -0
- package/lib/typescript/module/shared/utils/errorUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/index.d.ts +14 -0
- package/lib/typescript/module/shared/utils/index.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/networkUtils.d.ts +140 -0
- package/lib/typescript/module/shared/utils/networkUtils.d.ts.map +1 -0
- package/lib/typescript/module/shared/utils/themeUtils.d.ts +91 -0
- package/lib/typescript/module/shared/utils/themeUtils.d.ts.map +1 -0
- package/lib/typescript/module/ui/components/FontLoader.d.ts +1 -1
- package/lib/typescript/module/ui/components/FontLoader.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/SignInModal.d.ts +18 -0
- package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -0
- package/lib/typescript/module/ui/context/OxyContext.d.ts +1 -2
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
- package/lib/typescript/module/ui/hooks/useColorScheme.d.ts.map +1 -0
- package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts +2 -0
- package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts.map +1 -1
- package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +9 -0
- package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +9 -0
- package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
- package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/UserListScreen.d.ts +11 -0
- package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -0
- package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/colorUtils.d.ts +7 -11
- package/lib/typescript/module/ui/utils/colorUtils.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/themeUtils.d.ts +6 -19
- package/lib/typescript/module/ui/utils/themeUtils.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
- package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -0
- package/lib/typescript/module/utils/errorUtils.d.ts +0 -6
- package/lib/typescript/module/utils/errorUtils.d.ts.map +1 -1
- package/lib/typescript/module/utils/platform.d.ts +41 -0
- package/lib/typescript/module/utils/platform.d.ts.map +1 -0
- package/lib/typescript/module/web/WebOxyContext.d.ts +117 -9
- package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
- package/lib/typescript/module/web/index.d.ts +19 -8
- package/lib/typescript/module/web/index.d.ts.map +1 -1
- package/lib/typescript/module/web.d.ts +2 -1
- package/lib/typescript/module/web.d.ts.map +1 -1
- package/package.json +8 -2
- package/src/core/AuthManager.ts +436 -0
- package/src/core/HttpService.ts +43 -1
- package/src/core/index.ts +4 -0
- package/src/core/mixins/OxyServices.fedcm.ts +37 -42
- package/src/core/mixins/OxyServices.popup.ts +10 -7
- package/src/crypto/keyManager.ts +16 -21
- package/src/index.ts +83 -12
- package/src/lib/sonner.native.ts +28 -0
- package/src/lib/sonner.ts +11 -28
- package/src/lib/sonner.web.ts +28 -0
- package/src/models/session.ts +4 -0
- package/src/shared/index.ts +82 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/debugUtils.ts +73 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/ui/components/BottomSheetRouter.tsx +1 -1
- package/src/ui/components/FontLoader.tsx +1 -2
- package/src/ui/components/GroupedItem.tsx +1 -1
- package/src/ui/components/Header.tsx +1 -1
- package/src/ui/components/OxyProvider.tsx +10 -0
- package/src/ui/components/OxySignInButton.tsx +20 -22
- package/src/ui/components/ProfileCard.tsx +1 -1
- package/src/ui/components/QuickActions.tsx +1 -1
- package/src/ui/components/Section.tsx +1 -1
- package/src/ui/components/SectionTitle.tsx +1 -1
- package/src/ui/components/SignInModal.tsx +534 -0
- package/src/ui/context/OxyContext.tsx +1 -2
- package/src/ui/hooks/queries/queryKeys.ts +2 -2
- package/src/ui/hooks/useSessionSocket.ts +12 -17
- package/src/ui/hooks/useThemeColors.ts +1 -1
- package/src/ui/hooks/useThemeStyles.ts +1 -1
- package/src/ui/navigation/bottomSheetManager.ts +5 -1
- package/src/ui/navigation/routes.ts +8 -9
- package/src/ui/screens/AccountCenterScreen.tsx +7 -7
- package/src/ui/screens/AccountOverviewScreen.tsx +6 -6
- package/src/ui/screens/AccountSettingsScreen.tsx +2 -2
- package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
- package/src/ui/screens/AppInfoScreen.tsx +1 -1
- package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
- package/src/ui/screens/FileManagementScreen.tsx +1 -1
- package/src/ui/screens/FollowersListScreen.tsx +14 -0
- package/src/ui/screens/FollowingListScreen.tsx +14 -0
- package/src/ui/screens/HelpSupportScreen.tsx +1 -1
- package/src/ui/screens/HistoryViewScreen.tsx +1 -1
- package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
- package/src/ui/screens/LearnMoreUsernamesScreen.tsx +231 -0
- package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
- package/src/ui/screens/OxyAuthScreen.tsx +10 -21
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
- package/src/ui/screens/ProfileScreen.tsx +1 -1
- package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
- package/src/ui/screens/UserListScreen.tsx +416 -0
- package/src/ui/screens/karma/KarmaAboutScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaCenterScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaFAQScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaRewardsScreen.tsx +1 -1
- package/src/ui/screens/karma/KarmaRulesScreen.tsx +1 -1
- package/src/ui/stores/authStore.ts +5 -6
- package/src/ui/utils/colorUtils.ts +15 -43
- package/src/ui/utils/themeUtils.ts +14 -39
- package/src/utils/errorUtils.ts +1 -6
- package/src/utils/hookUtils.ts +8 -8
- package/src/utils/platform.ts +117 -0
- package/src/web/WebOxyContext.tsx +331 -41
- package/src/web/index.ts +76 -6
- package/src/web.ts +1 -1
- package/lib/commonjs/ui/hooks/use-color-scheme.js.map +0 -1
- package/lib/commonjs/ui/utils/user-utils.js.map +0 -1
- package/lib/module/ui/hooks/use-color-scheme.js.map +0 -1
- package/lib/module/ui/utils/user-utils.js.map +0 -1
- package/lib/typescript/commonjs/ui/hooks/use-color-scheme.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/utils/user-utils.d.ts.map +0 -1
- package/lib/typescript/module/ui/hooks/use-color-scheme.d.ts.map +0 -1
- package/lib/typescript/module/ui/utils/user-utils.d.ts.map +0 -1
- /package/src/ui/hooks/{use-color-scheme.ts → useColorScheme.ts} +0 -0
- /package/src/ui/utils/{user-utils.ts → userUtils.ts} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Utility Functions
|
|
3
|
+
*
|
|
4
|
+
* Consolidated network utilities including circuit breaker pattern
|
|
5
|
+
* and exponential backoff for resilient API calls.
|
|
6
|
+
*
|
|
7
|
+
* @module shared/utils/networkUtils
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* State for circuit breaker pattern.
|
|
12
|
+
*/
|
|
13
|
+
export interface CircuitBreakerState {
|
|
14
|
+
/** Number of consecutive failures */
|
|
15
|
+
consecutiveFailures: number;
|
|
16
|
+
/** Current interval between retries (ms) */
|
|
17
|
+
currentInterval: number;
|
|
18
|
+
/** Base interval for retries (ms) */
|
|
19
|
+
baseInterval: number;
|
|
20
|
+
/** Maximum interval cap (ms) */
|
|
21
|
+
maxInterval: number;
|
|
22
|
+
/** Number of failures before circuit opens */
|
|
23
|
+
maxFailures: number;
|
|
24
|
+
/** Whether the circuit is currently open (blocking requests) */
|
|
25
|
+
isOpen?: boolean;
|
|
26
|
+
/** Timestamp when circuit was opened */
|
|
27
|
+
openedAt?: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Configuration for circuit breaker.
|
|
32
|
+
*/
|
|
33
|
+
export interface CircuitBreakerConfig {
|
|
34
|
+
/** Base interval between retries in milliseconds. Default: 10000 (10s) */
|
|
35
|
+
baseInterval?: number;
|
|
36
|
+
/** Maximum interval cap in milliseconds. Default: 60000 (60s) */
|
|
37
|
+
maxInterval?: number;
|
|
38
|
+
/** Number of consecutive failures before opening circuit. Default: 5 */
|
|
39
|
+
maxFailures?: number;
|
|
40
|
+
/** Time to wait before attempting recovery in milliseconds. Default: 30000 (30s) */
|
|
41
|
+
recoveryTimeout?: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Default circuit breaker configuration.
|
|
46
|
+
*/
|
|
47
|
+
export const DEFAULT_CIRCUIT_BREAKER_CONFIG: Required<CircuitBreakerConfig> = {
|
|
48
|
+
baseInterval: 10000,
|
|
49
|
+
maxInterval: 60000,
|
|
50
|
+
maxFailures: 5,
|
|
51
|
+
recoveryTimeout: 30000,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Creates initial circuit breaker state.
|
|
56
|
+
*
|
|
57
|
+
* @param config - Optional custom configuration
|
|
58
|
+
* @returns Initial circuit breaker state
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* const state = createCircuitBreakerState({ maxFailures: 3 });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export const createCircuitBreakerState = (
|
|
66
|
+
config: CircuitBreakerConfig = {}
|
|
67
|
+
): CircuitBreakerState => {
|
|
68
|
+
const { baseInterval, maxInterval, maxFailures } = {
|
|
69
|
+
...DEFAULT_CIRCUIT_BREAKER_CONFIG,
|
|
70
|
+
...config,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
consecutiveFailures: 0,
|
|
75
|
+
currentInterval: baseInterval,
|
|
76
|
+
baseInterval,
|
|
77
|
+
maxInterval,
|
|
78
|
+
maxFailures,
|
|
79
|
+
isOpen: false,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Calculates next interval using exponential backoff.
|
|
85
|
+
*
|
|
86
|
+
* @param state - Current circuit breaker state
|
|
87
|
+
* @returns Next interval in milliseconds
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* const nextInterval = calculateBackoffInterval(state);
|
|
92
|
+
* await delay(nextInterval);
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export const calculateBackoffInterval = (state: CircuitBreakerState): number => {
|
|
96
|
+
const { consecutiveFailures, baseInterval, maxInterval } = state;
|
|
97
|
+
|
|
98
|
+
if (consecutiveFailures === 0) return baseInterval;
|
|
99
|
+
|
|
100
|
+
const backoffMultiplier = Math.min(
|
|
101
|
+
Math.pow(2, consecutiveFailures - 1),
|
|
102
|
+
maxInterval / baseInterval
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
return Math.min(baseInterval * backoffMultiplier, maxInterval);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Records a failure and updates circuit breaker state.
|
|
110
|
+
*
|
|
111
|
+
* @param state - Current circuit breaker state
|
|
112
|
+
* @returns Updated state after recording failure
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* try {
|
|
117
|
+
* await apiCall();
|
|
118
|
+
* state = recordSuccess(state);
|
|
119
|
+
* } catch (error) {
|
|
120
|
+
* state = recordFailure(state);
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export const recordFailure = (state: CircuitBreakerState): CircuitBreakerState => {
|
|
125
|
+
const newFailures = state.consecutiveFailures + 1;
|
|
126
|
+
const newInterval = calculateBackoffInterval({
|
|
127
|
+
...state,
|
|
128
|
+
consecutiveFailures: newFailures,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const shouldOpenCircuit = newFailures >= state.maxFailures;
|
|
132
|
+
const finalInterval = shouldOpenCircuit ? state.maxInterval : newInterval;
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
...state,
|
|
136
|
+
consecutiveFailures: newFailures,
|
|
137
|
+
currentInterval: finalInterval,
|
|
138
|
+
isOpen: shouldOpenCircuit,
|
|
139
|
+
openedAt: shouldOpenCircuit ? Date.now() : state.openedAt,
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Records a success and resets circuit breaker state.
|
|
145
|
+
*
|
|
146
|
+
* @param state - Current circuit breaker state
|
|
147
|
+
* @returns Reset state after successful request
|
|
148
|
+
*/
|
|
149
|
+
export const recordSuccess = (state: CircuitBreakerState): CircuitBreakerState => {
|
|
150
|
+
return {
|
|
151
|
+
...state,
|
|
152
|
+
consecutiveFailures: 0,
|
|
153
|
+
currentInterval: state.baseInterval,
|
|
154
|
+
isOpen: false,
|
|
155
|
+
openedAt: undefined,
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Checks if the circuit breaker should allow a request.
|
|
161
|
+
*
|
|
162
|
+
* When the circuit is open, it will only allow requests after
|
|
163
|
+
* the recovery timeout has passed (half-open state).
|
|
164
|
+
*
|
|
165
|
+
* @param state - Current circuit breaker state
|
|
166
|
+
* @param recoveryTimeout - Time to wait before allowing recovery attempts
|
|
167
|
+
* @returns true if request should be allowed
|
|
168
|
+
*/
|
|
169
|
+
export const shouldAllowRequest = (
|
|
170
|
+
state: CircuitBreakerState,
|
|
171
|
+
recoveryTimeout: number = DEFAULT_CIRCUIT_BREAKER_CONFIG.recoveryTimeout
|
|
172
|
+
): boolean => {
|
|
173
|
+
if (!state.isOpen) return true;
|
|
174
|
+
|
|
175
|
+
if (!state.openedAt) return true;
|
|
176
|
+
|
|
177
|
+
const timeSinceOpen = Date.now() - state.openedAt;
|
|
178
|
+
return timeSinceOpen >= recoveryTimeout;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Delays execution for a specified duration.
|
|
183
|
+
*
|
|
184
|
+
* @param ms - Milliseconds to delay
|
|
185
|
+
* @returns Promise that resolves after the delay
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```ts
|
|
189
|
+
* await delay(1000); // Wait 1 second
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
export const delay = (ms: number): Promise<void> =>
|
|
193
|
+
new Promise(resolve => setTimeout(resolve, ms));
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Executes a function with exponential backoff retry.
|
|
197
|
+
*
|
|
198
|
+
* @param fn - Async function to execute
|
|
199
|
+
* @param options - Retry options
|
|
200
|
+
* @returns Result of the function
|
|
201
|
+
* @throws Last error if all retries fail
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```ts
|
|
205
|
+
* const result = await withRetry(
|
|
206
|
+
* () => fetchData(),
|
|
207
|
+
* { maxRetries: 3, baseDelay: 1000 }
|
|
208
|
+
* );
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
211
|
+
export const withRetry = async <T>(
|
|
212
|
+
fn: () => Promise<T>,
|
|
213
|
+
options: {
|
|
214
|
+
maxRetries?: number;
|
|
215
|
+
baseDelay?: number;
|
|
216
|
+
maxDelay?: number;
|
|
217
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
218
|
+
onRetry?: (error: unknown, attempt: number) => void;
|
|
219
|
+
} = {}
|
|
220
|
+
): Promise<T> => {
|
|
221
|
+
const {
|
|
222
|
+
maxRetries = 3,
|
|
223
|
+
baseDelay = 1000,
|
|
224
|
+
maxDelay = 30000,
|
|
225
|
+
shouldRetry = () => true,
|
|
226
|
+
onRetry,
|
|
227
|
+
} = options;
|
|
228
|
+
|
|
229
|
+
let lastError: unknown;
|
|
230
|
+
|
|
231
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
232
|
+
try {
|
|
233
|
+
return await fn();
|
|
234
|
+
} catch (error) {
|
|
235
|
+
lastError = error;
|
|
236
|
+
|
|
237
|
+
if (attempt === maxRetries || !shouldRetry(error)) {
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const delayMs = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
|
|
242
|
+
onRetry?.(error, attempt + 1);
|
|
243
|
+
await delay(delayMs);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
throw lastError;
|
|
248
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Utility Functions
|
|
3
|
+
*
|
|
4
|
+
* Consolidated theme utilities for normalizing and handling color schemes
|
|
5
|
+
* across the OxyServices ecosystem.
|
|
6
|
+
*
|
|
7
|
+
* @module shared/utils/themeUtils
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Valid theme values in the Oxy ecosystem.
|
|
12
|
+
*/
|
|
13
|
+
export type ThemeValue = 'light' | 'dark';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes a theme value to ensure it's always 'light' or 'dark'.
|
|
17
|
+
*
|
|
18
|
+
* @param theme - Theme value (may be 'light' | 'dark' | string | undefined)
|
|
19
|
+
* @returns Normalized 'light' | 'dark' theme (defaults to 'light')
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* normalizeTheme('dark'); // 'dark'
|
|
24
|
+
* normalizeTheme('light'); // 'light'
|
|
25
|
+
* normalizeTheme('unknown'); // 'light'
|
|
26
|
+
* normalizeTheme(undefined); // 'light'
|
|
27
|
+
* normalizeTheme(null); // 'light'
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const normalizeTheme = (theme?: string | null): ThemeValue =>
|
|
31
|
+
theme === 'light' || theme === 'dark' ? theme : 'light';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Normalizes a color scheme value with optional fallback chain.
|
|
35
|
+
*
|
|
36
|
+
* Handles null/undefined cases from React Native's useColorScheme() hook
|
|
37
|
+
* with a proper fallback chain.
|
|
38
|
+
*
|
|
39
|
+
* @param colorScheme - The color scheme from useColorScheme() hook (may be null/undefined)
|
|
40
|
+
* @param theme - Optional theme prop as fallback
|
|
41
|
+
* @returns Normalized 'light' | 'dark' color scheme
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* // In a React Native component:
|
|
46
|
+
* const systemScheme = useColorScheme(); // might be null
|
|
47
|
+
* const colorScheme = normalizeColorScheme(systemScheme, props.theme);
|
|
48
|
+
*
|
|
49
|
+
* normalizeColorScheme('dark', 'light'); // 'dark'
|
|
50
|
+
* normalizeColorScheme(null, 'dark'); // 'dark'
|
|
51
|
+
* normalizeColorScheme(undefined, undefined); // 'light'
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export const normalizeColorScheme = (
|
|
55
|
+
colorScheme?: string | null,
|
|
56
|
+
theme?: string
|
|
57
|
+
): ThemeValue => {
|
|
58
|
+
if (colorScheme === 'light' || colorScheme === 'dark') {
|
|
59
|
+
return colorScheme;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (theme === 'light' || theme === 'dark') {
|
|
63
|
+
return theme;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return 'light';
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Gets the opposite theme value.
|
|
71
|
+
*
|
|
72
|
+
* @param theme - Current theme value
|
|
73
|
+
* @returns The opposite theme ('light' → 'dark', 'dark' → 'light')
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* getOppositeTheme('light'); // 'dark'
|
|
78
|
+
* getOppositeTheme('dark'); // 'light'
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export const getOppositeTheme = (theme: ThemeValue): ThemeValue =>
|
|
82
|
+
theme === 'light' ? 'dark' : 'light';
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Checks if the system prefers dark mode.
|
|
86
|
+
*
|
|
87
|
+
* This function only works in browser environments.
|
|
88
|
+
* Returns false in non-browser environments (Node.js, React Native).
|
|
89
|
+
*
|
|
90
|
+
* @returns true if system prefers dark mode, false otherwise
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* if (systemPrefersDarkMode()) {
|
|
95
|
+
* setTheme('dark');
|
|
96
|
+
* }
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export const systemPrefersDarkMode = (): boolean => {
|
|
100
|
+
if (typeof window === 'undefined') return false;
|
|
101
|
+
return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Gets the system's preferred color scheme.
|
|
106
|
+
*
|
|
107
|
+
* @returns 'dark' if system prefers dark mode, 'light' otherwise
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const theme = getSystemColorScheme();
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export const getSystemColorScheme = (): ThemeValue =>
|
|
115
|
+
systemPrefersDarkMode() ? 'dark' : 'light';
|
|
@@ -4,7 +4,7 @@ import { useStore } from 'zustand';
|
|
|
4
4
|
import type { RouteName } from '../navigation/routes';
|
|
5
5
|
import { getScreenComponent, isValidRoute } from '../navigation/routes';
|
|
6
6
|
import type { BaseScreenProps } from '../types/navigation';
|
|
7
|
-
import { useColorScheme } from '../hooks/
|
|
7
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
8
8
|
import { Colors } from '../constants/theme';
|
|
9
9
|
import BottomSheet, { type BottomSheetRef } from './BottomSheet';
|
|
10
10
|
import {
|
|
@@ -3,7 +3,7 @@ import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
|
|
|
3
3
|
import { Ionicons } from '@expo/vector-icons';
|
|
4
4
|
// @ts-ignore - MaterialCommunityIcons is available at runtime
|
|
5
5
|
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
|
6
|
-
import { useColorScheme } from '../hooks/
|
|
6
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
7
7
|
import { darkenColor } from '../utils/colorUtils';
|
|
8
8
|
import { normalizeColorScheme } from '../utils/themeUtils';
|
|
9
9
|
import { Colors } from '../constants/theme';
|
|
@@ -14,7 +14,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
|
14
14
|
import { Ionicons } from '@expo/vector-icons';
|
|
15
15
|
import OxyIcon from './icon/OxyIcon';
|
|
16
16
|
import { fontFamilies } from '../styles/fonts';
|
|
17
|
-
import { useColorScheme } from '../hooks/
|
|
17
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
18
18
|
import { normalizeColorScheme } from '../utils/themeUtils';
|
|
19
19
|
import { Colors } from '../constants/theme';
|
|
20
20
|
|
|
@@ -19,6 +19,7 @@ const isWeb = Platform.OS === 'web';
|
|
|
19
19
|
// Conditionally import components
|
|
20
20
|
let KeyboardProvider: any = ({ children }: any) => children;
|
|
21
21
|
let BottomSheetRouter: any = null;
|
|
22
|
+
let SignInModal: any = null;
|
|
22
23
|
|
|
23
24
|
// KeyboardProvider only on native
|
|
24
25
|
if (!isWeb) {
|
|
@@ -36,6 +37,13 @@ try {
|
|
|
36
37
|
// BottomSheetRouter not available
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
// SignInModal works on all platforms
|
|
41
|
+
try {
|
|
42
|
+
SignInModal = require('./SignInModal').default;
|
|
43
|
+
} catch {
|
|
44
|
+
// SignInModal not available
|
|
45
|
+
}
|
|
46
|
+
|
|
39
47
|
/**
|
|
40
48
|
* OxyProvider - Universal provider for Expo apps (native + web)
|
|
41
49
|
*
|
|
@@ -206,6 +214,8 @@ const OxyProvider: FC<OxyProviderProps> = ({
|
|
|
206
214
|
{children}
|
|
207
215
|
{/* Only render bottom sheet router on native */}
|
|
208
216
|
{BottomSheetRouter && <BottomSheetRouter />}
|
|
217
|
+
{/* Sign-in modal for all platforms */}
|
|
218
|
+
{SignInModal && <SignInModal />}
|
|
209
219
|
<Toaster />
|
|
210
220
|
</OxyContextProvider>
|
|
211
221
|
</QueryClientProvider>
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
-
import { useState } from 'react';
|
|
2
|
+
import { useCallback, useState, useEffect } from 'react';
|
|
3
3
|
import { TouchableOpacity, Text, View, StyleSheet, type ViewStyle, type TextStyle, type StyleProp, Platform } from 'react-native';
|
|
4
4
|
import { useAuth } from '../hooks/useAuth';
|
|
5
5
|
import { fontFamilies } from '../styles/fonts';
|
|
6
6
|
import OxyLogo from './OxyLogo';
|
|
7
|
+
import { showSignInModal, subscribeToSignInModal } from './SignInModal';
|
|
7
8
|
|
|
8
9
|
export interface OxySignInButtonProps {
|
|
9
10
|
/**
|
|
@@ -81,36 +82,33 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
|
|
|
81
82
|
disabled = false,
|
|
82
83
|
showWhenAuthenticated = false,
|
|
83
84
|
}) => {
|
|
84
|
-
const { isAuthenticated,
|
|
85
|
-
const [
|
|
85
|
+
const { isAuthenticated, isLoading } = useAuth();
|
|
86
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
87
|
+
|
|
88
|
+
// Subscribe to modal close events
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
return subscribeToSignInModal(setIsModalOpen);
|
|
91
|
+
}, []);
|
|
86
92
|
|
|
87
93
|
// Don't show the button if already authenticated (unless explicitly overridden)
|
|
88
94
|
if (isAuthenticated && !showWhenAuthenticated) return null;
|
|
89
95
|
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
const handlePress = async () => {
|
|
96
|
+
// Handle button press - opens full-screen sign-in modal with QR code and auth options
|
|
97
|
+
const handlePress = useCallback(() => {
|
|
93
98
|
if (onPress) {
|
|
94
99
|
onPress();
|
|
95
100
|
return;
|
|
96
101
|
}
|
|
97
102
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
// Sign-in handled by the auth flow
|
|
105
|
-
if (__DEV__) {
|
|
106
|
-
console.log('OxySignInButton: Sign-in flow initiated', error);
|
|
107
|
-
}
|
|
108
|
-
} finally {
|
|
109
|
-
setIsSigningIn(false);
|
|
110
|
-
}
|
|
111
|
-
};
|
|
103
|
+
// Set state immediately before showing modal
|
|
104
|
+
console.log('[OxySignInButton] Setting isModalOpen to true');
|
|
105
|
+
setIsModalOpen(true);
|
|
106
|
+
// Show the full-screen sign-in modal on all platforms
|
|
107
|
+
showSignInModal();
|
|
108
|
+
}, [onPress]);
|
|
112
109
|
|
|
113
|
-
|
|
110
|
+
console.log('[OxySignInButton] render - isModalOpen:', isModalOpen);
|
|
111
|
+
const isButtonDisabled = disabled || isLoading || isModalOpen;
|
|
114
112
|
|
|
115
113
|
// Determine the button style based on the variant
|
|
116
114
|
const getButtonStyle = () => {
|
|
@@ -151,7 +149,7 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
|
|
|
151
149
|
style={isButtonDisabled ? { opacity: 0.6 } : undefined}
|
|
152
150
|
/>
|
|
153
151
|
<Text style={[styles.text, getTextStyle(), isButtonDisabled && styles.textDisabled]}>
|
|
154
|
-
{
|
|
152
|
+
{isLoading || isModalOpen ? 'Signing in...' : text}
|
|
155
153
|
</Text>
|
|
156
154
|
</View>
|
|
157
155
|
</TouchableOpacity>
|
|
@@ -7,7 +7,7 @@ import { useOxy } from '../context/OxyContext';
|
|
|
7
7
|
import { useFileDownloadUrl } from '../hooks';
|
|
8
8
|
import { fontFamilies } from '../styles/fonts';
|
|
9
9
|
import { useThemeStyles } from '../hooks/useThemeStyles';
|
|
10
|
-
import { useColorScheme } from '../hooks/
|
|
10
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
11
11
|
|
|
12
12
|
interface ProfileCardProps {
|
|
13
13
|
user: {
|
|
@@ -2,7 +2,7 @@ import type React from 'react';
|
|
|
2
2
|
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
|
|
3
3
|
import { Ionicons } from '@expo/vector-icons';
|
|
4
4
|
import { useThemeStyles } from '../hooks/useThemeStyles';
|
|
5
|
-
import { useColorScheme } from '../hooks/
|
|
5
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
6
6
|
|
|
7
7
|
interface QuickAction {
|
|
8
8
|
id: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import { View, StyleSheet, type StyleProp, type ViewStyle } from 'react-native';
|
|
3
3
|
import SectionTitle from './SectionTitle';
|
|
4
|
-
import { useColorScheme } from '../hooks/
|
|
4
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
5
5
|
import { normalizeColorScheme } from '../utils/themeUtils';
|
|
6
6
|
|
|
7
7
|
interface SectionProps {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import { Text, StyleSheet, type StyleProp, type TextStyle } from 'react-native';
|
|
3
3
|
import { fontFamilies } from '../styles/fonts';
|
|
4
|
-
import { useColorScheme } from '../hooks/
|
|
4
|
+
import { useColorScheme } from '../hooks/useColorScheme';
|
|
5
5
|
import { normalizeColorScheme } from '../utils/themeUtils';
|
|
6
6
|
import { useThemeStyles } from '../hooks/useThemeStyles';
|
|
7
7
|
|