@oxyhq/services 5.13.0 → 5.13.2

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 (353) hide show
  1. package/README.md +71 -0
  2. package/lib/commonjs/core/HttpClient.js +238 -0
  3. package/lib/commonjs/core/HttpClient.js.map +1 -0
  4. package/lib/commonjs/core/OxyServices.js +530 -332
  5. package/lib/commonjs/core/OxyServices.js.map +1 -1
  6. package/lib/commonjs/core/RequestManager.js +199 -0
  7. package/lib/commonjs/core/RequestManager.js.map +1 -0
  8. package/lib/commonjs/core/index.js +38 -1
  9. package/lib/commonjs/core/index.js.map +1 -1
  10. package/lib/commonjs/i18n/index.js +37 -1
  11. package/lib/commonjs/i18n/index.js.map +1 -1
  12. package/lib/commonjs/i18n/locales/ar-SA.json +128 -0
  13. package/lib/commonjs/i18n/locales/ca-ES.json +128 -0
  14. package/lib/commonjs/i18n/locales/de-DE.json +128 -0
  15. package/lib/commonjs/i18n/locales/en-US.json +85 -12
  16. package/lib/commonjs/i18n/locales/es-ES.json +58 -6
  17. package/lib/commonjs/i18n/locales/fr-FR.json +128 -0
  18. package/lib/commonjs/i18n/locales/it-IT.json +128 -0
  19. package/lib/commonjs/i18n/locales/ja-JP.json +127 -0
  20. package/lib/commonjs/i18n/locales/ko-KR.json +128 -0
  21. package/lib/commonjs/i18n/locales/pt-PT.json +128 -0
  22. package/lib/commonjs/i18n/locales/zh-CN.json +128 -0
  23. package/lib/commonjs/index.js +36 -0
  24. package/lib/commonjs/index.js.map +1 -1
  25. package/lib/commonjs/ui/components/Avatar.js +94 -27
  26. package/lib/commonjs/ui/components/Avatar.js.map +1 -1
  27. package/lib/commonjs/ui/components/FollowButton.js +1 -0
  28. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  29. package/lib/commonjs/ui/components/FontLoader.js +22 -42
  30. package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
  31. package/lib/commonjs/ui/components/OxyProvider.js +5 -8
  32. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  33. package/lib/commonjs/ui/components/StepBasedScreen.js +64 -44
  34. package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
  35. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +14 -35
  36. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
  37. package/lib/commonjs/ui/components/internal/PinInput.js +2 -2
  38. package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
  39. package/lib/commonjs/ui/components/internal/TextField.js +13 -8
  40. package/lib/commonjs/ui/components/internal/TextField.js.map +1 -1
  41. package/lib/commonjs/ui/context/OxyContext.js +443 -371
  42. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  43. package/lib/commonjs/ui/hooks/useSessionSocket.js +80 -22
  44. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  45. package/lib/commonjs/ui/index.js +4 -1
  46. package/lib/commonjs/ui/index.js.map +1 -1
  47. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +32 -2
  48. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  49. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +101 -59
  50. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  51. package/lib/commonjs/ui/screens/FileManagementScreen.js +3 -2
  52. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  53. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +75 -117
  54. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  55. package/lib/commonjs/ui/screens/SignInScreen.js +43 -50
  56. package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
  57. package/lib/commonjs/ui/screens/SignUpScreen.js +14 -16
  58. package/lib/commonjs/ui/screens/SignUpScreen.js.map +1 -1
  59. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +188 -142
  60. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  61. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +10 -10
  62. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -1
  63. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +2 -4
  64. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -1
  65. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js +45 -25
  66. package/lib/commonjs/ui/screens/steps/RecoverRequestStep.js.map +1 -1
  67. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js +88 -53
  68. package/lib/commonjs/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -1
  69. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js +79 -58
  70. package/lib/commonjs/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
  71. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js +61 -52
  72. package/lib/commonjs/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
  73. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js +218 -39
  74. package/lib/commonjs/ui/screens/steps/SignInPasswordStep.js.map +1 -1
  75. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js +77 -50
  76. package/lib/commonjs/ui/screens/steps/SignInTotpStep.js.map +1 -1
  77. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js +424 -71
  78. package/lib/commonjs/ui/screens/steps/SignInUsernameStep.js.map +1 -1
  79. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js +55 -30
  80. package/lib/commonjs/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
  81. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js +64 -46
  82. package/lib/commonjs/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
  83. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js +84 -146
  84. package/lib/commonjs/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
  85. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js +113 -34
  86. package/lib/commonjs/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
  87. package/lib/commonjs/ui/stores/accountStore.js +237 -0
  88. package/lib/commonjs/ui/stores/accountStore.js.map +1 -0
  89. package/lib/commonjs/ui/stores/authStore.js +17 -20
  90. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  91. package/lib/commonjs/ui/styles/authStyles.js +16 -8
  92. package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
  93. package/lib/commonjs/ui/styles/index.js +11 -0
  94. package/lib/commonjs/ui/styles/index.js.map +1 -1
  95. package/lib/commonjs/ui/styles/spacing.js +51 -0
  96. package/lib/commonjs/ui/styles/spacing.js.map +1 -0
  97. package/lib/commonjs/utils/asyncUtils.js +9 -22
  98. package/lib/commonjs/utils/asyncUtils.js.map +1 -1
  99. package/lib/commonjs/utils/cache.js +259 -0
  100. package/lib/commonjs/utils/cache.js.map +1 -0
  101. package/lib/commonjs/utils/index.js +99 -0
  102. package/lib/commonjs/utils/index.js.map +1 -1
  103. package/lib/commonjs/utils/languageUtils.js +159 -0
  104. package/lib/commonjs/utils/languageUtils.js.map +1 -0
  105. package/lib/commonjs/utils/requestUtils.js +217 -0
  106. package/lib/commonjs/utils/requestUtils.js.map +1 -0
  107. package/lib/commonjs/utils/sessionUtils.js +191 -0
  108. package/lib/commonjs/utils/sessionUtils.js.map +1 -0
  109. package/lib/commonjs/utils/validationUtils.js +1 -1
  110. package/lib/module/core/HttpClient.js +232 -0
  111. package/lib/module/core/HttpClient.js.map +1 -0
  112. package/lib/module/core/OxyServices.js +528 -326
  113. package/lib/module/core/OxyServices.js.map +1 -1
  114. package/lib/module/core/RequestManager.js +194 -0
  115. package/lib/module/core/RequestManager.js.map +1 -0
  116. package/lib/module/core/index.js +2 -0
  117. package/lib/module/core/index.js.map +1 -1
  118. package/lib/module/i18n/index.js +37 -1
  119. package/lib/module/i18n/index.js.map +1 -1
  120. package/lib/module/i18n/locales/ar-SA.json +128 -0
  121. package/lib/module/i18n/locales/ca-ES.json +128 -0
  122. package/lib/module/i18n/locales/de-DE.json +128 -0
  123. package/lib/module/i18n/locales/en-US.json +85 -12
  124. package/lib/module/i18n/locales/es-ES.json +58 -6
  125. package/lib/module/i18n/locales/fr-FR.json +128 -0
  126. package/lib/module/i18n/locales/it-IT.json +128 -0
  127. package/lib/module/i18n/locales/ja-JP.json +127 -0
  128. package/lib/module/i18n/locales/ko-KR.json +128 -0
  129. package/lib/module/i18n/locales/pt-PT.json +128 -0
  130. package/lib/module/i18n/locales/zh-CN.json +128 -0
  131. package/lib/module/index.js +2 -0
  132. package/lib/module/index.js.map +1 -1
  133. package/lib/module/ui/components/Avatar.js +94 -27
  134. package/lib/module/ui/components/Avatar.js.map +1 -1
  135. package/lib/module/ui/components/FollowButton.js +1 -0
  136. package/lib/module/ui/components/FollowButton.js.map +1 -1
  137. package/lib/module/ui/components/FontLoader.js +23 -43
  138. package/lib/module/ui/components/FontLoader.js.map +1 -1
  139. package/lib/module/ui/components/OxyProvider.js +6 -8
  140. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  141. package/lib/module/ui/components/StepBasedScreen.js +65 -45
  142. package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
  143. package/lib/module/ui/components/internal/GroupedPillButtons.js +14 -35
  144. package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
  145. package/lib/module/ui/components/internal/PinInput.js +2 -2
  146. package/lib/module/ui/components/internal/PinInput.js.map +1 -1
  147. package/lib/module/ui/components/internal/TextField.js +13 -8
  148. package/lib/module/ui/components/internal/TextField.js.map +1 -1
  149. package/lib/module/ui/context/OxyContext.js +442 -370
  150. package/lib/module/ui/context/OxyContext.js.map +1 -1
  151. package/lib/module/ui/hooks/useSessionSocket.js +80 -22
  152. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  153. package/lib/module/ui/index.js +4 -2
  154. package/lib/module/ui/index.js.map +1 -1
  155. package/lib/module/ui/screens/AccountSettingsScreen.js +33 -2
  156. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  157. package/lib/module/ui/screens/AccountSwitcherScreen.js +102 -60
  158. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  159. package/lib/module/ui/screens/FileManagementScreen.js +3 -2
  160. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  161. package/lib/module/ui/screens/LanguageSelectorScreen.js +73 -117
  162. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  163. package/lib/module/ui/screens/SignInScreen.js +44 -51
  164. package/lib/module/ui/screens/SignInScreen.js.map +1 -1
  165. package/lib/module/ui/screens/SignUpScreen.js +14 -16
  166. package/lib/module/ui/screens/SignUpScreen.js.map +1 -1
  167. package/lib/module/ui/screens/WelcomeNewUserScreen.js +187 -143
  168. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  169. package/lib/module/ui/screens/internal/SignInPasswordStep.js +10 -10
  170. package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -1
  171. package/lib/module/ui/screens/internal/SignInUsernameStep.js +2 -4
  172. package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -1
  173. package/lib/module/ui/screens/steps/RecoverRequestStep.js +45 -25
  174. package/lib/module/ui/screens/steps/RecoverRequestStep.js.map +1 -1
  175. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js +89 -54
  176. package/lib/module/ui/screens/steps/RecoverResetPasswordStep.js.map +1 -1
  177. package/lib/module/ui/screens/steps/RecoverSuccessStep.js +80 -59
  178. package/lib/module/ui/screens/steps/RecoverSuccessStep.js.map +1 -1
  179. package/lib/module/ui/screens/steps/RecoverVerifyStep.js +62 -53
  180. package/lib/module/ui/screens/steps/RecoverVerifyStep.js.map +1 -1
  181. package/lib/module/ui/screens/steps/SignInPasswordStep.js +219 -40
  182. package/lib/module/ui/screens/steps/SignInPasswordStep.js.map +1 -1
  183. package/lib/module/ui/screens/steps/SignInTotpStep.js +78 -51
  184. package/lib/module/ui/screens/steps/SignInTotpStep.js.map +1 -1
  185. package/lib/module/ui/screens/steps/SignInUsernameStep.js +426 -73
  186. package/lib/module/ui/screens/steps/SignInUsernameStep.js.map +1 -1
  187. package/lib/module/ui/screens/steps/SignUpIdentityStep.js +55 -30
  188. package/lib/module/ui/screens/steps/SignUpIdentityStep.js.map +1 -1
  189. package/lib/module/ui/screens/steps/SignUpSecurityStep.js +65 -47
  190. package/lib/module/ui/screens/steps/SignUpSecurityStep.js.map +1 -1
  191. package/lib/module/ui/screens/steps/SignUpSummaryStep.js +84 -146
  192. package/lib/module/ui/screens/steps/SignUpSummaryStep.js.map +1 -1
  193. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js +114 -35
  194. package/lib/module/ui/screens/steps/SignUpWelcomeStep.js.map +1 -1
  195. package/lib/module/ui/stores/accountStore.js +229 -0
  196. package/lib/module/ui/stores/accountStore.js.map +1 -0
  197. package/lib/module/ui/stores/authStore.js +17 -20
  198. package/lib/module/ui/stores/authStore.js.map +1 -1
  199. package/lib/module/ui/styles/authStyles.js +16 -8
  200. package/lib/module/ui/styles/authStyles.js.map +1 -1
  201. package/lib/module/ui/styles/index.js +1 -0
  202. package/lib/module/ui/styles/index.js.map +1 -1
  203. package/lib/module/ui/styles/spacing.js +48 -0
  204. package/lib/module/ui/styles/spacing.js.map +1 -0
  205. package/lib/module/utils/asyncUtils.js +10 -22
  206. package/lib/module/utils/asyncUtils.js.map +1 -1
  207. package/lib/module/utils/cache.js +250 -0
  208. package/lib/module/utils/cache.js.map +1 -0
  209. package/lib/module/utils/index.js +7 -0
  210. package/lib/module/utils/index.js.map +1 -1
  211. package/lib/module/utils/languageUtils.js +151 -0
  212. package/lib/module/utils/languageUtils.js.map +1 -0
  213. package/lib/module/utils/requestUtils.js +210 -0
  214. package/lib/module/utils/requestUtils.js.map +1 -0
  215. package/lib/module/utils/sessionUtils.js +180 -0
  216. package/lib/module/utils/sessionUtils.js.map +1 -0
  217. package/lib/module/utils/validationUtils.js +1 -1
  218. package/lib/typescript/core/HttpClient.d.ts +64 -0
  219. package/lib/typescript/core/HttpClient.d.ts.map +1 -0
  220. package/lib/typescript/core/OxyServices.d.ts +86 -73
  221. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  222. package/lib/typescript/core/RequestManager.d.ts +67 -0
  223. package/lib/typescript/core/RequestManager.d.ts.map +1 -0
  224. package/lib/typescript/core/index.d.ts +2 -0
  225. package/lib/typescript/core/index.d.ts.map +1 -1
  226. package/lib/typescript/i18n/index.d.ts.map +1 -1
  227. package/lib/typescript/index.d.ts +2 -0
  228. package/lib/typescript/index.d.ts.map +1 -1
  229. package/lib/typescript/models/interfaces.d.ts +15 -0
  230. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  231. package/lib/typescript/models/session.d.ts +1 -0
  232. package/lib/typescript/models/session.d.ts.map +1 -1
  233. package/lib/typescript/ui/components/Avatar.d.ts +6 -7
  234. package/lib/typescript/ui/components/Avatar.d.ts.map +1 -1
  235. package/lib/typescript/ui/components/FollowButton.d.ts.map +1 -1
  236. package/lib/typescript/ui/components/FontLoader.d.ts +3 -3
  237. package/lib/typescript/ui/components/FontLoader.d.ts.map +1 -1
  238. package/lib/typescript/ui/components/OxyProvider.d.ts +2 -2
  239. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  240. package/lib/typescript/ui/components/StepBasedScreen.d.ts.map +1 -1
  241. package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
  242. package/lib/typescript/ui/components/internal/TextField.d.ts.map +1 -1
  243. package/lib/typescript/ui/context/OxyContext.d.ts +5 -0
  244. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  245. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
  246. package/lib/typescript/ui/index.d.ts +2 -2
  247. package/lib/typescript/ui/index.d.ts.map +1 -1
  248. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  249. package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  250. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts +3 -3
  251. package/lib/typescript/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  252. package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
  253. package/lib/typescript/ui/screens/SignUpScreen.d.ts.map +1 -1
  254. package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  255. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -1
  256. package/lib/typescript/ui/screens/steps/RecoverRequestStep.d.ts.map +1 -1
  257. package/lib/typescript/ui/screens/steps/RecoverResetPasswordStep.d.ts.map +1 -1
  258. package/lib/typescript/ui/screens/steps/RecoverSuccessStep.d.ts.map +1 -1
  259. package/lib/typescript/ui/screens/steps/RecoverVerifyStep.d.ts.map +1 -1
  260. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts +2 -0
  261. package/lib/typescript/ui/screens/steps/SignInPasswordStep.d.ts.map +1 -1
  262. package/lib/typescript/ui/screens/steps/SignInTotpStep.d.ts.map +1 -1
  263. package/lib/typescript/ui/screens/steps/SignInUsernameStep.d.ts.map +1 -1
  264. package/lib/typescript/ui/screens/steps/SignUpIdentityStep.d.ts.map +1 -1
  265. package/lib/typescript/ui/screens/steps/SignUpSecurityStep.d.ts.map +1 -1
  266. package/lib/typescript/ui/screens/steps/SignUpSummaryStep.d.ts.map +1 -1
  267. package/lib/typescript/ui/screens/steps/SignUpWelcomeStep.d.ts.map +1 -1
  268. package/lib/typescript/ui/stores/accountStore.d.ts +34 -0
  269. package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -0
  270. package/lib/typescript/ui/stores/authStore.d.ts +7 -3
  271. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  272. package/lib/typescript/ui/styles/authStyles.d.ts +19 -2
  273. package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -1
  274. package/lib/typescript/ui/styles/index.d.ts +1 -0
  275. package/lib/typescript/ui/styles/index.d.ts.map +1 -1
  276. package/lib/typescript/ui/styles/spacing.d.ts +43 -0
  277. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -0
  278. package/lib/typescript/utils/asyncUtils.d.ts +2 -0
  279. package/lib/typescript/utils/asyncUtils.d.ts.map +1 -1
  280. package/lib/typescript/utils/cache.d.ts +128 -0
  281. package/lib/typescript/utils/cache.d.ts.map +1 -0
  282. package/lib/typescript/utils/index.d.ts +4 -0
  283. package/lib/typescript/utils/index.d.ts.map +1 -1
  284. package/lib/typescript/utils/languageUtils.d.ts +38 -0
  285. package/lib/typescript/utils/languageUtils.d.ts.map +1 -0
  286. package/lib/typescript/utils/requestUtils.d.ts +122 -0
  287. package/lib/typescript/utils/requestUtils.d.ts.map +1 -0
  288. package/lib/typescript/utils/sessionUtils.d.ts +55 -0
  289. package/lib/typescript/utils/sessionUtils.d.ts.map +1 -0
  290. package/lib/typescript/utils/validationUtils.d.ts +1 -1
  291. package/package.json +1 -1
  292. package/src/core/HttpClient.ts +277 -0
  293. package/src/core/OxyServices.ts +461 -352
  294. package/src/core/RequestManager.ts +240 -0
  295. package/src/core/index.ts +10 -0
  296. package/src/i18n/index.ts +36 -0
  297. package/src/i18n/locales/ar-SA.json +128 -0
  298. package/src/i18n/locales/ca-ES.json +128 -0
  299. package/src/i18n/locales/de-DE.json +128 -0
  300. package/src/i18n/locales/en-US.json +85 -12
  301. package/src/i18n/locales/es-ES.json +58 -6
  302. package/src/i18n/locales/fr-FR.json +128 -0
  303. package/src/i18n/locales/it-IT.json +128 -0
  304. package/src/i18n/locales/ja-JP.json +127 -0
  305. package/src/i18n/locales/ko-KR.json +128 -0
  306. package/src/i18n/locales/pt-PT.json +128 -0
  307. package/src/i18n/locales/zh-CN.json +128 -0
  308. package/src/index.ts +10 -0
  309. package/src/models/interfaces.ts +19 -0
  310. package/src/models/session.ts +1 -1
  311. package/src/ui/components/Avatar.tsx +151 -35
  312. package/src/ui/components/FollowButton.tsx +1 -0
  313. package/src/ui/components/FontLoader.tsx +17 -37
  314. package/src/ui/components/OxyProvider.tsx +14 -13
  315. package/src/ui/components/StepBasedScreen.tsx +66 -43
  316. package/src/ui/components/internal/GroupedPillButtons.tsx +15 -31
  317. package/src/ui/components/internal/PinInput.tsx +2 -2
  318. package/src/ui/components/internal/TextField.tsx +7 -6
  319. package/src/ui/context/OxyContext.tsx +441 -326
  320. package/src/ui/hooks/useSessionSocket.ts +72 -18
  321. package/src/ui/index.ts +4 -1
  322. package/src/ui/screens/AccountSettingsScreen.tsx +34 -2
  323. package/src/ui/screens/AccountSwitcherScreen.tsx +102 -68
  324. package/src/ui/screens/FileManagementScreen.tsx +16 -16
  325. package/src/ui/screens/LanguageSelectorScreen.tsx +86 -143
  326. package/src/ui/screens/SignInScreen.tsx +59 -43
  327. package/src/ui/screens/SignUpScreen.tsx +14 -15
  328. package/src/ui/screens/WelcomeNewUserScreen.tsx +153 -105
  329. package/src/ui/screens/internal/SignInPasswordStep.tsx +4 -6
  330. package/src/ui/screens/internal/SignInUsernameStep.tsx +1 -1
  331. package/src/ui/screens/steps/RecoverRequestStep.tsx +34 -24
  332. package/src/ui/screens/steps/RecoverResetPasswordStep.tsx +65 -36
  333. package/src/ui/screens/steps/RecoverSuccessStep.tsx +71 -47
  334. package/src/ui/screens/steps/RecoverVerifyStep.tsx +60 -50
  335. package/src/ui/screens/steps/SignInPasswordStep.tsx +190 -32
  336. package/src/ui/screens/steps/SignInTotpStep.tsx +68 -34
  337. package/src/ui/screens/steps/SignInUsernameStep.tsx +446 -63
  338. package/src/ui/screens/steps/SignUpIdentityStep.tsx +49 -35
  339. package/src/ui/screens/steps/SignUpSecurityStep.tsx +56 -39
  340. package/src/ui/screens/steps/SignUpSummaryStep.tsx +99 -89
  341. package/src/ui/screens/steps/SignUpWelcomeStep.tsx +88 -20
  342. package/src/ui/stores/accountStore.ts +285 -0
  343. package/src/ui/stores/authStore.ts +16 -19
  344. package/src/ui/styles/authStyles.ts +16 -8
  345. package/src/ui/styles/index.ts +1 -0
  346. package/src/ui/styles/spacing.ts +46 -0
  347. package/src/utils/asyncUtils.ts +10 -24
  348. package/src/utils/cache.ts +264 -0
  349. package/src/utils/index.ts +19 -0
  350. package/src/utils/languageUtils.ts +174 -0
  351. package/src/utils/requestUtils.ts +234 -0
  352. package/src/utils/sessionUtils.ts +206 -0
  353. package/src/utils/validationUtils.ts +1 -1
