@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.
Files changed (322) hide show
  1. package/README.md +48 -7
  2. package/lib/commonjs/core/OxyServices.js +168 -5
  3. package/lib/commonjs/core/OxyServices.js.map +1 -1
  4. package/lib/commonjs/i18n/index.js +40 -0
  5. package/lib/commonjs/i18n/index.js.map +1 -0
  6. package/lib/commonjs/i18n/locales/en-US.json +681 -0
  7. package/lib/commonjs/i18n/locales/es-ES.json +689 -0
  8. package/lib/commonjs/ui/components/GroupedItem.js +2 -1
  9. package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
  10. package/lib/commonjs/ui/components/Header.js +4 -3
  11. package/lib/commonjs/ui/components/Header.js.map +1 -1
  12. package/lib/commonjs/ui/components/OxyProvider.js +110 -103
  13. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  14. package/lib/commonjs/ui/components/ProfileCard.js +5 -1
  15. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  16. package/lib/commonjs/ui/components/Section.js +1 -1
  17. package/lib/commonjs/ui/components/StepBasedScreen.js +16 -16
  18. package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
  19. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +15 -3
  20. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
  21. package/lib/commonjs/ui/components/internal/PinInput.js +10 -4
  22. package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
  23. package/lib/commonjs/ui/context/OxyContext.js +128 -12
  24. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  25. package/lib/commonjs/ui/hooks/useI18n.js +22 -0
  26. package/lib/commonjs/ui/hooks/useI18n.js.map +1 -0
  27. package/lib/commonjs/ui/navigation/OxyRouter.js +11 -131
  28. package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
  29. package/lib/commonjs/ui/navigation/routes.js +127 -0
  30. package/lib/commonjs/ui/navigation/routes.js.map +1 -0
  31. package/lib/commonjs/ui/navigation/types.js +7 -0
  32. package/lib/commonjs/ui/navigation/types.js.map +1 -1
  33. package/lib/commonjs/ui/screens/AccountCenterScreen.js +55 -47
  34. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  35. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +69 -61
  36. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  37. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +378 -37
  38. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  39. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +52 -34
  40. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  41. package/lib/commonjs/ui/screens/FeedbackScreen.js +40 -36
  42. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  43. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +105 -78
  44. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  45. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +1 -1
  46. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  47. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +92 -60
  48. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  49. package/lib/commonjs/ui/screens/ProfileScreen.js +21 -11
  50. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  51. package/lib/commonjs/ui/screens/RecoverAccountScreen.js +30 -8
  52. package/lib/commonjs/ui/screens/RecoverAccountScreen.js.map +1 -1
  53. package/lib/commonjs/ui/screens/SignInScreen.js +47 -26
  54. package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
  55. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +31 -24
  56. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  57. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +11 -7
  58. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -1
  59. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +12 -6
  60. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -1
  61. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +11 -7
  62. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  63. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +15 -11
  64. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  65. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +19 -27
  66. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  67. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +8 -4
  68. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  69. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +14 -10
  70. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  71. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +7 -3
  72. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  73. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js +19 -14
  74. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js.map +1 -1
  75. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js +130 -0
  76. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -0
  77. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js +13 -13
  78. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
  79. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js +14 -20
  80. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
  81. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js +22 -8
  82. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js.map +1 -1
  83. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js +161 -0
  84. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js.map +1 -0
  85. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js +12 -6
  86. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js.map +1 -1
  87. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js +10 -6
  88. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
  89. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js +10 -6
  90. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
  91. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js +34 -4
  92. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
  93. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js +9 -10
  94. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
  95. package/lib/commonjs/ui/styles/authStyles.js +1 -2
  96. package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
  97. package/lib/commonjs/utils/deviceManager.js +1 -1
  98. package/lib/commonjs/utils/deviceManager.js.map +1 -1
  99. package/lib/commonjs/utils/validationUtils.js +4 -2
  100. package/lib/commonjs/utils/validationUtils.js.map +1 -1
  101. package/lib/module/core/OxyServices.js +168 -5
  102. package/lib/module/core/OxyServices.js.map +1 -1
  103. package/lib/module/i18n/index.js +35 -0
  104. package/lib/module/i18n/index.js.map +1 -0
  105. package/lib/module/i18n/locales/en-US.json +681 -0
  106. package/lib/module/i18n/locales/es-ES.json +689 -0
  107. package/lib/module/ui/components/GroupedItem.js +2 -1
  108. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  109. package/lib/module/ui/components/Header.js +4 -3
  110. package/lib/module/ui/components/Header.js.map +1 -1
  111. package/lib/module/ui/components/OxyProvider.js +109 -103
  112. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  113. package/lib/module/ui/components/ProfileCard.js +5 -1
  114. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  115. package/lib/module/ui/components/Section.js +1 -1
  116. package/lib/module/ui/components/StepBasedScreen.js +16 -16
  117. package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
  118. package/lib/module/ui/components/internal/GroupedPillButtons.js +15 -3
  119. package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
  120. package/lib/module/ui/components/internal/PinInput.js +9 -4
  121. package/lib/module/ui/components/internal/PinInput.js.map +1 -1
  122. package/lib/module/ui/context/OxyContext.js +128 -12
  123. package/lib/module/ui/context/OxyContext.js.map +1 -1
  124. package/lib/module/ui/hooks/useI18n.js +18 -0
  125. package/lib/module/ui/hooks/useI18n.js.map +1 -0
  126. package/lib/module/ui/navigation/OxyRouter.js +7 -124
  127. package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
  128. package/lib/module/ui/navigation/routes.js +122 -0
  129. package/lib/module/ui/navigation/routes.js.map +1 -0
  130. package/lib/module/ui/navigation/types.js +19 -1
  131. package/lib/module/ui/navigation/types.js.map +1 -1
  132. package/lib/module/ui/screens/AccountCenterScreen.js +55 -47
  133. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  134. package/lib/module/ui/screens/AccountOverviewScreen.js +69 -61
  135. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  136. package/lib/module/ui/screens/AccountSettingsScreen.js +378 -37
  137. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  138. package/lib/module/ui/screens/AccountSwitcherScreen.js +52 -34
  139. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  140. package/lib/module/ui/screens/FeedbackScreen.js +40 -36
  141. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  142. package/lib/module/ui/screens/LanguageSelectorScreen.js +107 -80
  143. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  144. package/lib/module/ui/screens/PaymentGatewayScreen.js +1 -1
  145. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  146. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +92 -60
  147. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  148. package/lib/module/ui/screens/ProfileScreen.js +21 -11
  149. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  150. package/lib/module/ui/screens/RecoverAccountScreen.js +30 -8
  151. package/lib/module/ui/screens/RecoverAccountScreen.js.map +1 -1
  152. package/lib/module/ui/screens/SignInScreen.js +47 -26
  153. package/lib/module/ui/screens/SignInScreen.js.map +1 -1
  154. package/lib/module/ui/screens/WelcomeNewUserScreen.js +31 -24
  155. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  156. package/lib/module/ui/screens/internal/SignInPasswordStep.js +11 -7
  157. package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -1
  158. package/lib/module/ui/screens/internal/SignInUsernameStep.js +12 -6
  159. package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -1
  160. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +11 -7
  161. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  162. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +15 -11
  163. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  164. package/lib/module/ui/screens/karma/KarmaFAQScreen.js +19 -27
  165. package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  166. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +8 -4
  167. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  168. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +14 -10
  169. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  170. package/lib/module/ui/screens/karma/KarmaRulesScreen.js +7 -3
  171. package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  172. package/lib/module/ui/screens/steps/RecoverRequestStep.js +19 -14
  173. package/lib/module/ui/screens/steps/RecoverRequestStep.js.map +1 -1
  174. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js +125 -0
  175. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -0
  176. package/lib/module/ui/screens/steps/RecoverSuccessStep.js +13 -13
  177. package/lib/module/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
  178. package/lib/module/ui/screens/steps/RecoverVerifyStep.js +14 -20
  179. package/lib/module/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
  180. package/lib/module/ui/screens/steps/SignInPasswordStep.js +22 -8
  181. package/lib/module/ui/screens/steps/SignInPasswordStep.js.map +1 -1
  182. package/lib/module/ui/screens/steps/SignInTotpStep.js +156 -0
  183. package/lib/module/ui/screens/steps/SignInTotpStep.js.map +1 -0
  184. package/lib/module/ui/screens/steps/SignInUsernameStep.js +12 -6
  185. package/lib/module/ui/screens/steps/SignInUsernameStep.js.map +1 -1
  186. package/lib/module/ui/screens/steps/SignUpIdentityStep.js +10 -6
  187. package/lib/module/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
  188. package/lib/module/ui/screens/steps/SignUpSecurityStep.js +10 -6
  189. package/lib/module/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
  190. package/lib/module/ui/screens/steps/SignUpSummaryStep.js +34 -4
  191. package/lib/module/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
  192. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js +9 -10
  193. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
  194. package/lib/module/ui/styles/authStyles.js +1 -2
  195. package/lib/module/ui/styles/authStyles.js.map +1 -1
  196. package/lib/module/utils/deviceManager.js +1 -1
  197. package/lib/module/utils/deviceManager.js.map +1 -1
  198. package/lib/module/utils/validationUtils.js +4 -2
  199. package/lib/module/utils/validationUtils.js.map +1 -1
  200. package/lib/typescript/core/OxyServices.d.ts +58 -3
  201. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  202. package/lib/typescript/i18n/index.d.ts +4 -0
  203. package/lib/typescript/i18n/index.d.ts.map +1 -0
  204. package/lib/typescript/models/interfaces.d.ts +4 -0
  205. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  206. package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
  207. package/lib/typescript/ui/components/Header.d.ts.map +1 -1
  208. package/lib/typescript/ui/components/OxyProvider.d.ts +1 -1
  209. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  210. package/lib/typescript/ui/components/ProfileCard.d.ts.map +1 -1
  211. package/lib/typescript/ui/components/StepBasedScreen.d.ts +2 -1
  212. package/lib/typescript/ui/components/StepBasedScreen.d.ts.map +1 -1
  213. package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
  214. package/lib/typescript/ui/components/internal/PinInput.d.ts +6 -3
  215. package/lib/typescript/ui/components/internal/PinInput.d.ts.map +1 -1
  216. package/lib/typescript/ui/context/OxyContext.d.ts +7 -4
  217. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  218. package/lib/typescript/ui/hooks/useI18n.d.ts +5 -0
  219. package/lib/typescript/ui/hooks/useI18n.d.ts.map +1 -0
  220. package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +1 -1
  221. package/lib/typescript/ui/navigation/routes.d.ts +9 -0
  222. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -0
  223. package/lib/typescript/ui/navigation/types.d.ts +24 -10
  224. package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
  225. package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  226. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  227. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  228. package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  229. package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
  230. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  231. package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  232. package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
  233. package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts.map +1 -1
  234. package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
  235. package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  236. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts +2 -1
  237. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -1
  238. package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts.map +1 -1
  239. package/lib/typescript/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
  240. package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  241. package/lib/typescript/ui/screens/karma/KarmaFAQScreen.d.ts.map +1 -1
  242. package/lib/typescript/ui/screens/karma/KarmaLeaderboardScreen.d.ts.map +1 -1
  243. package/lib/typescript/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
  244. package/lib/typescript/ui/screens/karma/KarmaRulesScreen.d.ts.map +1 -1
  245. package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts +4 -1
  246. package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts.map +1 -1
  247. package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts +24 -0
  248. package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts.map +1 -0
  249. package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts +2 -1
  250. package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts.map +1 -1
  251. package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts +3 -1
  252. package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts.map +1 -1
  253. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts +1 -0
  254. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts.map +1 -1
  255. package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts +19 -0
  256. package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts.map +1 -0
  257. package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts +2 -1
  258. package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts.map +1 -1
  259. package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts +2 -1
  260. package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts.map +1 -1
  261. package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts +2 -1
  262. package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts.map +1 -1
  263. package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts +2 -1
  264. package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts.map +1 -1
  265. package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts +2 -1
  266. package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts.map +1 -1
  267. package/lib/typescript/ui/styles/authStyles.d.ts +0 -1
  268. package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -1
  269. package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
  270. package/package.json +48 -14
  271. package/src/core/OxyServices.ts +143 -9
  272. package/src/i18n/index.ts +39 -0
  273. package/src/i18n/locales/en-US.json +681 -0
  274. package/src/i18n/locales/es-ES.json +689 -0
  275. package/src/models/interfaces.ts +6 -1
  276. package/src/ui/components/GroupedItem.tsx +2 -1
  277. package/src/ui/components/Header.tsx +4 -3
  278. package/src/ui/components/OxyProvider.tsx +105 -112
  279. package/src/ui/components/ProfileCard.tsx +5 -1
  280. package/src/ui/components/Section.tsx +1 -1
  281. package/src/ui/components/StepBasedScreen.tsx +16 -13
  282. package/src/ui/components/internal/GroupedPillButtons.tsx +10 -6
  283. package/src/ui/components/internal/PinInput.tsx +15 -6
  284. package/src/ui/context/OxyContext.tsx +123 -20
  285. package/src/ui/hooks/useI18n.ts +12 -0
  286. package/src/ui/navigation/OxyRouter.tsx +15 -134
  287. package/src/ui/navigation/routes.ts +153 -0
  288. package/src/ui/navigation/types.ts +28 -10
  289. package/src/ui/screens/AccountCenterScreen.tsx +47 -45
  290. package/src/ui/screens/AccountOverviewScreen.tsx +68 -70
  291. package/src/ui/screens/AccountSettingsScreen.tsx +265 -41
  292. package/src/ui/screens/AccountSwitcherScreen.tsx +35 -33
  293. package/src/ui/screens/FeedbackScreen.tsx +39 -37
  294. package/src/ui/screens/LanguageSelectorScreen.tsx +99 -70
  295. package/src/ui/screens/PaymentGatewayScreen.tsx +5 -5
  296. package/src/ui/screens/PremiumSubscriptionScreen.tsx +56 -54
  297. package/src/ui/screens/ProfileScreen.tsx +14 -8
  298. package/src/ui/screens/RecoverAccountScreen.tsx +29 -8
  299. package/src/ui/screens/SignInScreen.tsx +39 -30
  300. package/src/ui/screens/WelcomeNewUserScreen.tsx +31 -17
  301. package/src/ui/screens/internal/SignInPasswordStep.tsx +11 -8
  302. package/src/ui/screens/internal/SignInUsernameStep.tsx +10 -8
  303. package/src/ui/screens/karma/KarmaAboutScreen.tsx +23 -11
  304. package/src/ui/screens/karma/KarmaCenterScreen.tsx +21 -11
  305. package/src/ui/screens/karma/KarmaFAQScreen.tsx +15 -33
  306. package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +6 -4
  307. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +28 -10
  308. package/src/ui/screens/karma/KarmaRulesScreen.tsx +5 -3
  309. package/src/ui/screens/steps/RecoverRequestStep.tsx +20 -17
  310. package/src/ui/screens/steps/RecoverResetPasswordStep.tsx +133 -0
  311. package/src/ui/screens/steps/RecoverSuccessStep.tsx +12 -19
  312. package/src/ui/screens/steps/RecoverVerifyStep.tsx +15 -24
  313. package/src/ui/screens/steps/SignInPasswordStep.tsx +19 -6
  314. package/src/ui/screens/steps/SignInTotpStep.tsx +129 -0
  315. package/src/ui/screens/steps/SignInUsernameStep.tsx +11 -10
  316. package/src/ui/screens/steps/SignUpIdentityStep.tsx +10 -11
  317. package/src/ui/screens/steps/SignUpSecurityStep.tsx +10 -11
  318. package/src/ui/screens/steps/SignUpSummaryStep.tsx +24 -9
  319. package/src/ui/screens/steps/SignUpWelcomeStep.tsx +8 -14
  320. package/src/ui/styles/authStyles.ts +0 -1
  321. package/src/utils/deviceManager.ts +1 -1
  322. 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="Account Switcher"
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...</Text>
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="Title"
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="Brief summary of your feedback"
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="Description"
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="Please provide detailed information..."
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="Email Address"
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 || "Enter your email address"}
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
- Review & Submit
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:</Text>
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:</Text>
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:</Text>
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:</Text>
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:</Text>
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;