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