@oxyhq/services 5.5.9 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/README.md +16 -2
  2. package/lib/commonjs/core/index.js +69 -82
  3. package/lib/commonjs/core/index.js.map +1 -1
  4. package/lib/commonjs/index.js +24 -183
  5. package/lib/commonjs/index.js.map +1 -1
  6. package/lib/commonjs/node/index.js +0 -2
  7. package/lib/commonjs/node/index.js.map +1 -1
  8. package/lib/commonjs/ui/components/FollowButton.js +100 -229
  9. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  10. package/lib/commonjs/ui/components/OxyPayButton.js +131 -0
  11. package/lib/commonjs/ui/components/OxyPayButton.js.map +1 -0
  12. package/lib/commonjs/ui/components/OxyProvider.js +41 -198
  13. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  14. package/lib/commonjs/ui/components/OxySignInButton.js +15 -2
  15. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  16. package/lib/commonjs/ui/components/icon/FAIRWalletIcon.js +66 -0
  17. package/lib/commonjs/ui/components/icon/FAIRWalletIcon.js.map +1 -0
  18. package/lib/commonjs/ui/components/icon/index.js +7 -0
  19. package/lib/commonjs/ui/components/icon/index.js.map +1 -1
  20. package/lib/commonjs/ui/components/index.js +7 -0
  21. package/lib/commonjs/ui/components/index.js.map +1 -1
  22. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +14 -7
  23. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
  24. package/lib/commonjs/ui/components/internal/PinInput.js +108 -0
  25. package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -0
  26. package/lib/commonjs/ui/components/internal/TextField.js +20 -0
  27. package/lib/commonjs/ui/components/internal/TextField.js.map +1 -1
  28. package/lib/commonjs/ui/context/OxyContext.js +116 -84
  29. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  30. package/lib/commonjs/ui/hooks/index.js +2 -15
  31. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  32. package/lib/commonjs/ui/hooks/useFollow.js +52 -136
  33. package/lib/commonjs/ui/hooks/useFollow.js.map +1 -1
  34. package/lib/commonjs/ui/hooks/useSessionSocket.js +52 -0
  35. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -0
  36. package/lib/commonjs/ui/index.js +8 -191
  37. package/lib/commonjs/ui/index.js.map +1 -1
  38. package/lib/commonjs/ui/navigation/OxyRouter.js +52 -60
  39. package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
  40. package/lib/commonjs/ui/screens/AccountCenterScreen.js +18 -30
  41. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  42. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +4 -22
  43. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  44. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +90 -39
  45. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  46. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +37 -66
  47. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  48. package/lib/commonjs/ui/screens/AppInfoScreen.js +21 -44
  49. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  50. package/lib/commonjs/ui/screens/FeedbackScreen.js +44 -23
  51. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  52. package/lib/commonjs/ui/screens/FileManagementScreen.js +59 -78
  53. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  54. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +1588 -0
  55. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -0
  56. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +22 -36
  57. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  58. package/lib/commonjs/ui/screens/RecoverAccountScreen.js +269 -0
  59. package/lib/commonjs/ui/screens/RecoverAccountScreen.js.map +1 -0
  60. package/lib/commonjs/ui/screens/SessionManagementScreen.js +47 -69
  61. package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
  62. package/lib/commonjs/ui/screens/SignInScreen.js +99 -333
  63. package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/SignUpScreen.js +136 -340
  65. package/lib/commonjs/ui/screens/SignUpScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +192 -0
  67. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -0
  68. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +135 -0
  69. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -0
  70. package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js +108 -0
  71. package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js.map +1 -0
  72. package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js +126 -0
  73. package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js.map +1 -0
  74. package/lib/commonjs/ui/screens/internal/SignUpSummaryStep.js +84 -0
  75. package/lib/commonjs/ui/screens/internal/SignUpSummaryStep.js.map +1 -0
  76. package/lib/commonjs/ui/screens/internal/SignUpWelcomeStep.js +59 -0
  77. package/lib/commonjs/ui/screens/internal/SignUpWelcomeStep.js.map +1 -0
  78. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +15 -2
  79. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  80. package/lib/commonjs/ui/stores/authStore.js +66 -0
  81. package/lib/commonjs/ui/stores/authStore.js.map +1 -0
  82. package/lib/commonjs/ui/stores/followStore.js +124 -0
  83. package/lib/commonjs/ui/stores/followStore.js.map +1 -0
  84. package/lib/commonjs/ui/styles/index.js +0 -11
  85. package/lib/commonjs/ui/styles/index.js.map +1 -1
  86. package/lib/commonjs/ui/utils/confirmAction.js +28 -0
  87. package/lib/commonjs/ui/utils/confirmAction.js.map +1 -0
  88. package/lib/module/core/index.js +69 -81
  89. package/lib/module/core/index.js.map +1 -1
  90. package/lib/module/index.js +14 -17
  91. package/lib/module/index.js.map +1 -1
  92. package/lib/module/node/index.js +0 -3
  93. package/lib/module/node/index.js.map +1 -1
  94. package/lib/module/ui/components/FollowButton.js +100 -229
  95. package/lib/module/ui/components/FollowButton.js.map +1 -1
  96. package/lib/module/ui/components/OxyPayButton.js +125 -0
  97. package/lib/module/ui/components/OxyPayButton.js.map +1 -0
  98. package/lib/module/ui/components/OxyProvider.js +42 -199
  99. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  100. package/lib/module/ui/components/OxySignInButton.js +15 -2
  101. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  102. package/lib/module/ui/components/icon/FAIRWalletIcon.js +60 -0
  103. package/lib/module/ui/components/icon/FAIRWalletIcon.js.map +1 -0
  104. package/lib/module/ui/components/icon/index.js +1 -0
  105. package/lib/module/ui/components/icon/index.js.map +1 -1
  106. package/lib/module/ui/components/index.js +1 -0
  107. package/lib/module/ui/components/index.js.map +1 -1
  108. package/lib/module/ui/components/internal/GroupedPillButtons.js +15 -8
  109. package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
  110. package/lib/module/ui/components/internal/PinInput.js +103 -0
  111. package/lib/module/ui/components/internal/PinInput.js.map +1 -0
  112. package/lib/module/ui/components/internal/TextField.js +20 -0
  113. package/lib/module/ui/components/internal/TextField.js.map +1 -1
  114. package/lib/module/ui/context/OxyContext.js +117 -85
  115. package/lib/module/ui/context/OxyContext.js.map +1 -1
  116. package/lib/module/ui/hooks/index.js +1 -2
  117. package/lib/module/ui/hooks/index.js.map +1 -1
  118. package/lib/module/ui/hooks/useFollow.js +52 -137
  119. package/lib/module/ui/hooks/useFollow.js.map +1 -1
  120. package/lib/module/ui/hooks/useSessionSocket.js +47 -0
  121. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -0
  122. package/lib/module/ui/index.js +2 -13
  123. package/lib/module/ui/index.js.map +1 -1
  124. package/lib/module/ui/navigation/OxyRouter.js +53 -61
  125. package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
  126. package/lib/module/ui/screens/AccountCenterScreen.js +6 -18
  127. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  128. package/lib/module/ui/screens/AccountOverviewScreen.js +5 -23
  129. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  130. package/lib/module/ui/screens/AccountSettingsScreen.js +91 -40
  131. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  132. package/lib/module/ui/screens/AccountSwitcherScreen.js +38 -67
  133. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  134. package/lib/module/ui/screens/AppInfoScreen.js +22 -45
  135. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  136. package/lib/module/ui/screens/FeedbackScreen.js +44 -23
  137. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  138. package/lib/module/ui/screens/FileManagementScreen.js +59 -78
  139. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  140. package/lib/module/ui/screens/PaymentGatewayScreen.js +1583 -0
  141. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -0
  142. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +23 -37
  143. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  144. package/lib/module/ui/screens/RecoverAccountScreen.js +263 -0
  145. package/lib/module/ui/screens/RecoverAccountScreen.js.map +1 -0
  146. package/lib/module/ui/screens/SessionManagementScreen.js +47 -69
  147. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  148. package/lib/module/ui/screens/SignInScreen.js +100 -334
  149. package/lib/module/ui/screens/SignInScreen.js.map +1 -1
  150. package/lib/module/ui/screens/SignUpScreen.js +137 -341
  151. package/lib/module/ui/screens/SignUpScreen.js.map +1 -1
  152. package/lib/module/ui/screens/internal/SignInPasswordStep.js +186 -0
  153. package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -0
  154. package/lib/module/ui/screens/internal/SignInUsernameStep.js +129 -0
  155. package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -0
  156. package/lib/module/ui/screens/internal/SignUpIdentityStep.js +102 -0
  157. package/lib/module/ui/screens/internal/SignUpIdentityStep.js.map +1 -0
  158. package/lib/module/ui/screens/internal/SignUpSecurityStep.js +120 -0
  159. package/lib/module/ui/screens/internal/SignUpSecurityStep.js.map +1 -0
  160. package/lib/module/ui/screens/internal/SignUpSummaryStep.js +79 -0
  161. package/lib/module/ui/screens/internal/SignUpSummaryStep.js.map +1 -0
  162. package/lib/module/ui/screens/internal/SignUpWelcomeStep.js +54 -0
  163. package/lib/module/ui/screens/internal/SignUpWelcomeStep.js.map +1 -0
  164. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +16 -3
  165. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  166. package/lib/module/ui/stores/authStore.js +62 -0
  167. package/lib/module/ui/stores/authStore.js.map +1 -0
  168. package/lib/module/ui/stores/followStore.js +120 -0
  169. package/lib/module/ui/stores/followStore.js.map +1 -0
  170. package/lib/module/ui/styles/index.js +0 -1
  171. package/lib/module/ui/styles/index.js.map +1 -1
  172. package/lib/module/ui/utils/confirmAction.js +25 -0
  173. package/lib/module/ui/utils/confirmAction.js.map +1 -0
  174. package/lib/typescript/core/index.d.ts +28 -10
  175. package/lib/typescript/core/index.d.ts.map +1 -1
  176. package/lib/typescript/index.d.ts +5 -4
  177. package/lib/typescript/index.d.ts.map +1 -1
  178. package/lib/typescript/models/interfaces.d.ts +6 -0
  179. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  180. package/lib/typescript/models/secureSession.d.ts +0 -1
  181. package/lib/typescript/models/secureSession.d.ts.map +1 -1
  182. package/lib/typescript/node/index.d.ts +0 -1
  183. package/lib/typescript/node/index.d.ts.map +1 -1
  184. package/lib/typescript/ui/components/FollowButton.d.ts +1 -77
  185. package/lib/typescript/ui/components/FollowButton.d.ts.map +1 -1
  186. package/lib/typescript/ui/components/OxyPayButton.d.ts +29 -0
  187. package/lib/typescript/ui/components/OxyPayButton.d.ts.map +1 -0
  188. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  189. package/lib/typescript/ui/components/OxySignInButton.d.ts.map +1 -1
  190. package/lib/typescript/ui/components/icon/FAIRWalletIcon.d.ts +8 -0
  191. package/lib/typescript/ui/components/icon/FAIRWalletIcon.d.ts.map +1 -0
  192. package/lib/typescript/ui/components/icon/index.d.ts +1 -0
  193. package/lib/typescript/ui/components/icon/index.d.ts.map +1 -1
  194. package/lib/typescript/ui/components/index.d.ts +1 -0
  195. package/lib/typescript/ui/components/index.d.ts.map +1 -1
  196. package/lib/typescript/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
  197. package/lib/typescript/ui/components/internal/PinInput.d.ts +12 -0
  198. package/lib/typescript/ui/components/internal/PinInput.d.ts.map +1 -0
  199. package/lib/typescript/ui/components/internal/TextField.d.ts +1 -0
  200. package/lib/typescript/ui/components/internal/TextField.d.ts.map +1 -1
  201. package/lib/typescript/ui/context/OxyContext.d.ts +0 -2
  202. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  203. package/lib/typescript/ui/hooks/index.d.ts +1 -2
  204. package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
  205. package/lib/typescript/ui/hooks/useFollow.d.ts +14 -15
  206. package/lib/typescript/ui/hooks/useFollow.d.ts.map +1 -1
  207. package/lib/typescript/ui/hooks/useSessionSocket.d.ts +11 -0
  208. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -0
  209. package/lib/typescript/ui/index.d.ts +2 -5
  210. package/lib/typescript/ui/index.d.ts.map +1 -1
  211. package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +1 -1
  212. package/lib/typescript/ui/navigation/types.d.ts +5 -23
  213. package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
  214. package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  215. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  216. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  217. package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  218. package/lib/typescript/ui/screens/AppInfoScreen.d.ts.map +1 -1
  219. package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
  220. package/lib/typescript/ui/screens/FileManagementScreen.d.ts.map +1 -1
  221. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +27 -0
  222. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -0
  223. package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  224. package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts +8 -0
  225. package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts.map +1 -0
  226. package/lib/typescript/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  227. package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
  228. package/lib/typescript/ui/screens/SignUpScreen.d.ts.map +1 -1
  229. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts +27 -0
  230. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -0
  231. package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts +26 -0
  232. package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts.map +1 -0
  233. package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts +20 -0
  234. package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts.map +1 -0
  235. package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts +24 -0
  236. package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts.map +1 -0
  237. package/lib/typescript/ui/screens/internal/SignUpSummaryStep.d.ts +15 -0
  238. package/lib/typescript/ui/screens/internal/SignUpSummaryStep.d.ts.map +1 -0
  239. package/lib/typescript/ui/screens/internal/SignUpWelcomeStep.d.ts +13 -0
  240. package/lib/typescript/ui/screens/internal/SignUpWelcomeStep.d.ts.map +1 -0
  241. package/lib/typescript/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
  242. package/lib/typescript/ui/stores/authStore.d.ts +16 -0
  243. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -0
  244. package/lib/typescript/ui/stores/followStore.d.ts +15 -0
  245. package/lib/typescript/ui/stores/followStore.d.ts.map +1 -0
  246. package/lib/typescript/ui/styles/index.d.ts +0 -1
  247. package/lib/typescript/ui/styles/index.d.ts.map +1 -1
  248. package/lib/typescript/ui/utils/confirmAction.d.ts +7 -0
  249. package/lib/typescript/ui/utils/confirmAction.d.ts.map +1 -0
  250. package/package.json +12 -7
  251. package/src/core/index.ts +78 -88
  252. package/src/index.ts +8 -45
  253. package/src/models/interfaces.ts +7 -1
  254. package/src/models/secureSession.ts +1 -2
  255. package/src/node/index.ts +0 -3
  256. package/src/ui/components/FollowButton.tsx +100 -322
  257. package/src/ui/components/OxyPayButton.tsx +133 -0
  258. package/src/ui/components/OxyProvider.tsx +39 -201
  259. package/src/ui/components/OxySignInButton.tsx +13 -2
  260. package/src/ui/components/icon/FAIRWalletIcon.tsx +49 -0
  261. package/src/ui/components/icon/index.ts +1 -0
  262. package/src/ui/components/index.ts +1 -0
  263. package/src/ui/components/internal/GroupedPillButtons.tsx +12 -8
  264. package/src/ui/components/internal/PinInput.tsx +102 -0
  265. package/src/ui/components/internal/TextField.tsx +9 -0
  266. package/src/ui/context/OxyContext.tsx +74 -91
  267. package/src/ui/hooks/index.ts +1 -2
  268. package/src/ui/hooks/useFollow.ts +58 -129
  269. package/src/ui/hooks/useSessionSocket.ts +50 -0
  270. package/src/ui/index.ts +2 -37
  271. package/src/ui/navigation/OxyRouter.tsx +47 -63
  272. package/src/ui/navigation/types.ts +5 -26
  273. package/src/ui/screens/AccountCenterScreen.tsx +12 -21
  274. package/src/ui/screens/AccountOverviewScreen.tsx +6 -30
  275. package/src/ui/screens/AccountSettingsScreen.tsx +75 -46
  276. package/src/ui/screens/AccountSwitcherScreen.tsx +46 -88
  277. package/src/ui/screens/AppInfoScreen.tsx +27 -47
  278. package/src/ui/screens/FeedbackScreen.tsx +34 -19
  279. package/src/ui/screens/FileManagementScreen.tsx +293 -321
  280. package/src/ui/screens/PaymentGatewayScreen.tsx +1315 -0
  281. package/src/ui/screens/PremiumSubscriptionScreen.tsx +109 -124
  282. package/src/ui/screens/RecoverAccountScreen.tsx +260 -0
  283. package/src/ui/screens/SessionManagementScreen.tsx +65 -137
  284. package/src/ui/screens/SignInScreen.tsx +89 -283
  285. package/src/ui/screens/SignUpScreen.tsx +138 -291
  286. package/src/ui/screens/internal/SignInPasswordStep.tsx +179 -0
  287. package/src/ui/screens/internal/SignInUsernameStep.tsx +139 -0
  288. package/src/ui/screens/internal/SignUpIdentityStep.tsx +114 -0
  289. package/src/ui/screens/internal/SignUpSecurityStep.tsx +132 -0
  290. package/src/ui/screens/internal/SignUpSummaryStep.tsx +66 -0
  291. package/src/ui/screens/internal/SignUpWelcomeStep.tsx +52 -0
  292. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +13 -3
  293. package/src/ui/stores/authStore.ts +45 -0
  294. package/src/ui/stores/followStore.ts +80 -0
  295. package/src/ui/styles/index.ts +0 -1
  296. package/src/ui/utils/confirmAction.ts +23 -0
  297. package/lib/commonjs/ui/components/bottomSheet/index.js +0 -37
  298. package/lib/commonjs/ui/components/bottomSheet/index.js.map +0 -1
  299. package/lib/commonjs/ui/hooks/useAuthFetch.js +0 -217
  300. package/lib/commonjs/ui/hooks/useAuthFetch.js.map +0 -1
  301. package/lib/commonjs/ui/hooks/useOxyFollow.js +0 -190
  302. package/lib/commonjs/ui/hooks/useOxyFollow.js.map +0 -1
  303. package/lib/commonjs/ui/screens/BillingManagementScreen.js +0 -636
  304. package/lib/commonjs/ui/screens/BillingManagementScreen.js.map +0 -1
  305. package/lib/commonjs/ui/store/index.js +0 -67
  306. package/lib/commonjs/ui/store/index.js.map +0 -1
  307. package/lib/commonjs/ui/store/setupOxyStore.js +0 -63
  308. package/lib/commonjs/ui/store/setupOxyStore.js.map +0 -1
  309. package/lib/commonjs/ui/store/slices/authSlice.js +0 -56
  310. package/lib/commonjs/ui/store/slices/authSlice.js.map +0 -1
  311. package/lib/commonjs/ui/store/slices/followSlice.js +0 -238
  312. package/lib/commonjs/ui/store/slices/followSlice.js.map +0 -1
  313. package/lib/commonjs/ui/store/slices/index.js +0 -129
  314. package/lib/commonjs/ui/store/slices/index.js.map +0 -1
  315. package/lib/commonjs/ui/store/slices/types.js +0 -19
  316. package/lib/commonjs/ui/store/slices/types.js.map +0 -1
  317. package/lib/commonjs/ui/styles/shadows.js +0 -123
  318. package/lib/commonjs/ui/styles/shadows.js.map +0 -1
  319. package/lib/commonjs/utils/polyfills.js +0 -42
  320. package/lib/commonjs/utils/polyfills.js.map +0 -1
  321. package/lib/module/ui/components/bottomSheet/index.js +0 -5
  322. package/lib/module/ui/components/bottomSheet/index.js.map +0 -1
  323. package/lib/module/ui/hooks/useAuthFetch.js +0 -212
  324. package/lib/module/ui/hooks/useAuthFetch.js.map +0 -1
  325. package/lib/module/ui/hooks/useOxyFollow.js +0 -186
  326. package/lib/module/ui/hooks/useOxyFollow.js.map +0 -1
  327. package/lib/module/ui/screens/BillingManagementScreen.js +0 -631
  328. package/lib/module/ui/screens/BillingManagementScreen.js.map +0 -1
  329. package/lib/module/ui/store/index.js +0 -33
  330. package/lib/module/ui/store/index.js.map +0 -1
  331. package/lib/module/ui/store/setupOxyStore.js +0 -59
  332. package/lib/module/ui/store/setupOxyStore.js.map +0 -1
  333. package/lib/module/ui/store/slices/authSlice.js +0 -48
  334. package/lib/module/ui/store/slices/authSlice.js.map +0 -1
  335. package/lib/module/ui/store/slices/followSlice.js +0 -232
  336. package/lib/module/ui/store/slices/followSlice.js.map +0 -1
  337. package/lib/module/ui/store/slices/index.js +0 -11
  338. package/lib/module/ui/store/slices/index.js.map +0 -1
  339. package/lib/module/ui/store/slices/types.js +0 -15
  340. package/lib/module/ui/store/slices/types.js.map +0 -1
  341. package/lib/module/ui/styles/shadows.js +0 -119
  342. package/lib/module/ui/styles/shadows.js.map +0 -1
  343. package/lib/module/utils/polyfills.js +0 -36
  344. package/lib/module/utils/polyfills.js.map +0 -1
  345. package/lib/typescript/types/react-redux.d.ts +0 -5
  346. package/lib/typescript/ui/components/bottomSheet/index.d.ts +0 -4
  347. package/lib/typescript/ui/components/bottomSheet/index.d.ts.map +0 -1
  348. package/lib/typescript/ui/hooks/useAuthFetch.d.ts +0 -34
  349. package/lib/typescript/ui/hooks/useAuthFetch.d.ts.map +0 -1
  350. package/lib/typescript/ui/hooks/useOxyFollow.d.ts +0 -81
  351. package/lib/typescript/ui/hooks/useOxyFollow.d.ts.map +0 -1
  352. package/lib/typescript/ui/screens/BillingManagementScreen.d.ts +0 -5
  353. package/lib/typescript/ui/screens/BillingManagementScreen.d.ts.map +0 -1
  354. package/lib/typescript/ui/store/index.d.ts +0 -27
  355. package/lib/typescript/ui/store/index.d.ts.map +0 -1
  356. package/lib/typescript/ui/store/setupOxyStore.d.ts +0 -29
  357. package/lib/typescript/ui/store/setupOxyStore.d.ts.map +0 -1
  358. package/lib/typescript/ui/store/slices/authSlice.d.ts +0 -32
  359. package/lib/typescript/ui/store/slices/authSlice.d.ts.map +0 -1
  360. package/lib/typescript/ui/store/slices/followSlice.d.ts +0 -120
  361. package/lib/typescript/ui/store/slices/followSlice.d.ts.map +0 -1
  362. package/lib/typescript/ui/store/slices/index.d.ts +0 -9
  363. package/lib/typescript/ui/store/slices/index.d.ts.map +0 -1
  364. package/lib/typescript/ui/store/slices/types.d.ts +0 -16
  365. package/lib/typescript/ui/store/slices/types.d.ts.map +0 -1
  366. package/lib/typescript/ui/styles/shadows.d.ts +0 -233
  367. package/lib/typescript/ui/styles/shadows.d.ts.map +0 -1
  368. package/lib/typescript/utils/polyfills.d.ts +0 -6
  369. package/lib/typescript/utils/polyfills.d.ts.map +0 -1
  370. package/src/__tests__/backend-middleware.test.ts +0 -209
  371. package/src/__tests__/polyfills.test.ts +0 -30
  372. package/src/__tests__/setup.ts +0 -43
  373. package/src/__tests__/ui/hooks/authfetch-integration.test.ts +0 -197
  374. package/src/__tests__/ui/hooks/backward-compatibility.test.ts +0 -159
  375. package/src/__tests__/ui/hooks/real-world-scenarios.test.ts +0 -224
  376. package/src/__tests__/ui/hooks/url-resolution.test.ts +0 -129
  377. package/src/__tests__/ui/hooks/useAuthFetch-separation.test.ts +0 -69
  378. package/src/__tests__/ui/hooks/useAuthFetch.test.ts +0 -70
  379. package/src/__tests__/ui/hooks/useOxyFollow.test.tsx +0 -92
  380. package/src/__tests__/ui/screens/AccountSettingsScreen.test.tsx +0 -112
  381. package/src/__tests__/ui/store/setupOxyStore.test.ts +0 -50
  382. package/src/__tests__/validate-structure.js +0 -91
  383. package/src/__tests__/validation.js +0 -42
  384. package/src/types/react-redux.d.ts +0 -5
  385. package/src/ui/components/bottomSheet/index.tsx +0 -14
  386. package/src/ui/hooks/useAuthFetch.ts +0 -238
  387. package/src/ui/hooks/useOxyFollow.ts +0 -188
  388. package/src/ui/screens/BillingManagementScreen.tsx +0 -589
  389. package/src/ui/store/index.ts +0 -36
  390. package/src/ui/store/setupOxyStore.ts +0 -58
  391. package/src/ui/store/slices/authSlice.ts +0 -43
  392. package/src/ui/store/slices/followSlice.ts +0 -207
  393. package/src/ui/store/slices/index.ts +0 -31
  394. package/src/ui/store/slices/types.ts +0 -33
  395. package/src/ui/styles/shadows.ts +0 -112
  396. package/src/utils/polyfills.ts +0 -34
