@oxyhq/services 5.21.6 → 5.22.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 (478) hide show
  1. package/README.md +201 -2
  2. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  3. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  4. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  5. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  6. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  7. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  8. package/lib/commonjs/assets/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  9. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  10. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  11. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  12. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  13. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  14. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  15. package/lib/commonjs/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  16. package/lib/commonjs/core/HttpService.js +87 -2
  17. package/lib/commonjs/core/HttpService.js.map +1 -1
  18. package/lib/commonjs/core/mixins/OxyServices.assets.js +3 -1
  19. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
  20. package/lib/commonjs/crypto/keyManager.js +67 -22
  21. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  22. package/lib/commonjs/i18n/locales/en-US.json +3 -3
  23. package/lib/commonjs/i18n/locales/es-ES.json +240 -19
  24. package/lib/commonjs/index.js +66 -0
  25. package/lib/commonjs/index.js.map +1 -1
  26. package/lib/commonjs/ui/components/Avatar.js +1 -1
  27. package/lib/commonjs/ui/components/Avatar.js.map +1 -1
  28. package/lib/commonjs/ui/components/FollowButton.js +1 -1
  29. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  30. package/lib/commonjs/ui/components/FontLoader.js +34 -34
  31. package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
  32. package/lib/commonjs/ui/components/Header.js +4 -4
  33. package/lib/commonjs/ui/components/Header.js.map +1 -1
  34. package/lib/commonjs/ui/components/OxyPayButton.js +1 -1
  35. package/lib/commonjs/ui/components/OxyPayButton.js.map +1 -1
  36. package/lib/commonjs/ui/components/OxySignInButton.js +2 -1
  37. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  38. package/lib/commonjs/ui/components/ProfileCard.js +1 -1
  39. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  40. package/lib/commonjs/ui/components/SectionTitle.js +1 -1
  41. package/lib/commonjs/ui/components/SectionTitle.js.map +1 -1
  42. package/lib/commonjs/ui/components/StepBasedScreen.js +2 -1
  43. package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
  44. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +2 -1
  45. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -1
  46. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +57 -0
  47. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +1 -0
  48. package/lib/commonjs/ui/components/fileManagement/styles.js +17 -17
  49. package/lib/commonjs/ui/components/fileManagement/styles.js.map +1 -1
  50. package/lib/commonjs/ui/components/payment/paymentStyles.js +7 -7
  51. package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -1
  52. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +177 -0
  53. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js.map +1 -0
  54. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +10 -123
  55. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  56. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +2 -32
  57. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  58. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +2 -31
  59. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  60. package/lib/commonjs/ui/hooks/useFileFiltering.js +76 -0
  61. package/lib/commonjs/ui/hooks/useFileFiltering.js.map +1 -0
  62. package/lib/commonjs/ui/navigation/routes.js +2 -0
  63. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  64. package/lib/commonjs/ui/screens/AccountCenterScreen.js +4 -2
  65. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +13 -5
  67. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  68. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +273 -1820
  69. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  70. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +1 -1
  71. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  72. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +3 -1
  73. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  74. package/lib/commonjs/ui/screens/AppInfoScreen.js +2 -2
  75. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  76. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +640 -0
  77. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -0
  78. package/lib/commonjs/ui/screens/FileManagementScreen.js +41 -23
  79. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/HistoryViewScreen.js +9 -3
  81. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +4 -2
  83. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +3 -1
  85. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +11 -12
  87. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  88. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +12 -4
  89. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  90. package/lib/commonjs/ui/screens/SearchSettingsScreen.js +3 -1
  91. package/lib/commonjs/ui/screens/SearchSettingsScreen.js.map +1 -1
  92. package/lib/commonjs/ui/screens/SessionManagementScreen.js +15 -5
  93. package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
  94. package/lib/commonjs/ui/screens/UserLinksScreen.js +3 -1
  95. package/lib/commonjs/ui/screens/UserLinksScreen.js.map +1 -1
  96. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +2 -1
  97. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  98. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +2 -4
  99. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  100. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +3 -3
  101. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  102. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +3 -3
  103. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  104. package/lib/commonjs/ui/styles/authStyles.js +5 -4
  105. package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
  106. package/lib/commonjs/ui/styles/fonts.js +27 -27
  107. package/lib/commonjs/ui/styles/fonts.js.map +1 -1
  108. package/lib/commonjs/ui/styles/theme.js +3 -3
  109. package/lib/commonjs/ui/styles/theme.js.map +1 -1
  110. package/lib/commonjs/ui/utils/authHelpers.js +164 -0
  111. package/lib/commonjs/ui/utils/authHelpers.js.map +1 -0
  112. package/lib/commonjs/ui/utils/avatarUtils.js +18 -61
  113. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  114. package/lib/commonjs/web.js +682 -0
  115. package/lib/commonjs/web.js.map +1 -0
  116. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  117. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  118. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  119. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  120. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  121. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  122. package/lib/module/assets/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  123. package/lib/module/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  124. package/lib/module/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  125. package/lib/module/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  126. package/lib/module/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  127. package/lib/module/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  128. package/lib/module/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  129. package/lib/module/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  130. package/lib/module/core/HttpService.js +87 -2
  131. package/lib/module/core/HttpService.js.map +1 -1
  132. package/lib/module/core/mixins/OxyServices.assets.js +3 -1
  133. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  134. package/lib/module/crypto/keyManager.js +67 -22
  135. package/lib/module/crypto/keyManager.js.map +1 -1
  136. package/lib/module/i18n/locales/en-US.json +3 -3
  137. package/lib/module/i18n/locales/es-ES.json +240 -19
  138. package/lib/module/index.js +6 -0
  139. package/lib/module/index.js.map +1 -1
  140. package/lib/module/ui/components/Avatar.js +1 -1
  141. package/lib/module/ui/components/Avatar.js.map +1 -1
  142. package/lib/module/ui/components/FollowButton.js +1 -1
  143. package/lib/module/ui/components/FollowButton.js.map +1 -1
  144. package/lib/module/ui/components/FontLoader.js +34 -34
  145. package/lib/module/ui/components/FontLoader.js.map +1 -1
  146. package/lib/module/ui/components/Header.js +4 -4
  147. package/lib/module/ui/components/Header.js.map +1 -1
  148. package/lib/module/ui/components/OxyPayButton.js +1 -1
  149. package/lib/module/ui/components/OxyPayButton.js.map +1 -1
  150. package/lib/module/ui/components/OxySignInButton.js +2 -1
  151. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  152. package/lib/module/ui/components/ProfileCard.js +1 -1
  153. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  154. package/lib/module/ui/components/SectionTitle.js +1 -1
  155. package/lib/module/ui/components/SectionTitle.js.map +1 -1
  156. package/lib/module/ui/components/StepBasedScreen.js +2 -1
  157. package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
  158. package/lib/module/ui/components/feedback/feedbackStyles.js +2 -1
  159. package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -1
  160. package/lib/module/ui/components/fileManagement/AnimatedButton.js +50 -0
  161. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +1 -0
  162. package/lib/module/ui/components/fileManagement/styles.js +17 -17
  163. package/lib/module/ui/components/fileManagement/styles.js.map +1 -1
  164. package/lib/module/ui/components/payment/paymentStyles.js +7 -7
  165. package/lib/module/ui/components/payment/paymentStyles.js.map +1 -1
  166. package/lib/module/ui/hooks/mutations/mutationFactory.js +173 -0
  167. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -0
  168. package/lib/module/ui/hooks/mutations/useAccountMutations.js +10 -122
  169. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  170. package/lib/module/ui/hooks/queries/useAccountQueries.js +2 -32
  171. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  172. package/lib/module/ui/hooks/queries/useServicesQueries.js +2 -31
  173. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  174. package/lib/module/ui/hooks/useFileFiltering.js +72 -0
  175. package/lib/module/ui/hooks/useFileFiltering.js.map +1 -0
  176. package/lib/module/ui/navigation/routes.js +2 -0
  177. package/lib/module/ui/navigation/routes.js.map +1 -1
  178. package/lib/module/ui/screens/AccountCenterScreen.js +4 -2
  179. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  180. package/lib/module/ui/screens/AccountOverviewScreen.js +13 -5
  181. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  182. package/lib/module/ui/screens/AccountSettingsScreen.js +277 -1824
  183. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  184. package/lib/module/ui/screens/AccountSwitcherScreen.js +1 -1
  185. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  186. package/lib/module/ui/screens/AccountVerificationScreen.js +3 -1
  187. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  188. package/lib/module/ui/screens/AppInfoScreen.js +2 -2
  189. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  190. package/lib/module/ui/screens/EditProfileFieldScreen.js +635 -0
  191. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -0
  192. package/lib/module/ui/screens/FileManagementScreen.js +41 -23
  193. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  194. package/lib/module/ui/screens/HistoryViewScreen.js +9 -3
  195. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  196. package/lib/module/ui/screens/LanguageSelectorScreen.js +4 -2
  197. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  198. package/lib/module/ui/screens/LegalDocumentsScreen.js +3 -1
  199. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  200. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +11 -12
  201. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  202. package/lib/module/ui/screens/PrivacySettingsScreen.js +12 -4
  203. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  204. package/lib/module/ui/screens/SearchSettingsScreen.js +3 -1
  205. package/lib/module/ui/screens/SearchSettingsScreen.js.map +1 -1
  206. package/lib/module/ui/screens/SessionManagementScreen.js +15 -5
  207. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  208. package/lib/module/ui/screens/UserLinksScreen.js +3 -1
  209. package/lib/module/ui/screens/UserLinksScreen.js.map +1 -1
  210. package/lib/module/ui/screens/WelcomeNewUserScreen.js +2 -1
  211. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  212. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +2 -4
  213. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  214. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +3 -3
  215. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  216. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +3 -3
  217. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  218. package/lib/module/ui/styles/authStyles.js +5 -4
  219. package/lib/module/ui/styles/authStyles.js.map +1 -1
  220. package/lib/module/ui/styles/fonts.js +27 -27
  221. package/lib/module/ui/styles/fonts.js.map +1 -1
  222. package/lib/module/ui/styles/theme.js +3 -3
  223. package/lib/module/ui/styles/theme.js.map +1 -1
  224. package/lib/module/ui/utils/authHelpers.js +154 -0
  225. package/lib/module/ui/utils/authHelpers.js.map +1 -0
  226. package/lib/module/ui/utils/avatarUtils.js +18 -61
  227. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  228. package/lib/module/web.js +75 -0
  229. package/lib/module/web.js.map +1 -0
  230. package/lib/typescript/commonjs/core/HttpService.d.ts +5 -0
  231. package/lib/typescript/commonjs/core/HttpService.d.ts.map +1 -1
  232. package/lib/typescript/commonjs/crypto/keyManager.d.ts.map +1 -1
  233. package/lib/typescript/commonjs/index.d.ts +6 -0
  234. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  235. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  236. package/lib/typescript/commonjs/ui/components/StepBasedScreen.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts.map +1 -1
  238. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts +16 -0
  239. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts.map +1 -0
  240. package/lib/typescript/commonjs/ui/hooks/mutations/mutationFactory.d.ts +76 -0
  241. package/lib/typescript/commonjs/ui/hooks/mutations/mutationFactory.d.ts.map +1 -0
  242. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +29 -4
  243. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  244. package/lib/typescript/commonjs/ui/hooks/queries/useAccountQueries.d.ts +1 -1
  245. package/lib/typescript/commonjs/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts +1 -1
  247. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  248. package/lib/typescript/commonjs/ui/hooks/useFileFiltering.d.ts +29 -0
  249. package/lib/typescript/commonjs/ui/hooks/useFileFiltering.d.ts.map +1 -0
  250. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
  251. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  252. package/lib/typescript/commonjs/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  253. package/lib/typescript/commonjs/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  254. package/lib/typescript/commonjs/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  255. package/lib/typescript/commonjs/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  256. package/lib/typescript/commonjs/ui/screens/EditProfileFieldScreen.d.ts +13 -0
  257. package/lib/typescript/commonjs/ui/screens/EditProfileFieldScreen.d.ts.map +1 -0
  258. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  259. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  260. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  261. package/lib/typescript/commonjs/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  262. package/lib/typescript/commonjs/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  263. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  264. package/lib/typescript/commonjs/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  265. package/lib/typescript/commonjs/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  266. package/lib/typescript/commonjs/ui/screens/UserLinksScreen.d.ts.map +1 -1
  267. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  268. package/lib/typescript/commonjs/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
  269. package/lib/typescript/commonjs/ui/styles/fonts.d.ts +7 -7
  270. package/lib/typescript/commonjs/ui/styles/theme.d.ts.map +1 -1
  271. package/lib/typescript/commonjs/ui/utils/authHelpers.d.ts +99 -0
  272. package/lib/typescript/commonjs/ui/utils/authHelpers.d.ts.map +1 -0
  273. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts.map +1 -1
  274. package/lib/typescript/commonjs/web.d.ts +54 -0
  275. package/lib/typescript/commonjs/web.d.ts.map +1 -0
  276. package/lib/typescript/module/core/HttpService.d.ts +5 -0
  277. package/lib/typescript/module/core/HttpService.d.ts.map +1 -1
  278. package/lib/typescript/module/crypto/keyManager.d.ts.map +1 -1
  279. package/lib/typescript/module/index.d.ts +6 -0
  280. package/lib/typescript/module/index.d.ts.map +1 -1
  281. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  282. package/lib/typescript/module/ui/components/StepBasedScreen.d.ts.map +1 -1
  283. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts.map +1 -1
  284. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts +16 -0
  285. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts.map +1 -0
  286. package/lib/typescript/module/ui/hooks/mutations/mutationFactory.d.ts +76 -0
  287. package/lib/typescript/module/ui/hooks/mutations/mutationFactory.d.ts.map +1 -0
  288. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +29 -4
  289. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  290. package/lib/typescript/module/ui/hooks/queries/useAccountQueries.d.ts +1 -1
  291. package/lib/typescript/module/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  292. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts +1 -1
  293. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  294. package/lib/typescript/module/ui/hooks/useFileFiltering.d.ts +29 -0
  295. package/lib/typescript/module/ui/hooks/useFileFiltering.d.ts.map +1 -0
  296. package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
  297. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  298. package/lib/typescript/module/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  299. package/lib/typescript/module/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  300. package/lib/typescript/module/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  301. package/lib/typescript/module/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  302. package/lib/typescript/module/ui/screens/EditProfileFieldScreen.d.ts +13 -0
  303. package/lib/typescript/module/ui/screens/EditProfileFieldScreen.d.ts.map +1 -0
  304. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  305. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  306. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  307. package/lib/typescript/module/ui/screens/LegalDocumentsScreen.d.ts.map +1 -1
  308. package/lib/typescript/module/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  309. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  310. package/lib/typescript/module/ui/screens/SearchSettingsScreen.d.ts.map +1 -1
  311. package/lib/typescript/module/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  312. package/lib/typescript/module/ui/screens/UserLinksScreen.d.ts.map +1 -1
  313. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  314. package/lib/typescript/module/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
  315. package/lib/typescript/module/ui/styles/fonts.d.ts +7 -7
  316. package/lib/typescript/module/ui/styles/theme.d.ts.map +1 -1
  317. package/lib/typescript/module/ui/utils/authHelpers.d.ts +99 -0
  318. package/lib/typescript/module/ui/utils/authHelpers.d.ts.map +1 -0
  319. package/lib/typescript/module/ui/utils/avatarUtils.d.ts.map +1 -1
  320. package/lib/typescript/module/web.d.ts +54 -0
  321. package/lib/typescript/module/web.d.ts.map +1 -0
  322. package/package.json +27 -41
  323. package/src/assets/fonts/Inter/Inter_18pt-Black.ttf +0 -0
  324. package/src/assets/fonts/Inter/Inter_18pt-Bold.ttf +0 -0
  325. package/src/assets/fonts/Inter/Inter_18pt-ExtraBold.ttf +0 -0
  326. package/src/assets/fonts/Inter/Inter_18pt-Light.ttf +0 -0
  327. package/src/assets/fonts/Inter/Inter_18pt-Medium.ttf +0 -0
  328. package/src/assets/fonts/Inter/Inter_18pt-Regular.ttf +0 -0
  329. package/src/assets/fonts/Inter/Inter_18pt-SemiBold.ttf +0 -0
  330. package/src/core/HttpService.ts +91 -0
  331. package/src/core/mixins/OxyServices.assets.ts +1 -1
  332. package/src/crypto/keyManager.ts +23 -22
  333. package/src/i18n/locales/en-US.json +3 -3
  334. package/src/i18n/locales/es-ES.json +240 -19
  335. package/src/index.ts +25 -0
  336. package/src/ui/components/Avatar.tsx +1 -1
  337. package/src/ui/components/FollowButton.tsx +1 -1
  338. package/src/ui/components/FontLoader.tsx +34 -34
  339. package/src/ui/components/Header.tsx +4 -4
  340. package/src/ui/components/OxyPayButton.tsx +1 -1
  341. package/src/ui/components/OxySignInButton.tsx +2 -1
  342. package/src/ui/components/ProfileCard.tsx +1 -1
  343. package/src/ui/components/SectionTitle.tsx +1 -1
  344. package/src/ui/components/StepBasedScreen.tsx +2 -1
  345. package/src/ui/components/feedback/feedbackStyles.ts +2 -1
  346. package/src/ui/components/fileManagement/AnimatedButton.tsx +56 -0
  347. package/src/ui/components/fileManagement/styles.ts +17 -17
  348. package/src/ui/components/payment/paymentStyles.ts +7 -7
  349. package/src/ui/hooks/mutations/mutationFactory.ts +215 -0
  350. package/src/ui/hooks/mutations/useAccountMutations.ts +48 -136
  351. package/src/ui/hooks/queries/useAccountQueries.ts +6 -33
  352. package/src/ui/hooks/queries/useServicesQueries.ts +6 -32
  353. package/src/ui/hooks/useFileFiltering.ts +115 -0
  354. package/src/ui/navigation/routes.ts +3 -0
  355. package/src/ui/screens/AccountCenterScreen.tsx +4 -2
  356. package/src/ui/screens/AccountOverviewScreen.tsx +13 -5
  357. package/src/ui/screens/AccountSettingsScreen.tsx +35 -1511
  358. package/src/ui/screens/AccountSwitcherScreen.tsx +1 -1
  359. package/src/ui/screens/AccountVerificationScreen.tsx +3 -1
  360. package/src/ui/screens/AppInfoScreen.tsx +2 -2
  361. package/src/ui/screens/EditProfileFieldScreen.tsx +685 -0
  362. package/src/ui/screens/FileManagementScreen.tsx +35 -17
  363. package/src/ui/screens/HistoryViewScreen.tsx +9 -3
  364. package/src/ui/screens/LanguageSelectorScreen.tsx +4 -2
  365. package/src/ui/screens/LegalDocumentsScreen.tsx +3 -1
  366. package/src/ui/screens/PremiumSubscriptionScreen.tsx +11 -13
  367. package/src/ui/screens/PrivacySettingsScreen.tsx +12 -4
  368. package/src/ui/screens/SearchSettingsScreen.tsx +3 -1
  369. package/src/ui/screens/SessionManagementScreen.tsx +15 -5
  370. package/src/ui/screens/UserLinksScreen.tsx +3 -1
  371. package/src/ui/screens/WelcomeNewUserScreen.tsx +2 -1
  372. package/src/ui/screens/karma/KarmaAboutScreen.tsx +6 -8
  373. package/src/ui/screens/karma/KarmaCenterScreen.tsx +3 -3
  374. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +3 -3
  375. package/src/ui/styles/authStyles.ts +4 -4
  376. package/src/ui/styles/fonts.ts +26 -26
  377. package/src/ui/styles/theme.ts +3 -5
  378. package/src/ui/utils/authHelpers.ts +183 -0
  379. package/src/ui/utils/avatarUtils.ts +25 -65
  380. package/src/web.ts +230 -0
  381. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-Black.ttf +0 -0
  382. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-Bold.ttf +0 -0
  383. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-ExtraBold.ttf +0 -0
  384. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-Light.ttf +0 -0
  385. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-Medium.ttf +0 -0
  386. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-Regular.ttf +0 -0
  387. package/lib/commonjs/assets/assets/fonts/Phudu/Phudu-SemiBold.ttf +0 -0
  388. package/lib/commonjs/assets/fonts/Phudu/Phudu-Black.ttf +0 -0
  389. package/lib/commonjs/assets/fonts/Phudu/Phudu-Bold.ttf +0 -0
  390. package/lib/commonjs/assets/fonts/Phudu/Phudu-ExtraBold.ttf +0 -0
  391. package/lib/commonjs/assets/fonts/Phudu/Phudu-Light.ttf +0 -0
  392. package/lib/commonjs/assets/fonts/Phudu/Phudu-Medium.ttf +0 -0
  393. package/lib/commonjs/assets/fonts/Phudu/Phudu-Regular.ttf +0 -0
  394. package/lib/commonjs/assets/fonts/Phudu/Phudu-SemiBold.ttf +0 -0
  395. package/lib/commonjs/ui/components/profile/EditBioModal.js +0 -181
  396. package/lib/commonjs/ui/components/profile/EditBioModal.js.map +0 -1
  397. package/lib/commonjs/ui/components/profile/EditDisplayNameModal.js +0 -204
  398. package/lib/commonjs/ui/components/profile/EditDisplayNameModal.js.map +0 -1
  399. package/lib/commonjs/ui/components/profile/EditEmailModal.js +0 -184
  400. package/lib/commonjs/ui/components/profile/EditEmailModal.js.map +0 -1
  401. package/lib/commonjs/ui/components/profile/EditFieldModal.js +0 -412
  402. package/lib/commonjs/ui/components/profile/EditFieldModal.js.map +0 -1
  403. package/lib/commonjs/ui/components/profile/EditLinksModal.js +0 -315
  404. package/lib/commonjs/ui/components/profile/EditLinksModal.js.map +0 -1
  405. package/lib/commonjs/ui/components/profile/EditLocationModal.js +0 -273
  406. package/lib/commonjs/ui/components/profile/EditLocationModal.js.map +0 -1
  407. package/lib/commonjs/ui/components/profile/EditUsernameModal.js +0 -180
  408. package/lib/commonjs/ui/components/profile/EditUsernameModal.js.map +0 -1
  409. package/lib/module/assets/assets/fonts/Phudu/Phudu-Black.ttf +0 -0
  410. package/lib/module/assets/assets/fonts/Phudu/Phudu-Bold.ttf +0 -0
  411. package/lib/module/assets/assets/fonts/Phudu/Phudu-ExtraBold.ttf +0 -0
  412. package/lib/module/assets/assets/fonts/Phudu/Phudu-Light.ttf +0 -0
  413. package/lib/module/assets/assets/fonts/Phudu/Phudu-Medium.ttf +0 -0
  414. package/lib/module/assets/assets/fonts/Phudu/Phudu-Regular.ttf +0 -0
  415. package/lib/module/assets/assets/fonts/Phudu/Phudu-SemiBold.ttf +0 -0
  416. package/lib/module/assets/fonts/Phudu/Phudu-Black.ttf +0 -0
  417. package/lib/module/assets/fonts/Phudu/Phudu-Bold.ttf +0 -0
  418. package/lib/module/assets/fonts/Phudu/Phudu-ExtraBold.ttf +0 -0
  419. package/lib/module/assets/fonts/Phudu/Phudu-Light.ttf +0 -0
  420. package/lib/module/assets/fonts/Phudu/Phudu-Medium.ttf +0 -0
  421. package/lib/module/assets/fonts/Phudu/Phudu-Regular.ttf +0 -0
  422. package/lib/module/assets/fonts/Phudu/Phudu-SemiBold.ttf +0 -0
  423. package/lib/module/ui/components/profile/EditBioModal.js +0 -175
  424. package/lib/module/ui/components/profile/EditBioModal.js.map +0 -1
  425. package/lib/module/ui/components/profile/EditDisplayNameModal.js +0 -198
  426. package/lib/module/ui/components/profile/EditDisplayNameModal.js.map +0 -1
  427. package/lib/module/ui/components/profile/EditEmailModal.js +0 -178
  428. package/lib/module/ui/components/profile/EditEmailModal.js.map +0 -1
  429. package/lib/module/ui/components/profile/EditFieldModal.js +0 -406
  430. package/lib/module/ui/components/profile/EditFieldModal.js.map +0 -1
  431. package/lib/module/ui/components/profile/EditLinksModal.js +0 -309
  432. package/lib/module/ui/components/profile/EditLinksModal.js.map +0 -1
  433. package/lib/module/ui/components/profile/EditLocationModal.js +0 -267
  434. package/lib/module/ui/components/profile/EditLocationModal.js.map +0 -1
  435. package/lib/module/ui/components/profile/EditUsernameModal.js +0 -174
  436. package/lib/module/ui/components/profile/EditUsernameModal.js.map +0 -1
  437. package/lib/typescript/commonjs/ui/components/profile/EditBioModal.d.ts +0 -11
  438. package/lib/typescript/commonjs/ui/components/profile/EditBioModal.d.ts.map +0 -1
  439. package/lib/typescript/commonjs/ui/components/profile/EditDisplayNameModal.d.ts +0 -12
  440. package/lib/typescript/commonjs/ui/components/profile/EditDisplayNameModal.d.ts.map +0 -1
  441. package/lib/typescript/commonjs/ui/components/profile/EditEmailModal.d.ts +0 -11
  442. package/lib/typescript/commonjs/ui/components/profile/EditEmailModal.d.ts.map +0 -1
  443. package/lib/typescript/commonjs/ui/components/profile/EditFieldModal.d.ts +0 -110
  444. package/lib/typescript/commonjs/ui/components/profile/EditFieldModal.d.ts.map +0 -1
  445. package/lib/typescript/commonjs/ui/components/profile/EditLinksModal.d.ts +0 -18
  446. package/lib/typescript/commonjs/ui/components/profile/EditLinksModal.d.ts.map +0 -1
  447. package/lib/typescript/commonjs/ui/components/profile/EditLocationModal.d.ts +0 -20
  448. package/lib/typescript/commonjs/ui/components/profile/EditLocationModal.d.ts.map +0 -1
  449. package/lib/typescript/commonjs/ui/components/profile/EditUsernameModal.d.ts +0 -11
  450. package/lib/typescript/commonjs/ui/components/profile/EditUsernameModal.d.ts.map +0 -1
  451. package/lib/typescript/module/ui/components/profile/EditBioModal.d.ts +0 -11
  452. package/lib/typescript/module/ui/components/profile/EditBioModal.d.ts.map +0 -1
  453. package/lib/typescript/module/ui/components/profile/EditDisplayNameModal.d.ts +0 -12
  454. package/lib/typescript/module/ui/components/profile/EditDisplayNameModal.d.ts.map +0 -1
  455. package/lib/typescript/module/ui/components/profile/EditEmailModal.d.ts +0 -11
  456. package/lib/typescript/module/ui/components/profile/EditEmailModal.d.ts.map +0 -1
  457. package/lib/typescript/module/ui/components/profile/EditFieldModal.d.ts +0 -110
  458. package/lib/typescript/module/ui/components/profile/EditFieldModal.d.ts.map +0 -1
  459. package/lib/typescript/module/ui/components/profile/EditLinksModal.d.ts +0 -18
  460. package/lib/typescript/module/ui/components/profile/EditLinksModal.d.ts.map +0 -1
  461. package/lib/typescript/module/ui/components/profile/EditLocationModal.d.ts +0 -20
  462. package/lib/typescript/module/ui/components/profile/EditLocationModal.d.ts.map +0 -1
  463. package/lib/typescript/module/ui/components/profile/EditUsernameModal.d.ts +0 -11
  464. package/lib/typescript/module/ui/components/profile/EditUsernameModal.d.ts.map +0 -1
  465. package/src/assets/fonts/Phudu/Phudu-Black.ttf +0 -0
  466. package/src/assets/fonts/Phudu/Phudu-Bold.ttf +0 -0
  467. package/src/assets/fonts/Phudu/Phudu-ExtraBold.ttf +0 -0
  468. package/src/assets/fonts/Phudu/Phudu-Light.ttf +0 -0
  469. package/src/assets/fonts/Phudu/Phudu-Medium.ttf +0 -0
  470. package/src/assets/fonts/Phudu/Phudu-Regular.ttf +0 -0
  471. package/src/assets/fonts/Phudu/Phudu-SemiBold.ttf +0 -0
  472. package/src/ui/components/profile/EditBioModal.tsx +0 -184
  473. package/src/ui/components/profile/EditDisplayNameModal.tsx +0 -203
  474. package/src/ui/components/profile/EditEmailModal.tsx +0 -188
  475. package/src/ui/components/profile/EditFieldModal.tsx +0 -465
  476. package/src/ui/components/profile/EditLinksModal.tsx +0 -316
  477. package/src/ui/components/profile/EditLocationModal.tsx +0 -278
  478. package/src/ui/components/profile/EditUsernameModal.tsx +0 -183