@@ -1,9 +1,10 @@
1
1
  import type React from 'react';
2
2
  import type { RouteName } from '../../navigation/routes';
3
- import { View, Text } from 'react-native';
3
+ import { View, Text, StyleSheet } from 'react-native';
4
4
  import { Ionicons } from '@expo/vector-icons';
5
5
  import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
6
6
  import { useI18n } from '../../hooks/useI18n';
7
+ import { STEP_INNER_GAP, stepStyles } from '../../styles/spacing';
7
8
 
8
9
  interface RecoverSuccessStepProps {
9
10
  // Common props from StepBasedScreen
@@ -35,6 +36,7 @@ const RecoverSuccessStep: React.FC<RecoverSuccessStepProps> = ({
35
36
  successMessage,
36
37
  }) => {
37
38
  const { t } = useI18n();
39
+ const baseStyles = stepStyles;
38
40
  // Extract identifier from previous steps
39
41
  const requestData = allStepData[0] || {};
40
42
  const { identifier } = requestData;
@@ -50,75 +52,97 @@ const RecoverSuccessStep: React.FC<RecoverSuccessStepProps> = ({
50
52
 
51
53
  return (
52
54
  <>
53
- <View style={{
54
- alignItems: 'center',
55
- justifyContent: 'center',
56
- marginBottom: 32,
57
- }}>
58
- <View style={{
59
- width: 80,
60
- height: 80,
61
- borderRadius: 40,
62
- backgroundColor: colors.success + '20',
63
- alignItems: 'center',
64
- justifyContent: 'center',
65
- marginBottom: 24,
66
- }}>
55
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, stylesheet.iconContainer]}>
56
+ <View style={[stylesheet.successIcon, { backgroundColor: colors.success + '20' }]}>
67
57
  <Ionicons name="checkmark-circle" size={40} color={colors.success} />
68
58
  </View>
69
59
  </View>
70
60
 
71
- <View style={styles.modernHeader}>
72
- <Text style={[styles.modernTitle, { color: colors.text }]}>{t('recover.title')}</Text>
73
- <Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>{successMessage || t('recover.resetSuccess')}</Text>
61
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, baseStyles.header]}>
62
+ <Text style={[styles.modernTitle, baseStyles.title, { color: colors.text, marginBottom: 0, marginTop: 0 }]}>{t('recover.title')}</Text>
63
+ <Text style={[styles.modernSubtitle, baseStyles.subtitle, { color: colors.secondaryText, marginBottom: 0, marginTop: 0 }]}>{successMessage || t('recover.resetSuccess')}</Text>
74
64
  </View>
75
65
 
76
- <View style={styles.modernInputContainer}>
77
- <View style={{
78
- padding: 20,
66
+ <View style={[baseStyles.container, baseStyles.sectionSpacing]}>
67
+ <View style={[stylesheet.infoCard, {
79
68
  backgroundColor: colors.inputBackground,
80
- borderRadius: 16,
81
- borderWidth: 1,
82
69
  borderColor: colors.border,
83
- marginBottom: 24,
84
- }}>
85
- <Text style={[styles.footerText, { color: colors.text, fontSize: 16, marginBottom: 8 }]}>
70
+ }]}>
71
+ <Text style={[styles.footerText, stylesheet.infoTitle, { color: colors.text }]}>
86
72
  {t('recover.whatsNextTitle') || "What's next?"}
87
73
  </Text>
88
- <Text style={[styles.footerText, { color: colors.secondaryText, fontSize: 14, lineHeight: 20 }]}>
74
+ <Text style={[styles.footerText, stylesheet.infoBody, { color: colors.secondaryText }]}>
89
75
  {t('recover.whatsNextBody') || 'You can now reset your password or return to sign in with your existing credentials.'}
90
76
  </Text>
91
77
  </View>
92
78
 
93
- <View style={{
94
- flexDirection: 'row',
95
- alignItems: 'center',
96
- padding: 12,
79
+ <View style={[stylesheet.successBanner, {
97
80
  backgroundColor: colors.success + '10',
98
- borderRadius: 8,
99
- borderWidth: 1,
100
81
  borderColor: colors.success + '30',
101
- }}>
102
- <Ionicons name="shield-checkmark" size={20} color={colors.success} style={{ marginRight: 8 }} />
103
- <Text style={[styles.footerText, { color: colors.success, fontSize: 14, flex: 1 }]}>
82
+ }]}>
83
+ <Ionicons name="shield-checkmark" size={20} color={colors.success} />
84
+ <Text style={[styles.footerText, stylesheet.bannerText, { color: colors.success }]}>
104
85
  {successMessage || t('recover.completeSecure') || 'Your account recovery is complete and secure.'}
105
86
  </Text>
106
87
  </View>
107
88
  </View>
108
89
 
109
- <GroupedPillButtons
110
- buttons={[
111
- {
112
- text: t('common.actions.signIn'),
113
- onPress: handleBackToSignIn,
114
- icon: 'arrow-back',
115
- variant: 'transparent',
116
- },
117
- ]}
118
- colors={colors}
119
- />
90
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, baseStyles.buttonContainer]}>
91
+ <GroupedPillButtons
92
+ buttons={[
93
+ {
94
+ text: t('common.actions.signIn'),
95
+ onPress: handleBackToSignIn,
96
+ icon: 'arrow-back',
97
+ variant: 'transparent',
98
+ },
99
+ ]}
100
+ colors={colors}
101
+ />
102
+ </View>
120
103
  </>