@@ -13,13 +13,16 @@ import { BaseScreenProps } from '../navigation/types';
13
13
  import { useOxy } from '../context/OxyContext';
14
14
  import { packageInfo } from '../../constants/version';
15
15
  import { toast } from '../../lib/sonner';
16
+ import { confirmAction } from '../utils/confirmAction';
16
17
  import { Ionicons } from '@expo/vector-icons';
17
18
  import { fontFamilies } from '../styles/fonts';
18
- import ProfileCard from '../components/ProfileCard';
19
- import Section from '../components/Section';
20
- import QuickActions from '../components/QuickActions';
21
- import GroupedSection from '../components/GroupedSection';
22
- import GroupedItem from '../components/GroupedItem';
19
+ import {
20
+ ProfileCard,
21
+ Section,
22
+ QuickActions,
23
+ GroupedSection,
24
+ GroupedItem
25
+ } from '../components';
23
26
 
24
27
  const AccountCenterScreen: React.FC<BaseScreenProps> = ({
25
28
  onClose,
@@ -49,21 +52,9 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
49
52
  };
50
53
 
51
54
  const confirmLogout = () => {
52
- Alert.alert(
53
- 'Sign Out',
55
+ confirmAction(
54
56
  'Are you sure you want to sign out?',
55
- [
56
- {
57
- text: 'Cancel',
58
- style: 'cancel',
59
- },
60
- {
61
- text: 'Sign Out',
62
- onPress: handleLogout,
63
- style: 'destructive',
64
- },
65
- ],
66
- { cancelable: true }
57
+ handleLogout
67
58
  );
68
59
  };
69
60
 
@@ -105,7 +96,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
105
96
  { id: 'settings', icon: 'settings', iconColor: '#5856D6', title: 'Settings', onPress: () => navigate('AccountSettings') },
106
97
  { id: 'sessions', icon: 'shield-checkmark', iconColor: '#30D158', title: 'Sessions', onPress: () => navigate('SessionManagement') },
107
98
  { id: 'premium', icon: 'star', iconColor: '#FFD700', title: 'Premium', onPress: () => navigate('PremiumSubscription') },
108
- ...(user?.isPremium ? [{ id: 'billing', icon: 'card', iconColor: '#34C759', title: 'Billing', onPress: () => navigate('BillingManagement') }] : []),
99
+ ...(user?.isPremium ? [{ id: 'billing', icon: 'card', iconColor: '#34C759', title: 'Billing', onPress: () => navigate('') }] : []),
109
100
  ...(sessions && sessions.length > 1 ? [{ id: 'switch', icon: 'swap-horizontal', iconColor: '#FF9500', title: 'Switch', onPress: () => navigate('AccountSwitcher') }] : []),
110
101
  ]}