@@ -0,0 +1,685 @@
1
+ import React, { useState, useEffect, useCallback, useMemo } from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ TextInput,
6
+ TouchableOpacity,
7
+ StyleSheet,
8
+ ScrollView,
9
+ Platform,
10
+ Image,
11
+ TextInputProps,
12
+ KeyboardAvoidingView,
13
+ } from 'react-native';
14
+ import { Ionicons } from '@expo/vector-icons';
15
+ import type { BaseScreenProps } from '../types/navigation';
16
+ import { useThemeStyles } from '../hooks/useThemeStyles';
17
+ import { useColorScheme } from '../hooks/use-color-scheme';
18
+ import { normalizeTheme } from '../utils/themeUtils';
19
+ import { Header } from '../components';
20
+ import { useI18n } from '../hooks/useI18n';
21
+ import { useOxy } from '../context/OxyContext';
22
+ import { useProfileEditing } from '../hooks/useProfileEditing';
23
+ import { fontFamilies } from '../styles/fonts';
24
+ import { toast } from '../../lib/sonner';
25
+ import { EMAIL_REGEX } from '../../utils/validationUtils';
26
+
27
+ /**
28
+ * Field types supported by EditProfileFieldScreen
29
+ */
30
+ export type ProfileFieldType =
31
+ | 'displayName'
32
+ | 'username'
33
+ | 'email'
34
+ | 'bio'
35
+ | 'phone'
36
+ | 'address'
37
+ | 'birthday'
38
+ | 'location'
39
+ | 'locations'
40
+ | 'links';
41
+
42
+ /**
43
+ * Field configuration for each field type
44
+ */
45
+ interface FieldConfig {
46
+ title: string;
47
+ subtitle?: string;
48
+ fields: Array<{
49
+ key: string;
50
+ label: string;
51
+ placeholder: string;
52
+ type?: 'text' | 'email' | 'textarea';
53
+ validation?: (value: string) => string | undefined;
54
+ inputProps?: Partial<TextInputProps>;
55
+ }>;
56
+ isList?: boolean;
57
+ }
58
+
59
+ interface EditProfileFieldScreenProps extends BaseScreenProps {
60
+ /** The field type to edit */
61
+ fieldType?: ProfileFieldType;
62
+ }
63
+
64
+ /**
65
+ * EditProfileFieldScreen - A dedicated screen for editing profile fields
66
+ *
67
+ * Navigate to this screen with a fieldType prop to edit that specific field.
68
+ *
69
+ * @example
70
+ * navigate('EditProfileField', { fieldType: 'username' })
71
+ */
72
+ const EditProfileFieldScreen: React.FC<EditProfileFieldScreenProps> = ({
73
+ goBack,
74
+ onClose,
75
+ theme,
76
+ fieldType = 'displayName',
77
+ }) => {
78
+ const { user } = useOxy();
79
+ const { t } = useI18n();
80
+ const { saveProfile, updateField, isSaving } = useProfileEditing();
81
+ const colorScheme = useColorScheme();
82
+ const normalizedTheme = normalizeTheme(theme);
83
+ const themeStyles = useThemeStyles(normalizedTheme, colorScheme);
84
+ const colors = themeStyles.colors;
85
+
86
+ // State for field values
87
+ const [fieldValues, setFieldValues] = useState<Record<string, string>>({});
88
+ const [fieldErrors, setFieldErrors] = useState<Record<string, string | undefined>>({});
89
+
90
+ // State for list fields (locations, links)
91
+ const [listItems, setListItems] = useState<Array<{ id: string; [key: string]: unknown }>>([]);
92
+ const [newItemValue, setNewItemValue] = useState('');
93
+
94
+ // Get field configuration based on fieldType
95
+ const fieldConfig = useMemo((): FieldConfig => {
96
+ switch (fieldType) {
97
+ case 'displayName':
98
+ return {
99
+ title: t('editProfile.items.displayName.title') || 'Display Name',
100
+ subtitle: t('editProfile.items.displayName.subtitle') || 'This is how your name will appear to others',
101
+ fields: [
102
+ {
103
+ key: 'displayName',
104
+ label: t('editProfile.items.displayName.firstName') || 'First Name',
105
+ placeholder: t('editProfile.items.displayName.firstNamePlaceholder') || 'Enter first name',
106
+ },
107
+ {
108
+ key: 'lastName',
109
+ label: t('editProfile.items.displayName.lastName') || 'Last Name',
110
+ placeholder: t('editProfile.items.displayName.lastNamePlaceholder') || 'Enter last name (optional)',
111
+ },
112
+ ],
113
+ };
114
+ case 'username':
115
+ return {
116
+ title: t('editProfile.items.username.title') || 'Username',
117
+ subtitle: t('editProfile.items.username.subtitle') || 'Your unique identifier on the platform',
118
+ fields: [
119
+ {
120
+ key: 'username',
121
+ label: t('editProfile.items.username.label') || 'Username',
122
+ placeholder: t('editProfile.items.username.placeholder') || 'Choose a username',
123
+ validation: (value) => {
124
+ if (!value.trim()) {
125
+ return t('editProfile.items.username.required') || 'Username is required';
126
+ }
127
+ if (value.length < 3) {
128
+ return t('editProfile.items.username.tooShort') || 'Username must be at least 3 characters';
129
+ }
130
+ return undefined;
131
+ },
132
+ inputProps: {
133
+ autoCapitalize: 'none',
134
+ autoCorrect: false,
135
+ },
136
+ },
137
+ ],
138
+ };
139
+ case 'email':
140
+ return {
141
+ title: t('editProfile.items.email.title') || 'Email',
142
+ subtitle: t('editProfile.items.email.subtitle') || 'Your primary email address',
143
+ fields: [
144
+ {
145
+ key: 'email',
146
+ label: t('editProfile.items.email.label') || 'Email Address',
147
+ placeholder: t('editProfile.items.email.placeholder') || 'Enter your email address',
148
+ type: 'email',
149
+ validation: (value) => {
150
+ if (!EMAIL_REGEX.test(value)) {
151
+ return t('editProfile.items.email.invalid') || 'Please enter a valid email address';
152
+ }
153
+ return undefined;
154
+ },
155
+ inputProps: {
156
+ keyboardType: 'email-address',
157
+ autoCapitalize: 'none',
158
+ autoCorrect: false,
159
+ },
160
+ },
161
+ ],
162
+ };
163
+ case 'bio':
164
+ return {
165
+ title: t('editProfile.items.bio.title') || 'Bio',
166
+ subtitle: t('editProfile.items.bio.subtitle') || 'Tell people a bit about yourself',
167
+ fields: [
168
+ {
169
+ key: 'bio',
170
+ label: t('editProfile.items.bio.label') || 'Bio',
171
+ placeholder: t('editProfile.items.bio.placeholder') || 'Tell people about yourself...',
172
+ type: 'textarea',
173
+ inputProps: {
174
+ multiline: true,
175
+ numberOfLines: 6,
176
+ textAlignVertical: 'top',
177
+ },
178
+ },
179
+ ],
180
+ };
181
+ case 'phone':
182
+ return {
183
+ title: t('editProfile.items.phone.title') || 'Phone Number',
184
+ subtitle: t('editProfile.items.phone.subtitle') || 'Your contact phone number',
185
+ fields: [
186
+ {
187
+ key: 'phone',
188
+ label: t('editProfile.items.phone.label') || 'Phone Number',
189
+ placeholder: t('editProfile.items.phone.placeholder') || 'Enter your phone number',
190
+ inputProps: {
191
+ keyboardType: 'phone-pad',
192
+ autoCapitalize: 'none',
193
+ autoCorrect: false,
194
+ },
195
+ },
196
+ ],
197
+ };
198
+ case 'address':
199
+ return {
200
+ title: t('editProfile.items.address.title') || 'Address',
201
+ subtitle: t('editProfile.items.address.subtitle') || 'Your physical address',
202
+ fields: [
203
+ {
204
+ key: 'address',
205
+ label: t('editProfile.items.address.label') || 'Address',
206
+ placeholder: t('editProfile.items.address.placeholder') || 'Enter your address',
207
+ type: 'textarea',
208
+ inputProps: {
209
+ multiline: true,
210
+ numberOfLines: 3,
211
+ textAlignVertical: 'top',
212
+ },
213
+ },
214
+ ],
215
+ };
216
+ case 'birthday':
217
+ return {
218
+ title: t('editProfile.items.birthday.title') || 'Birthday',
219
+ subtitle: t('editProfile.items.birthday.subtitle') || 'Your date of birth',
220
+ fields: [
221
+ {
222
+ key: 'birthday',
223
+ label: t('editProfile.items.birthday.label') || 'Birthday',
224
+ placeholder: t('editProfile.items.birthday.placeholder') || 'YYYY-MM-DD',
225
+ inputProps: {
226
+ autoCapitalize: 'none',
227
+ autoCorrect: false,
228
+ },
229
+ },
230
+ ],
231
+ };
232
+ case 'locations':
233
+ return {
234
+ title: t('editProfile.items.locations.title') || 'Locations',
235
+ subtitle: t('editProfile.items.locations.subtitle') || 'Places you\'ve been or live',
236
+ fields: [],
237
+ isList: true,
238
+ };
239
+ case 'links':
240
+ return {
241
+ title: t('editProfile.items.links.title') || 'Links',
242
+ subtitle: t('editProfile.items.links.subtitle') || 'Share your website, social profiles, etc.',
243
+ fields: [],
244
+ isList: true,
245
+ };
246
+ default:
247
+ return {
248
+ title: 'Edit Field',
249
+ fields: [],
250
+ };
251
+ }
252
+ }, [fieldType, t]);
253
+
254
+ // Initialize field values from user data
255
+ useEffect(() => {
256
+ if (!user) return;
257
+
258
+ // Cast user to any to access dynamic properties
259
+ const userData = user as any;
260
+
261
+ if (fieldConfig.isList) {
262
+ if (fieldType === 'locations') {
263
+ const locations = Array.isArray(userData.locations) ? userData.locations : [];
264
+ setListItems(locations.map((loc: any, i: number) => ({
265
+ id: loc.id || `location-${i}`,
266
+ name: loc.name || '',
267
+ ...loc,
268
+ })));
269
+ } else if (fieldType === 'links') {
270
+ const linksMetadata = Array.isArray(userData.linksMetadata) ? userData.linksMetadata : [];
271
+ const links = Array.isArray(userData.links) ? userData.links : [];
272
+ // Use linksMetadata if available, otherwise convert links array
273
+ if (linksMetadata.length > 0) {
274
+ setListItems(linksMetadata.map((link: any, i: number) => ({
275
+ id: link.id || `link-${i}`,
276
+ url: link.url || link.link || '',
277
+ title: link.title || '',
278
+ ...link,
279
+ })));
280
+ } else {
281
+ setListItems(links.map((item: any, i: number) => {
282
+ const url = typeof item === 'string' ? item : (item.link || item.url || '');
283
+ return {
284
+ id: `link-${i}`,
285
+ url,
286
+ title: url.replace(/^https?:\/\//, '').replace(/\/$/, ''),
287
+ };
288
+ }));
289
+ }
290
+ }
291
+ } else {
292
+ const initialValues: Record<string, string> = {};
293
+ fieldConfig.fields.forEach(field => {
294
+ if (field.key === 'displayName') {
295
+ initialValues[field.key] = String(userData.displayName || userData.name?.first || '');
296
+ } else if (field.key === 'lastName') {
297
+ initialValues[field.key] = String(userData.lastName || userData.name?.last || '');
298
+ } else if (field.key === 'birthday') {
299
+ initialValues[field.key] = String(userData.birthday || userData.dateOfBirth || '');
300
+ } else if (field.key === 'address') {
301
+ initialValues[field.key] = String(userData.address || userData.location || '');
302
+ } else {
303
+ initialValues[field.key] = String(userData[field.key] || '');
304
+ }
305
+ });
306
+ setFieldValues(initialValues);
307
+ }
308
+ }, [user, fieldConfig, fieldType]);
309
+
310
+ // Field change handler
311
+ const handleFieldChange = useCallback((key: string, value: string) => {
312
+ setFieldValues(prev => ({ ...prev, [key]: value }));
313
+ if (fieldErrors[key]) {
314
+ setFieldErrors(prev => ({ ...prev, [key]: undefined }));
315
+ }
316
+ }, [fieldErrors]);
317
+
318
+ // Validate all fields
319
+ const validateFields = useCallback((): boolean => {
320
+ const errors: Record<string, string | undefined> = {};
321
+ let isValid = true;
322
+
323
+ fieldConfig.fields.forEach(field => {
324
+ if (field.validation) {
325
+ const error = field.validation(fieldValues[field.key] || '');
326
+ if (error) {
327
+ errors[field.key] = error;
328
+ isValid = false;
329
+ }
330
+ }
331
+ });
332
+
333
+ setFieldErrors(errors);
334
+ return isValid;
335
+ }, [fieldConfig.fields, fieldValues]);
336
+
337
+ // Add item to list
338
+ const handleAddItem = useCallback(() => {
339
+ if (!newItemValue.trim()) return;
340
+
341
+ if (fieldType === 'locations') {
342
+ const newItem = {
343
+ id: `location-${Date.now()}`,
344
+ name: newItemValue.trim(),
345
+ };
346
+ setListItems(prev => [...prev, newItem]);
347
+ } else if (fieldType === 'links') {
348
+ const newItem = {
349
+ id: `link-${Date.now()}`,
350
+ url: newItemValue.trim(),
351
+ title: newItemValue.replace(/^https?:\/\//, '').replace(/\/$/, ''),
352
+ };
353
+ setListItems(prev => [...prev, newItem]);
354
+ }
355
+ setNewItemValue('');
356
+ }, [newItemValue, fieldType]);
357
+
358
+ // Remove item from list
359
+ const handleRemoveItem = useCallback((id: string) => {
360
+ setListItems(prev => prev.filter(item => item.id !== id));
361
+ }, []);
362
+
363
+ // Save handler
364
+ const handleSave = async () => {
365
+ if (fieldConfig.isList) {
366
+ let success = false;
367
+ if (fieldType === 'locations') {
368
+ success = await saveProfile({ locations: listItems as any });
369
+ } else if (fieldType === 'links') {
370
+ success = await saveProfile({
371
+ linksMetadata: listItems as any,
372
+ links: listItems.map((item: any) => item.url),
373
+ });
374
+ }
375
+ if (success) {
376
+ toast.success(t('common.saved') || 'Saved successfully');
377
+ (onClose || goBack)?.();
378
+ }
379
+ } else {
380
+ if (!validateFields()) return;
381
+
382
+ let success = false;
383
+ if (fieldType === 'displayName') {
384
+ success = await saveProfile({
385
+ displayName: fieldValues.displayName,
386
+ lastName: fieldValues.lastName,
387
+ });
388
+ } else {
389
+ const key = fieldConfig.fields[0]?.key;
390
+ if (key) {
391
+ success = await updateField(key, fieldValues[key]);
392
+ }
393
+ }
394
+
395
+ if (success) {
396
+ toast.success(t('common.saved') || 'Saved successfully');
397
+ (onClose || goBack)?.();
398
+ }
399
+ }
400
+ };
401
+
402
+ // Render a single field input
403
+ const renderField = (field: FieldConfig['fields'][0], index: number) => {
404
+ const isTextarea = field.type === 'textarea';
405
+
406
+ return (
407
+ <View key={field.key} style={styles.inputGroup}>
408
+ <Text style={[styles.label, { color: colors.text }]}>
409
+ {field.label}
410
+ </Text>
411
+ <TextInput
412
+ style={[
413
+ isTextarea ? styles.textArea : styles.input,
414
+ {
415
+ backgroundColor: colors.card,
416
+ color: colors.text,
417
+ borderColor: fieldErrors[field.key] ? '#FF3B30' : colors.border,
418
+ },
419
+ ]}
420
+ value={fieldValues[field.key] || ''}
421
+ onChangeText={(value) => handleFieldChange(field.key, value)}
422
+ placeholder={field.placeholder}
423
+ placeholderTextColor={colors.secondaryText}
424
+ autoFocus={index === 0}
425
+ selectionColor={colors.tint}
426
+ {...field.inputProps}
427
+ />
428
+ {fieldErrors[field.key] && (
429
+ <Text style={styles.errorText}>{fieldErrors[field.key]}</Text>
430
+ )}
431
+ </View>
432
+ );
433
+ };
434
+
435
+ // Render list content (locations or links)
436
+ const renderListContent = () => {
437
+ const addLabel = fieldType === 'locations'
438
+ ? (t('editProfile.items.locations.add') || 'Add Location')
439
+ : (t('editProfile.items.links.add') || 'Add Link');
440
+ const placeholder = fieldType === 'locations'
441
+ ? (t('editProfile.items.locations.placeholder') || 'Enter location name')
442
+ : (t('editProfile.items.links.placeholder') || 'Enter URL');
443
+ const listTitle = fieldType === 'locations'
444
+ ? (t('editProfile.items.locations.yourLocations') || 'Your Locations')
445
+ : (t('editProfile.items.links.yourLinks') || 'Your Links');
446
+
447
+ return (
448
+ <>
449
+ <View style={styles.inputGroup}>
450
+ <Text style={[styles.label, { color: colors.text }]}>{addLabel}</Text>
451
+ <View style={styles.addItemRow}>
452
+ <TextInput
453
+ style={[
454
+ styles.input,
455
+ {
456
+ backgroundColor: colors.card,
457
+ color: colors.text,
458
+ borderColor: colors.border,
459
+ flex: 1,
460
+ },
461
+ ]}
462
+ value={newItemValue}
463
+ onChangeText={setNewItemValue}
464
+ placeholder={placeholder}
465
+ placeholderTextColor={colors.secondaryText}
466
+ selectionColor={colors.tint}
467
+ autoCapitalize="none"
468
+ autoCorrect={false}
469
+ onSubmitEditing={handleAddItem}
470
+ returnKeyType="done"
471
+ keyboardType={fieldType === 'links' ? 'url' : 'default'}
472
+ />
473
+ <TouchableOpacity
474
+ style={[
475
+ styles.addButton,
476
+ { backgroundColor: newItemValue.trim() ? colors.tint : colors.border }
477
+ ]}
478
+ onPress={handleAddItem}
479
+ disabled={!newItemValue.trim()}
480
+ >
481
+ <Ionicons name="add" size={20} color="#fff" />
482
+ </TouchableOpacity>
483
+ </View>
484
+ </View>
485
+
486
+ {listItems.length > 0 && (
487
+ <View style={styles.listSection}>
488
+ <Text style={[styles.listTitle, { color: colors.text }]}>
489
+ {listTitle} ({listItems.length})
490
+ </Text>
491
+ {listItems.map((item: any) => (
492
+ <View
493
+ key={item.id}
494
+ style={[
495
+ styles.listItem,
496
+ { backgroundColor: colors.card, borderColor: colors.border }
497
+ ]}
498
+ >
499
+ {fieldType === 'links' && item.image && (
500
+ <Image source={{ uri: item.image }} style={styles.linkImage} />
501
+ )}
502
+ <View style={styles.listItemContent}>
503
+ <Text style={[styles.listItemTitle, { color: colors.text }]} numberOfLines={1}>
504
+ {fieldType === 'locations' ? item.name : (item.title || item.url)}
505
+ </Text>
506
+ {fieldType === 'links' && (
507
+ <Text style={[styles.listItemSubtitle, { color: colors.secondaryText }]} numberOfLines={1}>
508
+ {item.url}
509
+ </Text>
510
+ )}
511
+ </View>
512
+ <TouchableOpacity
513
+ onPress={() => handleRemoveItem(item.id)}
514
+ style={styles.removeButton}
515
+ >
516
+ <Ionicons name="trash-outline" size={18} color="#FF3B30" />
517
+ </TouchableOpacity>
518
+ </View>
519
+ ))}
520
+ </View>
521
+ )}
522
+ </>
523
+ );
524
+ };
525
+
526
+ return (
527
+ <KeyboardAvoidingView
528
+ style={[styles.container, { backgroundColor: normalizedTheme === 'dark' ? '#000000' : '#F5F5F5' }]}
529
+ behavior={Platform.OS === 'ios' ? 'padding' : undefined}
530
+ >
531
+ <Header
532
+ title=""
533
+ subtitle=""
534
+ theme={normalizedTheme}
535
+ onBack={onClose || goBack}
536
+ variant="minimal"
537
+ elevation="none"
538
+ rightAction={{
539
+ text: isSaving ? (t('common.saving') || 'Saving...') : (t('common.save') || 'Save'),
540
+ onPress: handleSave,
541
+ disabled: isSaving,
542
+ loading: isSaving,
543
+ }}
544
+ />
545
+
546
+ <ScrollView
547
+ style={styles.content}
548
+ contentContainerStyle={styles.contentContainer}
549
+ showsVerticalScrollIndicator={false}
550
+ keyboardShouldPersistTaps="handled"
551
+ >
552
+ {/* Big Title */}
553
+ <View style={styles.titleContainer}>
554
+ <Text style={[styles.bigTitle, { color: colors.text }]}>
555
+ {fieldConfig.title}
556
+ </Text>
557
+ {fieldConfig.subtitle && (
558
+ <Text style={[styles.bigSubtitle, { color: colors.secondaryText }]}>
559
+ {fieldConfig.subtitle}
560
+ </Text>
561
+ )}
562
+ </View>
563
+
564
+ {/* Form Content */}
565
+ <View style={[styles.formCard, { backgroundColor: colors.card }]}>
566
+ {fieldConfig.isList ? renderListContent() : fieldConfig.fields.map(renderField)}
567
+ </View>
568
+ </ScrollView>
569
+ </KeyboardAvoidingView>
570
+ );
571
+ };
572
+
573
+ const styles = StyleSheet.create({
574
+ container: {
575
+ flex: 1,
576
+ },
577
+ content: {
578
+ flex: 1,
579
+ },
580
+ contentContainer: {
581
+ padding: 16,
582
+ paddingTop: 24,
583
+ paddingBottom: 40,
584
+ },
585
+ titleContainer: {
586
+ marginBottom: 24,
587
+ },
588
+ bigTitle: {
589
+ fontSize: 34,
590
+ fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
591
+ fontFamily: fontFamilies.interBold,
592
+ lineHeight: 40,
593
+ marginBottom: 8,
594
+ letterSpacing: -0.5,
595
+ },
596
+ bigSubtitle: {
597
+ fontSize: 16,
598
+ lineHeight: 22,
599
+ opacity: 0.7,
600
+ marginTop: 4,
601
+ },
602
+ formCard: {
603
+ borderRadius: 16,
604
+ padding: 16,
605
+ gap: 16,
606
+ },
607
+ inputGroup: {
608
+ gap: 8,
609
+ },
610
+ label: {
611
+ fontSize: 14,
612
+ fontWeight: '600',
613
+ fontFamily: fontFamilies.interSemiBold,
614
+ },
615
+ input: {
616
+ borderWidth: StyleSheet.hairlineWidth,
617
+ borderRadius: 12,
618
+ padding: 16,
619
+ fontSize: 16,
620
+ minHeight: 52,
621
+ },
622
+ textArea: {
623
+ borderWidth: StyleSheet.hairlineWidth,
624
+ borderRadius: 12,
625
+ padding: 16,
626
+ fontSize: 16,
627
+ minHeight: 140,
628
+ },
629
+ errorText: {
630
+ fontSize: 12,
631
+ color: '#FF3B30',
632
+ marginTop: 4,
633
+ },
634
+ addItemRow: {
635
+ flexDirection: 'row',
636
+ gap: 8,
637
+ alignItems: 'center',
638
+ },
639
+ addButton: {
640
+ width: 52,
641
+ height: 52,
642
+ borderRadius: 12,
643
+ alignItems: 'center',
644
+ justifyContent: 'center',
645
+ },
646
+ listSection: {
647
+ marginTop: 8,
648
+ },
649
+ listTitle: {
650
+ fontSize: 16,
651
+ fontWeight: '600',
652
+ fontFamily: fontFamilies.interSemiBold,
653
+ marginBottom: 12,
654
+ },
655
+ listItem: {
656
+ flexDirection: 'row',
657
+ alignItems: 'center',
658
+ padding: 16,
659
+ borderRadius: 12,
660
+ borderWidth: StyleSheet.hairlineWidth,
661
+ gap: 12,
662
+ marginBottom: 8,
663
+ },
664
+ listItemContent: {
665
+ flex: 1,
666
+ gap: 4,
667
+ },
668
+ listItemTitle: {
669
+ fontSize: 16,
670
+ fontWeight: '500',
671
+ },
672
+ listItemSubtitle: {
673
+ fontSize: 13,
674
+ },
675
+ linkImage: {
676
+ width: 40,
677
+ height: 40,
678
+ borderRadius: 8,
679
+ },
680
+ removeButton: {
681
+ padding: 8,
682
+ },
683
+ });
684
+
685
+ export default React.memo(EditProfileFieldScreen);