121
104
  );
122
105
  };
123
106
 
124
107
  export default RecoverSuccessStep;
108
+
109
+ const stylesheet = StyleSheet.create({
110
+ iconContainer: {
111
+ alignItems: 'center',
112
+ justifyContent: 'center',
113
+ },
114
+ successIcon: {
115
+ width: 80,
116
+ height: 80,
117
+ borderRadius: 40,
118
+ alignItems: 'center',
119
+ justifyContent: 'center',
120
+ },
121
+ infoCard: {
122
+ padding: STEP_INNER_GAP * 2,
123
+ borderRadius: 16,
124
+ borderWidth: 1,
125
+ marginBottom: STEP_INNER_GAP,
126
+ gap: STEP_INNER_GAP,
127
+ },
128
+ infoTitle: {
129
+ fontSize: 16,
130
+ marginBottom: 0,
131
+ },
132
+ infoBody: {
133
+ fontSize: 14,
134
+ lineHeight: 20,
135
+ },
136
+ successBanner: {
137
+ flexDirection: 'row',
138
+ alignItems: 'center',
139
+ padding: STEP_INNER_GAP,
140
+ borderRadius: 8,
141
+ borderWidth: 1,
142
+ gap: STEP_INNER_GAP,
143
+ },
144
+ bannerText: {
145
+ flex: 1,
146
+ fontSize: 14,
147
+ },
148
+ });
@@ -1,11 +1,12 @@
1
1
  import type React from 'react';
