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