111
102
  theme={theme}
@@ -162,7 +153,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
162
153
  iconColor: '#34C759',
163
154
  title: 'Billing Management',
164
155
  subtitle: 'Payment methods and invoices',
165
- onPress: () => navigate('BillingManagement'),
156
+ onPress: () => navigate(''),
166
157
  }] : []),
167
158
  ]}
168
159
  theme={theme}
@@ -18,6 +18,7 @@ import Avatar from '../components/Avatar';
18
18
  import OxyIcon from '../components/icon/OxyIcon';
19
19
  import { fontFamilies } from '../styles/fonts';
20
20
  import { toast } from '../../lib/sonner';
21
+ import { confirmAction } from '../utils/confirmAction';
21
22
  import { Ionicons } from '@expo/vector-icons';
22
23
 
23
24
  /**
@@ -89,7 +90,7 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
89
90
  return {
90
91
  id: session.sessionId,
91
92
  sessionId: session.sessionId,
92
- username: session.username || 'Unknown User',
93
+ username: 'Unknown User',
93
94
  email: 'No email available',
94
95
  avatar: null,
95
96
  userProfile: null
@@ -129,21 +130,9 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
129
130
  }, [logout, onClose]);
130
131
 
131
132
  const confirmLogout = useCallback(() => {
132
- Alert.alert(
133
- 'Sign Out',
133
+ confirmAction(
134
134
  'Are you sure you want to sign out?',
135
- [
136
- {
137
- text: 'Cancel',
138
- style: 'cancel',
139
- },
140
- {
141
- text: 'Sign Out',
142
- onPress: handleLogout,
143
- style: 'destructive',
144
- },
145
- ],
146
- { cancelable: true }
135
+ handleLogout
147
136
  );
148
137
  }, [handleLogout]);
149
138
 
@@ -152,21 +141,9 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
152
141
  }, []);
153
142
 
154
143
  const handleSignOutAll = useCallback(() => {
155
- Alert.alert(
156
- 'Sign Out of All Accounts',
144
+ confirmAction(
157
145
  'Are you sure you want to sign out of all accounts?',
158
- [
159
- {
160
- text: 'Cancel',
161
- style: 'cancel',
162
- },
163
- {
164
- text: 'Sign Out All',
165
- onPress: handleLogout,
166
- style: 'destructive',
167
- },
168
- ],
169
- { cancelable: true }
146
+ handleLogout
170
147
  );
171
148
  }, [handleLogout]);
172
149
 
@@ -292,7 +269,6 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
292
269
  {user?.isPremium && (
293
270
  <TouchableOpacity
294
271
  style={[styles.settingItem, styles.lastSettingItem]}
295
- onPress={() => navigate?.('BillingManagement')}
296
272
  >
297
273
  <View style={styles.settingInfo}>
298
274
  <OxyIcon name="card" size={20} color="#34C759" style={styles.settingIcon} />
@@ -9,6 +9,7 @@ import {
9
9
  Alert,
10
10
  TextInput,
11
11
  Animated,
12
+ Platform,
12
13
  } from 'react-native';
13
14
  import { BaseScreenProps } from '../navigation/types';
14
15
  import { useOxy } from '../context/OxyContext';
@@ -17,6 +18,8 @@ import OxyIcon from '../components/icon/OxyIcon';
17
18
  import { Ionicons } from '@expo/vector-icons';
18
19
  import { toast } from '../../lib/sonner';
19
20
  import { fontFamilies } from '../styles/fonts';
21
+ import { confirmAction } from '../utils/confirmAction';
22
+ import { useAuthStore } from '../stores/authStore';
20
23
 
21
24
  const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
22
25
  onClose,
@@ -25,6 +28,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
25
28
  navigate,
26
29
  }) => {
27
30
  const { user, oxyServices, isLoading: authLoading, isAuthenticated } = useOxy();
31
+ const updateUser = useAuthStore((state) => state.updateUser);
28
32
  const [isLoading, setIsLoading] = useState(false);
29
33
  const [isSaving, setIsSaving] = useState(false);
30
34
 
@@ -33,11 +37,12 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
33
37
 
34
38
  // Form state
35
39
  const [displayName, setDisplayName] = useState('');
40
+ const [lastName, setLastName] = useState('');
36
41
  const [username, setUsername] = useState('');
37
42
  const [email, setEmail] = useState('');
38
43
  const [bio, setBio] = useState('');
39
44
  const [location, setLocation] = useState('');
40
- const [website, setWebsite] = useState('');
45
+ const [links, setLinks] = useState<string[]>([]);
41
46
  const [avatarUrl, setAvatarUrl] = useState('');
42
47
 
43
48
  // Editing states
@@ -45,11 +50,12 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
45
50
 
46
51
  // Temporary input states for inline editing
47
52
  const [tempDisplayName, setTempDisplayName] = useState('');
53
+ const [tempLastName, setTempLastName] = useState('');
48
54
  const [tempUsername, setTempUsername] = useState('');
49
55
  const [tempEmail, setTempEmail] = useState('');
50
56
  const [tempBio, setTempBio] = useState('');
51
57
  const [tempLocation, setTempLocation] = useState('');
52
- const [tempWebsite, setTempWebsite] = useState('');
58
+ const [tempLinks, setTempLinks] = useState<string[]>([]);
53
59
 
54
60
  // Memoize theme-related calculations to prevent unnecessary recalculations
55
61
  const themeStyles = useMemo(() => {
@@ -76,14 +82,19 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
76
82
  if (user) {
77
83
  const userDisplayName = typeof user.name === 'string'
78
84
  ? user.name
79
- : user.name?.full || user.name?.first || '';
80
-
85
+ : user.name?.first || user.name?.full || '';
86
+ const userLastName = typeof user.name === 'object' ? user.name?.last || '' : '';
81
87
  setDisplayName(userDisplayName);
88
+ setLastName(userLastName);
82
89
  setUsername(user.username || '');
83
90
  setEmail(user.email || '');
84
91
  setBio(user.bio || '');
85
92
  setLocation(user.location || '');
86
- setWebsite(user.website || '');
93
+ setLinks(
94
+ Array.isArray(user.links)
95
+ ? user.links.map(l => typeof l === 'string' ? l : l.link).filter(Boolean)
96
+ : user.website ? [user.website] : []
97
+ );
87
98
  setAvatarUrl(user.avatar?.url || '');
88
99
  }
89
100
  }, [user]);
@@ -100,12 +111,12 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
100
111
  email,
101
112
  bio,
102
113
  location,
103
- website,
114
+ links,
104
115
  };
105
116
 
106
117
  // Handle name field
107
- if (displayName) {
108
- updates.name = displayName;
118
+ if (displayName || lastName) {
119
+ updates.name = { first: displayName, last: lastName };
109
120
  }
110
121
 
111
122
  // Handle avatar
@@ -113,7 +124,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
113
124
  updates.avatar = { url: avatarUrl };
114
125
  }
115
126
 
116
- await oxyServices.updateProfile(updates);
127
+ await updateUser(updates, oxyServices);
117
128
  toast.success('Profile updated successfully');
118
129
 
119
130
  animateSaveButton(1); // Scale back to normal
@@ -132,34 +143,18 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
132
143
  };
133
144
 
134
145
  const handleAvatarUpdate = () => {
135
- Alert.alert(
136
- 'Update Avatar',
137
- 'Choose how you want to update your profile picture',
138
- [
139
- {
140
- text: 'Cancel',
141
- style: 'cancel',
142
- },
143
- {
144
- text: 'Use Mock URL',
145
- onPress: () => {
146
- const mockUrl = `https://ui-avatars.com/api/?name=${displayName || username}&background=random`;
147
- setAvatarUrl(mockUrl);
148
- },
149
- },
150
- {
151
- text: 'Remove Avatar',
152
- onPress: () => setAvatarUrl(''),
153
- style: 'destructive',
154
- },
155
- ]
156
- );
146
+ // Always use confirmAction for both web and native
147
+ confirmAction('Remove your profile picture?', () => {
148
+ setAvatarUrl('');
149
+ toast.success('Avatar removed');
150
+ });
157
151
  };
158
152
 
159
153
  const startEditing = (type: string, currentValue: string) => {
160
154
  switch (type) {
161
155
  case 'displayName':
162
- setTempDisplayName(currentValue);
156
+ setTempDisplayName(displayName);
157
+ setTempLastName(lastName);
163
158
  break;
164
159
  case 'username':
165
160
  setTempUsername(currentValue);
@@ -173,8 +168,8 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
173
168
  case 'location':
174
169
  setTempLocation(currentValue);
175
170
  break;
176
- case 'website':
177
- setTempWebsite(currentValue);
171
+ case 'links':
172
+ setTempLinks([...links]);
178
173
  break;
179
174
  }
180
175
  setEditingField(type);
@@ -186,6 +181,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
186
181
  switch (type) {
187
182
  case 'displayName':
188
183
  setDisplayName(tempDisplayName);
184
+ setLastName(tempLastName);
189
185
  break;
190
186
  case 'username':
191
187
  setUsername(tempUsername);
@@ -199,8 +195,8 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
199
195
  case 'location':
200
196
  setLocation(tempLocation);
201
197
  break;
202
- case 'website':
203
- setWebsite(tempWebsite);
198
+ case 'links':
199
+ setLinks(tempLinks);
204
200
  break;
205
201
  }
206
202
 
@@ -222,7 +218,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
222
218
  email: 'Email',
223
219
  bio: 'Bio',
224
220
  location: 'Location',
225
- website: 'Website'
221
+ links: 'Links'
226
222
  };
227
223
  return labels[type as keyof typeof labels] || 'Field';
228
224
  };
@@ -234,19 +230,52 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
234
230
  email: { name: 'mail', color: '#FF9500' },
235
231
  bio: { name: 'document-text', color: '#34C759' },
236
232
  location: { name: 'location', color: '#FF3B30' },
237
- website: { name: 'link', color: '#32D74B' }
233
+ links: { name: 'link', color: '#32D74B' }
238
234
  };
239
235
  return icons[type as keyof typeof icons] || { name: 'person', color: '#007AFF' };
240
236
  };
241
237
 
242
238
  const renderEditingField = (type: string) => {
239
+ if (type === 'displayName') {
240
+ return (
241
+ <View style={styles.editingFieldContainer}>
242
+ <View style={styles.editingFieldContent}>
243
+ <View style={[styles.newValueSection, { flexDirection: 'row', gap: 12 }]}>
244
+ <View style={{ flex: 1 }}>
245
+ <Text style={styles.editingFieldLabel}>First Name</Text>
246
+ <TextInput
247
+ style={styles.editingFieldInput}
248
+ value={tempDisplayName}
249
+ onChangeText={setTempDisplayName}
250
+ placeholder="Enter your first name"
251
+ placeholderTextColor={themeStyles.isDarkTheme ? '#aaa' : '#999'}
252
+ autoFocus
253
+ selectionColor={themeStyles.primaryColor}
254
+ />
255
+ </View>
256
+ <View style={{ flex: 1 }}>
257
+ <Text style={styles.editingFieldLabel}>Last Name</Text>
258
+ <TextInput
259
+ style={styles.editingFieldInput}
260
+ value={tempLastName}
261
+ onChangeText={setTempLastName}
262
+ placeholder="Enter your last name"
263
+ placeholderTextColor={themeStyles.isDarkTheme ? '#aaa' : '#999'}
264
+ selectionColor={themeStyles.primaryColor}
265
+ />
266
+ </View>
267
+ </View>
268
+ </View>
269
+ </View>
270
+ );
271
+ }
243
272
  const fieldConfig = {
244
273
  displayName: { label: 'Display Name', value: displayName, placeholder: 'Enter your display name', icon: 'person', color: '#007AFF', multiline: false, keyboardType: 'default' as const },
245
274
  username: { label: 'Username', value: username, placeholder: 'Choose a username', icon: 'at', color: '#5856D6', multiline: false, keyboardType: 'default' as const },
246
275
  email: { label: 'Email', value: email, placeholder: 'Enter your email address', icon: 'mail', color: '#FF9500', multiline: false, keyboardType: 'email-address' as const },
247
276
  bio: { label: 'Bio', value: bio, placeholder: 'Tell people about yourself...', icon: 'document-text', color: '#34C759', multiline: true, keyboardType: 'default' as const },
248
277
  location: { label: 'Location', value: location, placeholder: 'Enter your location', icon: 'location', color: '#FF3B30', multiline: false, keyboardType: 'default' as const },
249
- website: { label: 'Website', value: website, placeholder: 'Enter your website URL', icon: 'link', color: '#32D74B', multiline: false, keyboardType: 'url' as const }
278
+ links: { label: 'Links', value: links.join(', '), placeholder: 'Enter your links (comma separated)', icon: 'link', color: '#32D74B', multiline: false, keyboardType: 'url' as const }
250
279
  };
251
280
 
252
281
  const config = fieldConfig[type as keyof typeof fieldConfig];
@@ -259,7 +288,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
259
288
  case 'email': return tempEmail;
260
289
  case 'bio': return tempBio;
261
290
  case 'location': return tempLocation;
262
- case 'website': return tempWebsite;
291
+ case 'links': return tempLinks.join(', ');
263
292
  default: return '';
264
293
  }
265
294
  })();
@@ -271,7 +300,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
271
300
  case 'email': setTempEmail(text); break;
272
301
  case 'bio': setTempBio(text); break;
273
302
  case 'location': setTempLocation(text); break;
274
- case 'website': setTempWebsite(text); break;
303
+ case 'links': setTempLinks(text.split(',').map(s => s.trim()).filter(Boolean)); break;
275
304
  }
276
305
  };
277
306
 
@@ -461,7 +490,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
461
490
  {renderField(
462
491
  'displayName',
463
492
  'Display Name',
464
- displayName,
493
+ [displayName, lastName].filter(Boolean).join(' '), // Show full name
465
494
  'Add your display name',
466
495
  'person',
467
496
  '#007AFF',
@@ -529,10 +558,10 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({
529
558
  )}
530
559
 
531
560
  {renderField(
532
- 'website',
533
- 'Website',
534
- website,
535
- 'Add your website',
561
+ 'links',
562
+ 'Links',
563
+ links.join(', '),
564
+ 'Add your links',
536
565
  'link',
537
566
  '#32D74B',
538
567
  false,
@@ -17,6 +17,7 @@ import { SecureClientSession } from '../../models/secureSession';
17
17
  import { fontFamilies } from '../styles/fonts';
18
18
  import { User } from '../../models/interfaces';
19
19
  import { toast } from '../../lib/sonner';
20
+ import { confirmAction } from '../utils/confirmAction';
20
21
  import OxyIcon from '../components/icon/OxyIcon';
21
22
  import { Ionicons } from '@expo/vector-icons';
22
23
  import Avatar from '../components/Avatar';
@@ -142,40 +143,21 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
142
143
  }
143
144
  };
144
145
 
145
- const handleRemoveSession = async (sessionId: string) => {
146
- const sessionToRemove = sessionsWithUsers.find(s => s.sessionId === sessionId);
147
- if (!sessionToRemove) return;
148
-
149
- const displayName = typeof sessionToRemove.userProfile?.name === 'object'
150
- ? sessionToRemove.userProfile.name.full || sessionToRemove.userProfile.name.first || sessionToRemove.userProfile.username
151
- : sessionToRemove.userProfile?.name || sessionToRemove.userProfile?.username || 'this account';
152
-
153
- Alert.alert(
154
- 'Remove Account',
146
+ const handleRemoveSession = async (sessionId: string, displayName: string) => {
147
+ confirmAction(
155
148
  `Are you sure you want to remove ${displayName} from this device? You'll need to sign in again to access this account.`,
156
- [
157
- {
158
- text: 'Cancel',
159
- style: 'cancel',
160
- },
161
- {
162
- text: 'Remove',
163
- style: 'destructive',
164
- onPress: async () => {
165
- setRemovingUserId(sessionId);
166
- try {
167
- await removeSession(sessionId);
168
- toast.success('Account removed successfully!');
169
- } catch (error) {
170
- console.error('Remove session failed:', error);
171
- toast.error('There was a problem removing the account. Please try again.');
172
- } finally {
173
- setRemovingUserId(null);
174
- }
175
- },
176
- },
177
- ],
178
- { cancelable: true }
149
+ async () => {
150
+ setRemovingUserId(sessionId);
151
+ try {
152
+ await removeSession(sessionId);
153
+ toast.success('Account removed successfully!');
154
+ } catch (error) {
155
+ console.error('Remove session failed:', error);
156
+ toast.error('There was a problem removing the account. Please try again.');
157
+ } finally {
158
+ setRemovingUserId(null);
159
+ }
160
+ }
179
161
  );
180
162
  };
181
163
 
@@ -238,34 +220,22 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
238
220
  };
239
221
 
240
222
  const handleRemoteSessionLogout = async (sessionId: string, deviceName: string) => {
241
- Alert.alert(
242
- 'Remove Device Session',
223
+ confirmAction(
243
224
  `Are you sure you want to sign out from "${deviceName}"? This will end the session on that device.`,
244
- [
245
- {
246
- text: 'Cancel',
247
- style: 'cancel',
248
- },
249
- {
250
- text: 'Sign Out',
251
- style: 'destructive',
252
- onPress: async () => {
253
- setRemoteLogoutSessionId(sessionId);
254
- try {
255
- await oxyServices?.logoutSecureSession(user?.sessionId || '', sessionId);
256
- // Refresh device sessions list
257
- await loadAllDeviceSessions();
258
- toast.success(`Signed out from ${deviceName} successfully!`);
259
- } catch (error) {
260
- console.error('Remote logout failed:', error);
261
- toast.error('There was a problem signing out from the device. Please try again.');
262
- } finally {
263
- setRemoteLogoutSessionId(null);
264
- }
265
- },
266
- },
267
- ],
268
- { cancelable: true }
225
+ async () => {
226
+ setRemoteLogoutSessionId(sessionId);
227
+ try {
228
+ await oxyServices?.logoutSecureSession(user?.sessionId || '', sessionId);
229
+ // Refresh device sessions list
230
+ await loadAllDeviceSessions();
231
+ toast.success(`Signed out from ${deviceName} successfully!`);
232
+ } catch (error) {
233
+ console.error('Remote logout failed:', error);
234
+ toast.error('There was a problem signing out from the device. Please try again.');
235
+ } finally {
236
+ setRemoteLogoutSessionId(null);
237
+ }
238
+ }
269
239
  );
270
240
  };
271
241
 
@@ -277,34 +247,22 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
277
247
  return;
278
248
  }
279
249
 
280
- Alert.alert(
281
- 'Sign Out All Other Devices',
250
+ confirmAction(
282
251
  `Are you sure you want to sign out from all ${otherDevicesCount} other device(s)? This will end sessions on all other devices except this one.`,
283
- [
284
- {
285
- text: 'Cancel',
286
- style: 'cancel',
287
- },
288
- {
289
- text: 'Sign Out All',
290
- style: 'destructive',
291
- onPress: async () => {
292
- setLoggingOutAllDevices(true);
293
- try {
294
- await oxyServices?.logoutAllDeviceSessions(user?.sessionId || '', undefined, true);
295
- // Refresh device sessions list
296
- await loadAllDeviceSessions();
297
- toast.success('Signed out from all other devices successfully!');
298
- } catch (error) {
299
- console.error('Logout all devices failed:', error);
300
- toast.error('There was a problem signing out from other devices. Please try again.');
301
- } finally {
302
- setLoggingOutAllDevices(false);
303
- }
304
- },
305
- },
306
- ],
307
- { cancelable: true }
252
+ async () => {
253
+ setLoggingOutAllDevices(true);
254
+ try {
255
+ await oxyServices?.logoutAllDeviceSessions(user?.sessionId || '', undefined, true);
256
+ // Refresh device sessions list
257
+ await loadAllDeviceSessions();
258
+ toast.success('Signed out from all other devices successfully!');
259
+ } catch (error) {
260
+ console.error('Logout all devices failed:', error);
261
+ toast.error('There was a problem signing out from other devices. Please try again.');
262
+ } finally {
263
+ setLoggingOutAllDevices(false);
264
+ }
265
+ }
308
266
  );
309
267
  };
310
268
 
@@ -432,7 +390,7 @@ const ModernAccountSwitcherScreen: React.FC<BaseScreenProps> = ({
432
390
  </TouchableOpacity>
433
391
  <TouchableOpacity
434
392
  style={styles.removeButton}
435
- onPress={() => handleRemoveSession(sessionWithUser.sessionId)}
393
+ onPress={() => handleRemoveSession(sessionWithUser.sessionId, displayName)}
436
394
  disabled={isSwitching || isRemoving}
437
395
  >
438
396
  {isRemoving ? (