@oxy.so/services 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/LICENSE +675 -201
  2. package/NOTICE +215 -3
  3. package/README.md +1 -3
  4. package/lib/commonjs/assets/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  5. package/lib/commonjs/assets/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  6. package/lib/commonjs/assets/assets/fonts/icons/manifest.json +5 -11
  7. package/lib/commonjs/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  8. package/lib/commonjs/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  9. package/lib/commonjs/assets/fonts/icons/manifest.json +5 -11
  10. package/lib/commonjs/ui/components/FollowButton.js +15 -28
  11. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  12. package/lib/commonjs/ui/components/FollowTargetButton.js +17 -13
  13. package/lib/commonjs/ui/components/FollowTargetButton.js.map +1 -1
  14. package/lib/commonjs/ui/components/OxyAuthPrompt.js +3 -2
  15. package/lib/commonjs/ui/components/OxyAuthPrompt.js.map +1 -1
  16. package/lib/commonjs/ui/components/OxyConsentScreen.js +4 -2
  17. package/lib/commonjs/ui/components/OxyConsentScreen.js.map +1 -1
  18. package/lib/commonjs/ui/components/OxySignInButton.js +1 -1
  19. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  20. package/lib/commonjs/ui/components/OxySignInRequestSurface.js +2 -1
  21. package/lib/commonjs/ui/components/OxySignInRequestSurface.js.map +1 -1
  22. package/lib/commonjs/ui/components/ProfileButton.js +67 -267
  23. package/lib/commonjs/ui/components/ProfileButton.js.map +1 -1
  24. package/lib/commonjs/ui/components/ProfileSummaryCard.js +2 -2
  25. package/lib/commonjs/ui/components/ProfileSummaryCard.js.map +1 -1
  26. package/lib/commonjs/ui/components/SurfaceHeaderAction.js +9 -49
  27. package/lib/commonjs/ui/components/SurfaceHeaderAction.js.map +1 -1
  28. package/lib/commonjs/ui/components/SurfaceScreen.js +3 -2
  29. package/lib/commonjs/ui/components/SurfaceScreen.js.map +1 -1
  30. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +2 -1
  31. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  32. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js +2 -1
  33. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js.map +1 -1
  34. package/lib/commonjs/ui/components/authChooser/SignUpView.js +4 -2
  35. package/lib/commonjs/ui/components/authChooser/SignUpView.js.map +1 -1
  36. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js +2 -1
  37. package/lib/commonjs/ui/components/authChooser/requestSurfaces.js.map +1 -1
  38. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +20 -14
  39. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  40. package/lib/commonjs/ui/components/fileManagement/FileViewer.js +48 -85
  41. package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
  42. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +35 -31
  43. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  44. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +9 -6
  45. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  46. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +22 -19
  47. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  48. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +6 -3
  49. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -1
  50. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +6 -3
  51. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -1
  52. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +7 -5
  53. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  54. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +20 -17
  55. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  56. package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js +2 -1
  57. package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
  58. package/lib/commonjs/ui/components/surfaces/ActionSheetSurface.js +5 -3
  59. package/lib/commonjs/ui/components/surfaces/ActionSheetSurface.js.map +1 -1
  60. package/lib/commonjs/ui/icons/subsetGlyphMaps.js +0 -6
  61. package/lib/commonjs/ui/icons/subsetGlyphMaps.js.map +1 -1
  62. package/lib/commonjs/ui/screens/AccountMembersScreen.js +36 -60
  63. package/lib/commonjs/ui/screens/AccountMembersScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +2 -1
  65. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  66. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +16 -7
  67. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  68. package/lib/commonjs/ui/screens/AvatarCropScreen.js +7 -6
  69. package/lib/commonjs/ui/screens/AvatarCropScreen.js.map +1 -1
  70. package/lib/commonjs/ui/screens/CreateAccountScreen.js +2 -1
  71. package/lib/commonjs/ui/screens/CreateAccountScreen.js.map +1 -1
  72. package/lib/commonjs/ui/screens/FeedbackScreen.js +18 -9
  73. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  74. package/lib/commonjs/ui/screens/FileManagementScreen.js +99 -200
  75. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  76. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +8 -9
  77. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  78. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +19 -8
  79. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +2 -1
  81. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  82. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +20 -10
  83. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +4 -2
  85. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  86. package/lib/commonjs/ui/screens/ProfileScreen.js +2 -1
  87. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  88. package/lib/commonjs/ui/screens/UserListScreen.js +31 -33
  89. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  90. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +22 -11
  91. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  92. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js +7 -18
  93. package/lib/commonjs/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  94. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js +7 -16
  95. package/lib/commonjs/ui/screens/fileManagement/FileListSection.js.map +1 -1
  96. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +6 -6
  97. package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  98. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js +23 -66
  99. package/lib/commonjs/ui/screens/fileManagement/UploadBar.js.map +1 -1
  100. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js +17 -8
  101. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  102. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js +2 -1
  103. package/lib/commonjs/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js +3 -2
  105. package/lib/commonjs/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  106. package/lib/module/assets/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  107. package/lib/module/assets/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  108. package/lib/module/assets/assets/fonts/icons/manifest.json +5 -11
  109. package/lib/module/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  110. package/lib/module/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  111. package/lib/module/assets/fonts/icons/manifest.json +5 -11
  112. package/lib/module/ui/components/FollowButton.js +15 -28
  113. package/lib/module/ui/components/FollowButton.js.map +1 -1
  114. package/lib/module/ui/components/FollowTargetButton.js +15 -12
  115. package/lib/module/ui/components/FollowTargetButton.js.map +1 -1
  116. package/lib/module/ui/components/OxyAuthPrompt.js +2 -1
  117. package/lib/module/ui/components/OxyAuthPrompt.js.map +1 -1
  118. package/lib/module/ui/components/OxyConsentScreen.js +4 -2
  119. package/lib/module/ui/components/OxyConsentScreen.js.map +1 -1
  120. package/lib/module/ui/components/OxySignInButton.js +1 -1
  121. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  122. package/lib/module/ui/components/OxySignInRequestSurface.js +2 -1
  123. package/lib/module/ui/components/OxySignInRequestSurface.js.map +1 -1
  124. package/lib/module/ui/components/ProfileButton.js +70 -269
  125. package/lib/module/ui/components/ProfileButton.js.map +1 -1
  126. package/lib/module/ui/components/ProfileSummaryCard.js +2 -2
  127. package/lib/module/ui/components/ProfileSummaryCard.js.map +1 -1
  128. package/lib/module/ui/components/SurfaceHeaderAction.js +8 -48
  129. package/lib/module/ui/components/SurfaceHeaderAction.js.map +1 -1
  130. package/lib/module/ui/components/SurfaceScreen.js +2 -1
  131. package/lib/module/ui/components/SurfaceScreen.js.map +1 -1
  132. package/lib/module/ui/components/authChooser/AccountsMenuView.js +2 -1
  133. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  134. package/lib/module/ui/components/authChooser/SignInEntryView.js +2 -1
  135. package/lib/module/ui/components/authChooser/SignInEntryView.js.map +1 -1
  136. package/lib/module/ui/components/authChooser/SignUpView.js +4 -2
  137. package/lib/module/ui/components/authChooser/SignUpView.js.map +1 -1
  138. package/lib/module/ui/components/authChooser/requestSurfaces.js +2 -1
  139. package/lib/module/ui/components/authChooser/requestSurfaces.js.map +1 -1
  140. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +12 -6
  141. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  142. package/lib/module/ui/components/fileManagement/FileViewer.js +38 -75
  143. package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
  144. package/lib/module/ui/components/fileManagement/UploadPreview.js +31 -27
  145. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  146. package/lib/module/ui/components/modals/DeleteAccountModal.js +6 -3
  147. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  148. package/lib/module/ui/components/payment/PaymentDetailsStep.js +6 -3
  149. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  150. package/lib/module/ui/components/payment/PaymentMethodStep.js +6 -3
  151. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -1
  152. package/lib/module/ui/components/payment/PaymentReviewStep.js +6 -3
  153. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -1
  154. package/lib/module/ui/components/payment/PaymentSuccessStep.js +4 -2
  155. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -1
  156. package/lib/module/ui/components/payment/PaymentSummaryStep.js +6 -3
  157. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -1
  158. package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js +2 -1
  159. package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
  160. package/lib/module/ui/components/surfaces/ActionSheetSurface.js +4 -2
  161. package/lib/module/ui/components/surfaces/ActionSheetSurface.js.map +1 -1
  162. package/lib/module/ui/icons/subsetGlyphMaps.js +0 -6
  163. package/lib/module/ui/icons/subsetGlyphMaps.js.map +1 -1
  164. package/lib/module/ui/screens/AccountMembersScreen.js +37 -61
  165. package/lib/module/ui/screens/AccountMembersScreen.js.map +1 -1
  166. package/lib/module/ui/screens/AccountSettingsScreen.js +2 -1
  167. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  168. package/lib/module/ui/screens/AccountVerificationScreen.js +15 -7
  169. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  170. package/lib/module/ui/screens/AvatarCropScreen.js +2 -1
  171. package/lib/module/ui/screens/AvatarCropScreen.js.map +1 -1
  172. package/lib/module/ui/screens/CreateAccountScreen.js +2 -1
  173. package/lib/module/ui/screens/CreateAccountScreen.js.map +1 -1
  174. package/lib/module/ui/screens/FeedbackScreen.js +18 -9
  175. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  176. package/lib/module/ui/screens/FileManagementScreen.js +91 -192
  177. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  178. package/lib/module/ui/screens/LanguageSelectorScreen.js +9 -10
  179. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  180. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +18 -7
  181. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  182. package/lib/module/ui/screens/PaymentGatewayScreen.js +2 -1
  183. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  184. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +20 -10
  185. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  186. package/lib/module/ui/screens/PrivacySettingsScreen.js +4 -2
  187. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  188. package/lib/module/ui/screens/ProfileScreen.js +2 -1
  189. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  190. package/lib/module/ui/screens/UserListScreen.js +32 -34
  191. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  192. package/lib/module/ui/screens/WelcomeNewUserScreen.js +22 -11
  193. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  194. package/lib/module/ui/screens/fileManagement/FileLibraryError.js +6 -17
  195. package/lib/module/ui/screens/fileManagement/FileLibraryError.js.map +1 -1
  196. package/lib/module/ui/screens/fileManagement/FileListSection.js +5 -14
  197. package/lib/module/ui/screens/fileManagement/FileListSection.js.map +1 -1
  198. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +3 -3
  199. package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
  200. package/lib/module/ui/screens/fileManagement/UploadBar.js +24 -66
  201. package/lib/module/ui/screens/fileManagement/UploadBar.js.map +1 -1
  202. package/lib/module/ui/screens/trust/TrustAboutScreen.js +16 -7
  203. package/lib/module/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  204. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js +2 -1
  205. package/lib/module/ui/screens/trust/TrustLeaderboardScreen.js.map +1 -1
  206. package/lib/module/ui/screens/trust/TrustRulesScreen.js +2 -1
  207. package/lib/module/ui/screens/trust/TrustRulesScreen.js.map +1 -1
  208. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts.map +1 -1
  209. package/lib/typescript/commonjs/ui/components/FollowTargetButton.d.ts.map +1 -1
  210. package/lib/typescript/commonjs/ui/components/OxyAuthPrompt.d.ts.map +1 -1
  211. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +1 -1
  212. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  213. package/lib/typescript/commonjs/ui/components/ProfileButton.d.ts +1 -20
  214. package/lib/typescript/commonjs/ui/components/ProfileButton.d.ts.map +1 -1
  215. package/lib/typescript/commonjs/ui/components/ProfileSummaryCard.d.ts.map +1 -1
  216. package/lib/typescript/commonjs/ui/components/SurfaceHeaderAction.d.ts +1 -5
  217. package/lib/typescript/commonjs/ui/components/SurfaceHeaderAction.d.ts.map +1 -1
  218. package/lib/typescript/commonjs/ui/components/SurfaceScreen.d.ts.map +1 -1
  219. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  220. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  221. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  222. package/lib/typescript/commonjs/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  223. package/lib/typescript/commonjs/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -1
  224. package/lib/typescript/commonjs/ui/components/payment/PaymentMethodStep.d.ts.map +1 -1
  225. package/lib/typescript/commonjs/ui/components/payment/PaymentReviewStep.d.ts.map +1 -1
  226. package/lib/typescript/commonjs/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -1
  227. package/lib/typescript/commonjs/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -1
  228. package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  229. package/lib/typescript/commonjs/ui/components/surfaces/ActionSheetSurface.d.ts.map +1 -1
  230. package/lib/typescript/commonjs/ui/icons/Ionicons.d.ts +1 -1
  231. package/lib/typescript/commonjs/ui/icons/Ionicons.d.ts.map +1 -1
  232. package/lib/typescript/commonjs/ui/icons/MaterialCommunityIcons.d.ts +1 -1
  233. package/lib/typescript/commonjs/ui/icons/MaterialCommunityIcons.d.ts.map +1 -1
  234. package/lib/typescript/commonjs/ui/icons/subsetGlyphMaps.d.ts +0 -6
  235. package/lib/typescript/commonjs/ui/icons/subsetGlyphMaps.d.ts.map +1 -1
  236. package/lib/typescript/commonjs/ui/screens/AccountMembersScreen.d.ts.map +1 -1
  237. package/lib/typescript/commonjs/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  238. package/lib/typescript/commonjs/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  239. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  241. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -1
  243. package/lib/typescript/commonjs/ui/screens/fileManagement/FileLibraryError.d.ts +0 -2
  244. package/lib/typescript/commonjs/ui/screens/fileManagement/FileLibraryError.d.ts.map +1 -1
  245. package/lib/typescript/commonjs/ui/screens/fileManagement/FileListSection.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  247. package/lib/typescript/commonjs/ui/screens/fileManagement/UploadBar.d.ts +1 -14
  248. package/lib/typescript/commonjs/ui/screens/fileManagement/UploadBar.d.ts.map +1 -1
  249. package/lib/typescript/commonjs/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  250. package/lib/typescript/commonjs/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  251. package/lib/typescript/module/ui/components/FollowButton.d.ts.map +1 -1
  252. package/lib/typescript/module/ui/components/FollowTargetButton.d.ts.map +1 -1
  253. package/lib/typescript/module/ui/components/OxyAuthPrompt.d.ts.map +1 -1
  254. package/lib/typescript/module/ui/components/OxySignInButton.d.ts +1 -1
  255. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  256. package/lib/typescript/module/ui/components/ProfileButton.d.ts +1 -20
  257. package/lib/typescript/module/ui/components/ProfileButton.d.ts.map +1 -1
  258. package/lib/typescript/module/ui/components/ProfileSummaryCard.d.ts.map +1 -1
  259. package/lib/typescript/module/ui/components/SurfaceHeaderAction.d.ts +1 -5
  260. package/lib/typescript/module/ui/components/SurfaceHeaderAction.d.ts.map +1 -1
  261. package/lib/typescript/module/ui/components/SurfaceScreen.d.ts.map +1 -1
  262. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  263. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  264. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  265. package/lib/typescript/module/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  266. package/lib/typescript/module/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -1
  267. package/lib/typescript/module/ui/components/payment/PaymentMethodStep.d.ts.map +1 -1
  268. package/lib/typescript/module/ui/components/payment/PaymentReviewStep.d.ts.map +1 -1
  269. package/lib/typescript/module/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -1
  270. package/lib/typescript/module/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -1
  271. package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  272. package/lib/typescript/module/ui/components/surfaces/ActionSheetSurface.d.ts.map +1 -1
  273. package/lib/typescript/module/ui/icons/Ionicons.d.ts +1 -1
  274. package/lib/typescript/module/ui/icons/Ionicons.d.ts.map +1 -1
  275. package/lib/typescript/module/ui/icons/MaterialCommunityIcons.d.ts +1 -1
  276. package/lib/typescript/module/ui/icons/MaterialCommunityIcons.d.ts.map +1 -1
  277. package/lib/typescript/module/ui/icons/subsetGlyphMaps.d.ts +0 -6
  278. package/lib/typescript/module/ui/icons/subsetGlyphMaps.d.ts.map +1 -1
  279. package/lib/typescript/module/ui/screens/AccountMembersScreen.d.ts.map +1 -1
  280. package/lib/typescript/module/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  281. package/lib/typescript/module/ui/screens/AvatarCropScreen.d.ts.map +1 -1
  282. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  283. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  284. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -1
  285. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -1
  286. package/lib/typescript/module/ui/screens/fileManagement/FileLibraryError.d.ts +0 -2
  287. package/lib/typescript/module/ui/screens/fileManagement/FileLibraryError.d.ts.map +1 -1
  288. package/lib/typescript/module/ui/screens/fileManagement/FileListSection.d.ts.map +1 -1
  289. package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
  290. package/lib/typescript/module/ui/screens/fileManagement/UploadBar.d.ts +1 -14
  291. package/lib/typescript/module/ui/screens/fileManagement/UploadBar.d.ts.map +1 -1
  292. package/lib/typescript/module/ui/screens/trust/TrustAboutScreen.d.ts.map +1 -1
  293. package/lib/typescript/module/ui/screens/trust/TrustRulesScreen.d.ts.map +1 -1
  294. package/package.json +7 -7
  295. package/src/assets/fonts/icons/OxyServicesIonicons.ttf +0 -0
  296. package/src/assets/fonts/icons/OxyServicesMaterialCommunityIcons.ttf +0 -0
  297. package/src/assets/fonts/icons/manifest.json +5 -11
  298. package/src/ui/components/FollowButton.tsx +14 -29
  299. package/src/ui/components/FollowTargetButton.tsx +14 -12
  300. package/src/ui/components/OxyAuthPrompt.tsx +2 -7
  301. package/src/ui/components/OxyConsentScreen.tsx +2 -2
  302. package/src/ui/components/OxySignInButton.tsx +2 -2
  303. package/src/ui/components/OxySignInRequestSurface.tsx +1 -1
  304. package/src/ui/components/ProfileButton.tsx +30 -297
  305. package/src/ui/components/ProfileSummaryCard.tsx +1 -2
  306. package/src/ui/components/SurfaceHeaderAction.tsx +7 -49
  307. package/src/ui/components/SurfaceScreen.tsx +2 -1
  308. package/src/ui/components/authChooser/AccountsMenuView.tsx +1 -1
  309. package/src/ui/components/authChooser/SignInEntryView.tsx +1 -1
  310. package/src/ui/components/authChooser/SignUpView.tsx +2 -2
  311. package/src/ui/components/authChooser/requestSurfaces.tsx +1 -1
  312. package/src/ui/components/fileManagement/FileDetailsModal.tsx +8 -6
  313. package/src/ui/components/fileManagement/FileViewer.tsx +21 -50
  314. package/src/ui/components/fileManagement/UploadPreview.tsx +12 -29
  315. package/src/ui/components/modals/DeleteAccountModal.tsx +4 -3
  316. package/src/ui/components/payment/PaymentDetailsStep.tsx +4 -3
  317. package/src/ui/components/payment/PaymentMethodStep.tsx +4 -3
  318. package/src/ui/components/payment/PaymentReviewStep.tsx +4 -3
  319. package/src/ui/components/payment/PaymentSuccessStep.tsx +3 -2
  320. package/src/ui/components/payment/PaymentSummaryStep.tsx +4 -3
  321. package/src/ui/components/photogrid/JustifiedPhotoGrid.tsx +2 -1
  322. package/src/ui/components/surfaces/ActionSheetSurface.tsx +3 -2
  323. package/src/ui/icons/subsetGlyphMaps.ts +0 -6
  324. package/src/ui/screens/AccountMembersScreen.tsx +17 -65
  325. package/src/ui/screens/AccountSettingsScreen.tsx +1 -1
  326. package/src/ui/screens/AccountVerificationScreen.tsx +14 -7
  327. package/src/ui/screens/AvatarCropScreen.tsx +2 -10
  328. package/src/ui/screens/CreateAccountScreen.tsx +1 -1
  329. package/src/ui/screens/FeedbackScreen.tsx +9 -9
  330. package/src/ui/screens/FileManagementScreen.tsx +37 -184
  331. package/src/ui/screens/LanguageSelectorScreen.tsx +5 -13
  332. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +17 -7
  333. package/src/ui/screens/PaymentGatewayScreen.tsx +1 -1
  334. package/src/ui/screens/PremiumSubscriptionScreen.tsx +10 -10
  335. package/src/ui/screens/PrivacySettingsScreen.tsx +2 -2
  336. package/src/ui/screens/ProfileScreen.tsx +1 -1
  337. package/src/ui/screens/UserListScreen.tsx +17 -44
  338. package/src/ui/screens/WelcomeNewUserScreen.tsx +11 -11
  339. package/src/ui/screens/fileManagement/FileLibraryError.tsx +6 -14
  340. package/src/ui/screens/fileManagement/FileListSection.tsx +4 -16
  341. package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +2 -13
  342. package/src/ui/screens/fileManagement/UploadBar.tsx +17 -56
  343. package/src/ui/screens/trust/TrustAboutScreen.tsx +16 -7
  344. package/src/ui/screens/trust/TrustLeaderboardScreen.tsx +1 -1
  345. package/src/ui/screens/trust/TrustRulesScreen.tsx +2 -1
  346. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js +0 -61
  347. package/lib/commonjs/ui/components/fileManagement/AnimatedButton.js.map +0 -1
  348. package/lib/commonjs/ui/components/internal/PinInput.js +0 -118
  349. package/lib/commonjs/ui/components/internal/PinInput.js.map +0 -1
  350. package/lib/module/ui/components/fileManagement/AnimatedButton.js +0 -55
  351. package/lib/module/ui/components/fileManagement/AnimatedButton.js.map +0 -1
  352. package/lib/module/ui/components/internal/PinInput.js +0 -113
  353. package/lib/module/ui/components/internal/PinInput.js.map +0 -1
  354. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts +0 -17
  355. package/lib/typescript/commonjs/ui/components/fileManagement/AnimatedButton.d.ts.map +0 -1
  356. package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts +0 -23
  357. package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts.map +0 -1
  358. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts +0 -17
  359. package/lib/typescript/module/ui/components/fileManagement/AnimatedButton.d.ts.map +0 -1
  360. package/lib/typescript/module/ui/components/internal/PinInput.d.ts +0 -23
  361. package/lib/typescript/module/ui/components/internal/PinInput.d.ts.map +0 -1
  362. package/src/ui/components/fileManagement/AnimatedButton.tsx +0 -64
  363. package/src/ui/components/internal/PinInput.tsx +0 -123
