@oxyhq/services 6.9.46 → 6.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/lib/commonjs/index.js +36 -13
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/ui/client.js +0 -20
  4. package/lib/commonjs/ui/client.js.map +1 -1
  5. package/lib/commonjs/ui/components/ActingAsBanner.js +0 -4
  6. package/lib/commonjs/ui/components/ActingAsBanner.js.map +1 -1
  7. package/lib/commonjs/ui/components/ActivityIndicator.js +1 -1
  8. package/lib/commonjs/ui/components/ActivityIndicator.js.map +1 -1
  9. package/lib/commonjs/ui/components/Avatar.js +0 -2
  10. package/lib/commonjs/ui/components/Avatar.js.map +1 -1
  11. package/lib/commonjs/ui/components/BottomSheet.js +33 -398
  12. package/lib/commonjs/ui/components/BottomSheet.js.map +1 -1
  13. package/lib/commonjs/ui/components/BottomSheetRouter.js +8 -0
  14. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  15. package/lib/commonjs/ui/components/FollowButton.js +3 -5
  16. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  17. package/lib/commonjs/ui/components/Header.js +0 -5
  18. package/lib/commonjs/ui/components/Header.js.map +1 -1
  19. package/lib/commonjs/ui/components/Icon.js +6 -7
  20. package/lib/commonjs/ui/components/Icon.js.map +1 -1
  21. package/lib/commonjs/ui/components/IconButton/IconButton.js +1 -5
  22. package/lib/commonjs/ui/components/IconButton/IconButton.js.map +1 -1
  23. package/lib/commonjs/ui/components/OxyPayButton.js +0 -2
  24. package/lib/commonjs/ui/components/OxyPayButton.js.map +1 -1
  25. package/lib/commonjs/ui/components/OxyProvider.js +100 -37
  26. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  27. package/lib/commonjs/ui/components/OxySignInButton.js +23 -9
  28. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  29. package/lib/commonjs/ui/components/ProfileCard.js +11 -8
  30. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  31. package/lib/commonjs/ui/components/QuickActions.js +2 -2
  32. package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
  33. package/lib/commonjs/ui/components/SignInModal.js +139 -284
  34. package/lib/commonjs/ui/components/SignInModal.js.map +1 -1
  35. package/lib/commonjs/ui/components/StepBasedScreen.js +0 -2
  36. package/lib/commonjs/ui/components/StepBasedScreen.js.map +1 -1
  37. package/lib/commonjs/ui/components/TextField.js +0 -1
  38. package/lib/commonjs/ui/components/TextField.js.map +1 -1
  39. package/lib/commonjs/ui/components/TouchableRipple/TouchableRipple.native.js +1 -1
  40. package/lib/commonjs/ui/components/TouchableRipple/TouchableRipple.native.js.map +1 -1
  41. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +0 -2
  42. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -1
  43. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +0 -2
  44. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  45. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +80 -76
  46. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  47. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +6 -8
  48. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  49. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +18 -23
  50. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  51. package/lib/commonjs/ui/components/fileManagement/styles.js +213 -25
  52. package/lib/commonjs/ui/components/fileManagement/styles.js.map +1 -1
  53. package/lib/commonjs/ui/components/logo/LogoIcon.js +63 -0
  54. package/lib/commonjs/ui/components/logo/LogoIcon.js.map +1 -0
  55. package/lib/commonjs/ui/components/logo/LogoText.js +50 -0
  56. package/lib/commonjs/ui/components/logo/LogoText.js.map +1 -0
  57. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +54 -88
  58. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  59. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +2 -2
  60. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  61. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +1 -1
  62. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
  63. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +1 -1
  64. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  65. package/lib/commonjs/ui/components/payment/paymentStyles.js +2 -10
  66. package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -1
  67. package/lib/commonjs/ui/components/styles/overlay.js +7 -9
  68. package/lib/commonjs/ui/components/styles/overlay.js.map +1 -1
  69. package/lib/commonjs/ui/components/theming.js +0 -1
  70. package/lib/commonjs/ui/components/theming.js.map +1 -1
  71. package/lib/commonjs/ui/context/OxyContext.js +34 -21
  72. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  73. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +1 -3
  74. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  75. package/lib/commonjs/ui/hooks/index.js +32 -12
  76. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  77. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +10 -5
  78. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js.map +1 -1
  79. package/lib/commonjs/ui/hooks/mutations/mutationKeys.js +34 -0
  80. package/lib/commonjs/ui/hooks/mutations/mutationKeys.js.map +1 -0
  81. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +235 -57
  82. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  83. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +17 -13
  84. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  85. package/lib/commonjs/ui/hooks/queries/index.js +6 -0
  86. package/lib/commonjs/ui/hooks/queries/index.js.map +1 -1
  87. package/lib/commonjs/ui/hooks/queries/queryKeys.js +2 -1
  88. package/lib/commonjs/ui/hooks/queries/queryKeys.js.map +1 -1
  89. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +80 -3
  90. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  91. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +36 -1
  92. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  93. package/lib/commonjs/ui/hooks/queryClient.js +168 -70
  94. package/lib/commonjs/ui/hooks/queryClient.js.map +1 -1
  95. package/lib/commonjs/ui/hooks/useAsyncAction.js +7 -7
  96. package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -1
  97. package/lib/commonjs/ui/hooks/useAuth.js +0 -8
  98. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  99. package/lib/commonjs/ui/hooks/useAvatarPicker.js +71 -20
  100. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +1 -1
  101. package/lib/commonjs/ui/hooks/useFileDownloadUrl.js +12 -41
  102. package/lib/commonjs/ui/hooks/useFileDownloadUrl.js.map +1 -1
  103. package/lib/commonjs/ui/hooks/useMutationStatus.js +86 -0
  104. package/lib/commonjs/ui/hooks/useMutationStatus.js.map +1 -0
  105. package/lib/commonjs/ui/hooks/useOnlineStatus.js +33 -0
  106. package/lib/commonjs/ui/hooks/useOnlineStatus.js.map +1 -0
  107. package/lib/commonjs/ui/hooks/useSessionSocket.js +101 -130
  108. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  109. package/lib/commonjs/ui/hooks/useSettingToggle.js +4 -4
  110. package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -1
  111. package/lib/commonjs/ui/index.js +1 -11
  112. package/lib/commonjs/ui/index.js.map +1 -1
  113. package/lib/commonjs/ui/navigation/routes.js +55 -3
  114. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  115. package/lib/commonjs/ui/screens/AccountCenterScreen.js +16 -16
  116. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  117. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +108 -123
  118. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  119. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +20 -19
  120. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  121. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +204 -161
  122. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  123. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +18 -18
  124. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  125. package/lib/commonjs/ui/screens/AppInfoScreen.js +22 -23
  126. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  127. package/lib/commonjs/ui/screens/AvatarCropScreen.js +939 -0
  128. package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -0
  129. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js +13 -20
  130. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js.map +1 -1
  131. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +10 -13
  132. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  133. package/lib/commonjs/ui/screens/FAQScreen.js +4 -4
  134. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -1
  135. package/lib/commonjs/ui/screens/FeedbackScreen.js +17 -15
  136. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  137. package/lib/commonjs/ui/screens/FileManagementScreen.js +797 -159
  138. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  139. package/lib/commonjs/ui/screens/HelpSupportScreen.js +8 -9
  140. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  141. package/lib/commonjs/ui/screens/HistoryViewScreen.js +29 -21
  142. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  143. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +3 -5
  144. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  145. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +5 -5
  146. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  147. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +2 -2
  148. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +75 -73
  149. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  150. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +32 -21
  151. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  152. package/lib/commonjs/ui/screens/ProfileScreen.js +4 -3
  153. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  154. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +3 -3
  155. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  156. package/lib/commonjs/ui/screens/SessionManagementScreen.js +57 -56
  157. package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
  158. package/lib/commonjs/ui/screens/UserLinksScreen.js +2 -3
  159. package/lib/commonjs/ui/screens/UserLinksScreen.js.map +1 -1
  160. package/lib/commonjs/ui/screens/UserListScreen.js +39 -22
  161. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  162. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +18 -21
  163. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  164. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +0 -3
  165. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  166. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +6 -10
  167. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  168. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +1 -1
  169. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  170. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +6 -6
  171. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  172. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +13 -19
  173. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  174. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +5 -5
  175. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  176. package/lib/commonjs/ui/server.js +0 -5
  177. package/lib/commonjs/ui/server.js.map +1 -1
  178. package/lib/commonjs/ui/styles/authStyles.js +0 -5
  179. package/lib/commonjs/ui/styles/authStyles.js.map +1 -1
  180. package/lib/commonjs/ui/styles/index.js +0 -11
  181. package/lib/commonjs/ui/styles/index.js.map +1 -1
  182. package/lib/commonjs/ui/styles/spacing.js +1 -42
  183. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  184. package/lib/commonjs/ui/styles/theme.js +0 -4
  185. package/lib/commonjs/ui/styles/theme.js.map +1 -1
  186. package/lib/commonjs/ui/utils/fileManagement.js +58 -39
  187. package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
  188. package/lib/commonjs/ui/utils/sessionHelpers.js +3 -1
  189. package/lib/commonjs/ui/utils/sessionHelpers.js.map +1 -1
  190. package/lib/commonjs/ui/utils/userUtils.js +33 -16
  191. package/lib/commonjs/ui/utils/userUtils.js.map +1 -1
  192. package/lib/module/index.js +9 -5
  193. package/lib/module/index.js.map +1 -1
  194. package/lib/module/ui/client.js +0 -6
  195. package/lib/module/ui/client.js.map +1 -1
  196. package/lib/module/ui/components/ActingAsBanner.js +0 -4
  197. package/lib/module/ui/components/ActingAsBanner.js.map +1 -1
  198. package/lib/module/ui/components/ActivityIndicator.js +1 -1
  199. package/lib/module/ui/components/ActivityIndicator.js.map +1 -1
  200. package/lib/module/ui/components/Avatar.js +0 -2
  201. package/lib/module/ui/components/Avatar.js.map +1 -1
  202. package/lib/module/ui/components/BottomSheet.js +35 -400
  203. package/lib/module/ui/components/BottomSheet.js.map +1 -1
  204. package/lib/module/ui/components/BottomSheetRouter.js +9 -1
  205. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  206. package/lib/module/ui/components/FollowButton.js +2 -4
  207. package/lib/module/ui/components/FollowButton.js.map +1 -1
  208. package/lib/module/ui/components/Header.js +0 -5
  209. package/lib/module/ui/components/Header.js.map +1 -1
  210. package/lib/module/ui/components/Icon.js +6 -7
  211. package/lib/module/ui/components/Icon.js.map +1 -1
  212. package/lib/module/ui/components/IconButton/IconButton.js +1 -5
  213. package/lib/module/ui/components/IconButton/IconButton.js.map +1 -1
  214. package/lib/module/ui/components/OxyPayButton.js +0 -2
  215. package/lib/module/ui/components/OxyPayButton.js.map +1 -1
  216. package/lib/module/ui/components/OxyProvider.js +103 -40
  217. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  218. package/lib/module/ui/components/OxySignInButton.js +23 -9
  219. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  220. package/lib/module/ui/components/ProfileCard.js +11 -8
  221. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  222. package/lib/module/ui/components/QuickActions.js +2 -2
  223. package/lib/module/ui/components/QuickActions.js.map +1 -1
  224. package/lib/module/ui/components/SignInModal.js +137 -284
  225. package/lib/module/ui/components/SignInModal.js.map +1 -1
  226. package/lib/module/ui/components/StepBasedScreen.js +0 -2
  227. package/lib/module/ui/components/StepBasedScreen.js.map +1 -1
  228. package/lib/module/ui/components/TextField.js +0 -1
  229. package/lib/module/ui/components/TextField.js.map +1 -1
  230. package/lib/module/ui/components/TouchableRipple/TouchableRipple.native.js +1 -1
  231. package/lib/module/ui/components/TouchableRipple/TouchableRipple.native.js.map +1 -1
  232. package/lib/module/ui/components/feedback/feedbackStyles.js +0 -2
  233. package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -1
  234. package/lib/module/ui/components/fileManagement/AnimatedButton.js +0 -1
  235. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +1 -1
  236. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +80 -75
  237. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  238. package/lib/module/ui/components/fileManagement/FileViewer.js +6 -7
  239. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  240. package/lib/module/ui/components/fileManagement/UploadPreview.js +18 -22
  241. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  242. package/lib/module/ui/components/fileManagement/styles.js +212 -24
  243. package/lib/module/ui/components/fileManagement/styles.js.map +1 -1
  244. package/lib/module/ui/components/logo/LogoIcon.js +56 -0
  245. package/lib/module/ui/components/logo/LogoIcon.js.map +1 -0
  246. package/lib/module/ui/components/logo/LogoText.js +43 -0
  247. package/lib/module/ui/components/logo/LogoText.js.map +1 -0
  248. package/lib/module/ui/components/modals/DeleteAccountModal.js +55 -88
  249. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  250. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  251. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  252. package/lib/module/ui/components/payment/PaymentReviewStep.js +1 -1
  253. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
  254. package/lib/module/ui/components/payment/PaymentSuccessStep.js +1 -1
  255. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  256. package/lib/module/ui/components/payment/paymentStyles.js +2 -10
  257. package/lib/module/ui/components/payment/paymentStyles.js.map +1 -1
  258. package/lib/module/ui/components/styles/overlay.js +8 -8
  259. package/lib/module/ui/components/styles/overlay.js.map +1 -1
  260. package/lib/module/ui/components/theming.js +0 -1
  261. package/lib/module/ui/components/theming.js.map +1 -1
  262. package/lib/module/ui/context/OxyContext.js +32 -19
  263. package/lib/module/ui/context/OxyContext.js.map +1 -1
  264. package/lib/module/ui/context/hooks/useAuthOperations.js +1 -3
  265. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  266. package/lib/module/ui/hooks/index.js +5 -3
  267. package/lib/module/ui/hooks/index.js.map +1 -1
  268. package/lib/module/ui/hooks/mutations/mutationFactory.js +6 -1
  269. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
  270. package/lib/module/ui/hooks/mutations/mutationKeys.js +30 -0
  271. package/lib/module/ui/hooks/mutations/mutationKeys.js.map +1 -0
  272. package/lib/module/ui/hooks/mutations/useAccountMutations.js +231 -52
  273. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  274. package/lib/module/ui/hooks/mutations/useServicesMutations.js +9 -5
  275. package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  276. package/lib/module/ui/hooks/queries/index.js +1 -1
  277. package/lib/module/ui/hooks/queries/index.js.map +1 -1
  278. package/lib/module/ui/hooks/queries/queryKeys.js +2 -1
  279. package/lib/module/ui/hooks/queries/queryKeys.js.map +1 -1
  280. package/lib/module/ui/hooks/queries/useAccountQueries.js +80 -3
  281. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  282. package/lib/module/ui/hooks/queries/useSecurityQueries.js +35 -1
  283. package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  284. package/lib/module/ui/hooks/queryClient.js +166 -68
  285. package/lib/module/ui/hooks/queryClient.js.map +1 -1
  286. package/lib/module/ui/hooks/useAsyncAction.js +3 -3
  287. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
  288. package/lib/module/ui/hooks/useAuth.js +0 -3
  289. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  290. package/lib/module/ui/hooks/useAvatarPicker.js +73 -22
  291. package/lib/module/ui/hooks/useAvatarPicker.js.map +1 -1
  292. package/lib/module/ui/hooks/useFileDownloadUrl.js +11 -39
  293. package/lib/module/ui/hooks/useFileDownloadUrl.js.map +1 -1
  294. package/lib/module/ui/hooks/useMutationStatus.js +82 -0
  295. package/lib/module/ui/hooks/useMutationStatus.js.map +1 -0
  296. package/lib/module/ui/hooks/useOnlineStatus.js +29 -0
  297. package/lib/module/ui/hooks/useOnlineStatus.js.map +1 -0
  298. package/lib/module/ui/hooks/useSessionSocket.js +101 -130
  299. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  300. package/lib/module/ui/hooks/useSettingToggle.js +1 -1
  301. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
  302. package/lib/module/ui/index.js +1 -10
  303. package/lib/module/ui/index.js.map +1 -1
  304. package/lib/module/ui/navigation/routes.js +54 -2
  305. package/lib/module/ui/navigation/routes.js.map +1 -1
  306. package/lib/module/ui/screens/AccountCenterScreen.js +15 -14
  307. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  308. package/lib/module/ui/screens/AccountOverviewScreen.js +96 -111
  309. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  310. package/lib/module/ui/screens/AccountSettingsScreen.js +19 -18
  311. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  312. package/lib/module/ui/screens/AccountSwitcherScreen.js +189 -145
  313. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  314. package/lib/module/ui/screens/AccountVerificationScreen.js +15 -15
  315. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  316. package/lib/module/ui/screens/AppInfoScreen.js +14 -15
  317. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  318. package/lib/module/ui/screens/AvatarCropScreen.js +936 -0
  319. package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -0
  320. package/lib/module/ui/screens/CreateManagedAccountScreen.js +11 -18
  321. package/lib/module/ui/screens/CreateManagedAccountScreen.js.map +1 -1
  322. package/lib/module/ui/screens/EditProfileFieldScreen.js +8 -11
  323. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  324. package/lib/module/ui/screens/FAQScreen.js +3 -3
  325. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  326. package/lib/module/ui/screens/FeedbackScreen.js +14 -12
  327. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  328. package/lib/module/ui/screens/FileManagementScreen.js +764 -125
  329. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  330. package/lib/module/ui/screens/HelpSupportScreen.js +2 -3
  331. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  332. package/lib/module/ui/screens/HistoryViewScreen.js +26 -17
  333. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  334. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -3
  335. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  336. package/lib/module/ui/screens/LegalDocumentsScreen.js +3 -3
  337. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  338. package/lib/module/ui/screens/PaymentGatewayScreen.js +2 -2
  339. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +60 -57
  340. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  341. package/lib/module/ui/screens/PrivacySettingsScreen.js +27 -16
  342. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  343. package/lib/module/ui/screens/ProfileScreen.js +4 -3
  344. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  345. package/lib/module/ui/screens/SavesCollectionsScreen.js +2 -2
  346. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  347. package/lib/module/ui/screens/SessionManagementScreen.js +48 -47
  348. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  349. package/lib/module/ui/screens/UserLinksScreen.js +2 -3
  350. package/lib/module/ui/screens/UserLinksScreen.js.map +1 -1
  351. package/lib/module/ui/screens/UserListScreen.js +40 -23
  352. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  353. package/lib/module/ui/screens/WelcomeNewUserScreen.js +16 -19
  354. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  355. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +0 -3
  356. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  357. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +6 -10
  358. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  359. package/lib/module/ui/screens/karma/KarmaFAQScreen.js +1 -1
  360. package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  361. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +6 -6
  362. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  363. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +13 -19
  364. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  365. package/lib/module/ui/screens/karma/KarmaRulesScreen.js +5 -5
  366. package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  367. package/lib/module/ui/server.js +0 -4
  368. package/lib/module/ui/server.js.map +1 -1
  369. package/lib/module/ui/styles/authStyles.js +0 -5
  370. package/lib/module/ui/styles/authStyles.js.map +1 -1
  371. package/lib/module/ui/styles/index.js +0 -1
  372. package/lib/module/ui/styles/index.js.map +1 -1
  373. package/lib/module/ui/styles/spacing.js +0 -42
  374. package/lib/module/ui/styles/spacing.js.map +1 -1
  375. package/lib/module/ui/styles/theme.js +0 -4
  376. package/lib/module/ui/styles/theme.js.map +1 -1
  377. package/lib/module/ui/utils/fileManagement.js +54 -36
  378. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  379. package/lib/module/ui/utils/sessionHelpers.js +3 -1
  380. package/lib/module/ui/utils/sessionHelpers.js.map +1 -1
  381. package/lib/module/ui/utils/userUtils.js +34 -16
  382. package/lib/module/ui/utils/userUtils.js.map +1 -1
  383. package/lib/typescript/commonjs/index.d.ts +7 -3
  384. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  385. package/lib/typescript/commonjs/ui/client.d.ts +0 -2
  386. package/lib/typescript/commonjs/ui/client.d.ts.map +1 -1
  387. package/lib/typescript/commonjs/ui/components/ActingAsBanner.d.ts.map +1 -1
  388. package/lib/typescript/commonjs/ui/components/Avatar.d.ts.map +1 -1
  389. package/lib/typescript/commonjs/ui/components/BottomSheet.d.ts +27 -27
  390. package/lib/typescript/commonjs/ui/components/BottomSheet.d.ts.map +1 -1
  391. package/lib/typescript/commonjs/ui/components/BottomSheetRouter.d.ts.map +1 -1
  392. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts.map +1 -1
  393. package/lib/typescript/commonjs/ui/components/Header.d.ts.map +1 -1
  394. package/lib/typescript/commonjs/ui/components/Icon.d.ts +3 -2
  395. package/lib/typescript/commonjs/ui/components/Icon.d.ts.map +1 -1
  396. package/lib/typescript/commonjs/ui/components/IconButton/IconButton.d.ts.map +1 -1
  397. package/lib/typescript/commonjs/ui/components/OxyPayButton.d.ts.map +1 -1
  398. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  399. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  400. package/lib/typescript/commonjs/ui/components/ProfileCard.d.ts +4 -1
  401. package/lib/typescript/commonjs/ui/components/ProfileCard.d.ts.map +1 -1
  402. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -1
  403. package/lib/typescript/commonjs/ui/components/StepBasedScreen.d.ts.map +1 -1
  404. package/lib/typescript/commonjs/ui/components/TextField/Addons/Outline.d.ts +2 -2
  405. package/lib/typescript/commonjs/ui/components/TextField/helpers.d.ts +2 -2
  406. package/lib/typescript/commonjs/ui/components/TextField/types.d.ts +0 -1
  407. package/lib/typescript/commonjs/ui/components/TextField/types.d.ts.map +1 -1
  408. package/lib/typescript/commonjs/ui/components/TextField.d.ts +1 -1
  409. package/lib/typescript/commonjs/ui/components/TextField.d.ts.map +1 -1
  410. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts +0 -1
  411. package/lib/typescript/commonjs/ui/components/feedback/feedbackStyles.d.ts.map +1 -1
  412. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts.map +1 -1
  413. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts +1 -1
  414. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  415. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts +0 -2
  416. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  417. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts +3 -2
  418. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  419. package/lib/typescript/commonjs/ui/components/fileManagement/styles.d.ts +200 -17
  420. package/lib/typescript/commonjs/ui/components/fileManagement/styles.d.ts.map +1 -1
  421. package/lib/typescript/commonjs/ui/components/logo/LogoIcon.d.ts +22 -0
  422. package/lib/typescript/commonjs/ui/components/logo/LogoIcon.d.ts.map +1 -0
  423. package/lib/typescript/commonjs/ui/components/logo/LogoText.d.ts +22 -0
  424. package/lib/typescript/commonjs/ui/components/logo/LogoText.d.ts.map +1 -0
  425. package/lib/typescript/commonjs/ui/components/modals/DeleteAccountModal.d.ts +2 -2
  426. package/lib/typescript/commonjs/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  427. package/lib/typescript/commonjs/ui/components/payment/paymentStyles.d.ts +0 -7
  428. package/lib/typescript/commonjs/ui/components/payment/paymentStyles.d.ts.map +1 -1
  429. package/lib/typescript/commonjs/ui/components/styles/overlay.d.ts +3 -1
  430. package/lib/typescript/commonjs/ui/components/styles/overlay.d.ts.map +1 -1
  431. package/lib/typescript/commonjs/ui/components/theming.d.ts.map +1 -1
  432. package/lib/typescript/commonjs/ui/components/types.d.ts.map +1 -1
  433. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  434. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  435. package/lib/typescript/commonjs/ui/hooks/index.d.ts +5 -3
  436. package/lib/typescript/commonjs/ui/hooks/index.d.ts.map +1 -1
  437. package/lib/typescript/commonjs/ui/hooks/mutations/mutationFactory.d.ts +11 -0
  438. package/lib/typescript/commonjs/ui/hooks/mutations/mutationFactory.d.ts.map +1 -1
  439. package/lib/typescript/commonjs/ui/hooks/mutations/mutationKeys.d.ts +25 -0
  440. package/lib/typescript/commonjs/ui/hooks/mutations/mutationKeys.d.ts.map +1 -0
  441. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +161 -9
  442. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  443. package/lib/typescript/commonjs/ui/hooks/mutations/useServicesMutations.d.ts.map +1 -1
  444. package/lib/typescript/commonjs/ui/hooks/queries/index.d.ts +1 -1
  445. package/lib/typescript/commonjs/ui/hooks/queries/index.d.ts.map +1 -1
  446. package/lib/typescript/commonjs/ui/hooks/queries/queryKeys.d.ts +1 -0
  447. package/lib/typescript/commonjs/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  448. package/lib/typescript/commonjs/ui/hooks/queries/useAccountQueries.d.ts +22 -8
  449. package/lib/typescript/commonjs/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  450. package/lib/typescript/commonjs/ui/hooks/queries/useSecurityQueries.d.ts +13 -3
  451. package/lib/typescript/commonjs/ui/hooks/queries/useSecurityQueries.d.ts.map +1 -1
  452. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts +7 -5
  453. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  454. package/lib/typescript/commonjs/ui/hooks/queryClient.d.ts +57 -9
  455. package/lib/typescript/commonjs/ui/hooks/queryClient.d.ts.map +1 -1
  456. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +1 -1
  457. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +0 -1
  458. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  459. package/lib/typescript/commonjs/ui/hooks/useAvatarPicker.d.ts +10 -2
  460. package/lib/typescript/commonjs/ui/hooks/useAvatarPicker.d.ts.map +1 -1
  461. package/lib/typescript/commonjs/ui/hooks/useFileDownloadUrl.d.ts +2 -6
  462. package/lib/typescript/commonjs/ui/hooks/useFileDownloadUrl.d.ts.map +1 -1
  463. package/lib/typescript/commonjs/ui/hooks/useMutationStatus.d.ts +23 -0
  464. package/lib/typescript/commonjs/ui/hooks/useMutationStatus.d.ts.map +1 -0
  465. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts +13 -0
  466. package/lib/typescript/commonjs/ui/hooks/useOnlineStatus.d.ts.map +1 -0
  467. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts +1 -2
  468. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +1 -1
  469. package/lib/typescript/commonjs/ui/index.d.ts +1 -4
  470. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  471. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +48 -2
  472. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  473. package/lib/typescript/commonjs/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  474. package/lib/typescript/commonjs/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  475. package/lib/typescript/commonjs/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  476. package/lib/typescript/commonjs/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  477. package/lib/typescript/commonjs/ui/screens/AppInfoScreen.d.ts.map +1 -1
  478. package/lib/typescript/commonjs/ui/screens/AvatarCropScreen.d.ts +49 -0
  479. package/lib/typescript/commonjs/ui/screens/AvatarCropScreen.d.ts.map +1 -0
  480. package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -1
  481. package/lib/typescript/commonjs/ui/screens/EditProfileFieldScreen.d.ts.map +1 -1
  482. package/lib/typescript/commonjs/ui/screens/FeedbackScreen.d.ts.map +1 -1
  483. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  484. package/lib/typescript/commonjs/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  485. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  486. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  487. package/lib/typescript/commonjs/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  488. package/lib/typescript/commonjs/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  489. package/lib/typescript/commonjs/ui/screens/ProfileScreen.d.ts.map +1 -1
  490. package/lib/typescript/commonjs/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  491. package/lib/typescript/commonjs/ui/screens/UserLinksScreen.d.ts.map +1 -1
  492. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
  493. package/lib/typescript/commonjs/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  494. package/lib/typescript/commonjs/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
  495. package/lib/typescript/commonjs/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  496. package/lib/typescript/commonjs/ui/screens/karma/KarmaLeaderboardScreen.d.ts.map +1 -1
  497. package/lib/typescript/commonjs/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
  498. package/lib/typescript/commonjs/ui/screens/karma/KarmaRulesScreen.d.ts.map +1 -1
  499. package/lib/typescript/commonjs/ui/server.d.ts +0 -2
  500. package/lib/typescript/commonjs/ui/server.d.ts.map +1 -1
  501. package/lib/typescript/commonjs/ui/styles/authStyles.d.ts +0 -4
  502. package/lib/typescript/commonjs/ui/styles/authStyles.d.ts.map +1 -1
  503. package/lib/typescript/commonjs/ui/styles/index.d.ts +0 -1
  504. package/lib/typescript/commonjs/ui/styles/index.d.ts.map +1 -1
  505. package/lib/typescript/commonjs/ui/styles/spacing.d.ts +0 -36
  506. package/lib/typescript/commonjs/ui/styles/spacing.d.ts.map +1 -1
  507. package/lib/typescript/commonjs/ui/styles/theme.d.ts +0 -1
  508. package/lib/typescript/commonjs/ui/styles/theme.d.ts.map +1 -1
  509. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +39 -12
  510. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  511. package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts +3 -1
  512. package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts.map +1 -1
  513. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts +19 -18
  514. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -1
  515. package/lib/typescript/module/index.d.ts +7 -3
  516. package/lib/typescript/module/index.d.ts.map +1 -1
  517. package/lib/typescript/module/ui/client.d.ts +0 -2
  518. package/lib/typescript/module/ui/client.d.ts.map +1 -1
  519. package/lib/typescript/module/ui/components/ActingAsBanner.d.ts.map +1 -1
  520. package/lib/typescript/module/ui/components/Avatar.d.ts.map +1 -1
  521. package/lib/typescript/module/ui/components/BottomSheet.d.ts +27 -27
  522. package/lib/typescript/module/ui/components/BottomSheet.d.ts.map +1 -1
  523. package/lib/typescript/module/ui/components/BottomSheetRouter.d.ts.map +1 -1
  524. package/lib/typescript/module/ui/components/FollowButton.d.ts.map +1 -1
  525. package/lib/typescript/module/ui/components/Header.d.ts.map +1 -1
  526. package/lib/typescript/module/ui/components/Icon.d.ts +3 -2
  527. package/lib/typescript/module/ui/components/Icon.d.ts.map +1 -1
  528. package/lib/typescript/module/ui/components/IconButton/IconButton.d.ts.map +1 -1
  529. package/lib/typescript/module/ui/components/OxyPayButton.d.ts.map +1 -1
  530. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  531. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  532. package/lib/typescript/module/ui/components/ProfileCard.d.ts +4 -1
  533. package/lib/typescript/module/ui/components/ProfileCard.d.ts.map +1 -1
  534. package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -1
  535. package/lib/typescript/module/ui/components/StepBasedScreen.d.ts.map +1 -1
  536. package/lib/typescript/module/ui/components/TextField/Addons/Outline.d.ts +2 -2
  537. package/lib/typescript/module/ui/components/TextField/helpers.d.ts +2 -2
  538. package/lib/typescript/module/ui/components/TextField/types.d.ts +0 -1
  539. package/lib/typescript/module/ui/components/TextField/types.d.ts.map +1 -1
  540. package/lib/typescript/module/ui/components/TextField.d.ts +1 -1
  541. package/lib/typescript/module/ui/components/TextField.d.ts.map +1 -1
  542. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts +0 -1
  543. package/lib/typescript/module/ui/components/feedback/feedbackStyles.d.ts.map +1 -1
  544. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts.map +1 -1
  545. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts +1 -1
  546. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  547. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts +0 -2
  548. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  549. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts +3 -2
  550. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  551. package/lib/typescript/module/ui/components/fileManagement/styles.d.ts +200 -17
  552. package/lib/typescript/module/ui/components/fileManagement/styles.d.ts.map +1 -1
  553. package/lib/typescript/module/ui/components/logo/LogoIcon.d.ts +22 -0
  554. package/lib/typescript/module/ui/components/logo/LogoIcon.d.ts.map +1 -0
  555. package/lib/typescript/module/ui/components/logo/LogoText.d.ts +22 -0
  556. package/lib/typescript/module/ui/components/logo/LogoText.d.ts.map +1 -0
  557. package/lib/typescript/module/ui/components/modals/DeleteAccountModal.d.ts +2 -2
  558. package/lib/typescript/module/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  559. package/lib/typescript/module/ui/components/payment/paymentStyles.d.ts +0 -7
  560. package/lib/typescript/module/ui/components/payment/paymentStyles.d.ts.map +1 -1
  561. package/lib/typescript/module/ui/components/styles/overlay.d.ts +3 -1
  562. package/lib/typescript/module/ui/components/styles/overlay.d.ts.map +1 -1
  563. package/lib/typescript/module/ui/components/theming.d.ts.map +1 -1
  564. package/lib/typescript/module/ui/components/types.d.ts.map +1 -1
  565. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  566. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  567. package/lib/typescript/module/ui/hooks/index.d.ts +5 -3
  568. package/lib/typescript/module/ui/hooks/index.d.ts.map +1 -1
  569. package/lib/typescript/module/ui/hooks/mutations/mutationFactory.d.ts +11 -0
  570. package/lib/typescript/module/ui/hooks/mutations/mutationFactory.d.ts.map +1 -1
  571. package/lib/typescript/module/ui/hooks/mutations/mutationKeys.d.ts +25 -0
  572. package/lib/typescript/module/ui/hooks/mutations/mutationKeys.d.ts.map +1 -0
  573. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +161 -9
  574. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  575. package/lib/typescript/module/ui/hooks/mutations/useServicesMutations.d.ts.map +1 -1
  576. package/lib/typescript/module/ui/hooks/queries/index.d.ts +1 -1
  577. package/lib/typescript/module/ui/hooks/queries/index.d.ts.map +1 -1
  578. package/lib/typescript/module/ui/hooks/queries/queryKeys.d.ts +1 -0
  579. package/lib/typescript/module/ui/hooks/queries/queryKeys.d.ts.map +1 -1
  580. package/lib/typescript/module/ui/hooks/queries/useAccountQueries.d.ts +22 -8
  581. package/lib/typescript/module/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  582. package/lib/typescript/module/ui/hooks/queries/useSecurityQueries.d.ts +13 -3
  583. package/lib/typescript/module/ui/hooks/queries/useSecurityQueries.d.ts.map +1 -1
  584. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts +7 -5
  585. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  586. package/lib/typescript/module/ui/hooks/queryClient.d.ts +57 -9
  587. package/lib/typescript/module/ui/hooks/queryClient.d.ts.map +1 -1
  588. package/lib/typescript/module/ui/hooks/useAssets.d.ts +1 -1
  589. package/lib/typescript/module/ui/hooks/useAuth.d.ts +0 -1
  590. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  591. package/lib/typescript/module/ui/hooks/useAvatarPicker.d.ts +10 -2
  592. package/lib/typescript/module/ui/hooks/useAvatarPicker.d.ts.map +1 -1
  593. package/lib/typescript/module/ui/hooks/useFileDownloadUrl.d.ts +2 -6
  594. package/lib/typescript/module/ui/hooks/useFileDownloadUrl.d.ts.map +1 -1
  595. package/lib/typescript/module/ui/hooks/useMutationStatus.d.ts +23 -0
  596. package/lib/typescript/module/ui/hooks/useMutationStatus.d.ts.map +1 -0
  597. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts +13 -0
  598. package/lib/typescript/module/ui/hooks/useOnlineStatus.d.ts.map +1 -0
  599. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts +1 -2
  600. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +1 -1
  601. package/lib/typescript/module/ui/index.d.ts +1 -4
  602. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  603. package/lib/typescript/module/ui/navigation/routes.d.ts +48 -2
  604. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  605. package/lib/typescript/module/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  606. package/lib/typescript/module/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  607. package/lib/typescript/module/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  608. package/lib/typescript/module/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  609. package/lib/typescript/module/ui/screens/AppInfoScreen.d.ts.map +1 -1
  610. package/lib/typescript/module/ui/screens/AvatarCropScreen.d.ts +49 -0
  611. package/lib/typescript/module/ui/screens/AvatarCropScreen.d.ts.map +1 -0
  612. package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -1
  613. package/lib/typescript/module/ui/screens/EditProfileFieldScreen.d.ts.map +1 -1
  614. package/lib/typescript/module/ui/screens/FeedbackScreen.d.ts.map +1 -1
  615. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  616. package/lib/typescript/module/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  617. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  618. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  619. package/lib/typescript/module/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  620. package/lib/typescript/module/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  621. package/lib/typescript/module/ui/screens/ProfileScreen.d.ts.map +1 -1
  622. package/lib/typescript/module/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  623. package/lib/typescript/module/ui/screens/UserLinksScreen.d.ts.map +1 -1
  624. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
  625. package/lib/typescript/module/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
  626. package/lib/typescript/module/ui/screens/karma/KarmaAboutScreen.d.ts.map +1 -1
  627. package/lib/typescript/module/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  628. package/lib/typescript/module/ui/screens/karma/KarmaLeaderboardScreen.d.ts.map +1 -1
  629. package/lib/typescript/module/ui/screens/karma/KarmaRewardsScreen.d.ts.map +1 -1
  630. package/lib/typescript/module/ui/screens/karma/KarmaRulesScreen.d.ts.map +1 -1
  631. package/lib/typescript/module/ui/server.d.ts +0 -2
  632. package/lib/typescript/module/ui/server.d.ts.map +1 -1
  633. package/lib/typescript/module/ui/styles/authStyles.d.ts +0 -4
  634. package/lib/typescript/module/ui/styles/authStyles.d.ts.map +1 -1
  635. package/lib/typescript/module/ui/styles/index.d.ts +0 -1
  636. package/lib/typescript/module/ui/styles/index.d.ts.map +1 -1
  637. package/lib/typescript/module/ui/styles/spacing.d.ts +0 -36
  638. package/lib/typescript/module/ui/styles/spacing.d.ts.map +1 -1
  639. package/lib/typescript/module/ui/styles/theme.d.ts +0 -1
  640. package/lib/typescript/module/ui/styles/theme.d.ts.map +1 -1
  641. package/lib/typescript/module/ui/utils/fileManagement.d.ts +39 -12
  642. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  643. package/lib/typescript/module/ui/utils/sessionHelpers.d.ts +3 -1
  644. package/lib/typescript/module/ui/utils/sessionHelpers.d.ts.map +1 -1
  645. package/lib/typescript/module/ui/utils/userUtils.d.ts +19 -18
  646. package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -1
  647. package/lib/typescript/types/expo-vector-icons.d.ts +7 -4
  648. package/package.json +64 -31
  649. package/src/index.ts +11 -4
  650. package/src/types/expo-vector-icons.d.ts +7 -4
  651. package/src/ui/client.ts +0 -6
  652. package/src/ui/components/ActingAsBanner.tsx +0 -4
  653. package/src/ui/components/ActivityIndicator.tsx +1 -1
  654. package/src/ui/components/Avatar.tsx +0 -2
  655. package/src/ui/components/BottomSheet.tsx +41 -440
  656. package/src/ui/components/BottomSheetRouter.tsx +12 -1
  657. package/src/ui/components/FollowButton.tsx +2 -4
  658. package/src/ui/components/Header.tsx +0 -5
  659. package/src/ui/components/Icon.tsx +12 -6
  660. package/src/ui/components/IconButton/IconButton.tsx +0 -3
  661. package/src/ui/components/OxyPayButton.tsx +0 -2
  662. package/src/ui/components/OxyProvider.tsx +127 -48
  663. package/src/ui/components/OxySignInButton.tsx +21 -9
  664. package/src/ui/components/ProfileCard.tsx +13 -10
  665. package/src/ui/components/QuickActions.tsx +2 -2
  666. package/src/ui/components/SignInModal.tsx +80 -199
  667. package/src/ui/components/StepBasedScreen.tsx +0 -2
  668. package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
  669. package/src/ui/components/TextField/helpers.tsx +2 -2
  670. package/src/ui/components/TextField/types.tsx +0 -1
  671. package/src/ui/components/TextField.tsx +1 -2
  672. package/src/ui/components/TouchableRipple/TouchableRipple.native.tsx +1 -1
  673. package/src/ui/components/feedback/feedbackStyles.ts +0 -2
  674. package/src/ui/components/fileManagement/AnimatedButton.tsx +0 -1
  675. package/src/ui/components/fileManagement/FileDetailsModal.tsx +71 -65
  676. package/src/ui/components/fileManagement/FileViewer.tsx +6 -9
  677. package/src/ui/components/fileManagement/UploadPreview.tsx +21 -25
  678. package/src/ui/components/fileManagement/styles.ts +206 -18
  679. package/src/ui/components/logo/LogoIcon.tsx +70 -0
  680. package/src/ui/components/logo/LogoText.tsx +70 -0
  681. package/src/ui/components/modals/DeleteAccountModal.tsx +56 -91
  682. package/src/ui/components/payment/PaymentDetailsStep.tsx +1 -1
  683. package/src/ui/components/payment/PaymentReviewStep.tsx +1 -1
  684. package/src/ui/components/payment/PaymentSuccessStep.tsx +1 -1
  685. package/src/ui/components/payment/paymentStyles.ts +0 -8
  686. package/src/ui/components/styles/overlay.tsx +17 -8
  687. package/src/ui/components/theming.tsx +0 -1
  688. package/src/ui/components/types.tsx +3 -2
  689. package/src/ui/context/OxyContext.tsx +34 -19
  690. package/src/ui/context/hooks/useAuthOperations.ts +1 -3
  691. package/src/ui/hooks/index.ts +11 -4
  692. package/src/ui/hooks/mutations/mutationFactory.ts +16 -1
  693. package/src/ui/hooks/mutations/mutationKeys.ts +28 -0
  694. package/src/ui/hooks/mutations/useAccountMutations.ts +251 -59
  695. package/src/ui/hooks/mutations/useServicesMutations.ts +10 -4
  696. package/src/ui/hooks/queries/index.ts +1 -0
  697. package/src/ui/hooks/queries/queryKeys.ts +2 -0
  698. package/src/ui/hooks/queries/useAccountQueries.ts +83 -3
  699. package/src/ui/hooks/queries/useSecurityQueries.ts +42 -2
  700. package/src/ui/hooks/queryClient.ts +194 -69
  701. package/src/ui/hooks/useAsyncAction.ts +3 -3
  702. package/src/ui/hooks/useAuth.ts +0 -2
  703. package/src/ui/hooks/useAvatarPicker.ts +108 -27
  704. package/src/ui/hooks/useFileDownloadUrl.ts +15 -39
  705. package/src/ui/hooks/useMutationStatus.ts +111 -0
  706. package/src/ui/hooks/useOnlineStatus.ts +29 -0
  707. package/src/ui/hooks/useSessionSocket.ts +136 -126
  708. package/src/ui/hooks/useSettingToggle.ts +1 -1
  709. package/src/ui/index.ts +0 -12
  710. package/src/ui/navigation/routes.ts +93 -2
  711. package/src/ui/screens/AccountCenterScreen.tsx +15 -13
  712. package/src/ui/screens/AccountOverviewScreen.tsx +94 -104
  713. package/src/ui/screens/AccountSettingsScreen.tsx +18 -17
  714. package/src/ui/screens/AccountSwitcherScreen.tsx +331 -298
  715. package/src/ui/screens/AccountVerificationScreen.tsx +15 -15
  716. package/src/ui/screens/AppInfoScreen.tsx +8 -13
  717. package/src/ui/screens/AvatarCropScreen.tsx +1073 -0
  718. package/src/ui/screens/CreateManagedAccountScreen.tsx +5 -16
  719. package/src/ui/screens/EditProfileFieldScreen.tsx +5 -10
  720. package/src/ui/screens/FAQScreen.tsx +3 -3
  721. package/src/ui/screens/FeedbackScreen.tsx +14 -12
  722. package/src/ui/screens/FileManagementScreen.tsx +885 -124
  723. package/src/ui/screens/HelpSupportScreen.tsx +2 -3
  724. package/src/ui/screens/HistoryViewScreen.tsx +24 -9
  725. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -3
  726. package/src/ui/screens/LegalDocumentsScreen.tsx +3 -3
  727. package/src/ui/screens/PaymentGatewayScreen.tsx +2 -2
  728. package/src/ui/screens/PremiumSubscriptionScreen.tsx +51 -56
  729. package/src/ui/screens/PrivacySettingsScreen.tsx +22 -20
  730. package/src/ui/screens/ProfileScreen.tsx +1 -2
  731. package/src/ui/screens/SavesCollectionsScreen.tsx +2 -2
  732. package/src/ui/screens/SessionManagementScreen.tsx +35 -47
  733. package/src/ui/screens/UserLinksScreen.tsx +1 -2
  734. package/src/ui/screens/UserListScreen.tsx +30 -19
  735. package/src/ui/screens/WelcomeNewUserScreen.tsx +14 -18
  736. package/src/ui/screens/karma/KarmaAboutScreen.tsx +0 -3
  737. package/src/ui/screens/karma/KarmaCenterScreen.tsx +4 -8
  738. package/src/ui/screens/karma/KarmaFAQScreen.tsx +1 -1
  739. package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +3 -4
  740. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +13 -18
  741. package/src/ui/screens/karma/KarmaRulesScreen.tsx +3 -4
  742. package/src/ui/server.ts +0 -4
  743. package/src/ui/styles/authStyles.ts +0 -5
  744. package/src/ui/styles/index.ts +0 -1
  745. package/src/ui/styles/spacing.ts +0 -43
  746. package/src/ui/styles/theme.ts +0 -4
  747. package/src/ui/utils/fileManagement.ts +66 -38
  748. package/src/ui/utils/sessionHelpers.ts +3 -1
  749. package/src/ui/utils/userUtils.ts +45 -29
  750. package/lib/commonjs/lib/sonner-safe.js +0 -32
  751. package/lib/commonjs/lib/sonner-safe.js.map +0 -1
  752. package/lib/commonjs/lib/sonner.js +0 -19
  753. package/lib/commonjs/lib/sonner.js.map +0 -1
  754. package/lib/commonjs/lib/sonner.native.js +0 -24
  755. package/lib/commonjs/lib/sonner.native.js.map +0 -1
  756. package/lib/commonjs/lib/sonner.web.js +0 -24
  757. package/lib/commonjs/lib/sonner.web.js.map +0 -1
  758. package/lib/commonjs/ui/hooks/useThemeColors.js +0 -33
  759. package/lib/commonjs/ui/hooks/useThemeColors.js.map +0 -1
  760. package/lib/commonjs/ui/hooks/useThemeStyles.js +0 -38
  761. package/lib/commonjs/ui/hooks/useThemeStyles.js.map +0 -1
  762. package/lib/commonjs/ui/styles/fonts.js +0 -84
  763. package/lib/commonjs/ui/styles/fonts.js.map +0 -1
  764. package/lib/module/lib/sonner-safe.js +0 -29
  765. package/lib/module/lib/sonner-safe.js.map +0 -1
  766. package/lib/module/lib/sonner.js +0 -14
  767. package/lib/module/lib/sonner.js.map +0 -1
  768. package/lib/module/lib/sonner.native.js +0 -19
  769. package/lib/module/lib/sonner.native.js.map +0 -1
  770. package/lib/module/lib/sonner.web.js +0 -19
  771. package/lib/module/lib/sonner.web.js.map +0 -1
  772. package/lib/module/ui/hooks/useThemeColors.js +0 -29
  773. package/lib/module/ui/hooks/useThemeColors.js.map +0 -1
  774. package/lib/module/ui/hooks/useThemeStyles.js +0 -33
  775. package/lib/module/ui/hooks/useThemeStyles.js.map +0 -1
  776. package/lib/module/ui/styles/fonts.js +0 -81
  777. package/lib/module/ui/styles/fonts.js.map +0 -1
  778. package/lib/typescript/commonjs/lib/sonner-safe.d.ts +0 -9
  779. package/lib/typescript/commonjs/lib/sonner-safe.d.ts.map +0 -1
  780. package/lib/typescript/commonjs/lib/sonner.d.ts +0 -12
  781. package/lib/typescript/commonjs/lib/sonner.d.ts.map +0 -1
  782. package/lib/typescript/commonjs/lib/sonner.native.d.ts +0 -15
  783. package/lib/typescript/commonjs/lib/sonner.native.d.ts.map +0 -1
  784. package/lib/typescript/commonjs/lib/sonner.web.d.ts +0 -15
  785. package/lib/typescript/commonjs/lib/sonner.web.d.ts.map +0 -1
  786. package/lib/typescript/commonjs/ui/hooks/useThemeColors.d.ts +0 -87
  787. package/lib/typescript/commonjs/ui/hooks/useThemeColors.d.ts.map +0 -1
  788. package/lib/typescript/commonjs/ui/hooks/useThemeStyles.d.ts +0 -22
  789. package/lib/typescript/commonjs/ui/hooks/useThemeStyles.d.ts.map +0 -1
  790. package/lib/typescript/commonjs/ui/styles/fonts.d.ts +0 -21
  791. package/lib/typescript/commonjs/ui/styles/fonts.d.ts.map +0 -1
  792. package/lib/typescript/module/lib/sonner-safe.d.ts +0 -9
  793. package/lib/typescript/module/lib/sonner-safe.d.ts.map +0 -1
  794. package/lib/typescript/module/lib/sonner.d.ts +0 -12
  795. package/lib/typescript/module/lib/sonner.d.ts.map +0 -1
  796. package/lib/typescript/module/lib/sonner.native.d.ts +0 -15
  797. package/lib/typescript/module/lib/sonner.native.d.ts.map +0 -1
  798. package/lib/typescript/module/lib/sonner.web.d.ts +0 -15
  799. package/lib/typescript/module/lib/sonner.web.d.ts.map +0 -1
  800. package/lib/typescript/module/ui/hooks/useThemeColors.d.ts +0 -87
  801. package/lib/typescript/module/ui/hooks/useThemeColors.d.ts.map +0 -1
  802. package/lib/typescript/module/ui/hooks/useThemeStyles.d.ts +0 -22
  803. package/lib/typescript/module/ui/hooks/useThemeStyles.d.ts.map +0 -1
  804. package/lib/typescript/module/ui/styles/fonts.d.ts +0 -21
  805. package/lib/typescript/module/ui/styles/fonts.d.ts.map +0 -1
  806. package/src/lib/sonner-safe.ts +0 -31
  807. package/src/lib/sonner.native.ts +0 -28
  808. package/src/lib/sonner.ts +0 -11
  809. package/src/lib/sonner.web.ts +0 -28
  810. package/src/ui/hooks/useThemeColors.ts +0 -27
  811. package/src/ui/hooks/useThemeStyles.ts +0 -50
  812. package/src/ui/styles/fonts.ts +0 -77
