@oxyhq/services 5.11.12 → 5.12.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 +48 -7
- package/lib/commonjs/core/OxyServices.js +168 -5
- package/lib/commonjs/core/OxyServices.js.map +1 -1
- package/lib/commonjs/i18n/index.js +40 -0
- package/lib/commonjs/i18n/index.js.map +1 -0
- package/lib/commonjs/i18n/locales/en-US.json +681 -0
- package/lib/commonjs/i18n/locales/es-ES.json +689 -0
- package/lib/commonjs/ui/components/GroupedItem.js +2 -1
- package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
- package/lib/commonjs/ui/components/Header.js +4 -3
- package/lib/commonjs/ui/components/Header.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +110 -103
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileCard.js +5 -1
- package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
- package/lib/commonjs/ui/components/Section.js +1 -1
- package/lib/commonjs/ui/components/StepBasedScreen.js +16 -16
- package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +15 -3
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/commonjs/ui/components/internal/PinInput.js +10 -4
- package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +128 -12
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/useI18n.js +22 -0
- package/lib/commonjs/ui/hooks/useI18n.js.map +1 -0
- package/lib/commonjs/ui/navigation/OxyRouter.js +11 -131
- package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/commonjs/ui/navigation/routes.js +127 -0
- package/lib/commonjs/ui/navigation/routes.js.map +1 -0
- package/lib/commonjs/ui/navigation/types.js +7 -0
- package/lib/commonjs/ui/navigation/types.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +55 -47
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +69 -61
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +378 -37
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +52 -34
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +40 -36
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +105 -78
- package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +92 -60
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +21 -11
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/RecoverAccountScreen.js +30 -8
- package/lib/commonjs/ui/screens/RecoverAccountScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js +47 -26
- package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +31 -24
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +11 -7
- package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +12 -6
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +11 -7
- package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +15 -11
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +19 -27
- package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +8 -4
- package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +14 -10
- package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +7 -3
- package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js +19 -14
- package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js +130 -0
- package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -0
- package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js +13 -13
- package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js +14 -20
- package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js +22 -8
- package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignInTotpStep.js +161 -0
- package/lib/commonjs/ui/screens/steps/SignInTotpStep.js.map +1 -0
- package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js +12 -6
- package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js +10 -6
- package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js +10 -6
- package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js +34 -4
- package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
- package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js +9 -10
- package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
- package/lib/commonjs/ui/styles/authStyles.js +1 -2
- package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
- package/lib/commonjs/utils/deviceManager.js +1 -1
- package/lib/commonjs/utils/deviceManager.js.map +1 -1
- package/lib/commonjs/utils/validationUtils.js +4 -2
- package/lib/commonjs/utils/validationUtils.js.map +1 -1
- package/lib/module/core/OxyServices.js +168 -5
- package/lib/module/core/OxyServices.js.map +1 -1
- package/lib/module/i18n/index.js +35 -0
- package/lib/module/i18n/index.js.map +1 -0
- package/lib/module/i18n/locales/en-US.json +681 -0
- package/lib/module/i18n/locales/es-ES.json +689 -0
- package/lib/module/ui/components/GroupedItem.js +2 -1
- package/lib/module/ui/components/GroupedItem.js.map +1 -1
- package/lib/module/ui/components/Header.js +4 -3
- package/lib/module/ui/components/Header.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +109 -103
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/ProfileCard.js +5 -1
- package/lib/module/ui/components/ProfileCard.js.map +1 -1
- package/lib/module/ui/components/Section.js +1 -1
- package/lib/module/ui/components/StepBasedScreen.js +16 -16
- package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
- package/lib/module/ui/components/internal/GroupedPillButtons.js +15 -3
- package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/module/ui/components/internal/PinInput.js +9 -4
- package/lib/module/ui/components/internal/PinInput.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +128 -12
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/useI18n.js +18 -0
- package/lib/module/ui/hooks/useI18n.js.map +1 -0
- package/lib/module/ui/navigation/OxyRouter.js +7 -124
- package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/module/ui/navigation/routes.js +122 -0
- package/lib/module/ui/navigation/routes.js.map +1 -0
- package/lib/module/ui/navigation/types.js +19 -1
- package/lib/module/ui/navigation/types.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +55 -47
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +69 -61
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +378 -37
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +52 -34
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +40 -36
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/LanguageSelectorScreen.js +107 -80
- package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +92 -60
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +21 -11
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/RecoverAccountScreen.js +30 -8
- package/lib/module/ui/screens/RecoverAccountScreen.js.map +1 -1
- package/lib/module/ui/screens/SignInScreen.js +47 -26
- package/lib/module/ui/screens/SignInScreen.js.map +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +31 -24
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/screens/internal/SignInPasswordStep.js +11 -7
- package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -1
- package/lib/module/ui/screens/internal/SignInUsernameStep.js +12 -6
- package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaAboutScreen.js +11 -7
- package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js +15 -11
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaFAQScreen.js +19 -27
- package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +8 -4
- package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +14 -10
- package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaRulesScreen.js +7 -3
- package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverRequestStep.js +19 -14
- package/lib/module/ui/screens/steps/RecoverRequestStep.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js +125 -0
- package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -0
- package/lib/module/ui/screens/steps/RecoverSuccessStep.js +13 -13
- package/lib/module/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
- package/lib/module/ui/screens/steps/RecoverVerifyStep.js +14 -20
- package/lib/module/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignInPasswordStep.js +22 -8
- package/lib/module/ui/screens/steps/SignInPasswordStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignInTotpStep.js +156 -0
- package/lib/module/ui/screens/steps/SignInTotpStep.js.map +1 -0
- package/lib/module/ui/screens/steps/SignInUsernameStep.js +12 -6
- package/lib/module/ui/screens/steps/SignInUsernameStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpIdentityStep.js +10 -6
- package/lib/module/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpSecurityStep.js +10 -6
- package/lib/module/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpSummaryStep.js +34 -4
- package/lib/module/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
- package/lib/module/ui/screens/steps/SignUpWelcomeStep.js +9 -10
- package/lib/module/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
- package/lib/module/ui/styles/authStyles.js +1 -2
- package/lib/module/ui/styles/authStyles.js.map +1 -1
- package/lib/module/utils/deviceManager.js +1 -1
- package/lib/module/utils/deviceManager.js.map +1 -1
- package/lib/module/utils/validationUtils.js +4 -2
- package/lib/module/utils/validationUtils.js.map +1 -1
- package/lib/typescript/core/OxyServices.d.ts +58 -3
- package/lib/typescript/core/OxyServices.d.ts.map +1 -1
- package/lib/typescript/i18n/index.d.ts +4 -0
- package/lib/typescript/i18n/index.d.ts.map +1 -0
- package/lib/typescript/models/interfaces.d.ts +4 -0
- package/lib/typescript/models/interfaces.d.ts.map +1 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
- package/lib/typescript/ui/components/Header.d.ts.map +1 -1
- package/lib/typescript/ui/components/OxyProvider.d.ts +1 -1
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/ProfileCard.d.ts.map +1 -1
- package/lib/typescript/ui/components/StepBasedScreen.d.ts +2 -1
- package/lib/typescript/ui/components/StepBasedScreen.d.ts.map +1 -1
- package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
- package/lib/typescript/ui/components/internal/PinInput.d.ts +6 -3
- package/lib/typescript/ui/components/internal/PinInput.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +7 -4
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useI18n.d.ts +5 -0
- package/lib/typescript/ui/hooks/useI18n.d.ts.map +1 -0
- package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/routes.d.ts +9 -0
- package/lib/typescript/ui/navigation/routes.d.ts.map +1 -0
- package/lib/typescript/ui/navigation/types.d.ts +24 -10
- package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts +2 -1
- package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaFAQScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaLeaderboardScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaRulesScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts +4 -1
- package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts +24 -0
- package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts +2 -1
- package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts +3 -1
- package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts +1 -0
- package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts +19 -0
- package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts.map +1 -0
- package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts +2 -1
- package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts +2 -1
- package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts +2 -1
- package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts +2 -1
- package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts +2 -1
- package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts.map +1 -1
- package/lib/typescript/ui/styles/authStyles.d.ts +0 -1
- package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -1
- package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
- package/package.json +48 -14
- package/src/core/OxyServices.ts +143 -9
- package/src/i18n/index.ts +39 -0
- package/src/i18n/locales/en-US.json +681 -0
- package/src/i18n/locales/es-ES.json +689 -0
- package/src/models/interfaces.ts +6 -1
- package/src/ui/components/GroupedItem.tsx +2 -1
- package/src/ui/components/Header.tsx +4 -3
- package/src/ui/components/OxyProvider.tsx +105 -112
- package/src/ui/components/ProfileCard.tsx +5 -1
- package/src/ui/components/Section.tsx +1 -1
- package/src/ui/components/StepBasedScreen.tsx +16 -13
- package/src/ui/components/internal/GroupedPillButtons.tsx +10 -6
- package/src/ui/components/internal/PinInput.tsx +15 -6
- package/src/ui/context/OxyContext.tsx +123 -20
- package/src/ui/hooks/useI18n.ts +12 -0
- package/src/ui/navigation/OxyRouter.tsx +15 -134
- package/src/ui/navigation/routes.ts +153 -0
- package/src/ui/navigation/types.ts +28 -10
- package/src/ui/screens/AccountCenterScreen.tsx +47 -45
- package/src/ui/screens/AccountOverviewScreen.tsx +68 -70
- package/src/ui/screens/AccountSettingsScreen.tsx +265 -41
- package/src/ui/screens/AccountSwitcherScreen.tsx +35 -33
- package/src/ui/screens/FeedbackScreen.tsx +39 -37
- package/src/ui/screens/LanguageSelectorScreen.tsx +99 -70
- package/src/ui/screens/PaymentGatewayScreen.tsx +5 -5
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +56 -54
- package/src/ui/screens/ProfileScreen.tsx +14 -8
- package/src/ui/screens/RecoverAccountScreen.tsx +29 -8
- package/src/ui/screens/SignInScreen.tsx +39 -30
- package/src/ui/screens/WelcomeNewUserScreen.tsx +31 -17
- package/src/ui/screens/internal/SignInPasswordStep.tsx +11 -8
- package/src/ui/screens/internal/SignInUsernameStep.tsx +10 -8
- package/src/ui/screens/karma/KarmaAboutScreen.tsx +23 -11
- package/src/ui/screens/karma/KarmaCenterScreen.tsx +21 -11
- package/src/ui/screens/karma/KarmaFAQScreen.tsx +15 -33
- package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +6 -4
- package/src/ui/screens/karma/KarmaRewardsScreen.tsx +28 -10
- package/src/ui/screens/karma/KarmaRulesScreen.tsx +5 -3
- package/src/ui/screens/steps/RecoverRequestStep.tsx +20 -17
- package/src/ui/screens/steps/RecoverResetPasswordStep.tsx +133 -0
- package/src/ui/screens/steps/RecoverSuccessStep.tsx +12 -19
- package/src/ui/screens/steps/RecoverVerifyStep.tsx +15 -24
- package/src/ui/screens/steps/SignInPasswordStep.tsx +19 -6
- package/src/ui/screens/steps/SignInTotpStep.tsx +129 -0
- package/src/ui/screens/steps/SignInUsernameStep.tsx +11 -10
- package/src/ui/screens/steps/SignUpIdentityStep.tsx +10 -11
- package/src/ui/screens/steps/SignUpSecurityStep.tsx +10 -11
- package/src/ui/screens/steps/SignUpSummaryStep.tsx +24 -9
- package/src/ui/screens/steps/SignUpWelcomeStep.tsx +8 -14
- package/src/ui/styles/authStyles.ts +0 -1
- package/src/utils/deviceManager.ts +1 -1
- package/src/utils/validationUtils.ts +5 -3
|
@@ -9,6 +9,8 @@ import { DeviceManager } from '../../utils/deviceManager';
|
|
|
9
9
|
import { useSessionSocket } from '../hooks/useSessionSocket';
|
|
10
10
|
import { toast } from '../../lib/sonner';
|
|
11
11
|
import { useAuthStore } from '../stores/authStore';
|
|
12
|
+
import type { BottomSheetController } from '../navigation/types';
|
|
13
|
+
import type { RouteName } from '../navigation/routes';
|
|
12
14
|
|
|
13
15
|
// Define the context shape
|
|
14
16
|
// NOTE: We intentionally avoid importing useFollow here to prevent a require cycle.
|
|
@@ -32,6 +34,7 @@ export interface OxyContextState {
|
|
|
32
34
|
logout: (targetSessionId?: string) => Promise<void>;
|
|
33
35
|
logoutAll: () => Promise<void>;
|
|
34
36
|
signUp: (username: string, email: string, password: string) => Promise<User>;
|
|
37
|
+
completeMfaLogin?: (mfaToken: string, code: string) => Promise<User>;
|
|
35
38
|
|
|
36
39
|
// Multi-session methods
|
|
37
40
|
switchSession: (sessionId: string) => Promise<void>;
|
|
@@ -48,10 +51,10 @@ export interface OxyContextState {
|
|
|
48
51
|
|
|
49
52
|
// Access to services
|
|
50
53
|
oxyServices: OxyServices;
|
|
51
|
-
bottomSheetRef?: React.RefObject<
|
|
54
|
+
bottomSheetRef?: React.RefObject<BottomSheetController | null>;
|
|
52
55
|
|
|
53
56
|
// Methods to directly control the bottom sheet
|
|
54
|
-
showBottomSheet?: (screenOrConfig?: string | { screen: string; props?: Record<string, any> }) => void;
|
|
57
|
+
showBottomSheet?: (screenOrConfig?: RouteName | string | { screen: RouteName | string; props?: Record<string, any> }) => void;
|
|
55
58
|
hideBottomSheet?: () => void;
|
|
56
59
|
|
|
57
60
|
/**
|
|
@@ -72,7 +75,7 @@ export interface OxyContextProviderProps {
|
|
|
72
75
|
storageKeyPrefix?: string;
|
|
73
76
|
onAuthStateChange?: (user: User | null) => void;
|
|
74
77
|
onError?: (error: ApiError) => void; // New: Error callback
|
|
75
|
-
bottomSheetRef?: React.RefObject<
|
|
78
|
+
bottomSheetRef?: React.RefObject<BottomSheetController | null>;
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
// Platform storage implementation
|
|
@@ -172,7 +175,18 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
172
175
|
const [sessions, setSessions] = useState<ClientSession[]>([]);
|
|
173
176
|
const [activeSessionId, setActiveSessionId] = useState<string | null>(null);
|
|
174
177
|
const [storage, setStorage] = useState<StorageInterface | null>(null);
|
|
175
|
-
const [currentLanguage, setCurrentLanguage] = useState<string>('en');
|
|
178
|
+
const [currentLanguage, setCurrentLanguage] = useState<string>('en-US');
|
|
179
|
+
|
|
180
|
+
// Normalize language codes to BCP-47 (e.g., en-US)
|
|
181
|
+
const normalizeLanguageCode = useCallback((lang?: string | null): string | null => {
|
|
182
|
+
if (!lang) return null;
|
|
183
|
+
if (lang.includes('-')) return lang;
|
|
184
|
+
const map: Record<string, string> = {
|
|
185
|
+
en: 'en-US', es: 'es-ES', ca: 'ca-ES', fr: 'fr-FR', de: 'de-DE', it: 'it-IT', pt: 'pt-PT',
|
|
186
|
+
ja: 'ja-JP', ko: 'ko-KR', zh: 'zh-CN', ar: 'ar-SA'
|
|
187
|
+
};
|
|
188
|
+
return map[lang] || lang;
|
|
189
|
+
}, []);
|
|
176
190
|
// Add a new state to track token restoration
|
|
177
191
|
const [tokenReady, setTokenReady] = useState(false);
|
|
178
192
|
|
|
@@ -212,7 +226,8 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
212
226
|
setTokenReady(false);
|
|
213
227
|
|
|
214
228
|
// Load saved language preference
|
|
215
|
-
const
|
|
229
|
+
const savedLanguageRaw = await storage.getItem(keys.language);
|
|
230
|
+
const savedLanguage = normalizeLanguageCode(savedLanguageRaw) || savedLanguageRaw;
|
|
216
231
|
if (savedLanguage) {
|
|
217
232
|
setCurrentLanguage(savedLanguage);
|
|
218
233
|
}
|
|
@@ -228,6 +243,16 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
228
243
|
const fullUser = await oxyServices.getUserBySession(storedActiveSessionId);
|
|
229
244
|
loginSuccess(fullUser);
|
|
230
245
|
setMinimalUser({ id: fullUser.id, username: fullUser.username, avatar: fullUser.avatar });
|
|
246
|
+
// Apply server language if present
|
|
247
|
+
if ((fullUser as any)?.language) {
|
|
248
|
+
try {
|
|
249
|
+
const serverLang = normalizeLanguageCode((fullUser as any).language) || (fullUser as any).language;
|
|
250
|
+
await storage.setItem(keys.language, serverLang);
|
|
251
|
+
setCurrentLanguage(serverLang);
|
|
252
|
+
} catch (e) {
|
|
253
|
+
console.warn('Failed to apply server language preference', e);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
231
256
|
const serverSessions = await oxyServices.getSessionsBySessionId(storedActiveSessionId);
|
|
232
257
|
const clientSessions: ClientSession[] = serverSessions.map(s => ({
|
|
233
258
|
sessionId: s.sessionId,
|
|
@@ -307,6 +332,16 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
307
332
|
});
|
|
308
333
|
|
|
309
334
|
await saveActiveSessionId(sessionId);
|
|
335
|
+
// Apply server language if present
|
|
336
|
+
if ((fullUser as any)?.language) {
|
|
337
|
+
try {
|
|
338
|
+
const serverLang = normalizeLanguageCode((fullUser as any).language) || (fullUser as any).language;
|
|
339
|
+
await storage?.setItem(keys.language, serverLang);
|
|
340
|
+
setCurrentLanguage(serverLang);
|
|
341
|
+
} catch (e) {
|
|
342
|
+
console.warn('Failed to apply server language after switch', e);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
310
345
|
|
|
311
346
|
if (onAuthStateChange) {
|
|
312
347
|
onAuthStateChange(fullUser);
|
|
@@ -334,27 +369,36 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
334
369
|
console.log('Auth - Using device fingerprint:', deviceFingerprint);
|
|
335
370
|
console.log('Auth - Using device ID:', deviceInfo.deviceId);
|
|
336
371
|
|
|
337
|
-
const response:
|
|
372
|
+
const response: any = await oxyServices.signIn(
|
|
338
373
|
username,
|
|
339
374
|
password,
|
|
340
375
|
deviceName || deviceInfo.deviceName || DeviceManager.getDefaultDeviceName(),
|
|
341
376
|
deviceFingerprint
|
|
342
377
|
);
|
|
343
378
|
|
|
379
|
+
// Handle MFA requirement
|
|
380
|
+
if (response && response.mfaRequired) {
|
|
381
|
+
const err: any = new Error('Multi-factor authentication required');
|
|
382
|
+
err.code = 'MFA_REQUIRED';
|
|
383
|
+
err.mfaToken = response.mfaToken;
|
|
384
|
+
err.expiresAt = response.expiresAt;
|
|
385
|
+
throw err;
|
|
386
|
+
}
|
|
387
|
+
|
|
344
388
|
// Set as active session (only store session ID)
|
|
345
|
-
setActiveSessionId(response.sessionId);
|
|
346
|
-
await saveActiveSessionId(response.sessionId);
|
|
389
|
+
setActiveSessionId((response as SessionLoginResponse).sessionId);
|
|
390
|
+
await saveActiveSessionId((response as SessionLoginResponse).sessionId);
|
|
347
391
|
|
|
348
392
|
// Get access token for API calls
|
|
349
393
|
await oxyServices.getTokenBySession(response.sessionId);
|
|
350
394
|
|
|
351
395
|
// Load full user data from backend
|
|
352
|
-
const fullUser = await oxyServices.getUserBySession(response.sessionId);
|
|
396
|
+
const fullUser = await oxyServices.getUserBySession((response as SessionLoginResponse).sessionId);
|
|
353
397
|
loginSuccess(fullUser);
|
|
354
398
|
setMinimalUser(response.user);
|
|
355
399
|
|
|
356
400
|
// Load sessions from backend
|
|
357
|
-
const serverSessions = await oxyServices.getSessionsBySessionId(response.sessionId);
|
|
401
|
+
const serverSessions = await oxyServices.getSessionsBySessionId((response as SessionLoginResponse).sessionId);
|
|
358
402
|
const clientSessions: ClientSession[] = serverSessions.map(serverSession => ({
|
|
359
403
|
sessionId: serverSession.sessionId,
|
|
360
404
|
deviceId: serverSession.deviceId,
|
|
@@ -497,6 +541,63 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
497
541
|
}
|
|
498
542
|
}, [storage, oxyServices, login, loginFailure]);
|
|
499
543
|
|
|
544
|
+
// Complete MFA login by verifying TOTP
|
|
545
|
+
const completeMfaLogin = useCallback(async (mfaToken: string, code: string): Promise<User> => {
|
|
546
|
+
if (!storage) throw new Error('Storage not initialized');
|
|
547
|
+
useAuthStore.setState({ isLoading: true, error: null });
|
|
548
|
+
try {
|
|
549
|
+
const response = await oxyServices.verifyTotpLogin(mfaToken, code);
|
|
550
|
+
|
|
551
|
+
// Set as active session
|
|
552
|
+
setActiveSessionId(response.sessionId);
|
|
553
|
+
await saveActiveSessionId(response.sessionId);
|
|
554
|
+
|
|
555
|
+
// Fetch access token and user data
|
|
556
|
+
await oxyServices.getTokenBySession(response.sessionId);
|
|
557
|
+
const fullUser = await oxyServices.getUserBySession(response.sessionId);
|
|
558
|
+
loginSuccess(fullUser);
|
|
559
|
+
setMinimalUser({ id: fullUser.id, username: fullUser.username, avatar: fullUser.avatar });
|
|
560
|
+
// Apply server language if present
|
|
561
|
+
if ((fullUser as any)?.language) {
|
|
562
|
+
try {
|
|
563
|
+
const serverLang = normalizeLanguageCode((fullUser as any).language) || (fullUser as any).language;
|
|
564
|
+
await storage.setItem(keys.language, serverLang);
|
|
565
|
+
setCurrentLanguage(serverLang);
|
|
566
|
+
} catch (e) {
|
|
567
|
+
console.warn('Failed to apply server language on MFA login', e);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// Load sessions list
|
|
572
|
+
const serverSessions = await oxyServices.getSessionsBySessionId(response.sessionId);
|
|
573
|
+
const clientSessions: ClientSession[] = serverSessions.map(s => ({
|
|
574
|
+
sessionId: s.sessionId,
|
|
575
|
+
deviceId: s.deviceId,
|
|
576
|
+
expiresAt: s.expiresAt || new Date().toISOString(),
|
|
577
|
+
lastActive: s.lastActive || new Date().toISOString(),
|
|
578
|
+
userId: s.userId || fullUser.id
|
|
579
|
+
}));
|
|
580
|
+
setSessions(clientSessions);
|
|
581
|
+
// Apply server language if present
|
|
582
|
+
if ((fullUser as any)?.language) {
|
|
583
|
+
try {
|
|
584
|
+
await storage.setItem(keys.language, (fullUser as any).language);
|
|
585
|
+
setCurrentLanguage((fullUser as any).language);
|
|
586
|
+
} catch (e) {
|
|
587
|
+
console.warn('Failed to apply server language on MFA login', e);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
if (onAuthStateChange) onAuthStateChange(fullUser);
|
|
592
|
+
return fullUser;
|
|
593
|
+
} catch (error: any) {
|
|
594
|
+
loginFailure(error.message || 'MFA verification failed');
|
|
595
|
+
throw error;
|
|
596
|
+
} finally {
|
|
597
|
+
useAuthStore.setState({ isLoading: false });
|
|
598
|
+
}
|
|
599
|
+
}, [storage, oxyServices, loginSuccess, loginFailure, saveActiveSessionId, onAuthStateChange]);
|
|
600
|
+
|
|
500
601
|
// Switch session method
|
|
501
602
|
const switchSession = useCallback(async (sessionId: string): Promise<void> => {
|
|
502
603
|
await switchToSession(sessionId);
|
|
@@ -640,22 +741,22 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
640
741
|
}, [storage, keys.language]);
|
|
641
742
|
|
|
642
743
|
// Bottom sheet control methods
|
|
643
|
-
const showBottomSheet = useCallback((screenOrConfig?: string | { screen: string; props?: Record<string, any> }) => {
|
|
644
|
-
console.log('showBottomSheet called with:', screenOrConfig);
|
|
744
|
+
const showBottomSheet = useCallback((screenOrConfig?: RouteName | string | { screen: RouteName | string; props?: Record<string, any> }) => {
|
|
745
|
+
if (__DEV__) console.log('showBottomSheet called with:', screenOrConfig);
|
|
645
746
|
|
|
646
747
|
if (bottomSheetRef?.current) {
|
|
647
|
-
console.log('bottomSheetRef is available');
|
|
748
|
+
if (__DEV__) console.log('bottomSheetRef is available');
|
|
648
749
|
|
|
649
750
|
// First, show the bottom sheet
|
|
650
751
|
if (bottomSheetRef.current.expand) {
|
|
651
|
-
console.log('Expanding bottom sheet');
|
|
752
|
+
if (__DEV__) console.log('Expanding bottom sheet');
|
|
652
753
|
bottomSheetRef.current.expand();
|
|
653
754
|
} else if (bottomSheetRef.current.present) {
|
|
654
|
-
console.log('Presenting bottom sheet');
|
|
755
|
+
if (__DEV__) console.log('Presenting bottom sheet');
|
|
655
756
|
bottomSheetRef.current.present();
|
|
656
757
|
} else {
|
|
657
758
|
console.warn('No expand or present method available on bottomSheetRef');
|
|
658
|
-
console.log('Available methods on bottomSheetRef.current:', Object.keys(bottomSheetRef.current));
|
|
759
|
+
if (__DEV__) console.log('Available methods on bottomSheetRef.current:', Object.keys(bottomSheetRef.current as any));
|
|
659
760
|
}
|
|
660
761
|
|
|
661
762
|
// Then navigate to the specified screen if provided
|
|
@@ -664,12 +765,12 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
664
765
|
setTimeout(() => {
|
|
665
766
|
if (typeof screenOrConfig === 'string') {
|
|
666
767
|
// Simple screen name
|
|
667
|
-
console.log('Navigating to screen:', screenOrConfig);
|
|
668
|
-
bottomSheetRef.current?.
|
|
768
|
+
if (__DEV__) console.log('Navigating to screen:', screenOrConfig);
|
|
769
|
+
bottomSheetRef.current?.navigate?.(screenOrConfig);
|
|
669
770
|
} else {
|
|
670
771
|
// Screen with props
|
|
671
|
-
console.log('Navigating to screen with props:', screenOrConfig.screen, screenOrConfig.props);
|
|
672
|
-
bottomSheetRef.current?.
|
|
772
|
+
if (__DEV__) console.log('Navigating to screen with props:', screenOrConfig.screen, screenOrConfig.props);
|
|
773
|
+
bottomSheetRef.current?.navigate?.(screenOrConfig.screen, screenOrConfig.props);
|
|
673
774
|
}
|
|
674
775
|
}, 100);
|
|
675
776
|
}
|
|
@@ -731,6 +832,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
731
832
|
logout,
|
|
732
833
|
logoutAll,
|
|
733
834
|
signUp,
|
|
835
|
+
completeMfaLogin,
|
|
734
836
|
switchSession,
|
|
735
837
|
removeSession,
|
|
736
838
|
refreshSessions,
|
|
@@ -756,6 +858,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
|
|
|
756
858
|
logout,
|
|
757
859
|
logoutAll,
|
|
758
860
|
signUp,
|
|
861
|
+
completeMfaLogin,
|
|
759
862
|
switchSession,
|
|
760
863
|
removeSession,
|
|
761
864
|
refreshSessions,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useOxy } from '../context/OxyContext';
|
|
3
|
+
import { translate } from '../../i18n';
|
|
4
|
+
|
|
5
|
+
export function useI18n() {
|
|
6
|
+
const { currentLanguage } = useOxy();
|
|
7
|
+
const t = useMemo(() => {
|
|
8
|
+
return (key: string, vars?: Record<string, string | number>) => translate(currentLanguage, key, vars);
|
|
9
|
+
}, [currentLanguage]);
|
|
10
|
+
return { t, locale: currentLanguage };
|
|
11
|
+
}
|
|
12
|
+
|
|
@@ -3,129 +3,10 @@ import { useState, useEffect, useCallback } from 'react';
|
|
|
3
3
|
import { View, StyleSheet } from 'react-native';
|
|
4
4
|
import { OxyServices } from '../../core';
|
|
5
5
|
|
|
6
|
-
// Import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import AccountSwitcherScreen from '../screens/AccountSwitcherScreen';
|
|
11
|
-
import SessionManagementScreen from '../screens/SessionManagementScreen';
|
|
12
|
-
import AccountOverviewScreen from '../screens/AccountOverviewScreen';
|
|
13
|
-
import AccountSettingsScreen from '../screens/AccountSettingsScreen';
|
|
14
|
-
import PremiumSubscriptionScreen from '../screens/PremiumSubscriptionScreen';
|
|
15
|
-
import AppInfoScreen from '../screens/AppInfoScreen';
|
|
16
|
-
import FeedbackScreen from '../screens/FeedbackScreen';
|
|
17
|
-
import KarmaCenterScreen from '../screens/karma/KarmaCenterScreen';
|
|
18
|
-
import KarmaLeaderboardScreen from '../screens/karma/KarmaLeaderboardScreen';
|
|
19
|
-
import KarmaRulesScreen from '../screens/karma/KarmaRulesScreen';
|
|
20
|
-
import KarmaAboutScreen from '../screens/karma/KarmaAboutScreen';
|
|
21
|
-
import KarmaRewardsScreen from '../screens/karma/KarmaRewardsScreen';
|
|
22
|
-
import KarmaFAQScreen from '../screens/karma/KarmaFAQScreen';
|
|
23
|
-
import ProfileScreen from '../screens/ProfileScreen';
|
|
24
|
-
import UserLinksScreen from '../screens/UserLinksScreen';
|
|
25
|
-
import FileManagementScreen from '../screens/FileManagementScreen';
|
|
26
|
-
import RecoverAccountScreen from '../screens/RecoverAccountScreen';
|
|
27
|
-
import PaymentGatewayScreen from '../screens/PaymentGatewayScreen';
|
|
28
|
-
import WelcomeNewUserScreen from '../screens/WelcomeNewUserScreen';
|
|
29
|
-
import LanguageSelectorScreen from '../screens/LanguageSelectorScreen';
|
|
30
|
-
|
|
31
|
-
// Import types
|
|
32
|
-
import type { OxyRouterProps, RouteConfig } from './types';
|
|
33
|
-
|
|
34
|
-
// Define route configuration with screen components and default snap points
|
|
35
|
-
const routes: Record<string, RouteConfig> = {
|
|
36
|
-
SignIn: {
|
|
37
|
-
component: SignInScreen,
|
|
38
|
-
snapPoints: ['10%', '80%'],
|
|
39
|
-
},
|
|
40
|
-
SignUp: {
|
|
41
|
-
component: SignUpScreen,
|
|
42
|
-
snapPoints: ['10%', '90%'],
|
|
43
|
-
},
|
|
44
|
-
RecoverAccount: {
|
|
45
|
-
component: RecoverAccountScreen,
|
|
46
|
-
snapPoints: ['10%', '80%'],
|
|
47
|
-
},
|
|
48
|
-
AccountCenter: {
|
|
49
|
-
component: AccountCenterScreen,
|
|
50
|
-
snapPoints: ['60%', '100%'],
|
|
51
|
-
},
|
|
52
|
-
AccountSwitcher: {
|
|
53
|
-
component: AccountSwitcherScreen,
|
|
54
|
-
snapPoints: ['70%', '100%'],
|
|
55
|
-
},
|
|
56
|
-
SessionManagement: {
|
|
57
|
-
component: SessionManagementScreen,
|
|
58
|
-
snapPoints: ['70%', '100%'],
|
|
59
|
-
},
|
|
60
|
-
AccountOverview: {
|
|
61
|
-
component: AccountOverviewScreen,
|
|
62
|
-
snapPoints: ['60%', '85%'],
|
|
63
|
-
},
|
|
64
|
-
EditProfile: {
|
|
65
|
-
component: AccountSettingsScreen,
|
|
66
|
-
snapPoints: ['60%', '100%'],
|
|
67
|
-
},
|
|
68
|
-
PremiumSubscription: {
|
|
69
|
-
component: PremiumSubscriptionScreen,
|
|
70
|
-
snapPoints: ['70%', '100%'],
|
|
71
|
-
},
|
|
72
|
-
AppInfo: {
|
|
73
|
-
component: AppInfoScreen,
|
|
74
|
-
snapPoints: ['60%', '90%'],
|
|
75
|
-
},
|
|
76
|
-
Feedback: {
|
|
77
|
-
component: FeedbackScreen,
|
|
78
|
-
snapPoints: ['70%', '100%'],
|
|
79
|
-
},
|
|
80
|
-
KarmaCenter: {
|
|
81
|
-
component: KarmaCenterScreen,
|
|
82
|
-
snapPoints: ['60%', '100%'],
|
|
83
|
-
},
|
|
84
|
-
KarmaLeaderboard: {
|
|
85
|
-
component: KarmaLeaderboardScreen,
|
|
86
|
-
snapPoints: ['60%', '100%'],
|
|
87
|
-
},
|
|
88
|
-
KarmaRules: {
|
|
89
|
-
component: KarmaRulesScreen,
|
|
90
|
-
snapPoints: ['60%', '90%'],
|
|
91
|
-
},
|
|
92
|
-
AboutKarma: {
|
|
93
|
-
component: KarmaAboutScreen,
|
|
94
|
-
snapPoints: ['60%', '90%'],
|
|
95
|
-
},
|
|
96
|
-
KarmaRewards: {
|
|
97
|
-
component: KarmaRewardsScreen,
|
|
98
|
-
snapPoints: ['60%', '90%'],
|
|
99
|
-
},
|
|
100
|
-
KarmaFAQ: {
|
|
101
|
-
component: KarmaFAQScreen,
|
|
102
|
-
snapPoints: ['60%', '90%'],
|
|
103
|
-
},
|
|
104
|
-
Profile: {
|
|
105
|
-
component: ProfileScreen,
|
|
106
|
-
snapPoints: ['60%', '90%'],
|
|
107
|
-
},
|
|
108
|
-
UserLinks: {
|
|
109
|
-
component: UserLinksScreen,
|
|
110
|
-
snapPoints: ['60%', '90%'],
|
|
111
|
-
},
|
|
112
|
-
FileManagement: {
|
|
113
|
-
component: FileManagementScreen,
|
|
114
|
-
snapPoints: ['70%', '100%'],
|
|
115
|
-
},
|
|
116
|
-
PaymentGateway: {
|
|
117
|
-
component: PaymentGatewayScreen,
|
|
118
|
-
snapPoints: ['60%', '90%'],
|
|
119
|
-
},
|
|
120
|
-
WelcomeNewUser: {
|
|
121
|
-
component: WelcomeNewUserScreen,
|
|
122
|
-
snapPoints: ['65%', '90%'],
|
|
123
|
-
},
|
|
124
|
-
LanguageSelector: {
|
|
125
|
-
component: LanguageSelectorScreen,
|
|
126
|
-
snapPoints: ['70%', '100%'],
|
|
127
|
-
},
|
|
128
|
-
};
|
|
6
|
+
// Import types and route registry
|
|
7
|
+
import type { OxyRouterProps } from './types';
|
|
8
|
+
import { routes } from './routes';
|
|
9
|
+
import type { RouteName } from './routes';
|
|
129
10
|
|
|
130
11
|
const OxyRouter: React.FC<OxyRouterProps> = ({
|
|
131
12
|
oxyServices,
|
|
@@ -137,23 +18,23 @@ const OxyRouter: React.FC<OxyRouterProps> = ({
|
|
|
137
18
|
navigationRef,
|
|
138
19
|
containerWidth,
|
|
139
20
|
}) => {
|
|
140
|
-
const [currentScreen, setCurrentScreen] = useState<
|
|
141
|
-
const [screenHistory, setScreenHistory] = useState<
|
|
21
|
+
const [currentScreen, setCurrentScreen] = useState<RouteName>(initialScreen);
|
|
22
|
+
const [screenHistory, setScreenHistory] = useState<RouteName[]>([initialScreen]);
|
|
142
23
|
// Store props per screen for correct restoration on back
|
|
143
|
-
const [screenPropsMap, setScreenPropsMap] = useState<Record<
|
|
24
|
+
const [screenPropsMap, setScreenPropsMap] = useState<Partial<Record<RouteName, any>>>({ [initialScreen]: {} });
|
|
144
25
|
|
|
145
26
|
// Update snap points when the screen changes
|
|
146
27
|
useEffect(() => {
|
|
147
|
-
if (routes[currentScreen] && typeof adjustSnapPoints === 'function') {
|
|
148
|
-
adjustSnapPoints(routes[currentScreen].snapPoints);
|
|
28
|
+
if ((routes as any)[currentScreen] && typeof adjustSnapPoints === 'function') {
|
|
29
|
+
adjustSnapPoints((routes as any)[currentScreen].snapPoints);
|
|
149
30
|
}
|
|
150
31
|
}, [currentScreen, adjustSnapPoints]);
|
|
151
32
|
|
|
152
33
|
// Memoized navigation methods
|
|
153
|
-
const navigate = useCallback((screen:
|
|
154
|
-
console.log('OxyRouter: navigate called
|
|
34
|
+
const navigate = useCallback((screen: RouteName, props: Record<string, any> = {}) => {
|
|
35
|
+
if (__DEV__) console.log('OxyRouter: navigate called', screen, props);
|
|
155
36
|
if (routes[screen]) {
|
|
156
|
-
console.log('OxyRouter: screen found in routes
|
|
37
|
+
if (__DEV__) console.log('OxyRouter: screen found in routes');
|
|
157
38
|
setCurrentScreen(screen);
|
|
158
39
|
setScreenHistory(prev => [...prev, screen]);
|
|
159
40
|
setScreenPropsMap(prev => ({ ...prev, [screen]: props }));
|
|
@@ -184,12 +65,12 @@ const OxyRouter: React.FC<OxyRouterProps> = ({
|
|
|
184
65
|
useEffect(() => {
|
|
185
66
|
if (navigationRef) {
|
|
186
67
|
navigationRef.current = navigate;
|
|
187
|
-
console.log('OxyRouter: navigationRef
|
|
68
|
+
if (__DEV__) console.log('OxyRouter: navigationRef set');
|
|
188
69
|
}
|
|
189
70
|
return () => {
|
|
190
71
|
if (navigationRef) {
|
|
191
72
|
navigationRef.current = null;
|
|
192
|
-
console.log('OxyRouter: navigationRef
|
|
73
|
+
if (__DEV__) console.log('OxyRouter: navigationRef cleared');
|
|
193
74
|
}
|
|
194
75
|
};
|
|
195
76
|
}, [navigate, navigationRef]);
|
|
@@ -231,7 +112,7 @@ const OxyRouter: React.FC<OxyRouterProps> = ({
|
|
|
231
112
|
|
|
232
113
|
// Render the current screen component
|
|
233
114
|
const renderScreen = () => {
|
|
234
|
-
const CurrentScreen = routes[currentScreen]?.component;
|
|
115
|
+
const CurrentScreen = (routes as any)[currentScreen]?.component;
|
|
235
116
|
if (!CurrentScreen) {
|
|
236
117
|
if (process.env.NODE_ENV !== 'production') {
|
|
237
118
|
console.error(`Screen "${currentScreen}" not found`);
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import SignInScreen from '../screens/SignInScreen';
|
|
3
|
+
import SignUpScreen from '../screens/SignUpScreen';
|
|
4
|
+
import AccountCenterScreen from '../screens/AccountCenterScreen';
|
|
5
|
+
import AccountSwitcherScreen from '../screens/AccountSwitcherScreen';
|
|
6
|
+
import SessionManagementScreen from '../screens/SessionManagementScreen';
|
|
7
|
+
import AccountOverviewScreen from '../screens/AccountOverviewScreen';
|
|
8
|
+
import AccountSettingsScreen from '../screens/AccountSettingsScreen';
|
|
9
|
+
import PremiumSubscriptionScreen from '../screens/PremiumSubscriptionScreen';
|
|
10
|
+
import AppInfoScreen from '../screens/AppInfoScreen';
|
|
11
|
+
import FeedbackScreen from '../screens/FeedbackScreen';
|
|
12
|
+
import KarmaCenterScreen from '../screens/karma/KarmaCenterScreen';
|
|
13
|
+
import KarmaLeaderboardScreen from '../screens/karma/KarmaLeaderboardScreen';
|
|
14
|
+
import KarmaRulesScreen from '../screens/karma/KarmaRulesScreen';
|
|
15
|
+
import KarmaAboutScreen from '../screens/karma/KarmaAboutScreen';
|
|
16
|
+
import KarmaRewardsScreen from '../screens/karma/KarmaRewardsScreen';
|
|
17
|
+
import KarmaFAQScreen from '../screens/karma/KarmaFAQScreen';
|
|
18
|
+
import ProfileScreen from '../screens/ProfileScreen';
|
|
19
|
+
import UserLinksScreen from '../screens/UserLinksScreen';
|
|
20
|
+
import FileManagementScreen from '../screens/FileManagementScreen';
|
|
21
|
+
import RecoverAccountScreen from '../screens/RecoverAccountScreen';
|
|
22
|
+
import PaymentGatewayScreen from '../screens/PaymentGatewayScreen';
|
|
23
|
+
import WelcomeNewUserScreen from '../screens/WelcomeNewUserScreen';
|
|
24
|
+
import LanguageSelectorScreen from '../screens/LanguageSelectorScreen';
|
|
25
|
+
|
|
26
|
+
export interface RouteConfig {
|
|
27
|
+
component: ComponentType<any>;
|
|
28
|
+
snapPoints: string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Keep a literal list of route names for a precise union type
|
|
32
|
+
export const routeNames = [
|
|
33
|
+
'SignIn',
|
|
34
|
+
'SignUp',
|
|
35
|
+
'RecoverAccount',
|
|
36
|
+
'AccountCenter',
|
|
37
|
+
'AccountSwitcher',
|
|
38
|
+
'SessionManagement',
|
|
39
|
+
'AccountOverview',
|
|
40
|
+
'EditProfile',
|
|
41
|
+
'PremiumSubscription',
|
|
42
|
+
'AppInfo',
|
|
43
|
+
'Feedback',
|
|
44
|
+
'KarmaCenter',
|
|
45
|
+
'KarmaLeaderboard',
|
|
46
|
+
'KarmaRules',
|
|
47
|
+
'AboutKarma',
|
|
48
|
+
'KarmaRewards',
|
|
49
|
+
'KarmaFAQ',
|
|
50
|
+
'Profile',
|
|
51
|
+
'UserLinks',
|
|
52
|
+
'FileManagement',
|
|
53
|
+
'PaymentGateway',
|
|
54
|
+
'WelcomeNewUser',
|
|
55
|
+
'LanguageSelector',
|
|
56
|
+
] as const;
|
|
57
|
+
|
|
58
|
+
export type RouteName = typeof routeNames[number];
|
|
59
|
+
|
|
60
|
+
export const routes: Record<RouteName, RouteConfig> = {
|
|
61
|
+
SignIn: {
|
|
62
|
+
component: SignInScreen as unknown as ComponentType<any>,
|
|
63
|
+
snapPoints: ['10%', '80%'],
|
|
64
|
+
},
|
|
65
|
+
SignUp: {
|
|
66
|
+
component: SignUpScreen as unknown as ComponentType<any>,
|
|
67
|
+
snapPoints: ['10%', '90%'],
|
|
68
|
+
},
|
|
69
|
+
RecoverAccount: {
|
|
70
|
+
component: RecoverAccountScreen as unknown as ComponentType<any>,
|
|
71
|
+
snapPoints: ['10%', '80%'],
|
|
72
|
+
},
|
|
73
|
+
AccountCenter: {
|
|
74
|
+
component: AccountCenterScreen as unknown as ComponentType<any>,
|
|
75
|
+
snapPoints: ['60%', '100%'],
|
|
76
|
+
},
|
|
77
|
+
AccountSwitcher: {
|
|
78
|
+
component: AccountSwitcherScreen as unknown as ComponentType<any>,
|
|
79
|
+
snapPoints: ['70%', '100%'],
|
|
80
|
+
},
|
|
81
|
+
SessionManagement: {
|
|
82
|
+
component: SessionManagementScreen as unknown as ComponentType<any>,
|
|
83
|
+
snapPoints: ['70%', '100%'],
|
|
84
|
+
},
|
|
85
|
+
AccountOverview: {
|
|
86
|
+
component: AccountOverviewScreen as unknown as ComponentType<any>,
|
|
87
|
+
snapPoints: ['60%', '85%'],
|
|
88
|
+
},
|
|
89
|
+
EditProfile: {
|
|
90
|
+
component: AccountSettingsScreen as unknown as ComponentType<any>,
|
|
91
|
+
snapPoints: ['60%', '100%'],
|
|
92
|
+
},
|
|
93
|
+
PremiumSubscription: {
|
|
94
|
+
component: PremiumSubscriptionScreen as unknown as ComponentType<any>,
|
|
95
|
+
snapPoints: ['70%', '100%'],
|
|
96
|
+
},
|
|
97
|
+
AppInfo: {
|
|
98
|
+
component: AppInfoScreen as unknown as ComponentType<any>,
|
|
99
|
+
snapPoints: ['60%', '90%'],
|
|
100
|
+
},
|
|
101
|
+
Feedback: {
|
|
102
|
+
component: FeedbackScreen as unknown as ComponentType<any>,
|
|
103
|
+
snapPoints: ['70%', '100%'],
|
|
104
|
+
},
|
|
105
|
+
KarmaCenter: {
|
|
106
|
+
component: KarmaCenterScreen as unknown as ComponentType<any>,
|
|
107
|
+
snapPoints: ['60%', '100%'],
|
|
108
|
+
},
|
|
109
|
+
KarmaLeaderboard: {
|
|
110
|
+
component: KarmaLeaderboardScreen as unknown as ComponentType<any>,
|
|
111
|
+
snapPoints: ['60%', '100%'],
|
|
112
|
+
},
|
|
113
|
+
KarmaRules: {
|
|
114
|
+
component: KarmaRulesScreen as unknown as ComponentType<any>,
|
|
115
|
+
snapPoints: ['60%', '90%'],
|
|
116
|
+
},
|
|
117
|
+
AboutKarma: {
|
|
118
|
+
component: KarmaAboutScreen as unknown as ComponentType<any>,
|
|
119
|
+
snapPoints: ['60%', '90%'],
|
|
120
|
+
},
|
|
121
|
+
KarmaRewards: {
|
|
122
|
+
component: KarmaRewardsScreen as unknown as ComponentType<any>,
|
|
123
|
+
snapPoints: ['60%', '90%'],
|
|
124
|
+
},
|
|
125
|
+
KarmaFAQ: {
|
|
126
|
+
component: KarmaFAQScreen as unknown as ComponentType<any>,
|
|
127
|
+
snapPoints: ['60%', '90%'],
|
|
128
|
+
},
|
|
129
|
+
Profile: {
|
|
130
|
+
component: ProfileScreen as unknown as ComponentType<any>,
|
|
131
|
+
snapPoints: ['60%', '90%'],
|
|
132
|
+
},
|
|
133
|
+
UserLinks: {
|
|
134
|
+
component: UserLinksScreen as unknown as ComponentType<any>,
|
|
135
|
+
snapPoints: ['60%', '90%'],
|
|
136
|
+
},
|
|
137
|
+
FileManagement: {
|
|
138
|
+
component: FileManagementScreen as unknown as ComponentType<any>,
|
|
139
|
+
snapPoints: ['70%', '100%'],
|
|
140
|
+
},
|
|
141
|
+
PaymentGateway: {
|
|
142
|
+
component: PaymentGatewayScreen as unknown as ComponentType<any>,
|
|
143
|
+
snapPoints: ['60%', '90%'],
|
|
144
|
+
},
|
|
145
|
+
WelcomeNewUser: {
|
|
146
|
+
component: WelcomeNewUserScreen as unknown as ComponentType<any>,
|
|
147
|
+
snapPoints: ['65%', '90%'],
|
|
148
|
+
},
|
|
149
|
+
LanguageSelector: {
|
|
150
|
+
component: LanguageSelectorScreen as unknown as ComponentType<any>,
|
|
151
|
+
snapPoints: ['70%', '100%'],
|
|
152
|
+
},
|
|
153
|
+
};
|