@@ -1,8 +1,8 @@
1
+ import { SegmentedControl, SegmentedControlItem, SegmentedControlItemText } from '@oxy.so/bloom/segmented-control';
1
2
  import type React from 'react';
2
3
  import { useCallback, useMemo, useState } from 'react';
3
4
  import {
4
5
  View,
5
- TouchableOpacity,
6
6
  ActivityIndicator,
7
7
  } from 'react-native';
8
8
  import Ionicons from '../icons/Ionicons';
@@ -291,37 +291,14 @@ const AccountMembersScreen: React.FC<BaseScreenProps> = ({ onClose, goBack, acco
291
291
  <Text className="text-caption font-caption text-text-secondary px-space-4">
292
292
  {t('accounts.members.invite.roleLabel') || 'Role'}
293
293
  </Text>
294
- <View className="flex-row flex-wrap gap-space-8">
295
- {ASSIGNABLE_ROLES.map((role) => {
296
- const selected = role === inviteRole;
297
- return (
298
- <TouchableOpacity
299
- key={role}
300
- accessibilityRole="radio"
301
- accessibilityState={{ selected }}
302
- accessibilityLabel={roleLabel(role)}
303
- onPress={() => setInviteRole(role)}
304
- activeOpacity={0.7}
305
- className="px-space-12 py-space-8 rounded-radius-full"
306
- style={{
307
- backgroundColor: selected ? colors.primary : colors.card,
308
- borderWidth: 1,
309
- borderColor: selected ? colors.primary : colors.border,
310
- }}
311
- >
312
- <Text
313
- className="text-caption font-semibold"
314
- style={{ color: selected ? colors.background : colors.text }}
315
- >
316
- {roleLabel(role)}
317
- </Text>
318
- </TouchableOpacity>
319
- );
320
- })}
321
- </View>
294
+ <SegmentedControl type="radio" label={t('accounts.members.invite.roleLabel') || 'Role'} value={inviteRole} onValueChange={setInviteRole} size="small">
295
+ {ASSIGNABLE_ROLES.map(role => <SegmentedControlItem key={role} value={role}>
296
+ <SegmentedControlItemText>{roleLabel(role)}</SegmentedControlItemText>
297
+ </SegmentedControlItem>)}
298
+ </SegmentedControl>
322
299
 
323
300
  <Button
324
- variant="primary"
301
+ appearance="solid" tone="accent"
325
302
  onPress={handleInvite}
326
303
  disabled={inviteMutation.isPending || !inviteIdentifier.trim()}
327
304
  loading={inviteMutation.isPending}
@@ -394,35 +371,12 @@ const AccountMembersScreen: React.FC<BaseScreenProps> = ({ onClose, goBack, acco
394
371
 
395
372
  {/* Role chips (editable) or static role label */}
396
373
  {canEditThisRole ? (
397
- <View className="flex-row flex-wrap gap-space-8">
398
- {ASSIGNABLE_ROLES.map((role) => {
399
- const selected = role === member.role;
400
- return (
401
- <TouchableOpacity
402
- key={role}
403
- accessibilityRole="radio"
404
- accessibilityState={{ selected }}
405
- accessibilityLabel={roleLabel(role)}
406
- onPress={() => handleChangeRole(member, role)}
407
- disabled={updateMutation.isPending}
408
- activeOpacity={0.7}
409
- className="px-space-12 py-space-4 rounded-radius-full"
410
- style={{
411
- backgroundColor: selected ? colors.primary : colors.card,
412
- borderWidth: 1,
413
- borderColor: selected ? colors.primary : colors.border,
414
- }}
415
- >
416
- <Text
417
- className="text-caption font-semibold"
418
- style={{ color: selected ? colors.background : colors.text }}
419
- >
420
- {roleLabel(role)}
421
- </Text>
422
- </TouchableOpacity>
423
- );
424
- })}
425
- </View>
374
+ <SegmentedControl type="radio" label={t('accounts.members.invite.roleLabel') || 'Role'}
375
+ value={member.role} onValueChange={role => handleChangeRole(member, role)} disabled={updateMutation.isPending} size="small">
376
+ {ASSIGNABLE_ROLES.map(role => <SegmentedControlItem key={role} value={role}>
377
+ <SegmentedControlItemText>{roleLabel(role)}</SegmentedControlItemText>
378
+ </SegmentedControlItem>)}
379
+ </SegmentedControl>
426
380
  ) : !isOwner ? (
427
381
  <Text className="text-caption font-caption text-text-secondary">
428
382
  {roleLabel(member.role)}
@@ -433,32 +387,30 @@ const AccountMembersScreen: React.FC<BaseScreenProps> = ({ onClose, goBack, acco
433
387
  {(canTransferToThis || canRemoveThisMember) ? (
434
388
  <View className="flex-row gap-space-16 pt-space-4">
435
389
  {canTransferToThis ? (
436
- <TouchableOpacity
390
+ <Button appearance="plain" tone="neutral" size="small"
437
391
  accessibilityRole="button"
438
392
  accessibilityLabel={t('accounts.members.actions.transfer') || 'Transfer ownership'}
439
393
  onPress={() => confirmTransfer(member)}
440
- activeOpacity={0.7}
441
394
  className="flex-row items-center gap-space-4"
442
395
  >
443
396
  <Ionicons name="swap-horizontal-outline" size={16} color={colors.icon} />
444
397
  <Text className="text-caption font-semibold text-text-secondary">
445
398
  {t('accounts.members.actions.transfer') || 'Transfer ownership'}
446
399
  </Text>
447
- </TouchableOpacity>
400
+ </Button>
448
401
  ) : null}
449
402
  {canRemoveThisMember ? (
450
- <TouchableOpacity
403
+ <Button appearance="plain" tone="neutral" size="small"
451
404
  accessibilityRole="button"
452
405
  accessibilityLabel={t('accounts.members.actions.remove') || 'Remove member'}
453
406
  onPress={() => confirmRemove(member)}
454
- activeOpacity={0.7}
455
407
  className="flex-row items-center gap-space-4"
456
408
  >
457
409
  <Ionicons name="trash-outline" size={16} color={colors.error} />
458
410
  <Text className="text-caption font-semibold" style={{ color: colors.error }}>
459
411
  {t('accounts.members.actions.remove') || 'Remove'}
460
412
  </Text>
461
- </TouchableOpacity>
413
+ </Button>
462
414
  ) : null}
463
415
  </View>
464
416
  ) : null}
@@ -233,7 +233,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps> = ({ onClose, goBack, nav
233
233
  </Text>
234
234
  </View>
235
235
  <Button
236
- variant="primary"
236
+ appearance="solid" tone="accent"
237
237
  onPress={handleSave}
238
238
  disabled={updateMutation.isPending || !displayName.trim() || Boolean(displayNameError)}
239
239
  loading={updateMutation.isPending}
@@ -12,7 +12,14 @@ import { Button } from '@oxy.so/bloom/button';
12
12
  import { TextField, TextFieldInput } from '@oxy.so/bloom/text-field';
13
13
  import { IconCircle } from '@oxy.so/bloom/icon-circle';
14
14
  import { BenefitList, BenefitRow } from '../components/BenefitList';
15
- import * as Icons from '@oxy.so/bloom/icons';
15
+ // Per glyph, never `@oxy.so/bloom/icons`. That barrel re-exports all 461 Remix
16
+ // glyphs and Metro does not tree-shake, so one import of it here re-ships every
17
+ // glyph — 313,123 B, measured — to every app in this package's graph, and no
18
+ // consumer can opt out of what a dependency asks for.
19
+ import { RiInformationLine } from '@oxy.so/bloom/icons/RiInformationLine';
20
+ import { RiShieldCheckLine } from '@oxy.so/bloom/icons/RiShieldCheckLine';
21
+ import { RiSparklingLine } from '@oxy.so/bloom/icons/RiSparklingLine';
22
+ import { RiVerifiedBadgeLine } from '@oxy.so/bloom/icons/RiVerifiedBadgeLine';
16
23
  import { useI18n } from '../hooks/useI18n';
17
24
  import { useSurfaceHeader } from '../hooks/useSurfaceHeader';
18
25
  import { useOxy } from '../context/OxyContext';
@@ -82,7 +89,7 @@ const AccountVerificationScreen: React.FC<BaseScreenProps> = ({
82
89
  <View className="px-screen-margin pb-space-32">
83
90
  {/* Hero */}
84
91
  <View className="items-center py-space-24 gap-space-12">
85
- <IconCircle icon={Icons.RiVerifiedBadgeLine} />
92
+ <IconCircle icon={RiVerifiedBadgeLine} />
86
93
  <H4 className="text-headerBold font-headerBold text-text text-center">
87
94
  {t('accountVerification.heroTitle') || 'Get a verified badge'}
88
95
  </H4>
@@ -97,15 +104,15 @@ const AccountVerificationScreen: React.FC<BaseScreenProps> = ({
97
104
  accessibilityLabel={t('accountVerification.sections.benefits') || 'What verification gives you'}
98
105
  >
99
106
  <BenefitRow
100
- icon={<Icons.RiShieldCheckLine size="sm" style={{ color: bloomTheme.colors.primary }} />}
107
+ icon={<RiShieldCheckLine size="sm" style={{ color: bloomTheme.colors.primary }} />}
101
108
  label={t('accountVerification.benefits.authenticity') || 'Confirms your identity is authentic and trusted'}
102
109
  />
103
110
  <BenefitRow
104
- icon={<Icons.RiVerifiedBadgeLine size="sm" style={{ color: bloomTheme.colors.primary }} />}
111
+ icon={<RiVerifiedBadgeLine size="sm" style={{ color: bloomTheme.colors.primary }} />}
105
112
  label={t('accountVerification.benefits.badge') || 'Displays a verified badge across the platform'}
106
113
  />
107
114
  <BenefitRow
108
- icon={<Icons.RiSparklingLine size="sm" style={{ color: bloomTheme.colors.primary }} />}
115
+ icon={<RiSparklingLine size="sm" style={{ color: bloomTheme.colors.primary }} />}
109
116
  label={t('accountVerification.benefits.credibility') || 'Builds credibility with people who follow you'}
110
117
  />
111
118
  </BenefitList>
@@ -148,7 +155,7 @@ const AccountVerificationScreen: React.FC<BaseScreenProps> = ({
148
155
  </View>
149
156
 
150
157
  <Button
151
- variant="primary"
158
+ appearance="solid" tone="accent"
152
159
  size="large"
153
160
  fullWidth
154
161
  className="mt-space-24"
@@ -161,7 +168,7 @@ const AccountVerificationScreen: React.FC<BaseScreenProps> = ({
161
168
  </Button>
162
169
 
163
170
  <View className="flex-row items-start gap-space-8 mt-space-24">
164
- <Icons.RiInformationLine
171
+ <RiInformationLine
165
172
  size="sm"
166
173
  style={{ color: bloomTheme.colors.textTertiary }}
167
174
  />
@@ -28,16 +28,8 @@
28
28
 
29
29
  import type React from 'react';
30
30
  import { useCallback, useMemo, useRef, useState } from 'react';
31
- import {
32
- View,
33
- Text,
34
- StyleSheet,
35
- ActivityIndicator,
36
- Image,
37
- Platform,
38
- AccessibilityInfo,
39
- Pressable,
40
- } from 'react-native';
31
+ import { View, StyleSheet, ActivityIndicator, Image, Platform, AccessibilityInfo, Pressable } from 'react-native';
32
+ import { Text } from '@oxy.so/bloom/typography';
41
33
  import { Gesture, GestureDetector } from 'react-native-gesture-handler';
42
34
  import Animated, {
43
35
  Easing,
@@ -474,7 +474,7 @@ const CreateAccountScreen: React.FC<BaseScreenProps> = ({
474
474
 
475
475
  {/* Create Button */}
476
476
  <Button
477
- variant="primary"
477
+ appearance="solid" tone="accent"
478
478
  onPress={handleCreate}
479
479
  disabled={!canCreate}
480
480
  loading={isCreating}
@@ -375,7 +375,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
375
375
 
376
376
  <View className="flex-row gap-space-8 mt-space-24 w-full">
377
377
  <Button
378
- variant="secondary"
378
+ appearance="subtle" tone="neutral"
379
379
  onPress={goBack}
380
380
  accessibilityLabel="Go back"
381
381
  icon={<Ionicons name="arrow-back" size={16} color={colors.text} />}
@@ -385,7 +385,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
385
385
  </Button>
386
386
 
387
387
  <Button
388
- variant="primary"
388
+ appearance="solid" tone="accent"
389
389
  onPress={nextStep}
390
390
  disabled={!isTypeStepValid()}
391
391
  accessibilityLabel="Continue to next step"
@@ -485,7 +485,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
485
485
 
486
486
  <View className="flex-row gap-space-8 mt-space-24 w-full">
487
487
  <Button
488
- variant="secondary"
488
+ appearance="subtle" tone="neutral"
489
489
  onPress={prevStep}
490
490
  accessibilityLabel="Go back"
491
491
  icon={<Ionicons name="arrow-back" size={16} color={colors.text} />}
@@ -495,7 +495,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
495
495
  </Button>
496
496
 
497
497
  <Button
498
- variant="primary"
498
+ appearance="solid" tone="accent"
499
499
  onPress={nextStep}
500
500
  disabled={!isDetailsStepValid()}
501
501
  accessibilityLabel="Continue to next step"
@@ -574,7 +574,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
574
574
 
575
575
  <View className="flex-row gap-space-8 mt-space-24 w-full">
576
576
  <Button
577
- variant="secondary"
577
+ appearance="subtle" tone="neutral"
578
578
  onPress={prevStep}
579
579
  accessibilityLabel="Go back"
580
580
  icon={<Ionicons name="arrow-back" size={16} color={colors.text} />}
@@ -584,7 +584,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
584
584
  </Button>
585
585
 
586
586
  <Button
587
- variant="primary"
587
+ appearance="solid" tone="accent"
588
588
  onPress={nextStep}
589
589
  disabled={!isContactStepValid()}
590
590
  accessibilityLabel="Continue to summary"
@@ -653,7 +653,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
653
653
  </View>
654
654
 
655
655
  <Button
656
- variant="primary"
656
+ appearance="solid" tone="accent"
657
657
  onPress={handleSubmitFeedback}
658
658
  disabled={feedbackState.status === "submitting"}
659
659
  loading={feedbackState.status === "submitting"}
@@ -670,7 +670,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
670
670
 
671
671
  <View className="flex-row mt-space-16 w-full">
672
672
  <Button
673
- variant="secondary"
673
+ appearance="subtle" tone="neutral"
674
674
  onPress={prevStep}
675
675
  accessibilityLabel="Go back"
676
676
  icon={<Ionicons name="arrow-back" size={16} color={colors.text} />}
@@ -701,7 +701,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
701
701
  "Your feedback has been submitted successfully. We'll review it and get back to you soon."}
702
702
  </Text>
703
703
  <Button
704
- variant="primary"
704
+ appearance="solid" tone="accent"
705
705
  onPress={() => {
706
706
  resetForm();
707
707
  setCurrentStep(0);
@@ -1,16 +1,8 @@
1
+ import { Button } from '@oxy.so/bloom/button';
1
2
  import type React from 'react';
2
3
  import { useState, useCallback, useMemo, useRef } from 'react';
3
- import {
4
- View,
5
- Text,
6
- TouchableOpacity,
7
- StyleSheet,
8
- ScrollView,
9
- ActivityIndicator,
10
- RefreshControl,
11
- TextInput,
12
- useWindowDimensions,
13
- } from 'react-native';
4
+ import { View, TouchableOpacity, StyleSheet, ScrollView, ActivityIndicator, RefreshControl, useWindowDimensions } from 'react-native';
5
+ import { Text } from '@oxy.so/bloom/typography';
14
6
  import { useQueryClient } from '@tanstack/react-query';
15
7
  import { Image as ExpoImage } from 'expo-image';
16
8
  import type { FileManagementScreenProps } from '../types/fileManagement';
@@ -46,11 +38,10 @@ import PhotoPickerView from './fileManagement/PhotoPickerSection';
46
38
  import FileListSection, { type FileListItem } from './fileManagement/FileListSection';
47
39
  import FileLibraryError from './fileManagement/FileLibraryError';
48
40
  import UploadBar from './fileManagement/UploadBar';
49
- import { AnimatedButton } from '../components/fileManagement/AnimatedButton';
41
+ import { SegmentedControl, SegmentedControlItem } from '@oxy.so/bloom/segmented-control';
42
+ import { Search } from '@oxy.so/bloom/search';
50
43
 
51
- // Genuinely-inline-only styles: `viewModeButton` is spread into an Animated.View
52
- // style array (interpolated backgroundColor), and the photo tiles are
53
- // `expo-image` (no className remap). Everything else uses NativeWind classNames.
44
+ // Photo tiles use expo-image dimensions; controls use Bloom primitives.
54
45
  // Nav-header slot layout for this screen's action row + review-mode back button.
55
46
  const fmHeaderStyles = StyleSheet.create({
56
47
  actionsRow: {
@@ -67,15 +58,6 @@ const fmHeaderStyles = StyleSheet.create({
67
58
  });
68
59
 
69
60
  const screenStyles = StyleSheet.create({
70
- viewModeButton: {
71
- paddingHorizontal: 10,
72
- paddingVertical: 6,
73
- borderRadius: 999,
74
- minWidth: 36,
75
- alignItems: 'center',
76
- justifyContent: 'center',
77
- marginHorizontal: 1,
78
- },
79
61
  justifiedPhotoImage: { width: '100%', height: '100%', borderRadius: 6 },
80
62
  });
81
63
 
@@ -799,35 +781,16 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
799
781
  },
800
782
  // Hide action buttons when selecting (in selectMode or bulk operations mode)
801
783
  rightElement: (!selectMode && selectedIds.size === 0) ? (
802
- <View className="flex-row items-center gap-[6px] ml-[12px]">
803
- {(isImage || isVideo || file.contentType.includes('pdf')) && (
804
- <TouchableOpacity
805
- className="w-[34px] h-[34px] rounded-[8px] items-center justify-center"
806
- style={{ backgroundColor: colors.backgroundSecondary }}
807
- onPress={() => handleFileOpen(file)}
808
- >
809
- <Ionicons name="eye" size={18} color={colors.primary} />
810
- </TouchableOpacity>
811
- )}
812
- <TouchableOpacity
813
- className="w-[34px] h-[34px] rounded-[8px] items-center justify-center"
814
- style={{ backgroundColor: colors.backgroundSecondary }}
815
- onPress={() => handleFileDownload(file.id, file.filename)}
816
- >
817
- <Ionicons name="download" size={18} color={colors.primary} />
818
- </TouchableOpacity>
819
- <TouchableOpacity
820
- className="w-[34px] h-[34px] rounded-[8px] items-center justify-center"
821
- style={{ backgroundColor: colors.negativeSubtle }}
822
- onPress={() => confirmFileDelete(file.id, file.filename)}
823
- disabled={deletingId === file.id}
824
- >
825
- {deletingId === file.id ? (
826
- <ActivityIndicator size="small" color={colors.error} />
827
- ) : (
828
- <Ionicons name="trash" size={18} color={colors.error} />
829
- )}
830
- </TouchableOpacity>
784
+ <View className="flex-row items-center gap-1.5 ml-3">
785
+ {(isImage || isVideo || file.contentType.includes('pdf')) ? <Button appearance="subtle" tone="neutral" size="small" iconOnly stopPropagation
786
+ accessibilityLabel={`Preview ${file.filename}`} onPress={() => handleFileOpen(file)}
787
+ icon={<Ionicons name="eye" size={18} color={colors.text} />} /> : null}
788
+ <Button appearance="subtle" tone="neutral" size="small" iconOnly stopPropagation
789
+ accessibilityLabel={`Download ${file.filename}`} onPress={() => handleFileDownload(file.id, file.filename)}
790
+ icon={<Ionicons name="download" size={18} color={colors.text} />} />
791
+ <Button appearance="subtle" tone="danger" size="small" iconOnly stopPropagation loading={deletingId === file.id}
792
+ accessibilityLabel={`Delete ${file.filename}`} onPress={() => confirmFileDelete(file.id, file.filename)}
793
+ icon={<Ionicons name="trash" size={18} color={colors.error} />} />
831
794
  </View>
832
795
  ) : undefined,
833
796
  };
@@ -844,7 +807,6 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
844
807
  iconColor={colors.error}
845
808
  titleColor={colors.text}
846
809
  descriptionColor={colors.textSecondary}
847
- buttonColor={colors.primary}
848
810
  />
849
811
  );
850
812
 
@@ -866,21 +828,7 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
866
828
  : t('fileManagement.emptyPhotos.otherDescription')
867
829
  } </Text>
868
830
  {user?.id === targetUserId && (
869
- <TouchableOpacity
870
- className="flex-row items-center px-[24px] py-[12px] rounded-[24px] gap-[8px]"
871
- style={{ backgroundColor: colors.primary }}
872
- onPress={handleFileUpload}
873
- disabled={uploading || isPickingDocument}
874
- >
875
- {(uploading || isPickingDocument) ? (
876
- <ActivityIndicator size="small" color="#FFFFFF" />
877
- ) : (
878
- <>
879
- <Ionicons name="cloud-upload" size={20} color="#FFFFFF" />
880
- <Text className="text-white text-[16px] font-semibold">{t('fileManagement.uploadPhotos')}</Text>
881
- </>
882
- )}
883
- </TouchableOpacity>
831
+ <Button onPress={handleFileUpload} loading={uploading || isPickingDocument}>{t('fileManagement.uploadPhotos')}</Button>
884
832
  )}
885
833
  </View>
886
834
  );
@@ -934,21 +882,7 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
934
882
  }
935
883
  </Text>
936
884
  {user?.id === targetUserId && (
937
- <TouchableOpacity
938
- className="flex-row items-center px-[24px] py-[12px] rounded-[24px] gap-[8px]"
939
- style={{ backgroundColor: colors.primary }}
940
- onPress={handleFileUpload}
941
- disabled={uploading || isPickingDocument}
942
- >
943
- {(uploading || isPickingDocument) ? (
944
- <ActivityIndicator size="small" color="#FFFFFF" />
945
- ) : (
946
- <>
947
- <Ionicons name="cloud-upload" size={20} color="#FFFFFF" />
948
- <Text className="text-white text-[16px] font-semibold">{t('fileManagement.uploadFiles')}</Text>
949
- </>
950
- )}
951
- </TouchableOpacity>
885
+ <Button onPress={handleFileUpload} loading={uploading || isPickingDocument}>{t('fileManagement.uploadFiles')}</Button>
952
886
  )}
953
887
  </View>
954
888
  );
@@ -1215,60 +1149,18 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
1215
1149
  className="flex-1"
1216
1150
  style={{ maxWidth: '80%' }}
1217
1151
  >
1218
- <View
1219
- className="flex-row rounded-full p-[2px] overflow-hidden"
1220
- style={{ backgroundColor: colors.card }}
1221
- >
1222
- <AnimatedButton
1223
- isSelected={viewMode === 'all'}
1224
- onPress={() => setViewMode('all')}
1225
- icon={viewMode === 'all' ? 'folder' : 'folder-outline'}
1226
- primaryColor={colors.primary}
1227
- textColor={colors.text}
1228
- style={screenStyles.viewModeButton}
1229
- accessibilityLabel={t('fileManagement.a11y.viewAll') || 'Show all files'}
1230
- />
1231
- <AnimatedButton
1232
- isSelected={viewMode === 'photos'}
1233
- onPress={() => setViewMode('photos')}
1234
- icon={viewMode === 'photos' ? 'image-multiple' : 'image-multiple-outline'}
1235
- primaryColor={colors.primary}
1236
- textColor={colors.text}
1237
- style={screenStyles.viewModeButton}
1238
- accessibilityLabel={t('fileManagement.a11y.viewPhotos') || 'Show photos only'}
1239
- />
1240
- <AnimatedButton
1241
- isSelected={viewMode === 'videos'}
1242
- onPress={() => setViewMode('videos')}
1243
- icon={viewMode === 'videos' ? 'video' : 'video-outline'}
1244
- primaryColor={colors.primary}
1245
- textColor={colors.text}
1246
- style={screenStyles.viewModeButton}
1247
- accessibilityLabel={t('fileManagement.a11y.viewVideos') || 'Show videos only'}
1248
- />
1249
- <AnimatedButton
1250
- isSelected={viewMode === 'documents'}
1251
- onPress={() => setViewMode('documents')}
1252
- icon={viewMode === 'documents' ? 'file-document' : 'file-document-outline'}
1253
- primaryColor={colors.primary}
1254
- textColor={colors.text}
1255
- style={screenStyles.viewModeButton}
1256
- accessibilityLabel={t('fileManagement.a11y.viewDocuments') || 'Show documents only'}
1257
- />
1258
- <AnimatedButton
1259
- isSelected={viewMode === 'audio'}
1260
- onPress={() => setViewMode('audio')}
1261
- icon={viewMode === 'audio' ? 'music-note' : 'music-note-outline'}
1262
- primaryColor={colors.primary}
1263
- textColor={colors.text}
1264
- style={screenStyles.viewModeButton}
1265
- accessibilityLabel={t('fileManagement.a11y.viewAudio') || 'Show audio only'}
1266
- />
1267
- </View>
1152
+ <SegmentedControl type="radio" label={t('fileManagement.viewMode') || 'File type'}
1153
+ value={viewMode} onValueChange={setViewMode} size="small">
1154
+ {(['all', 'photos', 'videos', 'documents', 'audio'] as const).map(mode => (
1155
+ <SegmentedControlItem key={mode} value={mode} accessibilityLabel={mode}>
1156
+ <MaterialCommunityIcons
1157
+ name={({ all: 'folder-outline', photos: 'image-multiple-outline', videos: 'video-outline', documents: 'file-document-outline', audio: 'music-note-outline' } as const)[mode]}
1158
+ size={18} color={colors.text} />
1159
+ </SegmentedControlItem>
1160
+ ))}
1161
+ </SegmentedControl>
1268
1162
  </ScrollView>
1269
- <TouchableOpacity
1270
- className="flex-row items-center justify-center px-[10px] py-[6px] rounded-full min-w-[36px] gap-[4px]"
1271
- style={{ backgroundColor: colors.card }}
1163
+ <Button appearance="subtle" tone="neutral" size="small"
1272
1164
  accessibilityRole="button"
1273
1165
  accessibilityLabel={t('fileManagement.a11y.sortBy', {
1274
1166
  field: sortBy,
@@ -1285,7 +1177,7 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
1285
1177
  setSortOrder(prev => prev === 'asc' ? 'desc' : 'asc');
1286
1178
  }
1287
1179
  }}
1288
- >
1180
+ trailing={<View className="flex-row items-center gap-1">
1289
1181
  <MaterialCommunityIcons
1290
1182
  name={
1291
1183
  sortBy === 'date' ? 'calendar' :
@@ -1300,58 +1192,21 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
1300
1192
  size={14}
1301
1193
  color={colors.textSecondary}
1302
1194
  />
1303
- </TouchableOpacity>
1195
+ </View>} />
1304
1196
  {user?.id === targetUserId && (!selectMode || allowUploadInSelectMode) && (
1305
- <TouchableOpacity
1306
- className="h-[44px] w-[44px] rounded-[22px] items-center justify-center"
1307
- style={{ backgroundColor: colors.primary }}
1308
- onPress={handleFileUpload}
1309
- disabled={uploading || isPickingDocument}
1310
- accessibilityRole="button"
1197
+ <Button iconOnly onPress={handleFileUpload} loading={uploading || isPickingDocument}
1311
1198
  accessibilityLabel={t('fileManagement.a11y.uploadFile') || 'Upload file'}
1312
- accessibilityState={{ busy: uploading || isPickingDocument }}
1313
- >
1314
- {uploading ? (
1315
- <View className="items-center justify-center">
1316
- <ActivityIndicator size="small" color="#FFFFFF" />
1317
- {uploadProgress && (
1318
- <Text className="text-white text-[10px] font-semibold mt-[2px]">
1319
- {uploadProgress.current}/{uploadProgress.total}
1320
- </Text>
1321
- )}
1322
- </View>
1323
- ) : isPickingDocument ? (
1324
- <ActivityIndicator size="small" color="#FFFFFF" />
1325
- ) : (
1326
- <Ionicons name="add" size={22} color="#FFFFFF" />
1327
- )}
1328
- </TouchableOpacity>
1199
+ icon={<Ionicons name="add" size={22} color={colors.primaryForeground} />} />
1329
1200
  )}
1330
1201
  </View>
1331
1202
 
1332
1203
  {/* Search Bar */}
1333
1204
  {files.length > 0 && (viewMode === 'all' || files.some(f => f.contentType.startsWith('image/'))) && (
1334
- <View
1335
- className="flex-row items-center px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-full gap-[10px]"
1336
- style={{ backgroundColor: colors.card }}
1337
- >
1338
- <Ionicons name="search" size={22} color={colors.icon} />
1339
- <TextInput
1340
- className="flex-1 text-[16px] leading-[20px]"
1341
- style={{ color: colors.text }}
1342
- placeholder={viewMode === 'photos' ? t('fileManagement.searchPhotos') : t('fileManagement.searchFiles')}
1343
- placeholderTextColor={colors.textSecondary}
1344
- value={searchQuery}
1345
- onChangeText={setSearchQuery}
1205
+ <View className="mx-[12px] mb-[12px]">
1206
+ <Search
1207
+ label={viewMode === 'photos' ? t('fileManagement.searchPhotos') : t('fileManagement.searchFiles')}
1208
+ value={searchQuery} onValueChange={setSearchQuery} onClearText={() => setSearchQuery('')}
1346
1209
  />
1347
- {searchQuery.length > 0 && (
1348
- <TouchableOpacity
1349
- onPress={() => setSearchQuery('')}
1350
- className="p-[4px] rounded-[12px] items-center justify-center"
1351
- >
1352
- <Ionicons name="close-circle" size={22} color={colors.icon} />
1353
- </TouchableOpacity>
1354
- )}
1355
1210
  </View>
1356
1211
  )}
1357
1212
 
@@ -1410,8 +1265,6 @@ const FileManagementScreen: React.FC<FileManagementScreenProps> = ({
1410
1265
  {!selectMode && uploading && (
1411
1266
  <UploadBar
1412
1267
  uploadProgress={uploadProgress}
1413
- isDark={bloomTheme.isDark}
1414
- colors={colors}
1415
1268
  t={t}
1416
1269
  />
1417
1270
  )}