@oxyhq/services 5.11.11 → 5.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -7
- package/lib/commonjs/core/OxyServices.js +162 -12
- 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/FollowButton.js +1 -1
- package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
- 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 +112 -105
- 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 +17 -17
- 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 +2 -2
- 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 +162 -12
- 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/FollowButton.js +1 -1
- package/lib/module/ui/components/FollowButton.js.map +1 -1
- 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 +111 -105
- 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 +17 -17
- 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 +2 -2
- 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 +57 -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 +49 -15
- package/src/core/OxyServices.ts +138 -19
- 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/FollowButton.tsx +2 -2
- package/src/ui/components/GroupedItem.tsx +2 -1
- package/src/ui/components/Header.tsx +4 -3
- package/src/ui/components/OxyProvider.tsx +107 -114
- package/src/ui/components/ProfileCard.tsx +5 -1
- package/src/ui/components/Section.tsx +1 -1
- package/src/ui/components/StepBasedScreen.tsx +17 -14
- 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 +6 -6
- 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
|
@@ -23,6 +23,7 @@ import OxyIcon from '../components/icon/OxyIcon';
|
|
|
23
23
|
import { Ionicons } from '@expo/vector-icons';
|
|
24
24
|
import Avatar from '../components/Avatar';
|
|
25
25
|
import { Header, GroupedSection } from '../components';
|
|
26
|
+
import { useI18n } from '../hooks/useI18n';
|
|
26
27
|
|
|
27
28
|
interface SessionWithUser extends ClientSession {
|
|
28
29
|
userProfile?: User;
|
|
@@ -71,6 +72,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
71
72
|
|
|
72
73
|
const screenWidth = Dimensions.get('window').width;
|
|
73
74
|
const isDarkTheme = theme === 'dark';
|
|
75
|
+
const { t } = useI18n();
|
|
74
76
|
|
|
75
77
|
// Modern color scheme
|
|
76
78
|
const colors = {
|
|
@@ -146,13 +148,13 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
146
148
|
setSwitchingToUserId(sessionId);
|
|
147
149
|
try {
|
|
148
150
|
await switchSession(sessionId);
|
|
149
|
-
toast.success('Account switched successfully!');
|
|
151
|
+
toast.success(t('accountSwitcher.toasts.switchSuccess') || 'Account switched successfully!');
|
|
150
152
|
if (onClose) {
|
|
151
153
|
onClose();
|
|
152
154
|
}
|
|
153
155
|
} catch (error) {
|
|
154
156
|
console.error('Switch session failed:', error);
|
|
155
|
-
toast.error('There was a problem switching accounts. Please try again.');
|
|
157
|
+
toast.error(t('accountSwitcher.toasts.switchFailed') || 'There was a problem switching accounts. Please try again.');
|
|
156
158
|
} finally {
|
|
157
159
|
setSwitchingToUserId(null);
|
|
158
160
|
}
|
|
@@ -160,15 +162,15 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
160
162
|
|
|
161
163
|
const handleRemoveSession = async (sessionId: string, displayName: string) => {
|
|
162
164
|
confirmAction(
|
|
163
|
-
`Are you sure you want to remove ${displayName} from this device? You'll need to sign in again to access this account.`,
|
|
165
|
+
t('accountSwitcher.confirms.remove', { displayName }) || `Are you sure you want to remove ${displayName} from this device? You'll need to sign in again to access this account.`,
|
|
164
166
|
async () => {
|
|
165
167
|
setRemovingUserId(sessionId);
|
|
166
168
|
try {
|
|
167
169
|
await removeSession(sessionId);
|
|
168
|
-
toast.success('Account removed successfully!');
|
|
170
|
+
toast.success(t('accountSwitcher.toasts.removeSuccess') || 'Account removed successfully!');
|
|
169
171
|
} catch (error) {
|
|
170
172
|
console.error('Remove session failed:', error);
|
|
171
|
-
toast.error('There was a problem removing the account. Please try again.');
|
|
173
|
+
toast.error(t('accountSwitcher.toasts.removeFailed') || 'There was a problem removing the account. Please try again.');
|
|
172
174
|
} finally {
|
|
173
175
|
setRemovingUserId(null);
|
|
174
176
|
}
|
|
@@ -178,18 +180,18 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
178
180
|
|
|
179
181
|
const handleLogoutAll = async () => {
|
|
180
182
|
confirmAction(
|
|
181
|
-
'Are you sure you want to sign out of all accounts? This will remove all saved accounts from this device.',
|
|
183
|
+
t('accountSwitcher.confirms.logoutAll') || 'Are you sure you want to sign out of all accounts? This will remove all saved accounts from this device.',
|
|
182
184
|
async () => {
|
|
183
185
|
try {
|
|
184
186
|
await logoutAll();
|
|
185
|
-
toast.success('All accounts signed out successfully!');
|
|
187
|
+
toast.success(t('accountSwitcher.toasts.signOutAllSuccess') || 'All accounts signed out successfully!');
|
|
186
188
|
if (onClose) {
|
|
187
189
|
onClose();
|
|
188
190
|
}
|
|
189
191
|
} catch (error) {
|
|
190
192
|
console.error('Logout all failed:', error);
|
|
191
193
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
192
|
-
toast.error(`There was a problem signing out: ${errorMessage}`);
|
|
194
|
+
toast.error(t('accountSwitcher.toasts.signOutAllFailed', { error: errorMessage }) || `There was a problem signing out: ${errorMessage}`);
|
|
193
195
|
}
|
|
194
196
|
}
|
|
195
197
|
);
|
|
@@ -206,7 +208,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
206
208
|
setDeviceSessions(allSessions || []);
|
|
207
209
|
} catch (error) {
|
|
208
210
|
console.error('Failed to load device sessions:', error);
|
|
209
|
-
toast.error('Failed to load device sessions. Please try again.');
|
|
211
|
+
toast.error(t('accountSwitcher.toasts.deviceLoadFailed') || 'Failed to load device sessions. Please try again.');
|
|
210
212
|
} finally {
|
|
211
213
|
setLoadingDeviceSessions(false);
|
|
212
214
|
}
|
|
@@ -214,17 +216,17 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
214
216
|
|
|
215
217
|
const handleRemoteSessionLogout = async (sessionId: string, deviceName: string) => {
|
|
216
218
|
confirmAction(
|
|
217
|
-
`Are you sure you want to sign out from "${deviceName}"? This will end the session on that device.`,
|
|
219
|
+
t('accountSwitcher.confirms.remoteLogout', { deviceName }) || `Are you sure you want to sign out from "${deviceName}"? This will end the session on that device.`,
|
|
218
220
|
async () => {
|
|
219
221
|
setRemoteLogoutSessionId(sessionId);
|
|
220
222
|
try {
|
|
221
223
|
await oxyServices?.logoutSession(activeSessionId || '', sessionId);
|
|
222
224
|
// Refresh device sessions list
|
|
223
225
|
await loadAllDeviceSessions();
|
|
224
|
-
toast.success(`Signed out from ${deviceName} successfully!`);
|
|
226
|
+
toast.success(t('accountSwitcher.toasts.remoteSignOutSuccess', { deviceName }) || `Signed out from ${deviceName} successfully!`);
|
|
225
227
|
} catch (error) {
|
|
226
228
|
console.error('Remote logout failed:', error);
|
|
227
|
-
toast.error('There was a problem signing out from the device. Please try again.');
|
|
229
|
+
toast.error(t('accountSwitcher.toasts.remoteSignOutFailed') || 'There was a problem signing out from the device. Please try again.');
|
|
228
230
|
} finally {
|
|
229
231
|
setRemoteLogoutSessionId(null);
|
|
230
232
|
}
|
|
@@ -236,22 +238,22 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
236
238
|
const otherDevicesCount = deviceSessions.filter(session => !session.isCurrent).length;
|
|
237
239
|
|
|
238
240
|
if (otherDevicesCount === 0) {
|
|
239
|
-
toast.info('No other device sessions found to sign out from.');
|
|
241
|
+
toast.info(t('accountSwitcher.toasts.noOtherDeviceSessions') || 'No other device sessions found to sign out from.');
|
|
240
242
|
return;
|
|
241
243
|
}
|
|
242
244
|
|
|
243
245
|
confirmAction(
|
|
244
|
-
`Are you sure you want to sign out from all ${otherDevicesCount} other device(s)? This will end sessions on all other devices except this one.`,
|
|
246
|
+
t('accountSwitcher.confirms.logoutOthers', { count: otherDevicesCount }) || `Are you sure you want to sign out from all ${otherDevicesCount} other device(s)? This will end sessions on all other devices except this one.`,
|
|
245
247
|
async () => {
|
|
246
248
|
setLoggingOutAllDevices(true);
|
|
247
249
|
try {
|
|
248
250
|
await oxyServices?.logoutAllDeviceSessions(activeSessionId || '');
|
|
249
251
|
// Refresh device sessions list
|
|
250
252
|
await loadAllDeviceSessions();
|
|
251
|
-
toast.success('Signed out from all other devices successfully!');
|
|
253
|
+
toast.success(t('accountSwitcher.toasts.signOutOthersSuccess') || 'Signed out from all other devices successfully!');
|
|
252
254
|
} catch (error) {
|
|
253
255
|
console.error('Logout all devices failed:', error);
|
|
254
|
-
toast.error('There was a problem signing out from other devices. Please try again.');
|
|
256
|
+
toast.error(t('accountSwitcher.toasts.signOutOthersFailed') || 'There was a problem signing out from other devices. Please try again.');
|
|
255
257
|
} finally {
|
|
256
258
|
setLoggingOutAllDevices(false);
|
|
257
259
|
}
|
|
@@ -263,7 +265,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
263
265
|
<View style={[styles.container, { backgroundColor: '#f2f2f2' }]}>
|
|
264
266
|
{/* Header */}
|
|
265
267
|
<Header
|
|
266
|
-
title=
|
|
268
|
+
title={t('accountSwitcher.title') || 'Account Switcher'}
|
|
267
269
|
theme={theme}
|
|
268
270
|
onBack={goBack}
|
|
269
271
|
onClose={onClose}
|
|
@@ -283,14 +285,14 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
283
285
|
{isLoading ? (
|
|
284
286
|
<View style={styles.loadingContainer}>
|
|
285
287
|
<ActivityIndicator size="large" color="#007AFF" />
|
|
286
|
-
<Text style={styles.loadingText}>Loading accounts
|
|
288
|
+
<Text style={styles.loadingText}>{t('accountSwitcher.loading') || 'Loading accounts...'}</Text>
|
|
287
289
|
</View>
|
|
288
290
|
) : (
|
|
289
291
|
<>
|
|
290
292
|
{/* Current Account */}
|
|
291
293
|
{isAuthenticated && user && (
|
|
292
294
|
<View style={styles.section}>
|
|
293
|
-
<Text style={styles.sectionTitle}>Current Account</Text>
|
|
295
|
+
<Text style={styles.sectionTitle}>{t('accountSwitcher.sections.current') || 'Current Account'}</Text>
|
|
294
296
|
|
|
295
297
|
<View style={[styles.settingItem, styles.firstSettingItem, styles.lastSettingItem, styles.currentAccountCard]}>
|
|
296
298
|
<View style={styles.userIcon}>
|
|
@@ -316,7 +318,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
316
318
|
</View>
|
|
317
319
|
</View>
|
|
318
320
|
<View style={styles.currentBadge}>
|
|
319
|
-
<Text style={styles.currentBadgeText}>Current</Text>
|
|
321
|
+
<Text style={styles.currentBadgeText}>{t('accountSwitcher.currentBadge') || 'Current'}</Text>
|
|
320
322
|
</View>
|
|
321
323
|
</View>
|
|
322
324
|
</View>
|
|
@@ -326,7 +328,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
326
328
|
{sessionsWithUsers.filter(s => s.sessionId !== activeSessionId).length > 0 && (
|
|
327
329
|
<View style={styles.section}>
|
|
328
330
|
<Text style={styles.sectionTitle}>
|
|
329
|
-
Other Accounts ({sessionsWithUsers.filter(s => s.sessionId !== activeSessionId).length})
|
|
331
|
+
{t('accountSwitcher.sections.otherWithCount', { count: sessionsWithUsers.filter(s => s.sessionId !== activeSessionId).length }) || `Other Accounts (${sessionsWithUsers.filter(s => s.sessionId !== activeSessionId).length})`}
|
|
330
332
|
</Text>
|
|
331
333
|
|
|
332
334
|
{sessionsWithUsers
|
|
@@ -443,7 +445,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
443
445
|
{/* Device Management Section */}
|
|
444
446
|
{showDeviceManagement && (
|
|
445
447
|
<View style={styles.section}>
|
|
446
|
-
<Text style={styles.sectionTitle}>Device Sessions</Text>
|
|
448
|
+
<Text style={styles.sectionTitle}>{t('accountSwitcher.sections.deviceSessions') || 'Device Sessions'}</Text>
|
|
447
449
|
|
|
448
450
|
{loadingDeviceSessions ? (
|
|
449
451
|
<GroupedSection
|
|
@@ -452,8 +454,8 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
452
454
|
id: 'loading-device-sessions',
|
|
453
455
|
icon: 'sync',
|
|
454
456
|
iconColor: '#007AFF',
|
|
455
|
-
title: 'Loading device sessions...',
|
|
456
|
-
subtitle: 'Please wait while we fetch your device sessions',
|
|
457
|
+
title: t('accountSwitcher.device.loadingTitle') || 'Loading device sessions...',
|
|
458
|
+
subtitle: t('accountSwitcher.device.loadingSubtitle') || 'Please wait while we fetch your device sessions',
|
|
457
459
|
disabled: true,
|
|
458
460
|
customContent: (
|
|
459
461
|
<ActivityIndicator size="small" color="#007AFF" style={{ marginRight: 16 }} />
|
|
@@ -469,8 +471,8 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
469
471
|
id: 'no-device-sessions',
|
|
470
472
|
icon: 'phone-portrait',
|
|
471
473
|
iconColor: '#ccc',
|
|
472
|
-
title: 'No device sessions found',
|
|
473
|
-
subtitle: 'Device session management not available',
|
|
474
|
+
title: t('accountSwitcher.device.noneTitle') || 'No device sessions found',
|
|
475
|
+
subtitle: t('accountSwitcher.device.noneSubtitle') || 'Device session management not available',
|
|
474
476
|
disabled: true,
|
|
475
477
|
},
|
|
476
478
|
]}
|
|
@@ -482,8 +484,8 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
482
484
|
id: `device-session-${session.sessionId}`,
|
|
483
485
|
icon: session.isCurrent ? 'phone-portrait' : 'phone-portrait-outline',
|
|
484
486
|
iconColor: session.isCurrent ? '#34C759' : '#8E8E93',
|
|
485
|
-
title: `${session.deviceName} ${session.isCurrent ? '(This device)' : ''}`,
|
|
486
|
-
subtitle: `Last active: ${new Date(session.lastActive).toLocaleDateString()}`,
|
|
487
|
+
title: `${session.deviceName} ${session.isCurrent ? '(' + (t('accountSwitcher.device.thisDevice') || 'This device') + ')' : ''}`,
|
|
488
|
+
subtitle: t('accountSwitcher.device.lastActive', { date: new Date(session.lastActive).toLocaleDateString() }) || `Last active: ${new Date(session.lastActive).toLocaleDateString()}`,
|
|
487
489
|
onPress: session.isCurrent ? undefined : () => handleRemoteSessionLogout(session.sessionId, session.deviceName),
|
|
488
490
|
disabled: session.isCurrent || remotingLogoutSessionId === session.sessionId,
|
|
489
491
|
customContent: !session.isCurrent ? (
|
|
@@ -515,21 +517,21 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
|
|
|
515
517
|
id: 'empty-state',
|
|
516
518
|
icon: 'person-outline',
|
|
517
519
|
iconColor: '#ccc',
|
|
518
|
-
title: 'No saved accounts',
|
|
519
|
-
subtitle: 'Add another account to switch between them quickly',
|
|
520
|
+
title: t('accountSwitcher.empty.title') || 'No saved accounts',
|
|
521
|
+
subtitle: t('accountSwitcher.empty.subtitle') || 'Add another account to switch between them quickly',
|
|
520
522
|
onPress: () => navigate?.('SignIn'),
|
|
521
523
|
customContent: (
|
|
522
524
|
<View style={styles.emptyStateContainer}>
|
|
523
525
|
<OxyIcon name="person-outline" size={48} color="#ccc" />
|
|
524
|
-
<Text style={styles.emptyStateTitle}>No saved accounts</Text>
|
|
526
|
+
<Text style={styles.emptyStateTitle}>{t('accountSwitcher.empty.title') || 'No saved accounts'}</Text>
|
|
525
527
|
<Text style={styles.emptyStateDescription}>
|
|
526
|
-
Add another account to switch between them quickly
|
|
528
|
+
{t('accountSwitcher.empty.subtitle') || 'Add another account to switch between them quickly'}
|
|
527
529
|
</Text>
|
|
528
530
|
<TouchableOpacity
|
|
529
531
|
style={styles.addAccountButton}
|
|
530
532
|
onPress={() => navigate?.('SignIn')}
|
|
531
533
|
>
|
|
532
|
-
<Text style={styles.addAccountButtonText}>Add Account</Text>
|
|
534
|
+
<Text style={styles.addAccountButtonText}>{t('accountCenter.sections.addAccount') || 'Add Account'}</Text>
|
|
533
535
|
</TouchableOpacity>
|
|
534
536
|
</View>
|
|
535
537
|
),
|
|
@@ -21,6 +21,7 @@ import { Ionicons } from '@expo/vector-icons';
|
|
|
21
21
|
import { toast } from '../../lib/sonner';
|
|
22
22
|
import { packageInfo } from '../../constants/version';
|
|
23
23
|
import { GroupedSection } from '../components';
|
|
24
|
+
import { useI18n } from '../hooks/useI18n';
|
|
24
25
|
|
|
25
26
|
// Types for better type safety
|
|
26
27
|
interface FeedbackData {
|
|
@@ -513,6 +514,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
513
514
|
}) => {
|
|
514
515
|
const { user, oxyServices } = useOxy();
|
|
515
516
|
const colors = useThemeColors(theme);
|
|
517
|
+
const { t } = useI18n();
|
|
516
518
|
|
|
517
519
|
// Form state
|
|
518
520
|
const { feedbackData, feedbackState, setFeedbackState, updateField, resetForm } = useFeedbackForm();
|
|
@@ -581,7 +583,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
581
583
|
// Submit feedback handler
|
|
582
584
|
const handleSubmitFeedback = useCallback(async () => {
|
|
583
585
|
if (!isTypeStepValid() || !isDetailsStepValid() || !isContactStepValid()) {
|
|
584
|
-
toast.error('Please fill in all required fields');
|
|
586
|
+
toast.error(t('feedback.toasts.fillRequired') || 'Please fill in all required fields');
|
|
585
587
|
return;
|
|
586
588
|
}
|
|
587
589
|
|
|
@@ -611,8 +613,8 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
611
613
|
// In a real implementation, you would call oxyServices.submitFeedback(feedbackPayload)
|
|
612
614
|
await new Promise(resolve => setTimeout(resolve, 2000)); // Simulate API call
|
|
613
615
|
|
|
614
|
-
setFeedbackState({ status: 'success', message: 'Feedback submitted successfully!' });
|
|
615
|
-
toast.success('Thank you for your feedback!');
|
|
616
|
+
setFeedbackState({ status: 'success', message: t('feedback.toasts.submitSuccess') || 'Feedback submitted successfully!' });
|
|
617
|
+
toast.success(t('feedback.toasts.thanks') || 'Thank you for your feedback!');
|
|
616
618
|
|
|
617
619
|
// Reset form after success
|
|
618
620
|
setTimeout(() => {
|
|
@@ -621,8 +623,8 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
621
623
|
}, 3000);
|
|
622
624
|
|
|
623
625
|
} catch (error: any) {
|
|
624
|
-
setFeedbackState({ status: 'error', message: error.message || 'Failed to submit feedback' });
|
|
625
|
-
toast.error(error.message || 'Failed to submit feedback');
|
|
626
|
+
setFeedbackState({ status: 'error', message: error.message || (t('feedback.toasts.submitFailed') || 'Failed to submit feedback') });
|
|
627
|
+
toast.error(error.message || (t('feedback.toasts.submitFailed') || 'Failed to submit feedback'));
|
|
626
628
|
}
|
|
627
629
|
}, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm]);
|
|
628
630
|
|
|
@@ -670,10 +672,10 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
670
672
|
]}>
|
|
671
673
|
<View style={styles.modernHeader}>
|
|
672
674
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
673
|
-
What type of feedback?
|
|
675
|
+
{t('feedback.type.title') || 'What type of feedback?'}
|
|
674
676
|
</Text>
|
|
675
677
|
<Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>
|
|
676
|
-
Choose the category that best describes your feedback
|
|
678
|
+
{t('feedback.type.subtitle') || 'Choose the category that best describes your feedback'}
|
|
677
679
|
</Text>
|
|
678
680
|
</View>
|
|
679
681
|
<View style={styles.fullBleed}>
|
|
@@ -682,7 +684,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
682
684
|
|
|
683
685
|
{feedbackData.type && (
|
|
684
686
|
<View style={styles.categoryContainer}>
|
|
685
|
-
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>Category</Text>
|
|
687
|
+
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>{t('feedback.category.label') || 'Category'}</Text>
|
|
686
688
|
<View style={styles.fullBleed}>
|
|
687
689
|
<GroupedSection items={categoryItems} theme={theme as 'light' | 'dark'} />
|
|
688
690
|
</View>
|
|
@@ -703,7 +705,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
703
705
|
onPress={goBack}
|
|
704
706
|
>
|
|
705
707
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
706
|
-
<Text style={[styles.navButtonText, { color: colors.text }]}>Back</Text>
|
|
708
|
+
<Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
|
|
707
709
|
</TouchableOpacity>
|
|
708
710
|
|
|
709
711
|
<TouchableOpacity
|
|
@@ -719,7 +721,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
719
721
|
onPress={nextStep}
|
|
720
722
|
disabled={!isTypeStepValid()}
|
|
721
723
|
>
|
|
722
|
-
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>Next</Text>
|
|
724
|
+
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>{t('common.actions.next') || 'Next'}</Text>
|
|
723
725
|
<Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
|
|
724
726
|
</TouchableOpacity>
|
|
725
727
|
</View>
|
|
@@ -733,22 +735,22 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
733
735
|
]}>
|
|
734
736
|
<View style={styles.modernHeader}>
|
|
735
737
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
736
|
-
Tell us more
|
|
738
|
+
{t('feedback.details.title') || 'Tell us more'}
|
|
737
739
|
</Text>
|
|
738
740
|
<Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>
|
|
739
|
-
Provide details about your feedback
|
|
741
|
+
{t('feedback.details.subtitle') || 'Provide details about your feedback'}
|
|
740
742
|
</Text>
|
|
741
743
|
</View>
|
|
742
744
|
|
|
743
745
|
<FormInput
|
|
744
746
|
icon="create-outline"
|
|
745
|
-
label=
|
|
747
|
+
label={t('feedback.fields.title.label') || 'Title'}
|
|
746
748
|
value={feedbackData.title}
|
|
747
749
|
onChangeText={(text) => {
|
|
748
750
|
updateField('title', text);
|
|
749
751
|
setErrorMessage('');
|
|
750
752
|
}}
|
|
751
|
-
placeholder=
|
|
753
|
+
placeholder={t('feedback.fields.title.placeholder') || 'Brief summary of your feedback'}
|
|
752
754
|
testID="feedback-title-input"
|
|
753
755
|
colors={colors}
|
|
754
756
|
styles={styles}
|
|
@@ -756,13 +758,13 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
756
758
|
|
|
757
759
|
<FormInput
|
|
758
760
|
icon="document-text-outline"
|
|
759
|
-
label=
|
|
761
|
+
label={t('feedback.fields.description.label') || 'Description'}
|
|
760
762
|
value={feedbackData.description}
|
|
761
763
|
onChangeText={(text) => {
|
|
762
764
|
updateField('description', text);
|
|
763
765
|
setErrorMessage('');
|
|
764
766
|
}}
|
|
765
|
-
placeholder=
|
|
767
|
+
placeholder={t('feedback.fields.description.placeholder') || 'Please provide detailed information...'}
|
|
766
768
|
multiline={true}
|
|
767
769
|
numberOfLines={6}
|
|
768
770
|
testID="feedback-description-input"
|
|
@@ -771,7 +773,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
771
773
|
/>
|
|
772
774
|
|
|
773
775
|
<View style={{ marginBottom: 24 }}>
|
|
774
|
-
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>Priority Level</Text>
|
|
776
|
+
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>{t('feedback.priority.label') || 'Priority Level'}</Text>
|
|
775
777
|
<View style={styles.fullBleed}>
|
|
776
778
|
<GroupedSection items={priorityItems} theme={theme as 'light' | 'dark'} />
|
|
777
779
|
</View>
|
|
@@ -786,7 +788,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
786
788
|
onPress={prevStep}
|
|
787
789
|
>
|
|
788
790
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
789
|
-
<Text style={[styles.navButtonText, { color: colors.text }]}>Back</Text>
|
|
791
|
+
<Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
|
|
790
792
|
</TouchableOpacity>
|
|
791
793
|
|
|
792
794
|
<TouchableOpacity
|
|
@@ -798,7 +800,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
798
800
|
onPress={nextStep}
|
|
799
801
|
disabled={!isDetailsStepValid()}
|
|
800
802
|
>
|
|
801
|
-
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>Next</Text>
|
|
803
|
+
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>{t('common.actions.next') || 'Next'}</Text>
|
|
802
804
|
<Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
|
|
803
805
|
</TouchableOpacity>
|
|
804
806
|
</View>
|
|
@@ -812,22 +814,22 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
812
814
|
]}>
|
|
813
815
|
<View style={styles.modernHeader}>
|
|
814
816
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
815
|
-
Contact Information
|
|
817
|
+
{t('feedback.contact.title') || 'Contact Information'}
|
|
816
818
|
</Text>
|
|
817
819
|
<Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>
|
|
818
|
-
Help us get back to you
|
|
820
|
+
{t('feedback.contact.subtitle') || 'Help us get back to you'}
|
|
819
821
|
</Text>
|
|
820
822
|
</View>
|
|
821
823
|
|
|
822
824
|
<FormInput
|
|
823
825
|
icon="mail-outline"
|
|
824
|
-
label=
|
|
826
|
+
label={t('feedback.fields.email.label') || 'Email Address'}
|
|
825
827
|
value={feedbackData.contactEmail}
|
|
826
828
|
onChangeText={(text) => {
|
|
827
829
|
updateField('contactEmail', text);
|
|
828
830
|
setErrorMessage('');
|
|
829
831
|
}}
|
|
830
|
-
placeholder={user?.email ||
|
|
832
|
+
placeholder={user?.email || (t('feedback.fields.email.placeholder') || 'Enter your email address')}
|
|
831
833
|
testID="feedback-email-input"
|
|
832
834
|
colors={colors}
|
|
833
835
|
styles={styles}
|
|
@@ -849,7 +851,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
849
851
|
)}
|
|
850
852
|
</TouchableOpacity>
|
|
851
853
|
<Text style={[styles.checkboxText, { color: colors.text }]}>
|
|
852
|
-
Include system information to help us better understand your issue
|
|
854
|
+
{t('feedback.contact.includeSystemInfo') || 'Include system information to help us better understand your issue'}
|
|
853
855
|
</Text>
|
|
854
856
|
</View>
|
|
855
857
|
|
|
@@ -888,40 +890,40 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
888
890
|
]}>
|
|
889
891
|
<View style={styles.modernHeader}>
|
|
890
892
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
891
|
-
|
|
893
|
+
{t('feedback.summary.title') || 'Summary'}
|
|
892
894
|
</Text>
|
|
893
895
|
<Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>
|
|
894
|
-
Please review your feedback before submitting
|
|
896
|
+
{t('feedback.summary.subtitle') || 'Please review your feedback before submitting'}
|
|
895
897
|
</Text>
|
|
896
898
|
</View>
|
|
897
899
|
|
|
898
900
|
<View style={styles.summaryContainer}>
|
|
899
901
|
<View style={styles.summaryRow}>
|
|
900
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Type
|
|
902
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.type') || 'Type:'}</Text>
|
|
901
903
|
<Text style={[styles.summaryValue, { color: colors.text }]}>
|
|
902
904
|
{FEEDBACK_TYPES.find(t => t.id === feedbackData.type)?.label}
|
|
903
905
|
</Text>
|
|
904
906
|
</View>
|
|
905
907
|
|
|
906
908
|
<View style={styles.summaryRow}>
|
|
907
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Category
|
|
909
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.category') || 'Category:'}</Text>
|
|
908
910
|
<Text style={[styles.summaryValue, { color: colors.text }]}>{feedbackData.category}</Text>
|
|
909
911
|
</View>
|
|
910
912
|
|
|
911
913
|
<View style={styles.summaryRow}>
|
|
912
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Priority
|
|
914
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.priority') || 'Priority:'}</Text>
|
|
913
915
|
<Text style={[styles.summaryValue, { color: colors.text }]}>
|
|
914
916
|
{PRIORITY_LEVELS.find(p => p.id === feedbackData.priority)?.label}
|
|
915
917
|
</Text>
|
|
916
918
|
</View>
|
|
917
919
|
|
|
918
920
|
<View style={styles.summaryRow}>
|
|
919
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Title
|
|
921
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.titleLabel') || 'Title:'}</Text>
|
|
920
922
|
<Text style={[styles.summaryValue, { color: colors.text }]}>{feedbackData.title}</Text>
|
|
921
923
|
</View>
|
|
922
924
|
|
|
923
925
|
<View style={styles.summaryRow}>
|
|
924
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Contact
|
|
926
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.contact') || 'Contact:'}</Text>
|
|
925
927
|
<Text style={[styles.summaryValue, { color: colors.text }]}>
|
|
926
928
|
{feedbackData.contactEmail || user?.email}
|
|
927
929
|
</Text>
|
|
@@ -938,7 +940,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
938
940
|
<ActivityIndicator color="#FFFFFF" size="small" />
|
|
939
941
|
) : (
|
|
940
942
|
<>
|
|
941
|
-
<Text style={styles.buttonText}>Submit Feedback</Text>
|
|
943
|
+
<Text style={styles.buttonText}>{t('feedback.actions.submit') || 'Submit Feedback'}</Text>
|
|
942
944
|
<Ionicons name="send" size={20} color="#FFFFFF" />
|
|
943
945
|
</>
|
|
944
946
|
)}
|
|
@@ -958,7 +960,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
958
960
|
onPress={prevStep}
|
|
959
961
|
>
|
|
960
962
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
961
|
-
<Text style={[styles.navButtonText, { color: colors.text }]}>Back</Text>
|
|
963
|
+
<Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
|
|
962
964
|
</TouchableOpacity>
|
|
963
965
|
</View>
|
|
964
966
|
</Animated.View>
|
|
@@ -974,10 +976,10 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
974
976
|
<Ionicons name="checkmark-circle" size={48} color={colors.success} />
|
|
975
977
|
</View>
|
|
976
978
|
<Text style={[styles.successTitle, { color: colors.text }]}>
|
|
977
|
-
Thank You!
|
|
979
|
+
{t('feedback.success.thanks') || 'Thank You!'}
|
|
978
980
|
</Text>
|
|
979
981
|
<Text style={[styles.successMessage, { color: colors.secondaryText }]}>
|
|
980
|
-
Your feedback has been submitted successfully. We'll review it and get back to you soon.
|
|
982
|
+
{t('feedback.success.message') || "Your feedback has been submitted successfully. We'll review it and get back to you soon."}
|
|
981
983
|
</Text>
|
|
982
984
|
<TouchableOpacity
|
|
983
985
|
style={[styles.button, { backgroundColor: colors.primary }]}
|
|
@@ -986,7 +988,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
986
988
|
setCurrentStep(0);
|
|
987
989
|
}}
|
|
988
990
|
>
|
|
989
|
-
<Text style={styles.buttonText}>Submit Another</Text>
|
|
991
|
+
<Text style={styles.buttonText}>{t('feedback.actions.submitAnother') || 'Submit Another'}</Text>
|
|
990
992
|
</TouchableOpacity>
|
|
991
993
|
</View>
|
|
992
994
|
</Animated.View>
|
|
@@ -1031,4 +1033,4 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
1031
1033
|
);
|
|
1032
1034
|
};
|
|
1033
1035
|
|
|
1034
|
-
export default FeedbackScreen;
|
|
1036
|
+
export default FeedbackScreen;
|