@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
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Request Manager
3
+ *
4
+ * Handles request-level optimizations: caching, deduplication, queuing, and retry.
5
+ * Works on top of HttpClient to add performance features.
6
+ */
7
+
8
+ import type { AxiosInstance } from 'axios';
9
+ import { TTLCache, registerCacheForCleanup } from '../utils/cache';
10
+ import { RequestDeduplicator, RequestQueue, SimpleLogger } from '../utils/requestUtils';
11
+ import { retryWithBackoff } from '../utils/errorUtils';
12
+ import type { OxyConfig } from '../models/interfaces';
13
+
14
+ export interface RequestOptions {
15
+ cache?: boolean;
16
+ cacheTTL?: number;
17
+ deduplicate?: boolean;
18
+ retry?: boolean;
19
+ maxRetries?: number;
20
+ timeout?: number;
21
+ signal?: AbortSignal;
22
+ }
23
+
24
+ /**
25
+ * Request Manager
26
+ *
27
+ * Manages request-level optimizations while delegating actual HTTP calls to HttpClient.
28
+ */
29
+ export class RequestManager {
30
+ private cache: TTLCache<any>;
31
+ private deduplicator: RequestDeduplicator;
32
+ private requestQueue: RequestQueue;
33
+ private logger: SimpleLogger;
34
+ private config: OxyConfig;
35
+ private httpClient: { request: (config: any) => Promise<any> };
36
+
37
+ // Performance monitoring
38
+ private requestMetrics = {
39
+ totalRequests: 0,
40
+ successfulRequests: 0,
41
+ failedRequests: 0,
42
+ cacheHits: 0,
43
+ cacheMisses: 0,
44
+ averageResponseTime: 0,
45
+ };
46
+
47
+ constructor(
48
+ httpClient: { request: (config: any) => Promise<any> },
49
+ config: OxyConfig
50
+ ) {
51
+ this.httpClient = httpClient;
52
+ this.config = config;
53
+
54
+ // Initialize performance infrastructure
55
+ this.cache = new TTLCache<any>(config.cacheTTL || 5 * 60 * 1000);
56
+ registerCacheForCleanup(this.cache);
57
+ this.deduplicator = new RequestDeduplicator();
58
+ this.requestQueue = new RequestQueue(
59
+ config.maxConcurrentRequests || 10,
60
+ config.requestQueueSize || 100
61
+ );
62
+ this.logger = new SimpleLogger(
63
+ config.enableLogging || false,
64
+ config.logLevel || 'error',
65
+ 'RequestManager'
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Make a request with all performance optimizations
71
+ */
72
+ async request<T>(
73
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',
74
+ url: string,
75
+ data?: any,
76
+ options: RequestOptions = {}
77
+ ): Promise<T> {
78
+ const {
79
+ cache = method === 'GET', // Cache GET requests by default
80
+ cacheTTL,
81
+ deduplicate = true,
82
+ retry = this.config.enableRetry !== false,
83
+ maxRetries = this.config.maxRetries || 3,
84
+ timeout,
85
+ signal,
86
+ } = options;
87
+
88
+ // Generate cache key
89
+ const cacheKey = cache ? `${method}:${url}:${JSON.stringify(data || {})}` : null;
90
+
91
+ // Check cache first
92
+ if (cache && cacheKey) {
93
+ const cached = this.cache.get(cacheKey) as T | null;
94
+ if (cached !== null) {
95
+ this.requestMetrics.cacheHits++;
96
+ this.logger.debug('Cache hit:', url);
97
+ return cached;
98
+ }
99
+ this.requestMetrics.cacheMisses++;
100
+ }
101
+
102
+ // Request function that uses HttpClient
103
+ const requestFn = async (): Promise<T> => {
104
+ const startTime = Date.now();
105
+ try {
106
+ const result = await this.httpClient.request({
107
+ method,
108
+ url,
109
+ data: method !== 'GET' ? data : undefined,
110
+ params: method === 'GET' ? data : undefined,
111
+ timeout: timeout || this.config.requestTimeout || 5000,
112
+ signal,
113
+ });
114
+
115
+ const duration = Date.now() - startTime;
116
+ this.updateMetrics(true, duration);
117
+ this.config.onRequestEnd?.(url, method, duration, true);
118
+
119
+ return result as T;
120
+ } catch (error: any) {
121
+ const duration = Date.now() - startTime;
122
+ this.updateMetrics(false, duration);
123
+ this.config.onRequestEnd?.(url, method, duration, false);
124
+ this.config.onRequestError?.(url, method, error);
125
+ throw error;
126
+ }
127
+ };
128
+
129
+ // Wrap with retry if enabled
130
+ const requestWithRetry = retry
131
+ ? () => this.retryWithBackoff(requestFn, maxRetries)
132
+ : requestFn;
133
+
134
+ // Wrap with deduplication if enabled
135
+ const dedupeKey = deduplicate ? `${method}:${url}:${JSON.stringify(data || {})}` : null;
136
+ const finalRequest = dedupeKey
137
+ ? () => this.deduplicator.deduplicate(dedupeKey, requestWithRetry)
138
+ : requestWithRetry;
139
+
140
+ // Execute request (with queue if needed)
141
+ const result = await this.requestQueue.enqueue(finalRequest);
142
+
143
+ // Cache the result if caching is enabled
144
+ if (cache && cacheKey && result) {
145
+ this.cache.set(cacheKey, result, cacheTTL);
146
+ }
147
+
148
+ return result;
149
+ }
150
+
151
+ /**
152
+ * Exponential backoff retry logic with 4xx error handling
153
+ */
154
+ private async retryWithBackoff<T>(
155
+ fn: () => Promise<T>,
156
+ maxRetries: number = 3,
157
+ baseDelay: number = 1000
158
+ ): Promise<T> {
159
+ let lastError: any;
160
+
161
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
162
+ try {
163
+ return await fn();
164
+ } catch (error: any) {
165
+ lastError = error;
166
+
167
+ // Don't retry on 4xx errors (client errors)
168
+ if (error.response?.status >= 400 && error.response?.status < 500) {
169
+ throw error;
170
+ }
171
+
172
+ // Don't retry on last attempt
173
+ if (attempt === maxRetries) {
174
+ break;
175
+ }
176
+
177
+ // Calculate delay with exponential backoff and jitter
178
+ const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
179
+ this.logger.debug(`Retry attempt ${attempt + 1}/${maxRetries} after ${delay}ms`);
180
+ await new Promise(resolve => setTimeout(resolve, delay));
181
+ }
182
+ }
183
+
184
+ throw lastError;
185
+ }
186
+
187
+ /**
188
+ * Update request metrics
189
+ */
190
+ private updateMetrics(success: boolean, duration: number): void {
191
+ this.requestMetrics.totalRequests++;
192
+ if (success) {
193
+ this.requestMetrics.successfulRequests++;
194
+ } else {
195
+ this.requestMetrics.failedRequests++;
196
+ }
197
+
198
+ // Update average response time (exponential moving average)
199
+ const alpha = 0.1; // Smoothing factor
200
+ this.requestMetrics.averageResponseTime =
201
+ this.requestMetrics.averageResponseTime * (1 - alpha) + duration * alpha;
202
+ }
203
+
204
+ /**
205
+ * Get performance metrics
206
+ */
207
+ getMetrics(): typeof this.requestMetrics {
208
+ return { ...this.requestMetrics };
209
+ }
210
+
211
+ /**
212
+ * Clear request cache
213
+ */
214
+ clearCache(): void {
215
+ this.cache.clear();
216
+ this.logger.debug('Cache cleared');
217
+ }
218
+
219
+ /**
220
+ * Clear specific cache entry
221
+ */
222
+ clearCacheEntry(key: string): void {
223
+ this.cache.delete(key);
224
+ }
225
+
226
+ /**
227
+ * Get cache statistics
228
+ */
229
+ getCacheStats(): { size: number; hits: number; misses: number; hitRate: number } {
230
+ const cacheStats = this.cache.getStats();
231
+ const total = this.requestMetrics.cacheHits + this.requestMetrics.cacheMisses;
232
+ return {
233
+ size: cacheStats.size,
234
+ hits: this.requestMetrics.cacheHits,
235
+ misses: this.requestMetrics.cacheMisses,
236
+ hitRate: total > 0 ? this.requestMetrics.cacheHits / total : 0,
237
+ };
238
+ }
239
+ }
240
+
package/src/core/index.ts CHANGED
@@ -17,6 +17,16 @@ export * from '../models/session';
17
17
  export { DeviceManager } from '../utils/deviceManager';
18
18
  export type { DeviceFingerprint, StoredDeviceInfo } from '../utils/deviceManager';
19
19
 
20
+ // Export language utilities
21
+ export {
22
+ SUPPORTED_LANGUAGES,
23
+ getLanguageMetadata,
24
+ getLanguageName,
25
+ getNativeLanguageName,
26
+ normalizeLanguageCode
27
+ } from '../utils/languageUtils';
28
+ export type { LanguageMetadata } from '../utils/languageUtils';
29
+
20
30
  // Import for default export
21
31
  import { OxyServices } from './OxyServices';
22
32
 
package/src/i18n/index.ts CHANGED
@@ -3,6 +3,24 @@
3
3
  const enUS = require('./locales/en-US.json') as Record<string, any>;
4
4
  // eslint-disable-next-line @typescript-eslint/no-var-requires
5
5
  const esES = require('./locales/es-ES.json') as Record<string, any>;
6
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
7
+ const caES = require('./locales/ca-ES.json') as Record<string, any>;
8
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
9
+ const frFR = require('./locales/fr-FR.json') as Record<string, any>;
10
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
11
+ const deDE = require('./locales/de-DE.json') as Record<string, any>;
12
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
13
+ const itIT = require('./locales/it-IT.json') as Record<string, any>;
14
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ const ptPT = require('./locales/pt-PT.json') as Record<string, any>;
16
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
17
+ const jaJP = require('./locales/ja-JP.json') as Record<string, any>;
18
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
19
+ const koKR = require('./locales/ko-KR.json') as Record<string, any>;
20
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
21
+ const zhCN = require('./locales/zh-CN.json') as Record<string, any>;
22
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
23
+ const arSA = require('./locales/ar-SA.json') as Record<string, any>;
6
24
 
7
25
  export type LocaleDict = Record<string, any>;
8
26
 
@@ -11,6 +29,24 @@ const DICTS: Record<string, LocaleDict> = {
11
29
  'en-US': enUS as LocaleDict,
12
30
  'es': esES as LocaleDict,
13
31
  'es-ES': esES as LocaleDict,
32
+ 'ca': caES as LocaleDict,
33
+ 'ca-ES': caES as LocaleDict,
34
+ 'fr': frFR as LocaleDict,
35
+ 'fr-FR': frFR as LocaleDict,
36
+ 'de': deDE as LocaleDict,
37
+ 'de-DE': deDE as LocaleDict,
38
+ 'it': itIT as LocaleDict,
39
+ 'it-IT': itIT as LocaleDict,
40
+ 'pt': ptPT as LocaleDict,
41
+ 'pt-PT': ptPT as LocaleDict,
42
+ 'ja': jaJP as LocaleDict,
43
+ 'ja-JP': jaJP as LocaleDict,
44
+ 'ko': koKR as LocaleDict,
45
+ 'ko-KR': koKR as LocaleDict,
46
+ 'zh': zhCN as LocaleDict,
47
+ 'zh-CN': zhCN as LocaleDict,
48
+ 'ar': arSA as LocaleDict,
49
+ 'ar-SA': arSA as LocaleDict,
14
50
  };
15
51
 
16
52
  const FALLBACK = 'en-US';
@@ -0,0 +1,128 @@
1
+ {
2
+ "signin": {
3
+ "title": "تسجيل الدخول",
4
+ "subtitle": "سجل الدخول للمتابعة",
5
+ "addAccountTitle": "إضافة حساب آخر",
6
+ "addAccountSubtitle": "تسجيل الدخول بحساب آخر",
7
+ "username": {
8
+ "label": "اسم المستخدم",
9
+ "placeholder": "أدخل اسم المستخدم",
10
+ "helper": "3-30 حرفًا، أحرف وأرقام فقط",
11
+ "required": "يرجى إدخال اسم المستخدم.",
12
+ "minLength": "يجب أن يكون اسم المستخدم 3 أحرف على الأقل."
13
+ },
14
+ "password": {
15
+ "label": "كلمة المرور",
16
+ "placeholder": "أدخل كلمة المرور",
17
+ "required": "يرجى إدخال كلمة المرور.",
18
+ "hint": "أدخل كلمة المرور لتسجيل الدخول"
19
+ },
20
+ "actions": {
21
+ "continue": "متابعة",
22
+ "back": "رجوع",
23
+ "signIn": "تسجيل الدخول",
24
+ "verify": "التحقق",
25
+ "openAccountSwitcher": "التبديل إلى حساب آخر",
26
+ "openAccountSwitcherSubtitle": "{{count}} حسابات أخرى متاحة",
27
+ "openAccountSwitcherSubtitle_singular": "حساب آخر واحد متاح",
28
+ "openAccountSwitcherSubtitle_zero": "راجع حساباتك المحفوظة",
29
+ "manageAccounts": "إدارة الحسابات المحفوظة",
30
+ "manageAccountsSubtitle": "مراجعة الجلسات أو إزالتها أو تسجيل الخروج",
31
+ "loadingOtherAccounts": "جاري تحميل الحسابات الأخرى…",
32
+ "switchAccountFailed": "لم نتمكن من التبديل بين الحسابات. يرجى المحاولة مرة أخرى."
33
+ },
34
+ "forgotPrompt": "نسيت كلمة المرور؟",
35
+ "security": {
36
+ "dataSecure": "بياناتك مشفرة وآمنة"
37
+ },
38
+ "currentlySignedInAs": "مسجل الدخول حاليًا كـ",
39
+ "alreadySignedInWith": "مسجل الدخول بالفعل بـ",
40
+ "alreadySignedIn": "مسجل الدخول بالفعل",
41
+ "alreadySignedInMessage": "هذا الحساب مسجل الدخول بالفعل. المتابعة بهذا الحساب؟",
42
+ "continueWithAccount": "متابعة",
43
+ "currentAccount": "الحالي",
44
+ "or": "أو",
45
+ "viewAllAccounts": "عرض {{count}} المزيد",
46
+ "status": {
47
+ "accountSwitched": "استخدام {{name}} الآن"
48
+ },
49
+ "totp": {
50
+ "title": "رمز المصادقة الثنائية",
51
+ "subtitle": "أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة الخاص بك لـ @{{username}}",
52
+ "invalidCode": "رمز غير صالح. يرجى المحاولة مرة أخرى.",
53
+ "noAccess": "لا يمكن الوصول إلى تطبيق المصادقة؟",
54
+ "useBackupCode": "استخدام رمز النسخ الاحتياطي",
55
+ "useRecoveryKey": "استخدام مفتاح الاسترداد"
56
+ }
57
+ },
58
+ "signup": {
59
+ "welcome": {
60
+ "title": "مرحبًا بك في Oxy!",
61
+ "subtitle": "أنشئ حسابك في خطوات قليلة",
62
+ "haveAccount": "لديك حساب بالفعل؟",
63
+ "signInCta": "تسجيل الدخول"
64
+ },
65
+ "identity": {
66
+ "title": "من أنت؟",
67
+ "subtitle": "اختر اسم المستخدم وأدخل بريدك الإلكتروني"
68
+ },
69
+ "username": {
70
+ "helper": "3-30 حرفًا، أحرف وأرقام فقط",
71
+ "required": "يرجى إدخال اسم مستخدم",
72
+ "minLength": "يجب أن يكون اسم المستخدم 3 أحرف على الأقل"
73
+ },
74
+ "email": {
75
+ "required": "يرجى إدخال عنوان بريد إلكتروني",
76
+ "invalid": "يرجى إدخال عنوان بريد إلكتروني صالح",
77
+ "helper": "لن نشارك بريدك الإلكتروني أبدًا"
78
+ },
79
+ "security": {
80
+ "title": "أمّن حسابك",
81
+ "subtitle": "أنشئ كلمة مرور قوية لحماية حسابك"
82
+ },
83
+ "password": {
84
+ "helper": "8 أحرف على الأقل",
85
+ "required": "يرجى إدخال كلمة مرور",
86
+ "minLength": "يجب أن تكون كلمة المرور 8 أحرف على الأقل",
87
+ "confirmRequired": "يرجى تأكيد كلمة المرور",
88
+ "mismatch": "كلمات المرور غير متطابقة",
89
+ "confirmHint": "أعد إدخال كلمة المرور للتأكيد"
90
+ },
91
+ "summary": {
92
+ "title": "أوشكت على الانتهاء!",
93
+ "subtitle": "راجع معلوماتك وأنشئ حسابك",
94
+ "sectionTitle": "معلومات الحساب",
95
+ "fields": {
96
+ "username": "اسم المستخدم",
97
+ "email": "البريد الإلكتروني",
98
+ "password": "كلمة المرور"
99
+ },
100
+ "notSet": "غير محدد",
101
+ "securityTip": "لمزيد من الأمان، قم بتمكين المصادقة الثنائية (TOTP) من إعدادات الحساب بعد إنشاء حسابك.",
102
+ "legalReminder": "بإنشاء حساب، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا."
103
+ }
104
+ },
105
+ "common": {
106
+ "actions": {
107
+ "back": "رجوع",
108
+ "continue": "متابعة",
109
+ "next": "التالي",
110
+ "getStarted": "ابدأ",
111
+ "createAccount": "إنشاء حساب",
112
+ "signIn": "تسجيل الدخول",
113
+ "verify": "التحقق",
114
+ "resetPassword": "إعادة تعيين كلمة المرور"
115
+ },
116
+ "links": {
117
+ "recoverAccount": "استعادة حسابك",
118
+ "signUp": "التسجيل"
119
+ },
120
+ "labels": {
121
+ "username": "اسم المستخدم",
122
+ "email": "البريد الإلكتروني",
123
+ "password": "كلمة المرور",
124
+ "confirmPassword": "تأكيد كلمة المرور"
125
+ }
126
+ }
127
+ }
128
+
@@ -0,0 +1,128 @@
1
+ {
2
+ "signin": {
3
+ "title": "Iniciar sessió",
4
+ "subtitle": "Inicia sessió per continuar",
5
+ "addAccountTitle": "Afegir un altre compte",
6
+ "addAccountSubtitle": "Inicia sessió amb un altre compte",
7
+ "username": {
8
+ "label": "Nom d'usuari",
9
+ "placeholder": "Introdueix el teu nom d'usuari",
10
+ "helper": "3-30 caràcters, només lletres i números",
11
+ "required": "Si us plau, introdueix el teu nom d'usuari.",
12
+ "minLength": "El nom d'usuari ha de tenir almenys 3 caràcters."
13
+ },
14
+ "password": {
15
+ "label": "Contrasenya",
16
+ "placeholder": "Introdueix la teva contrasenya",
17
+ "required": "Si us plau, introdueix la teva contrasenya.",
18
+ "hint": "Introdueix la teva contrasenya per iniciar sessió"
19
+ },
20
+ "actions": {
21
+ "continue": "Continuar",
22
+ "back": "Enrere",
23
+ "signIn": "Iniciar sessió",
24
+ "verify": "Verificar",
25
+ "openAccountSwitcher": "Canviar a un altre compte",
26
+ "openAccountSwitcherSubtitle": "{{count}} altres comptes disponibles",
27
+ "openAccountSwitcherSubtitle_singular": "1 altre compte disponible",
28
+ "openAccountSwitcherSubtitle_zero": "Revisa els teus comptes guardats",
29
+ "manageAccounts": "Gestionar comptes guardats",
30
+ "manageAccountsSubtitle": "Revisar sessions, eliminar o tancar sessió",
31
+ "loadingOtherAccounts": "Carregant altres comptes…",
32
+ "switchAccountFailed": "No hem pogut canviar de compte. Torna-ho a intentar."
33
+ },
34
+ "forgotPrompt": "Has oblidat la teva contrasenya?",
35
+ "security": {
36
+ "dataSecure": "Les teves dades estan xifrades i segures"
37
+ },
38
+ "currentlySignedInAs": "Actualment has iniciat sessió com",
39
+ "alreadySignedInWith": "Ja has iniciat sessió amb",
40
+ "alreadySignedIn": "Ja has iniciat sessió",
41
+ "alreadySignedInMessage": "Aquest compte ja ha iniciat sessió. Continuar amb aquest compte?",
42
+ "continueWithAccount": "Continuar",
43
+ "currentAccount": "Actual",
44
+ "or": "o",
45
+ "viewAllAccounts": "Veure {{count}} més",
46
+ "status": {
47
+ "accountSwitched": "Ara utilitzant {{name}}"
48
+ },
49
+ "totp": {
50
+ "title": "Codi de dos factors",
51
+ "subtitle": "Introdueix el codi de 6 dígits de la teva app autenticadora per @{{username}}",
52
+ "invalidCode": "Codi invàlid. Torna-ho a intentar.",
53
+ "noAccess": "Sense accés al teu autenticador?",
54
+ "useBackupCode": "Utilitzar codi de còpia de seguretat",
55
+ "useRecoveryKey": "Utilitzar clau de recuperació"
56
+ }
57
+ },
58
+ "signup": {
59
+ "welcome": {
60
+ "title": "Benvingut a Oxy!",
61
+ "subtitle": "Crea el teu compte en pocs passos",
62
+ "haveAccount": "Ja tens un compte?",
63
+ "signInCta": "Inicia sessió"
64
+ },
65
+ "identity": {
66
+ "title": "Qui ets?",
67
+ "subtitle": "Tria el teu nom d'usuari i introdueix el teu correu"
68
+ },
69
+ "username": {
70
+ "helper": "3-30 caràcters, només lletres i números",
71
+ "required": "Si us plau, introdueix un nom d'usuari",
72
+ "minLength": "El nom d'usuari ha de tenir almenys 3 caràcters"
73
+ },
74
+ "email": {
75
+ "required": "Si us plau, introdueix una adreça de correu electrònic",
76
+ "invalid": "Si us plau, introdueix una adreça de correu electrònic vàlida",
77
+ "helper": "Mai compartirem el teu correu"
78
+ },
79
+ "security": {
80
+ "title": "Protegeix el teu compte",
81
+ "subtitle": "Crea una contrasenya forta per protegir el teu compte"
82
+ },
83
+ "password": {
84
+ "helper": "Almenys 8 caràcters",
85
+ "required": "Si us plau, introdueix una contrasenya",
86
+ "minLength": "La contrasenya ha de tenir almenys 8 caràcters",
87
+ "confirmRequired": "Si us plau, confirma la teva contrasenya",
88
+ "mismatch": "Les contrasenyes no coincideixen",
89
+ "confirmHint": "Torna a introduir la teva contrasenya per confirmar"
90
+ },
91
+ "summary": {
92
+ "title": "Gairebé allà!",
93
+ "subtitle": "Revisa la teva informació i crea el teu compte",
94
+ "sectionTitle": "Informació del compte",
95
+ "fields": {
96
+ "username": "Nom d'usuari",
97
+ "email": "Correu electrònic",
98
+ "password": "Contrasenya"
99
+ },
100
+ "notSet": "No definit",
101
+ "securityTip": "Per a una major seguretat, habilita l'Autenticació de Dos Factors (TOTP) des de Configuració del compte després de crear el teu compte.",
102
+ "legalReminder": "En crear un compte, acceptes els nostres Termes de servei i Política de privacitat."
103
+ }
104
+ },
105
+ "common": {
106
+ "actions": {
107
+ "back": "Enrere",
108
+ "continue": "Continuar",
109
+ "next": "Següent",
110
+ "getStarted": "Començar",
111
+ "createAccount": "Crear compte",
112
+ "signIn": "Iniciar sessió",
113
+ "verify": "Verificar",
114
+ "resetPassword": "Restablir contrasenya"
115
+ },
116
+ "links": {
117
+ "recoverAccount": "Recuperar el teu compte",
118
+ "signUp": "Registrar-se"
119
+ },
120
+ "labels": {
121
+ "username": "Nom d'usuari",
122
+ "email": "Correu electrònic",
123
+ "password": "Contrasenya",
124
+ "confirmPassword": "Confirmar contrasenya"
125
+ }
126
+ }
127
+ }
128
+