2
2
  import type { RouteName } from '../../navigation/routes';
3
- import { View, Text } from 'react-native';
3
+ import { View, Text, StyleSheet } from 'react-native';
4
4
  import { Ionicons } from '@expo/vector-icons';
5
5
  import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
6
6
  import PinInput from '../../components/internal/PinInput';
7
7
  import { toast } from '../../../lib/sonner';
8
8
  import { useI18n } from '../../hooks/useI18n';
9
+ import { STEP_INNER_GAP, stepStyles } from '../../styles/spacing';
9
10
 
10
11
  interface RecoverVerifyStepProps {
11
12
  // Common props from StepBasedScreen
@@ -52,6 +53,7 @@ const RecoverVerifyStep: React.FC<RecoverVerifyStepProps> = ({
52
53
  identifier,
53
54
  }) => {
54
55
  const { t } = useI18n();
56
+ const baseStyles = stepStyles;
55
57
  const handleVerifyCode = async () => {
56
58
  setErrorMessage('');
57
59
  setSuccessMessage('');
@@ -66,33 +68,29 @@ const RecoverVerifyStep: React.FC<RecoverVerifyStepProps> = ({
66
68
 
67
69
  return (
68
70
  <>
69
- <View style={styles.modernHeader}>
70
- <Text style={[styles.modernTitle, { color: colors.text }]}>{t('recover.verify.title')}</Text>
71
- <Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>{t('recover.enterCode')}</Text>
71
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, baseStyles.header]}>
72
+ <Text style={[styles.modernTitle, baseStyles.title, { color: colors.text, marginBottom: 0, marginTop: 0 }]}>{t('recover.verify.title')}</Text>
73
+ <Text style={[styles.modernSubtitle, baseStyles.subtitle, { color: colors.secondaryText, marginBottom: 0, marginTop: 0 }]}>{t('recover.enterCode')}</Text>
72
74
  </View>
73
75
 
74
- <View style={styles.modernInputContainer}>
75
- <PinInput
76
- value={verificationCode}
77
- onChange={setVerificationCode}
78
- length={6}
79
- disabled={isLoading}
80
- autoFocus
81
- colors={colors}
82
- />
76
+ <View style={[baseStyles.container, baseStyles.sectionSpacing]}>
77
+ <View style={stylesheet.pinInputWrapper}>
78
+ <PinInput
79
+ value={verificationCode}
80
+ onChange={setVerificationCode}
81
+ length={6}
82
+ disabled={isLoading}
83
+ autoFocus
84
+ colors={colors}
85
+ />
86
+ </View>
83
87
 
84
88
  {successMessage && (
85
- <View style={{
86
- flexDirection: 'row',
87
- alignItems: 'center',
88
- marginTop: 16,
89
- padding: 12,
89
+ <View style={[stylesheet.messageContainer, {
90
90
  backgroundColor: colors.success + '10',
91
- borderRadius: 8,
92
- borderWidth: 1,
93
91
  borderColor: colors.success + '30',
94
- }}>
95
- <Ionicons name="checkmark-circle" size={20} color={colors.success} style={{ marginRight: 8 }} />
92
+ }]}>
93
+ <Ionicons name="checkmark-circle" size={20} color={colors.success} />
96
94
  <Text style={[styles.footerText, { color: colors.success, fontSize: 14 }]}>
97
95
  {successMessage}
98
96
  </Text>
@@ -100,17 +98,11 @@ const RecoverVerifyStep: React.FC<RecoverVerifyStepProps> = ({
100
98
  )}
101
99
 
102
100
  {errorMessage && (
103
- <View style={{
104
- flexDirection: 'row',
105
- alignItems: 'center',
106
- marginTop: 16,
107
- padding: 12,
101
+ <View style={[stylesheet.messageContainer, {
108
102
  backgroundColor: colors.error + '10',
109
- borderRadius: 8,
110
- borderWidth: 1,
111
103
  borderColor: colors.error + '30',
112
- }}>
113
- <Ionicons name="alert-circle" size={20} color={colors.error} style={{ marginRight: 8 }} />
104
+ }]}>
105
+ <Ionicons name="alert-circle" size={20} color={colors.error} />
114
106
  <Text style={[styles.footerText, { color: colors.error, fontSize: 14 }]}>
115
107
  {errorMessage}
116
108
  </Text>
@@ -118,27 +110,45 @@ const RecoverVerifyStep: React.FC<RecoverVerifyStepProps> = ({
118
110
  )}
119
111
  </View>
120
112
 
121
- <GroupedPillButtons
122
- buttons={[
123
- {
124
- text: t('common.actions.back'),
125
- onPress: prevStep,
126
- icon: 'arrow-back',
127
- variant: 'transparent',
128
- },
129
- {
130
- text: t('recover.verify.action'),
131
- onPress: handleVerifyCode,
132
- icon: 'checkmark-circle-outline',
133
- variant: 'primary',
134
- loading: isLoading,
135
- disabled: isLoading || verificationCode.length !== 6,
136
- },
137
- ]}
138
- colors={colors}
139
- />
113
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, baseStyles.buttonContainer]}>
114
+ <GroupedPillButtons
115
+ buttons={[
116
+ {
117
+ text: t('common.actions.back'),
118
+ onPress: prevStep,
119
+ icon: 'arrow-back',
120
+ variant: 'transparent',
121
+ },
122
+ {
123
+ text: t('recover.verify.action'),
124
+ onPress: handleVerifyCode,
125
+ icon: 'checkmark-circle-outline',
126
+ variant: 'primary',
127
+ loading: isLoading,
128
+ disabled: isLoading || verificationCode.length !== 6,
129
+ },
130
+ ]}
131
+ colors={colors}
132
+ />
133
+ </View>
140
134
  </>
141
135
  );
142
136
  };
143
137
 
144
138
  export default RecoverVerifyStep;
139
+
140
+ const stylesheet = StyleSheet.create({
141
+ pinInputWrapper: {
142
+ marginBottom: 0,
143
+ marginTop: 0,
144
+ },
145
+ messageContainer: {
146
+ flexDirection: 'row',
147
+ alignItems: 'center',
148
+ marginTop: STEP_INNER_GAP,
149
+ padding: STEP_INNER_GAP,
150
+ borderRadius: 8,
151
+ borderWidth: 1,
152
+ gap: STEP_INNER_GAP,
153
+ },
154
+ });
@@ -1,11 +1,13 @@
1
1
  import type React from 'react';
2
2
  import { useRef, useEffect } from 'react';
3
- import { View, Text, TouchableOpacity } from 'react-native';
3
+ import { View, Text, TouchableOpacity, Platform, StyleSheet, type ViewStyle, type TextStyle } from 'react-native';
4
4
  import { Ionicons } from '@expo/vector-icons';
5
5
  import Avatar from '../../components/Avatar';
6
6
  import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
7
7
  import TextField from '../../components/internal/TextField';
8
8
  import { useI18n } from '../../hooks/useI18n';
9
+ import { useOxy } from '../../context/OxyContext';
10
+ import { STEP_GAP, STEP_INNER_GAP, stepStyles } from '../../styles/spacing';
9
11
 
10
12
  interface SignInPasswordStepProps {
11
13
  // Common props from StepBasedScreen
@@ -41,6 +43,8 @@ interface SignInPasswordStepProps {
41
43
  // Sign-in function
42
44
  handleSignIn: () => Promise<void>;
43
45
  mfaToken?: string | null;
46
+ existingSession?: any;
47
+ handleContinueWithExistingAccount?: () => Promise<void>;
44
48
  }
45
49
 
46
50
  const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
@@ -61,9 +65,14 @@ const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
61
65
  username,
62
66
  handleSignIn,
63
67
  mfaToken,
68
+ existingSession,
69
+ handleContinueWithExistingAccount,
64
70
  }) => {
65
71
  const inputRef = useRef<any>(null);
66
72
  const { t } = useI18n();
73
+ const { oxyServices } = useOxy();
74
+ const baseStyles = stepStyles;
75
+ const webShadowReset = Platform.OS === 'web' ? ({ boxShadow: 'none' } as any) : null;
67
76
 
68
77
  const handlePasswordChange = (text: string) => {
69
78
  setPassword(text);
@@ -72,7 +81,7 @@ const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
72
81
 
73
82
  const handleSignInSubmit = async () => {
74
83
  if (!password) {
75
- setErrorMessage('Please enter your password.');
84
+ setErrorMessage(t('signin.password.required') || 'Please enter your password.');
76
85
  setTimeout(() => inputRef.current?.focus(), 0);
77
86
  return;
78
87
  }
@@ -102,28 +111,96 @@ const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
102
111
  }
103
112
  }, [mfaToken, nextStep]);
104
113
 
114
+ // If account is already signed in, show "continue" UI instead of password
115
+ if (existingSession && handleContinueWithExistingAccount) {
116
+ return (
117
+ <>
118
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, stylesheet.userProfileContainer]}>
119
+ <Avatar
120
+ name={userProfile?.displayName || userProfile?.name || username}
121
+ size={100}
122
+ theme={theme as 'light' | 'dark'}
123
+ backgroundColor={colors.primary + '20'}
124
+ uri={userProfile?.avatar && oxyServices ? oxyServices.getFileDownloadUrl(userProfile.avatar, 'thumb') : undefined}
125
+ />
126
+ <Text style={[styles.modernUserDisplayName, stylesheet.displayName, { color: colors.text, marginBottom: 0, marginTop: 0 }]}>
127
+ {userProfile?.displayName || userProfile?.name || username}
128
+ </Text>
129
+ <Text style={[styles.modernUsernameSubtext, stylesheet.usernameSubtext, { color: colors.secondaryText, marginBottom: 0, marginTop: 0 }]}>
130
+ @{username}
131
+ </Text>
132
+ </View>
133
+
134
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, stylesheet.alreadySignedInContainer]}>
135
+ <View style={[stylesheet.alreadySignedInCard, { backgroundColor: `${colors.primary}08`, borderColor: `${colors.primary}25` }]}>
136
+ <View style={stylesheet.alreadySignedInContent}>
137
+ <View style={[stylesheet.alreadySignedInIconWrapper, { backgroundColor: `${colors.primary}20` }]}>
138
+ <Ionicons name="checkmark-circle" size={28} color={colors.primary} />
139
+ </View>
140
+ <View style={stylesheet.alreadySignedInTextWrapper}>
141
+ <Text style={[stylesheet.alreadySignedInTitle, { color: colors.text }]}>
142
+ {t('signin.alreadySignedIn') || 'Already signed in'}
143
+ </Text>
144
+ <Text style={[stylesheet.alreadySignedInMessage, { color: colors.secondaryText }]}>
145
+ {t('signin.alreadySignedInMessage') || 'This account is already signed in. Tap continue to use it.'}
146
+ </Text>
147
+ </View>
148
+ </View>
149
+ </View>
150
+ </View>
151
+
152
+ {errorMessage && (
153
+ <View style={[baseStyles.container, baseStyles.sectionSpacing]}>
154
+ <Text style={[stylesheet.errorText, { color: colors.error }]}>
155
+ {errorMessage}
156
+ </Text>
157
+ </View>
158
+ )}
159
+
160
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, baseStyles.buttonContainer]}>
161
+ <GroupedPillButtons
162
+ buttons={[
163
+ {
164
+ text: t('common.actions.back') || 'Back',
165
+ onPress: prevStep,
166
+ icon: 'arrow-back',
167
+ variant: 'transparent',
168
+ },
169
+ {
170
+ text: t('signin.continueWithAccount') || 'Continue',
171
+ onPress: handleContinueWithExistingAccount,
172
+ icon: 'log-in',
173
+ variant: 'primary',
174
+ loading: isLoading,
175
+ testID: 'continue-button',
176
+ },
177
+ ]}
178
+ colors={colors}
179
+ />
180
+ </View>
181
+ </>
182
+ );
183
+ }
184
+
105
185
  return (
106
186
  <>
107
- <View style={styles.modernUserProfileContainer}>
108
- <View style={styles.avatarContainer}>
187
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, stylesheet.userProfileContainer]}>
109
188
  <Avatar