@@ -0,0 +1,936 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * AvatarCropScreen
5
+ *
6
+ * Flagship-grade circular crop editor presented after the user picks an image
7
+ * but before the avatar is uploaded. Inspired by iOS Photos, Google Photos and
8
+ * Instagram crop tools.
9
+ *
10
+ * Architecture:
11
+ * - Full-bleed black canvas, independent of theme, so photos always read well.
12
+ * - Translucent top bar with Cancel / Title / Done (primary CTA).
13
+ * - Circular viewport with white ring, outer 50% black mask, and a 3x3
14
+ * rule-of-thirds grid that appears during gestures and fades after 800ms.
15
+ * - Floating zoom chip during pinch.
16
+ * - Pan + pinch via Gesture Handler, transform driven by Reanimated.
17
+ * - Reduced-motion aware entrance animation.
18
+ * - Haptics on milestones via dynamically imported expo-haptics (optional).
19
+ *
20
+ * `expo-image-manipulator` and `expo-haptics` are optional peer dependencies —
21
+ * loaded with `await import(...)`. A missing manipulator surfaces a clear
22
+ * error; missing haptics simply degrades silently.
23
+ */
24
+
25
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
26
+ import { View, Text, StyleSheet, ActivityIndicator, TouchableOpacity, Image, Platform, AccessibilityInfo, Pressable } from 'react-native';
27
+ import { Gesture, GestureDetector } from 'react-native-gesture-handler';
28
+ import Animated, { Easing, runOnJS, useAnimatedStyle, useSharedValue, withDelay, withSpring, withTiming } from 'react-native-reanimated';
29
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
30
+ import { useTheme } from '@oxyhq/bloom/theme';
31
+ import { logger } from '@oxyhq/core';
32
+ import { useI18n } from "../hooks/useI18n.js";
33
+ import { toast } from '@oxyhq/bloom';
34
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
35
+ /** Component name used in `logger` context for filtered diagnostics. */
36
+ const LOG_COMPONENT = 'AvatarCropScreen';
37
+
38
+ /** Final crop result handed back to the caller. */
39
+
40
+ /** Side length (in dp) of the crop viewport. The output is always 512x512px. */
41
+ const VIEWPORT_SIZE = 320;
42
+ const OUTPUT_SIZE = 512;
43
+ const MIN_SCALE = 1;
44
+ const MAX_SCALE = 4;
45
+ /** Duration (ms) that the rule-of-thirds grid lingers after a gesture ends. */
46
+ const GRID_FADE_DELAY_MS = 800;
47
+ const GRID_FADE_DURATION_MS = 220;
48
+ /** Duration the zoom chip stays visible after a pinch ends. */
49
+ const ZOOM_CHIP_FADE_DELAY_MS = 600;
50
+ const ZOOM_CHIP_FADE_DURATION_MS = 200;
51
+ /** Backdrop color is fixed independent of theme so the photo always reads well. */
52
+ const CANVAS_BG = '#000000';
53
+ const RING_COLOR = '#ffffff';
54
+ const RING_WIDTH = 2;
55
+
56
+ /**
57
+ * Clamp the translation so the image edges never leave the viewport at any
58
+ * scale. Worklet-friendly (pure function, no closures over JS state) so the
59
+ * gesture handlers can reuse it without re-creating the closure each render.
60
+ */
61
+ function clampTranslation(tx, ty, s, baseW, baseH) {
62
+ 'worklet';
63
+
64
+ const scaledW = baseW * s;
65
+ const scaledH = baseH * s;
66
+ const maxX = Math.max(0, (scaledW - VIEWPORT_SIZE) / 2);
67
+ const maxY = Math.max(0, (scaledH - VIEWPORT_SIZE) / 2);
68
+ return {
69
+ tx: Math.min(Math.max(tx, -maxX), maxX),
70
+ ty: Math.min(Math.max(ty, -maxY), maxY)
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Lazy-loaded reference to the expo-image-manipulator module. The module is an
76
+ * optional peer dep, so we resolve it on demand and surface a clean error
77
+ * upstream if the consuming app has not installed it.
78
+ */
79
+
80
+ async function loadImageManipulator() {
81
+ try {
82
+ const mod = await import('expo-image-manipulator');
83
+ if (!mod || typeof mod.manipulateAsync !== 'function') {
84
+ throw new Error('expo-image-manipulator did not export manipulateAsync');
85
+ }
86
+ return mod;
87
+ } catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ throw new Error(`expo-image-manipulator is required for avatar cropping but is not installed: ${message}`);
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Haptic feedback wrapper. `expo-haptics` is an optional dependency — when not
95
+ * installed (or on web), all calls degrade silently. We resolve the module once
96
+ * and cache the promise so subsequent calls don't repeat the dynamic import.
97
+ */
98
+
99
+ let hapticsModulePromise = null;
100
+ function getHaptics() {
101
+ if (Platform.OS === 'web') return Promise.resolve(null);
102
+ if (hapticsModulePromise) return hapticsModulePromise;
103
+ hapticsModulePromise = (async () => {
104
+ try {
105
+ const mod = await import('expo-haptics');
106
+ if (!mod || typeof mod.impactAsync !== 'function') return null;
107
+ return mod;
108
+ } catch {
109
+ return null;
110
+ }
111
+ })();
112
+ return hapticsModulePromise;
113
+ }
114
+ async function hapticImpact(style) {
115
+ const h = await getHaptics();
116
+ if (!h) return;
117
+ const styleEnum = style === 'heavy' ? h.ImpactFeedbackStyle.Heavy : style === 'medium' ? h.ImpactFeedbackStyle.Medium : h.ImpactFeedbackStyle.Light;
118
+ try {
119
+ await h.impactAsync(styleEnum);
120
+ } catch {
121
+ // Silent — haptics are non-critical UX polish.
122
+ }
123
+ }
124
+ async function hapticNotification(type) {
125
+ const h = await getHaptics();
126
+ if (!h) return;
127
+ const typeEnum = type === 'error' ? h.NotificationFeedbackType.Error : type === 'warning' ? h.NotificationFeedbackType.Warning : h.NotificationFeedbackType.Success;
128
+ try {
129
+ await h.notificationAsync(typeEnum);
130
+ } catch {
131
+ // Silent.
132
+ }
133
+ }
134
+ async function hapticSelection() {
135
+ const h = await getHaptics();
136
+ if (!h) return;
137
+ try {
138
+ await h.selectionAsync();
139
+ } catch {
140
+ // Silent.
141
+ }
142
+ }
143
+ const AvatarCropScreen = ({
144
+ goBack,
145
+ onClose,
146
+ imageUri,
147
+ sourceWidth,
148
+ sourceHeight,
149
+ onConfirm,
150
+ onCancel
151
+ }) => {
152
+ const theme = useTheme();
153
+ const {
154
+ t
155
+ } = useI18n();
156
+ const insets = useSafeAreaInsets();
157
+
158
+ // Natural size of the source image. May be known up front (passed in) or
159
+ // measured lazily via Image.getSize once the image loads.
160
+ const [naturalSize, setNaturalSize] = useState(sourceWidth && sourceHeight ? {
161
+ width: sourceWidth,
162
+ height: sourceHeight
163
+ } : null);
164
+ const [isProcessing, setIsProcessing] = useState(false);
165
+ const [zoomLabel, setZoomLabel] = useState('1.0');
166
+ /** True when scale != MIN_SCALE OR translate != 0 — used to reveal the reset link. */
167
+ const [isModified, setIsModified] = useState(false);
168
+ const [reduceMotion, setReduceMotion] = useState(false);
169
+
170
+ // Shared values for the active gesture transform.
171
+ const scale = useSharedValue(MIN_SCALE);
172
+ const translateX = useSharedValue(0);
173
+ const translateY = useSharedValue(0);
174
+
175
+ // Entrance scale of the crop circle (pulse-in on mount).
176
+ const entrance = useSharedValue(reduceMotion ? 1 : 0.95);
177
+ /** 0..1 opacity for the rule-of-thirds grid and zoom chip. */
178
+ const gridOpacity = useSharedValue(0);
179
+ const zoomChipOpacity = useSharedValue(0);
180
+
181
+ // Refs that mirror the latest committed shared values so the JS-side
182
+ // confirm handler can read them without an extra `useSharedValue → react`
183
+ // bridge. Updated by `runOnJS(commit*)` from the gesture worklets.
184
+ const committedScale = useRef(MIN_SCALE);
185
+ const committedTranslateX = useRef(0);
186
+ const committedTranslateY = useRef(0);
187
+
188
+ // Saved start values for relative gesture math.
189
+ const savedScale = useSharedValue(MIN_SCALE);
190
+ const savedTranslateX = useSharedValue(0);
191
+ const savedTranslateY = useSharedValue(0);
192
+
193
+ // Track whether we've already announced a min/max bound during the current
194
+ // pinch so selection haptics don't fire on every frame.
195
+ const hitMinRef = useRef(false);
196
+ const hitMaxRef = useRef(false);
197
+
198
+ // The image is rendered at "cover" relative to the viewport. We compute
199
+ // `baseScale` so 1.0x means the image exactly covers the square; everything
200
+ // larger than that is user-zoom.
201
+ const baseFit = useMemo(() => {
202
+ if (!naturalSize) return null;
203
+ const ratio = naturalSize.width / naturalSize.height;
204
+ // Cover: the smaller dimension matches the viewport.
205
+ if (ratio >= 1) {
206
+ // Landscape — height fills viewport
207
+ return {
208
+ width: VIEWPORT_SIZE * ratio,
209
+ height: VIEWPORT_SIZE
210
+ };
211
+ }
212
+ return {
213
+ width: VIEWPORT_SIZE,
214
+ height: VIEWPORT_SIZE / ratio
215
+ };
216
+ }, [naturalSize]);
217
+
218
+ // Track in-flight measurement to avoid duplicate Image.getSize calls when
219
+ // the component re-renders before the previous getSize callback fires.
220
+ const measuringUriRef = useRef(null);
221
+ /** Failure state for measurement, surfaced to the user via the empty UI. */
222
+ const [measureError, setMeasureError] = useState(null);
223
+ const handleImageMeasured = useCallback(uri => {
224
+ if (measuringUriRef.current === uri) return;
225
+ measuringUriRef.current = uri;
226
+ // `logger.debug` is dev-gated upstream (no-op in production).
227
+ // We deliberately don't log the full file URI in any production
228
+ // path — only in debug builds — to avoid leaking on-device file
229
+ // paths into logcat / Sentry breadcrumbs.
230
+ logger.debug('Measuring image', {
231
+ component: LOG_COMPONENT
232
+ });
233
+ Image.getSize(uri, (w, h) => {
234
+ logger.debug('Image measured', {
235
+ component: LOG_COMPONENT
236
+ }, {
237
+ width: w,
238
+ height: h
239
+ });
240
+ if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) {
241
+ const message = t('editProfile.toasts.cropMeasureFailed') || 'Could not measure the image';
242
+ setMeasureError(message);
243
+ toast.error(message);
244
+ measuringUriRef.current = null;
245
+ return;
246
+ }
247
+ setMeasureError(null);
248
+ setNaturalSize({
249
+ width: w,
250
+ height: h
251
+ });
252
+ }, err => {
253
+ logger.error('Image.getSize failed', err, {
254
+ component: LOG_COMPONENT
255
+ });
256
+ const message = t('editProfile.toasts.cropMeasureFailed') || 'Could not measure the image';
257
+ setMeasureError(message);
258
+ toast.error(message);
259
+ measuringUriRef.current = null;
260
+ });
261
+ }, [t]);
262
+
263
+ // Kick off measurement once per imageUri. Using useEffect (not a render-body
264
+ // side effect) so the call is scheduled exactly when the URI changes,
265
+ // rather than being re-fired on every parent re-render.
266
+ useEffect(() => {
267
+ if (!imageUri) return;
268
+ if (sourceWidth && sourceHeight) return;
269
+ if (naturalSize) return;
270
+ handleImageMeasured(imageUri);
271
+ }, [handleImageMeasured, imageUri, naturalSize, sourceHeight, sourceWidth]);
272
+
273
+ // Dev-only one-time mount breadcrumb. `logger.debug` is dev-gated so
274
+ // this is a no-op in production releases; we additionally avoid logging
275
+ // the full `imageUri` to prevent leaking on-device file paths into any
276
+ // breadcrumb sink that picks up debug output.
277
+ useEffect(() => {
278
+ logger.debug('mount', {
279
+ component: LOG_COMPONENT
280
+ }, {
281
+ hasImageUri: !!imageUri,
282
+ hasSourceDimensions: !!(sourceWidth && sourceHeight)
283
+ });
284
+ }, [imageUri, sourceHeight, sourceWidth]);
285
+
286
+ // Detect reduce-motion preference once on mount + subscribe to changes.
287
+ useEffect(() => {
288
+ let cancelled = false;
289
+ AccessibilityInfo.isReduceMotionEnabled().then(enabled => {
290
+ if (cancelled) return;
291
+ setReduceMotion(enabled);
292
+ if (enabled) {
293
+ entrance.value = 1;
294
+ }
295
+ }).catch(() => {
296
+ // Best-effort — fall back to motion enabled.
297
+ });
298
+ const sub = AccessibilityInfo.addEventListener('reduceMotionChanged', enabled => {
299
+ setReduceMotion(enabled);
300
+ if (enabled) entrance.value = 1;
301
+ });
302
+ return () => {
303
+ cancelled = true;
304
+ sub.remove();
305
+ };
306
+ }, [entrance]);
307
+
308
+ // Play the entrance pulse exactly once when motion is allowed.
309
+ useEffect(() => {
310
+ if (reduceMotion) return;
311
+ entrance.value = withSpring(1, {
312
+ damping: 14,
313
+ stiffness: 180,
314
+ mass: 0.9
315
+ });
316
+ }, [entrance, reduceMotion]);
317
+ const commitTransform = useCallback((s, tx, ty) => {
318
+ committedScale.current = s;
319
+ committedTranslateX.current = tx;
320
+ committedTranslateY.current = ty;
321
+ const modified = Math.abs(s - MIN_SCALE) > 0.001 || Math.abs(tx) > 0.5 || Math.abs(ty) > 0.5;
322
+ setIsModified(modified);
323
+ setZoomLabel(s.toFixed(1));
324
+ }, []);
325
+
326
+ /** Show the rule-of-thirds grid; called from gesture worklets via runOnJS-free path. */
327
+ const showGrid = useCallback(() => {
328
+ gridOpacity.value = withTiming(1, {
329
+ duration: 120,
330
+ easing: Easing.out(Easing.quad)
331
+ });
332
+ }, [gridOpacity]);
333
+ const hideGrid = useCallback(() => {
334
+ gridOpacity.value = withDelay(GRID_FADE_DELAY_MS, withTiming(0, {
335
+ duration: GRID_FADE_DURATION_MS,
336
+ easing: Easing.in(Easing.quad)
337
+ }));
338
+ }, [gridOpacity]);
339
+ const showZoomChip = useCallback(() => {
340
+ zoomChipOpacity.value = withTiming(1, {
341
+ duration: 100
342
+ });
343
+ }, [zoomChipOpacity]);
344
+ const hideZoomChip = useCallback(() => {
345
+ zoomChipOpacity.value = withDelay(ZOOM_CHIP_FADE_DELAY_MS, withTiming(0, {
346
+ duration: ZOOM_CHIP_FADE_DURATION_MS
347
+ }));
348
+ }, [zoomChipOpacity]);
349
+
350
+ /** Dev-only ping fired once per gesture start so we can confirm in logs. */
351
+ const logGestureStart = useCallback(kind => {
352
+ logger.debug(`gesture start: ${kind}`, {
353
+ component: LOG_COMPONENT
354
+ });
355
+ }, []);
356
+ const panGesture = useMemo(() => Gesture.Pan().minDistance(2).onStart(() => {
357
+ 'worklet';
358
+
359
+ savedTranslateX.value = translateX.value;
360
+ savedTranslateY.value = translateY.value;
361
+ runOnJS(showGrid)();
362
+ runOnJS(logGestureStart)('pan');
363
+ }).onUpdate(event => {
364
+ 'worklet';
365
+
366
+ if (!baseFit) return;
367
+ const next = clampTranslation(savedTranslateX.value + event.translationX, savedTranslateY.value + event.translationY, scale.value, baseFit.width, baseFit.height);
368
+ translateX.value = next.tx;
369
+ translateY.value = next.ty;
370
+ }).onEnd(() => {
371
+ 'worklet';
372
+
373
+ runOnJS(commitTransform)(scale.value, translateX.value, translateY.value);
374
+ runOnJS(hideGrid)();
375
+ }), [baseFit, commitTransform, hideGrid, logGestureStart, savedTranslateX, savedTranslateY, scale, showGrid, translateX, translateY]);
376
+
377
+ /** Imperative helpers invoked from worklets via runOnJS. Stable refs. */
378
+ const resetPinchBounds = useCallback(() => {
379
+ hitMinRef.current = false;
380
+ hitMaxRef.current = false;
381
+ }, []);
382
+ const updateZoomLabel = useCallback(s => {
383
+ setZoomLabel(s.toFixed(1));
384
+ }, []);
385
+ const notifyMinBoundHit = useCallback(() => {
386
+ if (hitMinRef.current) return;
387
+ hitMinRef.current = true;
388
+ void hapticSelection();
389
+ }, []);
390
+ const notifyMaxBoundHit = useCallback(() => {
391
+ if (hitMaxRef.current) return;
392
+ hitMaxRef.current = true;
393
+ void hapticSelection();
394
+ }, []);
395
+ const pinchGesture = useMemo(() => Gesture.Pinch().onStart(() => {
396
+ 'worklet';
397
+
398
+ savedScale.value = scale.value;
399
+ runOnJS(showGrid)();
400
+ runOnJS(showZoomChip)();
401
+ runOnJS(resetPinchBounds)();
402
+ runOnJS(logGestureStart)('pinch');
403
+ }).onUpdate(event => {
404
+ 'worklet';
405
+
406
+ if (!baseFit) return;
407
+ const raw = savedScale.value * event.scale;
408
+ const nextScale = Math.min(MAX_SCALE, Math.max(MIN_SCALE, raw));
409
+ scale.value = nextScale;
410
+ // Re-clamp translation since the bounds depend on scale.
411
+ const clamped = clampTranslation(translateX.value, translateY.value, nextScale, baseFit.width, baseFit.height);
412
+ translateX.value = clamped.tx;
413
+ translateY.value = clamped.ty;
414
+ runOnJS(updateZoomLabel)(nextScale);
415
+ // Selection haptic on first frame at min/max.
416
+ if (nextScale <= MIN_SCALE + 0.001 && raw < MIN_SCALE) {
417
+ runOnJS(notifyMinBoundHit)();
418
+ } else if (nextScale >= MAX_SCALE - 0.001 && raw > MAX_SCALE) {
419
+ runOnJS(notifyMaxBoundHit)();
420
+ }
421
+ }).onEnd(() => {
422
+ 'worklet';
423
+
424
+ runOnJS(commitTransform)(scale.value, translateX.value, translateY.value);
425
+ runOnJS(hideGrid)();
426
+ runOnJS(hideZoomChip)();
427
+ }), [baseFit, commitTransform, hideGrid, hideZoomChip, logGestureStart, notifyMaxBoundHit, notifyMinBoundHit, resetPinchBounds, savedScale, scale, showGrid, showZoomChip, translateX, translateY, updateZoomLabel]);
428
+ const composedGesture = useMemo(() => Gesture.Simultaneous(panGesture, pinchGesture), [panGesture, pinchGesture]);
429
+ const imageAnimatedStyle = useAnimatedStyle(() => ({
430
+ transform: [{
431
+ translateX: translateX.value
432
+ }, {
433
+ translateY: translateY.value
434
+ }, {
435
+ scale: scale.value
436
+ }]
437
+ }));
438
+ const cropFrameAnimatedStyle = useAnimatedStyle(() => ({
439
+ transform: [{
440
+ scale: entrance.value
441
+ }]
442
+ }));
443
+ const gridAnimatedStyle = useAnimatedStyle(() => ({
444
+ opacity: gridOpacity.value
445
+ }));
446
+ const zoomChipAnimatedStyle = useAnimatedStyle(() => ({
447
+ opacity: zoomChipOpacity.value
448
+ }));
449
+ const resetTransform = useCallback(() => {
450
+ const duration = reduceMotion ? 0 : 220;
451
+ scale.value = withTiming(MIN_SCALE, {
452
+ duration
453
+ });
454
+ translateX.value = withTiming(0, {
455
+ duration
456
+ });
457
+ translateY.value = withTiming(0, {
458
+ duration
459
+ });
460
+ commitTransform(MIN_SCALE, 0, 0);
461
+ void hapticImpact('light');
462
+ AccessibilityInfo.announceForAccessibility(t('editProfile.crop.a11yResetAnnouncement') || 'Crop reset');
463
+ }, [commitTransform, reduceMotion, scale, t, translateX, translateY]);
464
+
465
+ /**
466
+ * Convert the on-screen transform into pixel-space crop coordinates
467
+ * relative to the source image, then invoke expo-image-manipulator to
468
+ * crop + resize to 512x512 JPEG.
469
+ */
470
+ const handleConfirm = useCallback(async () => {
471
+ // Dev-only breadcrumb. Avoid logging `imageUri` so on-device file
472
+ // paths don't leak into breadcrumb sinks that surface debug output.
473
+ logger.debug('handleConfirm start', {
474
+ component: LOG_COMPONENT
475
+ }, {
476
+ hasBaseFit: !!baseFit,
477
+ hasNaturalSize: !!naturalSize,
478
+ committedScale: committedScale.current,
479
+ committedTranslateX: committedTranslateX.current,
480
+ committedTranslateY: committedTranslateY.current
481
+ });
482
+ if (!imageUri || !baseFit || !naturalSize) {
483
+ toast.error(t('editProfile.toasts.cropNotReady') || 'Image not ready yet');
484
+ return;
485
+ }
486
+ setIsProcessing(true);
487
+ try {
488
+ const {
489
+ manipulateAsync,
490
+ SaveFormat
491
+ } = await loadImageManipulator();
492
+ const s = committedScale.current;
493
+ const tx = committedTranslateX.current;
494
+ const ty = committedTranslateY.current;
495
+
496
+ // Visible viewport in *displayed image* pixel space (with scale applied):
497
+ // The viewport is centered on the image origin, then offset by (-tx, -ty).
498
+ const scaledImageWidth = baseFit.width * s;
499
+ const scaledImageHeight = baseFit.height * s;
500
+
501
+ // Top-left of viewport in displayed-pixel space:
502
+ const viewportLeft = (scaledImageWidth - VIEWPORT_SIZE) / 2 - tx;
503
+ const viewportTop = (scaledImageHeight - VIEWPORT_SIZE) / 2 - ty;
504
+
505
+ // Convert to source-image pixel space:
506
+ const sourcePerDisplay = naturalSize.width / scaledImageWidth;
507
+ const cropX = Math.max(0, viewportLeft * sourcePerDisplay);
508
+ const cropY = Math.max(0, viewportTop * sourcePerDisplay);
509
+ const cropSize = Math.min(naturalSize.width - cropX, naturalSize.height - cropY, VIEWPORT_SIZE * sourcePerDisplay);
510
+ if (!Number.isFinite(cropSize) || cropSize <= 0) {
511
+ throw new Error('Computed crop region is invalid');
512
+ }
513
+
514
+ // Dev-only crop coordinates. We log the derived crop region but
515
+ // never the input URI — paths are PII-adjacent on some platforms.
516
+ logger.debug('manipulateAsync input', {
517
+ component: LOG_COMPONENT
518
+ }, {
519
+ cropX,
520
+ cropY,
521
+ cropSize,
522
+ outputSize: OUTPUT_SIZE
523
+ });
524
+ const result = await manipulateAsync(imageUri, [{
525
+ crop: {
526
+ originX: cropX,
527
+ originY: cropY,
528
+ width: cropSize,
529
+ height: cropSize
530
+ }
531
+ }, {
532
+ resize: {
533
+ width: OUTPUT_SIZE,
534
+ height: OUTPUT_SIZE
535
+ }
536
+ }], {
537
+ format: SaveFormat.JPEG,
538
+ compress: 0.85
539
+ });
540
+
541
+ // Log only the result's dimensions, never the on-disk URI.
542
+ logger.debug('manipulateAsync result', {
543
+ component: LOG_COMPONENT
544
+ }, {
545
+ width: result.width,
546
+ height: result.height
547
+ });
548
+ void hapticNotification('success');
549
+ await onConfirm?.({
550
+ uri: result.uri,
551
+ width: result.width,
552
+ height: result.height,
553
+ mime: 'image/jpeg'
554
+ });
555
+
556
+ // Close the sheet on success. The caller is responsible for any
557
+ // success toast (uploads typically toast their own outcome).
558
+ onClose?.();
559
+ } catch (err) {
560
+ logger.error('handleConfirm failed', err, {
561
+ component: LOG_COMPONENT
562
+ });
563
+ const message = err instanceof Error ? err.message : undefined;
564
+ void hapticNotification('error');
565
+ toast.error(message || t('editProfile.toasts.cropFailed') || 'Failed to crop image');
566
+ } finally {
567
+ setIsProcessing(false);
568
+ }
569
+ }, [baseFit, imageUri, naturalSize, onClose, onConfirm, t]);
570
+ const handleCancel = useCallback(() => {
571
+ onCancel?.();
572
+ goBack?.();
573
+ }, [goBack, onCancel]);
574
+ const topInset = Platform.OS === 'ios' ? Math.max(insets.top, 12) : Math.max(insets.top, 16);
575
+ const bottomInset = Math.max(insets.bottom, 16);
576
+ const styles = useMemo(() => StyleSheet.create({
577
+ container: {
578
+ flex: 1,
579
+ backgroundColor: CANVAS_BG
580
+ },
581
+ topBar: {
582
+ paddingTop: topInset,
583
+ paddingHorizontal: 12,
584
+ paddingBottom: 10,
585
+ flexDirection: 'row',
586
+ alignItems: 'center',
587
+ justifyContent: 'space-between',
588
+ backgroundColor: 'rgba(0,0,0,0.6)',
589
+ zIndex: 10
590
+ },
591
+ topBarTitleWrap: {
592
+ flex: 1,
593
+ alignItems: 'center',
594
+ justifyContent: 'center',
595
+ paddingHorizontal: 4
596
+ },
597
+ topBarTitle: {
598
+ color: '#ffffff',
599
+ fontSize: 17,
600
+ letterSpacing: -0.2,
601
+ ...(Platform.OS === 'web' ? {
602
+ fontWeight: '600'
603
+ } : null)
604
+ },
605
+ cancelBtn: {
606
+ minWidth: 64,
607
+ paddingHorizontal: 10,
608
+ paddingVertical: 8,
609
+ borderRadius: 18,
610
+ alignItems: 'flex-start',
611
+ justifyContent: 'center'
612
+ },
613
+ cancelLabel: {
614
+ color: '#ffffff',
615
+ fontSize: 15,
616
+ opacity: 0.85
617
+ },
618
+ doneBtn: {
619
+ minWidth: 76,
620
+ paddingHorizontal: 14,
621
+ paddingVertical: 8,
622
+ borderRadius: 18,
623
+ alignItems: 'center',
624
+ justifyContent: 'center',
625
+ backgroundColor: theme.colors.primary
626
+ },
627
+ doneBtnDisabled: {
628
+ opacity: 0.5
629
+ },
630
+ doneLabel: {
631
+ color: '#ffffff',
632
+ fontSize: 15,
633
+ letterSpacing: -0.1,
634
+ ...(Platform.OS === 'web' ? {
635
+ fontWeight: '600'
636
+ } : null)
637
+ },
638
+ doneLabelLoading: {
639
+ flexDirection: 'row',
640
+ alignItems: 'center',
641
+ justifyContent: 'center',
642
+ gap: 8
643
+ },
644
+ stage: {
645
+ flex: 1,
646
+ alignItems: 'center',
647
+ justifyContent: 'center',
648
+ paddingHorizontal: 16
649
+ },
650
+ cropFrame: {
651
+ width: VIEWPORT_SIZE,
652
+ height: VIEWPORT_SIZE,
653
+ alignItems: 'center',
654
+ justifyContent: 'center'
655
+ },
656
+ viewport: {
657
+ width: VIEWPORT_SIZE,
658
+ height: VIEWPORT_SIZE,
659
+ overflow: 'hidden',
660
+ borderRadius: VIEWPORT_SIZE / 2,
661
+ backgroundColor: '#1a1a1a',
662
+ alignItems: 'center',
663
+ justifyContent: 'center'
664
+ },
665
+ image: {
666
+ width: baseFit?.width ?? VIEWPORT_SIZE,
667
+ height: baseFit?.height ?? VIEWPORT_SIZE
668
+ },
669
+ // Outer mask: large square that overlays the canvas, with a
670
+ // round transparent cutout in the middle. We achieve this with
671
+ // four edge boxes around the circle (top/bottom/left/right) so
672
+ // there's no need for SVG. Each box is 50% black.
673
+ ringOverlay: {
674
+ position: 'absolute',
675
+ width: VIEWPORT_SIZE,
676
+ height: VIEWPORT_SIZE,
677
+ borderRadius: VIEWPORT_SIZE / 2,
678
+ borderWidth: RING_WIDTH,
679
+ borderColor: RING_COLOR,
680
+ // Subtle inner shadow approximated with a thin secondary border.
681
+ ...Platform.select({
682
+ web: {
683
+ boxShadow: 'inset 0 0 14px rgba(0,0,0,0.45)'
684
+ },
685
+ default: {}
686
+ })
687
+ },
688
+ gridOverlay: {
689
+ position: 'absolute',
690
+ width: VIEWPORT_SIZE,
691
+ height: VIEWPORT_SIZE,
692
+ borderRadius: VIEWPORT_SIZE / 2,
693
+ overflow: 'hidden',
694
+ pointerEvents: 'none'
695
+ },
696
+ gridLineH: {
697
+ position: 'absolute',
698
+ left: 0,
699
+ right: 0,
700
+ height: StyleSheet.hairlineWidth,
701
+ backgroundColor: 'rgba(255,255,255,0.45)'
702
+ },
703
+ gridLineV: {
704
+ position: 'absolute',
705
+ top: 0,
706
+ bottom: 0,
707
+ width: StyleSheet.hairlineWidth,
708
+ backgroundColor: 'rgba(255,255,255,0.45)'
709
+ },
710
+ zoomChip: {
711
+ position: 'absolute',
712
+ top: -44,
713
+ alignSelf: 'center',
714
+ paddingHorizontal: 12,
715
+ paddingVertical: 6,
716
+ borderRadius: 999,
717
+ backgroundColor: 'rgba(0,0,0,0.7)',
718
+ minWidth: 56,
719
+ alignItems: 'center',
720
+ justifyContent: 'center'
721
+ },
722
+ zoomChipText: {
723
+ color: '#ffffff',
724
+ fontFamily: Platform.select({
725
+ ios: 'Menlo',
726
+ android: 'monospace',
727
+ default: 'ui-monospace, SFMono-Regular, Menlo, monospace'
728
+ }),
729
+ fontSize: 12,
730
+ letterSpacing: 0.2
731
+ },
732
+ helperBlock: {
733
+ paddingHorizontal: 24,
734
+ paddingTop: 24,
735
+ paddingBottom: bottomInset,
736
+ alignItems: 'center',
737
+ justifyContent: 'flex-end',
738
+ gap: 10
739
+ },
740
+ helper: {
741
+ fontSize: 13,
742
+ lineHeight: 18,
743
+ color: 'rgba(255,255,255,0.6)',
744
+ textAlign: 'center',
745
+ maxWidth: 320
746
+ },
747
+ resetLink: {
748
+ paddingHorizontal: 12,
749
+ paddingVertical: 6
750
+ },
751
+ resetLinkText: {
752
+ fontSize: 13,
753
+ color: '#ffffff',
754
+ opacity: 0.85,
755
+ textDecorationLine: 'underline'
756
+ },
757
+ emptyState: {
758
+ flex: 1,
759
+ alignItems: 'center',
760
+ justifyContent: 'center',
761
+ padding: 24
762
+ },
763
+ emptyLabel: {
764
+ fontSize: 14,
765
+ color: 'rgba(255,255,255,0.7)',
766
+ textAlign: 'center'
767
+ }
768
+ }), [baseFit, bottomInset, theme, topInset]);
769
+
770
+ // Reset link reveal — only show when the image is not at the default
771
+ // transform. Use derived display state to avoid mounting/unmounting jank.
772
+ const resetLinkOpacity = isModified ? 1 : 0;
773
+
774
+ // No image supplied OR measurement failed — render a minimal empty state.
775
+ if (!imageUri || measureError) {
776
+ const emptyMessage = !imageUri ? t('editProfile.crop.noImage') || 'No image to crop' : measureError;
777
+ return /*#__PURE__*/_jsxs(View, {
778
+ style: styles.container,
779
+ children: [/*#__PURE__*/_jsxs(View, {
780
+ style: styles.topBar,
781
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
782
+ accessibilityLabel: t('editProfile.crop.cancel') || 'Cancel',
783
+ accessibilityRole: "button",
784
+ style: styles.cancelBtn,
785
+ onPress: handleCancel,
786
+ activeOpacity: 0.6,
787
+ children: /*#__PURE__*/_jsx(Text, {
788
+ style: styles.cancelLabel,
789
+ children: t('editProfile.crop.cancel') || 'Cancel'
790
+ })
791
+ }), /*#__PURE__*/_jsx(View, {
792
+ style: styles.topBarTitleWrap,
793
+ children: /*#__PURE__*/_jsx(Text, {
794
+ style: styles.topBarTitle,
795
+ children: t('editProfile.crop.title') || 'Crop avatar'
796
+ })
797
+ }), /*#__PURE__*/_jsx(View, {
798
+ style: styles.cancelBtn
799
+ })]
800
+ }), /*#__PURE__*/_jsx(View, {
801
+ style: styles.emptyState,
802
+ children: /*#__PURE__*/_jsx(Text, {
803
+ style: styles.emptyLabel,
804
+ children: emptyMessage
805
+ })
806
+ })]
807
+ });
808
+ }
809
+ return /*#__PURE__*/_jsxs(View, {
810
+ style: styles.container,
811
+ children: [/*#__PURE__*/_jsxs(View, {
812
+ style: styles.topBar,
813
+ children: [/*#__PURE__*/_jsx(TouchableOpacity, {
814
+ accessibilityLabel: t('editProfile.crop.cancel') || 'Cancel',
815
+ accessibilityRole: "button",
816
+ style: styles.cancelBtn,
817
+ onPress: handleCancel,
818
+ disabled: isProcessing,
819
+ activeOpacity: 0.6,
820
+ children: /*#__PURE__*/_jsx(Text, {
821
+ style: styles.cancelLabel,
822
+ children: t('editProfile.crop.cancel') || 'Cancel'
823
+ })
824
+ }), /*#__PURE__*/_jsx(View, {
825
+ style: styles.topBarTitleWrap,
826
+ children: /*#__PURE__*/_jsx(Text, {
827
+ style: styles.topBarTitle,
828
+ numberOfLines: 1,
829
+ children: t('editProfile.crop.title') || 'Crop avatar'
830
+ })
831
+ }), /*#__PURE__*/_jsx(TouchableOpacity, {
832
+ accessibilityLabel: t('editProfile.crop.confirm') || 'Use photo',
833
+ accessibilityRole: "button",
834
+ accessibilityState: {
835
+ disabled: isProcessing || !baseFit,
836
+ busy: isProcessing
837
+ },
838
+ style: [styles.doneBtn, (isProcessing || !baseFit) && styles.doneBtnDisabled],
839
+ onPress: handleConfirm,
840
+ disabled: isProcessing || !baseFit,
841
+ activeOpacity: 0.85,
842
+ children: isProcessing ? /*#__PURE__*/_jsxs(View, {
843
+ style: styles.doneLabelLoading,
844
+ children: [/*#__PURE__*/_jsx(ActivityIndicator, {
845
+ size: "small",
846
+ color: "#ffffff"
847
+ }), /*#__PURE__*/_jsx(Text, {
848
+ style: styles.doneLabel,
849
+ children: t('editProfile.crop.saving') || 'Saving…'
850
+ })]
851
+ }) : /*#__PURE__*/_jsx(Text, {
852
+ style: styles.doneLabel,
853
+ children: t('editProfile.crop.confirm') || 'Use photo'
854
+ })
855
+ })]
856
+ }), /*#__PURE__*/_jsx(View, {
857
+ style: styles.stage,
858
+ children: /*#__PURE__*/_jsxs(Animated.View, {
859
+ style: [styles.cropFrame, cropFrameAnimatedStyle],
860
+ accessible: true,
861
+ accessibilityRole: "image",
862
+ accessibilityLabel: t('editProfile.crop.a11yImage') || 'Crop preview. Pinch to zoom and drag to reposition the image.',
863
+ children: [/*#__PURE__*/_jsx(GestureDetector, {
864
+ gesture: composedGesture,
865
+ children: /*#__PURE__*/_jsx(View, {
866
+ style: styles.viewport,
867
+ children: baseFit ? /*#__PURE__*/_jsx(Animated.Image, {
868
+ source: {
869
+ uri: imageUri
870
+ },
871
+ style: [styles.image, imageAnimatedStyle],
872
+ resizeMode: "cover"
873
+ }) : /*#__PURE__*/_jsx(ActivityIndicator, {
874
+ color: "#ffffff"
875
+ })
876
+ })
877
+ }), /*#__PURE__*/_jsx(View, {
878
+ pointerEvents: "none",
879
+ style: styles.ringOverlay
880
+ }), /*#__PURE__*/_jsxs(Animated.View, {
881
+ pointerEvents: "none",
882
+ style: [styles.gridOverlay, gridAnimatedStyle],
883
+ children: [/*#__PURE__*/_jsx(View, {
884
+ style: [styles.gridLineH, {
885
+ top: VIEWPORT_SIZE / 3
886
+ }]
887
+ }), /*#__PURE__*/_jsx(View, {
888
+ style: [styles.gridLineH, {
889
+ top: VIEWPORT_SIZE * 2 / 3
890
+ }]
891
+ }), /*#__PURE__*/_jsx(View, {
892
+ style: [styles.gridLineV, {
893
+ left: VIEWPORT_SIZE / 3
894
+ }]
895
+ }), /*#__PURE__*/_jsx(View, {
896
+ style: [styles.gridLineV, {
897
+ left: VIEWPORT_SIZE * 2 / 3
898
+ }]
899
+ })]
900
+ }), /*#__PURE__*/_jsx(Animated.View, {
901
+ pointerEvents: "none",
902
+ style: [styles.zoomChip, zoomChipAnimatedStyle],
903
+ children: /*#__PURE__*/_jsx(Text, {
904
+ style: styles.zoomChipText,
905
+ children: t('editProfile.crop.zoom', {
906
+ value: zoomLabel
907
+ }) || `${zoomLabel}×`
908
+ })
909
+ })]
910
+ })
911
+ }), /*#__PURE__*/_jsxs(View, {
912
+ style: styles.helperBlock,
913
+ children: [/*#__PURE__*/_jsx(Text, {
914
+ style: styles.helper,
915
+ children: t('editProfile.crop.helper') || 'The cropped circle is what will appear on your profile. Pinch to zoom, drag to position.'
916
+ }), /*#__PURE__*/_jsx(Pressable, {
917
+ accessibilityLabel: t('editProfile.crop.a11yReset') || 'Reset crop to default position',
918
+ accessibilityRole: "button",
919
+ accessibilityState: {
920
+ disabled: !isModified || isProcessing
921
+ },
922
+ onPress: resetTransform,
923
+ disabled: !isModified || isProcessing,
924
+ style: [styles.resetLink, {
925
+ opacity: isProcessing ? 0.3 : resetLinkOpacity
926
+ }],
927
+ children: /*#__PURE__*/_jsx(Text, {
928
+ style: styles.resetLinkText,
929
+ children: t('editProfile.crop.resetToCenter') || 'Reset to center'
930
+ })
931
+ })]
932
+ })]
933
+ });
934
+ };
935
+ export default AvatarCropScreen;
936
+ //# sourceMappingURL=AvatarCropScreen.js.map