110
189
  name={userProfile?.displayName || userProfile?.name || username}
111
190
  size={100}
112
191
  theme={theme as 'light' | 'dark'}
113
- style={styles.modernUserAvatar}
114
192
  backgroundColor={colors.primary + '20'}
193
+ uri={userProfile?.avatar && oxyServices ? oxyServices.getFileDownloadUrl(userProfile.avatar, 'thumb') : undefined}
115
194
  />
116
- <View style={[styles.statusIndicator, { backgroundColor: colors.primary }]} />
117
- </View>
118
- <Text style={[styles.modernUserDisplayName, { color: colors.text }]}>
195
+ <Text style={[styles.modernUserDisplayName, stylesheet.displayName, { color: colors.text, marginBottom: 0, marginTop: 0 }]}>
119
196
  {userProfile?.displayName || userProfile?.name || username}
120
197
  </Text>
121
- <Text style={[styles.modernUsernameSubtext, { color: colors.secondaryText }]}>
198
+ <Text style={[styles.modernUsernameSubtext, stylesheet.usernameSubtext, { color: colors.secondaryText, marginBottom: 0, marginTop: 0 }]}>
122
199
  @{username}
123
200
  </Text>
124
201
  </View>
125
202
 
126
- <View style={styles.modernInputContainer}>
203
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, stylesheet.inputSection]}>
127
204
  <TextField
128
205
  ref={inputRef}
129
206
  label={t('common.labels.password')}
@@ -138,9 +215,12 @@ const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
138
215
  error={errorMessage || undefined}
139
216
  onSubmitEditing={handleSignInSubmit}
140
217
  autoFocus
218
+ accessibilityLabel={t('common.labels.password')}
219
+ accessibilityHint={t('signin.password.hint') || 'Enter your password to sign in'}
220
+ style={{ marginBottom: 0 }}
141
221
  />
142
222
 
143
- <View style={{ flexDirection: 'row', alignItems: 'center', marginBottom: 16 }}>
223
+ <View style={[stylesheet.forgotPasswordContainer]}>
144
224
  <Text style={[styles.footerText, { color: colors.text }]}>{t('signin.forgotPrompt') || 'Forgot your password?'} </Text>
145
225
  <TouchableOpacity onPress={() => navigate('RecoverAccount', {
146
226
  returnTo: 'SignIn',
@@ -152,27 +232,29 @@ const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
152
232
  </View>
153
233
  </View>
154
234
 
155
- <GroupedPillButtons
156
- buttons={[
157
- {
158
- text: t('common.actions.back') || 'Back',
159
- onPress: prevStep,
160
- icon: 'arrow-back',
161
- variant: 'transparent',
162
- },
163
- {
164
- text: t('common.actions.signIn') || 'Sign In',
165
- onPress: handleSignInSubmit,
166
- icon: 'log-in',
167
- variant: 'primary',
168
- loading: isLoading,
169
- testID: 'login-button',
170
- },
171
- ]}
172
- colors={colors}
173
- />
174
-
175
- <View style={styles.securityNotice}>
235
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, baseStyles.buttonContainer]}>
236
+ <GroupedPillButtons
237
+ buttons={[
238
+ {
239
+ text: t('common.actions.back') || 'Back',
240
+ onPress: prevStep,
241
+ icon: 'arrow-back',
242
+ variant: 'transparent',
243
+ },
244
+ {
245
+ text: t('common.actions.signIn') || 'Sign In',
246
+ onPress: handleSignInSubmit,
247
+ icon: 'log-in',
248
+ variant: 'primary',
249
+ loading: isLoading,
250
+ testID: 'login-button',
251
+ },
252
+ ]}
253
+ colors={colors}
254
+ />
255
+ </View>
256
+
257
+ <View style={[baseStyles.container, baseStyles.sectionSpacing, stylesheet.securityNotice, { marginTop: 0 }]}>
176
258
  <Ionicons name="shield-checkmark" size={14} color={colors.secondaryText} />
177
259
  <Text style={[styles.securityText, { color: colors.secondaryText }]}>
178
260
  {t('signin.security.dataSecure') || 'Your data is encrypted and secure'}
@@ -183,3 +265,79 @@ const SignInPasswordStep: React.FC<SignInPasswordStepProps> = ({
183
265
  };
184
266
 
185
267
  export default SignInPasswordStep;
268
+
269
+ const stylesheet = StyleSheet.create({
270
+ userProfileContainer: {
271
+ alignItems: 'flex-start',
272
+ paddingVertical: 0,
273
+ gap: STEP_INNER_GAP,
274
+ },
275
+ avatarContainer: {
276
+ position: 'relative',
277
+ marginBottom: 0,
278
+ marginTop: 0,
279
+ },
280
+ displayName: {
281
+ marginBottom: 0,
282
+ marginTop: 0,
283
+ },
284
+ usernameSubtext: {
285
+ marginBottom: 0,
286
+ marginTop: 0,
287
+ },
288
+ inputSection: {
289
+ gap: STEP_INNER_GAP,
290
+ },
291
+ forgotPasswordContainer: {
292
+ flexDirection: 'row',
293
+ alignItems: 'center',
294
+ marginTop: 0,
295
+ },
296
+ securityNotice: {
297
+ flexDirection: 'row',
298
+ alignItems: 'center',
299
+ gap: STEP_INNER_GAP,
300
+ },
301
+ alreadySignedInContainer: {
302
+ width: '100%',
303
+ },
304
+ alreadySignedInCard: {
305
+ borderRadius: 20,
306
+ borderWidth: 1.5,
307
+ padding: 20,
308
+ width: '100%',
309
+ },
310
+ alreadySignedInContent: {
311
+ flexDirection: 'row',
312
+ alignItems: 'flex-start',
313
+ gap: 16,
314
+ },
315
+ alreadySignedInIconWrapper: {
316
+ width: 52,
317
+ height: 52,
318
+ borderRadius: 26,
319
+ alignItems: 'center',
320
+ justifyContent: 'center',
321
+ flexShrink: 0,
322
+ },
323
+ alreadySignedInTextWrapper: {
324
+ flex: 1,
325
+ gap: 8,
326
+ paddingTop: 2,
327
+ },
328
+ alreadySignedInTitle: {
329
+ fontSize: 18,
330
+ fontWeight: '600',
331
+ lineHeight: 24,
332
+ letterSpacing: -0.2,
333
+ },
334
+ alreadySignedInMessage: {
335
+ fontSize: 15,
336
+ lineHeight: 22,
337
+ letterSpacing: -0.1,
338
+ },
339
+ errorText: {
340
+ fontSize: 14,
341
+ textAlign: 'center',
342
+ },
343
+ });