@b3dotfun/sdk 0.0.65-alpha.0 → 0.0.65-test.3

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 (268) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +77 -35
  2. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +2 -2
  3. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.js +1 -1
  4. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.js +1 -1
  5. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  6. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +5 -3
  7. package/dist/cjs/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  8. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  9. package/dist/cjs/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  10. package/dist/cjs/anyspend/react/components/common/OrderHistory.js +7 -3
  11. package/dist/cjs/anyspend/react/components/common/PanelOnrampPayment.js +1 -1
  12. package/dist/cjs/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  13. package/dist/cjs/anyspend/react/components/common/RecipientSelection.js +1 -1
  14. package/dist/cjs/anyspend/react/hooks/useSigMint.d.ts +1 -1
  15. package/dist/cjs/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  16. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +184 -35
  17. package/dist/cjs/global-account/react/components/B3DynamicModal.js +23 -12
  18. package/dist/cjs/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  19. package/dist/cjs/global-account/react/components/Deposit/Deposit.js +65 -0
  20. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  21. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +37 -0
  22. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  23. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.js +113 -279
  24. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  25. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.js +331 -0
  26. package/dist/cjs/global-account/react/components/ManageAccount/AppsContent.d.ts +6 -0
  27. package/dist/cjs/global-account/react/components/ManageAccount/AppsContent.js +34 -0
  28. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.js +6 -5
  29. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  30. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.js +23 -0
  31. package/dist/cjs/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  32. package/dist/cjs/global-account/react/components/ManageAccount/Header.js +120 -0
  33. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  34. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.js +43 -0
  35. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  36. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.js +16 -0
  37. package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.js +24 -193
  38. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  39. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.js +15 -0
  40. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  41. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +47 -0
  42. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  43. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +50 -0
  44. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  45. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.js +8 -0
  46. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  47. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +106 -0
  48. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  49. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.js +22 -0
  50. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.d.ts +10 -0
  51. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.js +12 -0
  52. package/dist/cjs/global-account/react/components/Send/Send.d.ts +5 -0
  53. package/dist/cjs/global-account/react/components/Send/Send.js +187 -0
  54. package/dist/cjs/global-account/react/components/SignInWithB3/SignIn.js +3 -1
  55. package/dist/cjs/global-account/react/components/icons/BellIcon.d.ts +3 -0
  56. package/dist/cjs/global-account/react/components/icons/BellIcon.js +5 -0
  57. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  58. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.js +7 -0
  59. package/dist/cjs/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  60. package/dist/cjs/global-account/react/components/icons/CopyIcon.js +7 -0
  61. package/dist/cjs/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  62. package/dist/cjs/global-account/react/components/icons/LinkIcon.js +5 -0
  63. package/dist/cjs/global-account/react/components/icons/LockIcon.d.ts +3 -0
  64. package/dist/cjs/global-account/react/components/icons/LockIcon.js +5 -0
  65. package/dist/cjs/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  66. package/dist/cjs/global-account/react/components/icons/WalletIcon.js +7 -0
  67. package/dist/cjs/global-account/react/components/index.d.ts +5 -4
  68. package/dist/cjs/global-account/react/components/index.js +14 -9
  69. package/dist/cjs/global-account/react/components/ui/Tabs.js +2 -2
  70. package/dist/cjs/global-account/react/components/ui/dialog.js +2 -2
  71. package/dist/cjs/global-account/react/hooks/index.d.ts +1 -1
  72. package/dist/cjs/global-account/react/hooks/index.js +3 -1
  73. package/dist/cjs/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  74. package/dist/cjs/global-account/react/hooks/useAccountWallet.js +18 -0
  75. package/dist/cjs/global-account/react/hooks/useAuthentication.d.ts +2 -2
  76. package/dist/cjs/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  77. package/dist/cjs/global-account/react/hooks/useUserQuery.d.ts +2 -2
  78. package/dist/cjs/global-account/react/stores/index.d.ts +1 -0
  79. package/dist/cjs/global-account/react/stores/index.js +3 -1
  80. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +31 -6
  81. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  82. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.js +36 -0
  83. package/dist/cjs/global-account/react/utils/profileDisplay.d.ts +2 -0
  84. package/dist/cjs/global-account/react/utils/profileDisplay.js +2 -2
  85. package/dist/cjs/shared/constants/chains/supported.d.ts +3 -3
  86. package/dist/cjs/shared/utils/ipfs.js +10 -3
  87. package/dist/esm/anyspend/react/components/AnySpend.js +78 -36
  88. package/dist/esm/anyspend/react/components/AnySpendCustom.js +2 -2
  89. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.js +1 -1
  90. package/dist/esm/anyspend/react/components/AnyspendDepositHype.js +1 -1
  91. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  92. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +5 -3
  93. package/dist/esm/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  94. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  95. package/dist/esm/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  96. package/dist/esm/anyspend/react/components/common/OrderHistory.js +6 -5
  97. package/dist/esm/anyspend/react/components/common/PanelOnrampPayment.js +1 -1
  98. package/dist/esm/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  99. package/dist/esm/anyspend/react/components/common/RecipientSelection.js +1 -1
  100. package/dist/esm/anyspend/react/hooks/useSigMint.d.ts +1 -1
  101. package/dist/esm/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  102. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +186 -37
  103. package/dist/esm/global-account/react/components/B3DynamicModal.js +23 -12
  104. package/dist/esm/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  105. package/dist/esm/global-account/react/components/Deposit/Deposit.js +59 -0
  106. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  107. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +34 -0
  108. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  109. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.js +113 -280
  110. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  111. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.js +325 -0
  112. package/dist/esm/global-account/react/components/ManageAccount/AppsContent.d.ts +6 -0
  113. package/dist/esm/global-account/react/components/ManageAccount/AppsContent.js +32 -0
  114. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.js +6 -5
  115. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  116. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.js +21 -0
  117. package/dist/esm/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  118. package/dist/esm/global-account/react/components/ManageAccount/Header.js +81 -0
  119. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  120. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.js +41 -0
  121. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  122. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.js +10 -0
  123. package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.js +26 -195
  124. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  125. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.js +13 -0
  126. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  127. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +45 -0
  128. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  129. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +45 -0
  130. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  131. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.js +6 -0
  132. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  133. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +101 -0
  134. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  135. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.js +20 -0
  136. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.d.ts +10 -0
  137. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.js +10 -0
  138. package/dist/esm/global-account/react/components/Send/Send.d.ts +5 -0
  139. package/dist/esm/global-account/react/components/Send/Send.js +181 -0
  140. package/dist/esm/global-account/react/components/SignInWithB3/SignIn.js +4 -2
  141. package/dist/esm/global-account/react/components/icons/BellIcon.d.ts +3 -0
  142. package/dist/esm/global-account/react/components/icons/BellIcon.js +3 -0
  143. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  144. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.js +4 -0
  145. package/dist/esm/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  146. package/dist/esm/global-account/react/components/icons/CopyIcon.js +4 -0
  147. package/dist/esm/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  148. package/dist/esm/global-account/react/components/icons/LinkIcon.js +3 -0
  149. package/dist/esm/global-account/react/components/icons/LockIcon.d.ts +3 -0
  150. package/dist/esm/global-account/react/components/icons/LockIcon.js +3 -0
  151. package/dist/esm/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  152. package/dist/esm/global-account/react/components/icons/WalletIcon.js +4 -0
  153. package/dist/esm/global-account/react/components/index.d.ts +5 -4
  154. package/dist/esm/global-account/react/components/index.js +9 -5
  155. package/dist/esm/global-account/react/components/ui/Tabs.js +2 -2
  156. package/dist/esm/global-account/react/components/ui/dialog.js +2 -2
  157. package/dist/esm/global-account/react/hooks/index.d.ts +1 -1
  158. package/dist/esm/global-account/react/hooks/index.js +1 -1
  159. package/dist/esm/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  160. package/dist/esm/global-account/react/hooks/useAccountWallet.js +17 -0
  161. package/dist/esm/global-account/react/hooks/useAuthentication.d.ts +2 -2
  162. package/dist/esm/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  163. package/dist/esm/global-account/react/hooks/useUserQuery.d.ts +2 -2
  164. package/dist/esm/global-account/react/stores/index.d.ts +1 -0
  165. package/dist/esm/global-account/react/stores/index.js +1 -0
  166. package/dist/esm/global-account/react/stores/useModalStore.d.ts +31 -6
  167. package/dist/esm/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  168. package/dist/esm/global-account/react/stores/useRecentAddressesStore.js +33 -0
  169. package/dist/esm/global-account/react/utils/profileDisplay.d.ts +2 -0
  170. package/dist/esm/global-account/react/utils/profileDisplay.js +2 -2
  171. package/dist/esm/shared/constants/chains/supported.d.ts +3 -3
  172. package/dist/esm/shared/utils/ipfs.js +10 -3
  173. package/dist/styles/index.css +1 -1
  174. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  175. package/dist/types/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  176. package/dist/types/anyspend/react/hooks/useSigMint.d.ts +1 -1
  177. package/dist/types/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  178. package/dist/types/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  179. package/dist/types/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  180. package/dist/types/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  181. package/dist/types/global-account/react/components/ManageAccount/AppsContent.d.ts +6 -0
  182. package/dist/types/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  183. package/dist/types/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  184. package/dist/types/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  185. package/dist/types/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  186. package/dist/types/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  187. package/dist/types/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  188. package/dist/types/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  189. package/dist/types/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  190. package/dist/types/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  191. package/dist/types/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  192. package/dist/types/global-account/react/components/ModalHeader/ModalHeader.d.ts +10 -0
  193. package/dist/types/global-account/react/components/Send/Send.d.ts +5 -0
  194. package/dist/types/global-account/react/components/icons/BellIcon.d.ts +3 -0
  195. package/dist/types/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  196. package/dist/types/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  197. package/dist/types/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  198. package/dist/types/global-account/react/components/icons/LockIcon.d.ts +3 -0
  199. package/dist/types/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  200. package/dist/types/global-account/react/components/index.d.ts +5 -4
  201. package/dist/types/global-account/react/hooks/index.d.ts +1 -1
  202. package/dist/types/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  203. package/dist/types/global-account/react/hooks/useAuthentication.d.ts +2 -2
  204. package/dist/types/global-account/react/hooks/useUserQuery.d.ts +2 -2
  205. package/dist/types/global-account/react/stores/index.d.ts +1 -0
  206. package/dist/types/global-account/react/stores/useModalStore.d.ts +31 -6
  207. package/dist/types/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  208. package/dist/types/global-account/react/utils/profileDisplay.d.ts +2 -0
  209. package/dist/types/shared/constants/chains/supported.d.ts +3 -3
  210. package/package.json +1 -1
  211. package/src/anyspend/react/components/AnySpend.tsx +229 -170
  212. package/src/anyspend/react/components/AnySpendCustom.tsx +1 -3
  213. package/src/anyspend/react/components/AnySpendCustomExactIn.tsx +0 -2
  214. package/src/anyspend/react/components/AnyspendDepositHype.tsx +0 -2
  215. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +7 -14
  216. package/src/anyspend/react/components/common/FeeDetailPanel.tsx +1 -1
  217. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +2 -2
  218. package/src/anyspend/react/components/common/OrderHistory.tsx +8 -13
  219. package/src/anyspend/react/components/common/PanelOnrampPayment.tsx +1 -1
  220. package/src/anyspend/react/components/common/PointsDetailPanel.tsx +1 -1
  221. package/src/anyspend/react/components/common/RecipientSelection.tsx +1 -1
  222. package/src/global-account/react/components/AccountAssets/AccountAssets.tsx +115 -25
  223. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +360 -128
  224. package/src/global-account/react/components/B3DynamicModal.tsx +28 -14
  225. package/src/global-account/react/components/Deposit/Deposit.tsx +211 -0
  226. package/src/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.tsx +84 -0
  227. package/src/global-account/react/components/LinkAccount/LinkAccount.tsx +332 -433
  228. package/src/global-account/react/components/LinkAccount/LinkNewAccount.tsx +490 -0
  229. package/src/global-account/react/components/ManageAccount/AppsContent.tsx +79 -0
  230. package/src/global-account/react/components/ManageAccount/BalanceContent.tsx +6 -10
  231. package/src/global-account/react/components/ManageAccount/BottomNavigation.tsx +83 -0
  232. package/src/global-account/react/components/ManageAccount/Header.tsx +230 -0
  233. package/src/global-account/react/components/ManageAccount/HomeActions.tsx +118 -0
  234. package/src/global-account/react/components/ManageAccount/HomeContent.tsx +42 -0
  235. package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +73 -589
  236. package/src/global-account/react/components/ManageAccount/NFTContent.tsx +24 -0
  237. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +72 -0
  238. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +87 -0
  239. package/src/global-account/react/components/ManageAccount/SettingsMenuItem.tsx +31 -0
  240. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +180 -0
  241. package/src/global-account/react/components/ManageAccount/TokenContent.tsx +41 -0
  242. package/src/global-account/react/components/ModalHeader/ModalHeader.tsx +50 -0
  243. package/src/global-account/react/components/Send/Send.tsx +585 -0
  244. package/src/global-account/react/components/SignInWithB3/SignIn.tsx +11 -7
  245. package/src/global-account/react/components/icons/BellIcon.tsx +15 -0
  246. package/src/global-account/react/components/icons/ChevronDownIcon.tsx +17 -0
  247. package/src/global-account/react/components/icons/CopyIcon.tsx +22 -0
  248. package/src/global-account/react/components/icons/LinkIcon.tsx +15 -0
  249. package/src/global-account/react/components/icons/LockIcon.tsx +15 -0
  250. package/src/global-account/react/components/icons/WalletIcon.tsx +21 -0
  251. package/src/global-account/react/components/index.ts +11 -5
  252. package/src/global-account/react/components/ui/Tabs.tsx +5 -13
  253. package/src/global-account/react/components/ui/dialog.tsx +32 -14
  254. package/src/global-account/react/hooks/index.ts +3 -0
  255. package/src/global-account/react/hooks/useAccountWallet.tsx +26 -0
  256. package/src/global-account/react/hooks/useB3BalanceFromAddresses.ts +1 -0
  257. package/src/global-account/react/stores/index.ts +1 -0
  258. package/src/global-account/react/stores/useModalStore.ts +35 -6
  259. package/src/global-account/react/stores/useRecentAddressesStore.ts +55 -0
  260. package/src/global-account/react/utils/profileDisplay.ts +4 -2
  261. package/src/shared/utils/ipfs.ts +10 -3
  262. package/src/styles/index.css +6 -1
  263. package/dist/cjs/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  264. package/dist/cjs/global-account/react/components/ProfileEditor/ProfileEditor.js +0 -141
  265. package/dist/esm/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  266. package/dist/esm/global-account/react/components/ProfileEditor/ProfileEditor.js +0 -135
  267. package/dist/types/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  268. package/src/global-account/react/components/ProfileEditor/ProfileEditor.tsx +0 -265
@@ -8,6 +8,7 @@ exports.AvatarEditor = AvatarEditor;
8
8
  const jsx_runtime_1 = require("react/jsx-runtime");
9
9
  const app_1 = __importDefault(require("../../../../global-account/app"));
10
10
  const react_1 = require("../../../../global-account/react");
11
+ const profileDisplay_1 = require("../../../../global-account/react/utils/profileDisplay");
11
12
  const cn_1 = require("../../../../shared/utils/cn");
12
13
  const debug_1 = require("../../../../shared/utils/debug");
13
14
  const thirdweb_1 = require("../../../../shared/utils/thirdweb");
@@ -16,21 +17,33 @@ const react_2 = require("react");
16
17
  const sonner_1 = require("sonner");
17
18
  const react_3 = require("thirdweb/react");
18
19
  const storage_1 = require("thirdweb/storage");
20
+ const useProfile_1 = require("../../hooks/useProfile");
21
+ const stores_1 = require("../../stores");
22
+ const ModalHeader_1 = __importDefault(require("../ModalHeader/ModalHeader"));
19
23
  const debug = (0, debug_1.debugB3React)("AvatarEditor");
20
24
  function AvatarEditor({ onSetAvatar, className }) {
25
+ const [viewStep, setViewStep] = (0, react_2.useState)("select");
26
+ const [selectedAvatar, setSelectedAvatar] = (0, react_2.useState)(null);
27
+ const [selectedProfileType, setSelectedProfileType] = (0, react_2.useState)(null); // Track which profile was selected
28
+ const [hoveredProfile, setHoveredProfile] = (0, react_2.useState)(null);
21
29
  const [selectedFile, setSelectedFile] = (0, react_2.useState)(null);
22
30
  const [previewUrl, setPreviewUrl] = (0, react_2.useState)(null);
23
- const [isUploading, setIsUploading] = (0, react_2.useState)(false);
24
31
  const [isSaving, setIsSaving] = (0, react_2.useState)(false);
32
+ const [isDragging, setIsDragging] = (0, react_2.useState)(false);
25
33
  const fileInputRef = (0, react_2.useRef)(null);
26
- const { setUser } = (0, react_1.useB3)();
34
+ const { setUser, user, partnerId } = (0, react_1.useB3)();
35
+ const setB3ModalContentType = (0, stores_1.useModalStore)(state => state.setB3ModalContentType);
36
+ const contentType = (0, stores_1.useModalStore)(state => state.contentType);
37
+ const { setPreference } = (0, useProfile_1.useProfileSettings)();
27
38
  const account = (0, react_3.useActiveAccount)();
28
39
  const { data: profile, refetch: refreshProfile } = (0, react_1.useProfile)({
29
40
  address: account?.address,
30
41
  fresh: true,
31
42
  });
32
- // Thirdweb upload function
33
- const hasAvatar = profile?.avatar;
43
+ // Get raw avatar URLs, convert IPFS URLs, and validate them
44
+ const rawCurrentAvatar = user?.avatar || profile?.avatar;
45
+ const currentAvatar = (0, profileDisplay_1.validateImageUrl)(rawCurrentAvatar);
46
+ const safePreviewUrl = (0, profileDisplay_1.validateImageUrl)(previewUrl);
34
47
  const handleFileSelect = (event) => {
35
48
  const file = event.target.files?.[0];
36
49
  if (file) {
@@ -45,12 +58,17 @@ function AvatarEditor({ onSetAvatar, className }) {
45
58
  return;
46
59
  }
47
60
  setSelectedFile(file);
61
+ // Clear profile type selection when uploading a new file
62
+ setSelectedProfileType(null);
48
63
  // Create preview URL
49
64
  const url = URL.createObjectURL(file);
50
65
  setPreviewUrl(url);
66
+ setSelectedAvatar(url);
51
67
  }
52
68
  };
53
- const handleRemoveFile = () => {
69
+ const handleRemovePreview = () => {
70
+ setSelectedAvatar(currentAvatar || null);
71
+ setSelectedProfileType(null);
54
72
  setSelectedFile(null);
55
73
  if (previewUrl) {
56
74
  URL.revokeObjectURL(previewUrl);
@@ -60,49 +78,180 @@ function AvatarEditor({ onSetAvatar, className }) {
60
78
  fileInputRef.current.value = "";
61
79
  }
62
80
  };
63
- const handleUpload = async () => {
64
- if (!selectedFile) {
65
- sonner_1.toast.error("Please select an image first");
81
+ const handleSaveChanges = async () => {
82
+ if (!account?.address) {
83
+ sonner_1.toast.error("No account connected");
66
84
  return;
67
85
  }
68
- setIsUploading(true);
86
+ setIsSaving(true);
69
87
  try {
70
- debug("Starting upload to IPFS", selectedFile);
71
- // Upload to IPFS using Thirdweb
72
- const ipfsUrl = await (0, storage_1.upload)({
73
- client: thirdweb_1.client,
74
- files: [selectedFile],
75
- });
76
- debug("Upload successful", ipfsUrl);
77
- // Save avatar URL using profiles service
78
- setIsSaving(true);
79
- const user = await app_1.default.service("users").setAvatar({
80
- avatar: ipfsUrl,
81
- },
82
- // @ts-expect-error - our typed client is expecting context even though it's set elsewhere
83
- {});
84
- // update user
85
- // @ts-expect-error this resolved fine, look into why expect-error needed
86
- setUser(user);
88
+ let fileToUpload = null;
89
+ // If user uploaded a new file
90
+ if (selectedFile) {
91
+ fileToUpload = selectedFile;
92
+ }
93
+ else if (selectedProfileType && selectedAvatar) {
94
+ // User selected from existing profile avatars
95
+ // Fetch the image from the URL and convert to blob
96
+ debug("Fetching image from social profile:", selectedAvatar);
97
+ try {
98
+ const response = await fetch(selectedAvatar);
99
+ if (!response.ok) {
100
+ throw new Error("Failed to fetch image");
101
+ }
102
+ const blob = await response.blob();
103
+ debug("Fetched blob with type:", blob.type);
104
+ // Determine the correct extension from the blob's MIME type
105
+ // This handles URLs without extensions (like Farcaster images)
106
+ const mimeToExtension = {
107
+ "image/jpeg": "jpg",
108
+ "image/jpg": "jpg",
109
+ "image/png": "png",
110
+ "image/gif": "gif",
111
+ "image/webp": "webp",
112
+ "image/svg+xml": "svg",
113
+ };
114
+ const extension = blob.type ? mimeToExtension[blob.type.toLowerCase()] || "jpg" : "jpg";
115
+ const mimeType = blob.type || `image/${extension}`;
116
+ fileToUpload = new File([blob], `avatar-${selectedProfileType}.${extension}`, { type: mimeType });
117
+ debug("Successfully converted social profile image to file with extension:", extension);
118
+ }
119
+ catch (fetchError) {
120
+ debug("Error fetching social profile image:", fetchError);
121
+ sonner_1.toast.error("Failed to fetch profile image. Please try uploading manually.");
122
+ setIsSaving(false);
123
+ return;
124
+ }
125
+ }
126
+ // Upload to IPFS if we have a file
127
+ if (fileToUpload) {
128
+ debug("Starting upload to IPFS", fileToUpload);
129
+ // Upload to IPFS using Thirdweb
130
+ const ipfsUrl = await (0, storage_1.upload)({
131
+ client: thirdweb_1.client,
132
+ files: [fileToUpload],
133
+ });
134
+ debug("Upload successful", ipfsUrl);
135
+ // Save avatar URL using profiles service
136
+ const user = await app_1.default.service("users").setAvatar({
137
+ avatar: ipfsUrl,
138
+ },
139
+ // @ts-expect-error - our typed client is expecting context even though it's set elsewhere
140
+ {});
141
+ // update user
142
+ // @ts-expect-error this resolved fine, look into why expect-error needed
143
+ setUser(user);
144
+ sonner_1.toast.success("Looks great! Your avatar has been saved!");
145
+ }
87
146
  // Refresh profile to get updated avatar
88
147
  await refreshProfile();
89
- sonner_1.toast.success(hasAvatar ? "Nice look! Your avatar has been updated!" : "Looks great! Your avatar has been saved!");
90
148
  onSetAvatar?.();
91
- // Clean up
92
- handleRemoveFile();
93
149
  }
94
150
  catch (error) {
95
- debug("Error uploading avatar:", error);
96
- sonner_1.toast.error("Failed to upload avatar. Please try again.");
151
+ debug("Error saving avatar:", error);
152
+ sonner_1.toast.error("Failed to save avatar. Please try again.");
97
153
  }
98
154
  finally {
99
- setIsUploading(false);
100
155
  setIsSaving(false);
101
156
  }
102
157
  };
103
- const handleFileInputClick = () => {
158
+ const handleCancel = () => {
159
+ if (viewStep === "upload") {
160
+ setViewStep("select");
161
+ handleRemovePreview();
162
+ }
163
+ else {
164
+ setB3ModalContentType({
165
+ type: "manageAccount",
166
+ chain: contentType?.chain,
167
+ partnerId: partnerId,
168
+ });
169
+ }
170
+ };
171
+ const handleProfileAvatarSelect = (avatarUrl, profileType) => {
172
+ setSelectedAvatar(avatarUrl);
173
+ setSelectedProfileType(profileType);
174
+ // Clear any selected file since we're selecting from profile
175
+ setSelectedFile(null);
176
+ if (previewUrl) {
177
+ URL.revokeObjectURL(previewUrl);
178
+ setPreviewUrl(null);
179
+ }
180
+ };
181
+ const handleUploadImageClick = () => {
182
+ setViewStep("upload");
183
+ };
184
+ const handleOpenFilePicker = () => {
104
185
  fileInputRef.current?.click();
105
186
  };
106
- const isLoading = isUploading || isSaving;
107
- return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)("flex flex-col items-center justify-center space-y-6 p-8", className), children: [(0, jsx_runtime_1.jsxs)("div", { className: "space-y-2 text-center", children: [(0, jsx_runtime_1.jsx)("h2", { className: "font-neue-montreal-semibold text-b3-grey text-2xl", children: hasAvatar ? "Update Your Avatar" : "Set Your Avatar" }), (0, jsx_runtime_1.jsx)("p", { className: "text-b3-foreground-muted font-neue-montreal-medium", children: "Upload an image to personalize your profile" })] }), hasAvatar && !previewUrl && ((0, jsx_runtime_1.jsx)("div", { className: "relative", children: (0, jsx_runtime_1.jsx)("div", { className: "border-b3-primary-blue h-32 w-32 overflow-hidden rounded-full border-4", children: (0, jsx_runtime_1.jsx)("img", { src: profile.avatar, alt: "Current avatar", className: "h-full w-full object-cover" }) }) })), (0, jsx_runtime_1.jsxs)("div", { className: "w-full max-w-md", children: [!selectedFile ? ((0, jsx_runtime_1.jsxs)("div", { onClick: handleFileInputClick, className: "border-b3-line hover:border-b3-primary-blue hover:bg-b3-primary-wash/20 cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { className: "text-b3-grey mx-auto mb-4 h-12 w-12" }), (0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey font-neue-montreal-semibold mb-2", children: "Click to select an image" }), (0, jsx_runtime_1.jsx)("p", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: "PNG, JPG, or GIF up to 5MB" })] })) : ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative", children: [(0, jsx_runtime_1.jsx)("div", { className: "border-b3-primary-blue mx-auto h-32 w-32 overflow-hidden rounded-full border-4", children: previewUrl ? ((0, jsx_runtime_1.jsx)("img", { src: previewUrl, alt: "Preview", className: "h-full w-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "bg-b3-primary-wash flex h-full w-full items-center justify-center rounded-full", children: (0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey font-neue-montreal-semibold text-sm", children: "No file selected" }) })) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleRemoveFile, className: "bg-b3-negative absolute -right-2 -top-2 flex h-8 w-8 items-center justify-center rounded-full text-white transition-colors hover:bg-red-600", disabled: isLoading, children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 16 }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-1 text-center", children: [(0, jsx_runtime_1.jsx)("p", { className: "text-b3-grey font-neue-montreal-semibold text-sm", children: selectedFile.name }), (0, jsx_runtime_1.jsxs)("p", { className: "text-b3-foreground-muted font-neue-montreal-medium text-xs", children: [(selectedFile.size / 1024 / 1024).toFixed(2), " MB"] })] })] })), (0, jsx_runtime_1.jsx)("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileSelect, className: "hidden" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex w-full max-w-md gap-3", children: [selectedFile && ((0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleUpload, disabled: isLoading, className: "bg-b3-primary-blue hover:bg-b3-primary-blue/90 flex-1 text-white", children: isLoading ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isUploading ? "Uploading..." : "Saving..."] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Check, { className: "mr-2 h-4 w-4" }), hasAvatar ? "Update Avatar" : "Set Avatar"] })) })), (0, jsx_runtime_1.jsxs)(react_1.Button, { variant: "outline", onClick: handleFileInputClick, disabled: isLoading, className: "flex-1", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { className: "mr-2 h-4 w-4" }), selectedFile ? "Change Image" : "Select Image"] })] }), (0, jsx_runtime_1.jsx)("div", { className: "text-b3-foreground-muted font-neue-montreal-medium max-w-md text-center text-xs", children: (0, jsx_runtime_1.jsx)("p", { children: "Your avatar will be uploaded to IPFS and stored securely. Make sure you have the rights to use this image." }) })] }));
187
+ const handleDragEnter = (e) => {
188
+ e.preventDefault();
189
+ e.stopPropagation();
190
+ setIsDragging(true);
191
+ };
192
+ const handleDragLeave = (e) => {
193
+ e.preventDefault();
194
+ e.stopPropagation();
195
+ setIsDragging(false);
196
+ };
197
+ const handleDragOver = (e) => {
198
+ e.preventDefault();
199
+ e.stopPropagation();
200
+ };
201
+ const handleDrop = (e) => {
202
+ e.preventDefault();
203
+ e.stopPropagation();
204
+ setIsDragging(false);
205
+ const file = e.dataTransfer.files?.[0];
206
+ if (file) {
207
+ // Validate file type
208
+ if (!file.type.startsWith("image/")) {
209
+ sonner_1.toast.error("Please select an image file");
210
+ return;
211
+ }
212
+ // Validate file size (max 5MB)
213
+ if (file.size > 5 * 1024 * 1024) {
214
+ sonner_1.toast.error("File size must be less than 5MB");
215
+ return;
216
+ }
217
+ setSelectedFile(file);
218
+ // Clear profile type selection when uploading a new file
219
+ setSelectedProfileType(null);
220
+ // Create preview URL
221
+ const url = URL.createObjectURL(file);
222
+ setPreviewUrl(url);
223
+ setSelectedAvatar(url);
224
+ }
225
+ };
226
+ const handleLinkMoreAccount = () => {
227
+ setB3ModalContentType({
228
+ type: "linkAccount",
229
+ chain: contentType?.chain,
230
+ partnerId: partnerId,
231
+ });
232
+ };
233
+ const isLoading = isSaving;
234
+ // Get profile avatars with validated URLs
235
+ const profileAvatars = profile?.profiles
236
+ ?.filter(p => p.avatar)
237
+ .map(p => {
238
+ const rawAvatarUrl = p?.avatar || "";
239
+ const validatedUrl = (0, profileDisplay_1.validateImageUrl)(rawAvatarUrl);
240
+ return {
241
+ type: p.type,
242
+ avatar: validatedUrl,
243
+ name: p.name || p.type,
244
+ };
245
+ })
246
+ .filter(p => p.avatar !== null) || []; // Filter out profiles with invalid avatars
247
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)("flex w-full max-w-md flex-col bg-white", className), children: [viewStep === "upload" && (0, jsx_runtime_1.jsx)(ModalHeader_1.default, { title: "Upload Image" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col items-center p-6", children: [viewStep === "select" ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative mb-6", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-32 w-32 overflow-hidden rounded-full", children: safePreviewUrl || selectedAvatar || currentAvatar ? ((0, jsx_runtime_1.jsx)(react_1.IPFSMediaRenderer, { src: safePreviewUrl || selectedAvatar || currentAvatar || "", alt: "Avatar preview", className: "h-full w-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "bg-b3-primary-wash h-full w-full" })) }), (selectedAvatar !== currentAvatar || selectedFile) && ((0, jsx_runtime_1.jsx)("button", { onClick: handleRemovePreview, className: "absolute -right-1 -top-1 flex h-8 w-8 items-center justify-center rounded-full bg-[#51525c] text-white transition-colors hover:bg-[#71717a]", children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { className: "h-4 w-4" }) }))] }), (0, jsx_runtime_1.jsxs)("button", { onClick: handleUploadImageClick, className: "font-inter shadow-xs mb-6 flex w-full items-center justify-center gap-2 rounded-xl border border-[#e4e4e7] bg-white px-4 py-3 text-sm font-semibold text-[#18181b] transition-colors hover:bg-[#f4f4f5]", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Upload, { className: "h-4 w-4" }), "Upload image"] }), (0, jsx_runtime_1.jsxs)("div", { className: "w-full", children: [(0, jsx_runtime_1.jsx)("h3", { className: "mb-2 text-base font-semibold text-[#18181b]", children: "Select your profile image" }), (0, jsx_runtime_1.jsx)("p", { className: "mb-4 text-sm font-semibold text-[#475467]", children: "Pick an avatar from your linked profiles, ENS or upload a new one." }), (0, jsx_runtime_1.jsx)("div", { className: "mb-4 flex gap-3", children: profileAvatars.map((profileAvatar, index) => {
248
+ // Skip if avatar is null (should not happen due to filter, but TypeScript doesn't know that)
249
+ if (!profileAvatar.avatar)
250
+ return null;
251
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "relative", onMouseEnter: () => setHoveredProfile(profileAvatar.type), onMouseLeave: () => setHoveredProfile(null), children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => handleProfileAvatarSelect(profileAvatar.avatar || "", profileAvatar.type || ""), className: (0, cn_1.cn)("h-16 w-16 overflow-hidden rounded-full border-2 transition-all", selectedProfileType === profileAvatar.type
252
+ ? "border-[#3368ef] ring-2 ring-[#3368ef]/20"
253
+ : "border-transparent hover:border-[#e4e4e7]"), children: (0, jsx_runtime_1.jsx)("img", { src: profileAvatar.avatar, alt: `${profileAvatar.type} avatar`, className: "h-full w-full object-cover" }) }), hoveredProfile === profileAvatar.type && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-10 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-md bg-[#18181b] px-3 py-1.5 text-xs text-white", children: profileAvatar.name }))] }, index));
254
+ }) }), (0, jsx_runtime_1.jsxs)("button", { onClick: handleLinkMoreAccount, className: "font-inter flex items-center gap-2 text-sm font-semibold text-[#3368ef] hover:underline", children: [(0, jsx_runtime_1.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", children: (0, jsx_runtime_1.jsx)("path", { d: "M8.75 2.75C8.75 2.33579 8.41421 2 8 2C7.58579 2 7.25 2.33579 7.25 2.75V7.25H2.75C2.33579 7.25 2 7.58579 2 8C2 8.41421 2.33579 8.75 2.75 8.75H7.25V13.25C7.25 13.6642 7.58579 14 8 14C8.41421 14 8.75 13.6642 8.75 13.25V8.75H13.25C13.6642 8.75 14 8.41421 14 8C14 7.58579 13.6642 7.25 13.25 7.25H8.75V2.75Z", fill: "currentColor" }) }), "Link more account"] })] })] })) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: !selectedFile ? ((0, jsx_runtime_1.jsxs)("div", { onClick: handleOpenFilePicker, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: (0, cn_1.cn)("mb-6 flex w-full cursor-pointer flex-col items-center justify-center rounded-xl border-2 border-dashed p-16 transition-colors", isDragging
255
+ ? "border-[#3368ef] bg-[#f0f5ff]"
256
+ : "border-[#e4e4e7] hover:border-[#3368ef] hover:bg-[#f0f5ff]"), children: [(0, jsx_runtime_1.jsxs)("p", { className: "font-inter mb-1 text-sm", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-semibold text-[#3368ef]", children: "Click to upload" }), (0, jsx_runtime_1.jsx)("span", { className: "text-[#71717a]", children: " or drag and drop" })] }), (0, jsx_runtime_1.jsx)("p", { className: "text-xs text-[#71717a]", children: "PNG, JPG or GIF (up to 5MB)" })] })) : ((0, jsx_runtime_1.jsx)("div", { className: "mb-6 w-full", children: (0, jsx_runtime_1.jsx)("div", { className: "aspect-square w-full overflow-hidden rounded-xl bg-[#f4f4f5]", children: safePreviewUrl ? ((0, jsx_runtime_1.jsx)("img", { src: safePreviewUrl, alt: "Preview", className: "h-full w-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "bg-b3-primary-wash h-full w-full" })) }) })) })), (0, jsx_runtime_1.jsx)("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileSelect, className: "hidden" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "font-inter flex gap-3 border-t border-[#e4e4e7] p-6 font-semibold", children: [(0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleCancel, variant: "outline", disabled: isLoading, className: "flex-1 rounded-xl border-[#e4e4e7] text-[#18181b] hover:bg-[#f4f4f5]", children: "Cancel" }), (0, jsx_runtime_1.jsx)(react_1.Button, { onClick: handleSaveChanges, disabled: isLoading || (!selectedFile && !selectedProfileType), className: "flex-1 rounded-xl bg-[#3368ef] text-white hover:bg-[#2952cc]", children: isLoading ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Saving..."] })) : ("Save changes") })] })] }));
108
257
  }
@@ -13,16 +13,21 @@ const react_3 = require("react");
13
13
  const react_4 = require("thirdweb/react");
14
14
  const AvatarEditor_1 = require("./AvatarEditor/AvatarEditor");
15
15
  const useB3_1 = require("./B3Provider/useB3");
16
+ const Deposit_1 = require("./Deposit/Deposit");
16
17
  const LinkAccount_1 = require("./LinkAccount/LinkAccount");
17
- const ProfileEditor_1 = require("./ProfileEditor/ProfileEditor");
18
+ const LinkNewAccount_1 = require("./LinkAccount/LinkNewAccount");
18
19
  const ManageAccount_1 = require("./ManageAccount/ManageAccount");
19
20
  const RequestPermissions_1 = require("./RequestPermissions/RequestPermissions");
21
+ const Send_1 = require("./Send/Send");
20
22
  const SignInWithB3Flow_1 = require("./SignInWithB3/SignInWithB3Flow");
21
23
  const dialog_1 = require("./ui/dialog");
22
24
  const drawer_1 = require("./ui/drawer");
23
25
  const debug = (0, debug_1.debugB3React)("B3DynamicModal");
24
26
  function B3DynamicModal() {
25
- const { isOpen, setB3ModalOpen, contentType, history, navigateBack } = (0, react_2.useModalStore)();
27
+ const isOpen = (0, react_2.useModalStore)(state => state.isOpen);
28
+ const setB3ModalOpen = (0, react_2.useModalStore)(state => state.setB3ModalOpen);
29
+ const contentType = (0, react_2.useModalStore)(state => state.contentType);
30
+ const navigateBack = (0, react_2.useModalStore)(state => state.navigateBack);
26
31
  const { theme } = (0, useB3_1.useB3)();
27
32
  const isMobile = (0, react_2.useIsMobile)();
28
33
  const prevIsOpenRef = (0, react_3.useRef)(isOpen);
@@ -53,8 +58,10 @@ function B3DynamicModal() {
53
58
  "anySpendSignatureMint",
54
59
  "anySpendBondKit",
55
60
  "linkAccount",
61
+ "linkNewAccount",
56
62
  "avatarEditor",
57
- "profileEditor",
63
+ "deposit",
64
+ "send",
58
65
  ];
59
66
  const freestyleTypes = [
60
67
  "anySpendNft",
@@ -70,7 +77,7 @@ function B3DynamicModal() {
70
77
  ];
71
78
  // Check if current content type is in freestyle types
72
79
  const isFreestyleType = freestyleTypes.includes(contentType?.type);
73
- const hideCloseButton = isFreestyleType;
80
+ const hideCloseButton = true;
74
81
  // Build content class using cn utility
75
82
  // eslint-disable-next-line tailwindcss/no-custom-classname
76
83
  const contentClass = (0, cn_1.cn)("b3-modal", theme === "dark" && "dark", fullWidthTypes.includes(contentType?.type) && "w-full", isFreestyleType && "b3-modal-freestyle", contentType?.type === "signInWithB3" && "p-0", contentType?.type === "anySpend" && "md:px-6");
@@ -96,7 +103,7 @@ function B3DynamicModal() {
96
103
  case "anySpendFundTournament":
97
104
  return (0, jsx_runtime_1.jsx)(react_1.AnySpendTournament, { ...contentType, mode: "modal", action: "fund" });
98
105
  case "anySpendOrderHistory":
99
- return (0, jsx_runtime_1.jsx)(react_1.OrderHistory, { onBack: () => { }, mode: "modal" });
106
+ return (0, jsx_runtime_1.jsx)(react_1.OrderHistory, { ...contentType, mode: "modal" });
100
107
  case "anySpendStakeB3":
101
108
  return (0, jsx_runtime_1.jsx)(react_1.AnySpendStakeB3, { ...contentType, mode: "modal" });
102
109
  case "anySpendStakeB3ExactIn":
@@ -113,12 +120,16 @@ function B3DynamicModal() {
113
120
  return (0, jsx_runtime_1.jsx)(react_1.AnySpendBondKit, { ...contentType });
114
121
  case "linkAccount":
115
122
  return (0, jsx_runtime_1.jsx)(LinkAccount_1.LinkAccount, { ...contentType });
123
+ case "linkNewAccount":
124
+ return (0, jsx_runtime_1.jsx)(LinkNewAccount_1.LinkNewAccount, { ...contentType });
116
125
  case "anySpendDepositHype":
117
126
  return (0, jsx_runtime_1.jsx)(AnyspendDepositHype_1.AnySpendDepositHype, { ...contentType, mode: "modal" });
118
127
  case "avatarEditor":
119
128
  return (0, jsx_runtime_1.jsx)(AvatarEditor_1.AvatarEditor, { onSetAvatar: contentType.onSuccess });
120
- case "profileEditor":
121
- return (0, jsx_runtime_1.jsx)(ProfileEditor_1.ProfileEditor, { onSuccess: contentType.onSuccess });
129
+ case "deposit":
130
+ return (0, jsx_runtime_1.jsx)(Deposit_1.Deposit, {});
131
+ case "send":
132
+ return (0, jsx_runtime_1.jsx)(Send_1.Send, { ...contentType });
122
133
  // Add other modal types here
123
134
  default:
124
135
  return null;
@@ -128,9 +139,9 @@ function B3DynamicModal() {
128
139
  const ModalContent = isMobile ? drawer_1.DrawerContent : dialog_1.DialogContent;
129
140
  const ModalTitle = isMobile ? drawer_1.DrawerTitle : dialog_1.DialogTitle;
130
141
  const ModalDescription = isMobile ? drawer_1.DrawerDescription : dialog_1.DialogDescription;
131
- return ((0, jsx_runtime_1.jsxs)(ModalComponent, { open: isOpen, onOpenChange: setB3ModalOpen, children: [(0, jsx_runtime_1.jsxs)(ModalContent, { className: (0, cn_1.cn)(contentClass, "rounded-2xl bg-white shadow-xl dark:bg-gray-900", "border border-gray-200 dark:border-gray-800",
132
- // Remove default width classes for avatar editor and profile editor
133
- contentType?.type === "avatarEditor" || contentType?.type === "profileEditor"
134
- ? "!w-[90vw] !max-w-none" // Use !important to override default styles
135
- : "mx-auto w-full max-w-md sm:max-w-lg"), hideCloseButton: hideCloseButton, children: [(0, jsx_runtime_1.jsx)(ModalTitle, { className: "sr-only hidden", children: contentType?.type || "Modal" }), (0, jsx_runtime_1.jsx)(ModalDescription, { className: "sr-only hidden", children: contentType?.type || "Modal Body" }), (0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)("no-scrollbar max-h-[90dvh] overflow-auto sm:max-h-[80dvh]"), children: [history.length > 0 && contentType?.showBackButton && ((0, jsx_runtime_1.jsxs)("button", { onClick: navigateBack, className: "flex items-center gap-2 px-6 py-4 text-gray-600 transition-colors hover:text-gray-900 dark:text-gray-400 dark:hover:text-white", children: [(0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [(0, jsx_runtime_1.jsx)("path", { d: "M15.8337 10H4.16699", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M10.0003 15.8334L4.16699 10L10.0003 4.16669", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] }), (0, jsx_runtime_1.jsx)("span", { className: "text-sm font-medium", children: "Back" })] })), renderContent()] })] }), (contentType?.type === "avatarEditor" || contentType?.type === "profileEditor") && ((0, jsx_runtime_1.jsx)("button", { onClick: () => setB3ModalOpen(false), className: "fixed right-5 top-5 z-[100] cursor-pointer text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white", children: (0, jsx_runtime_1.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: (0, jsx_runtime_1.jsx)("path", { d: "M18 6L6 18M6 6L18 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }))] }));
142
+ return ((0, jsx_runtime_1.jsxs)(ModalComponent, { open: isOpen, onOpenChange: setB3ModalOpen, children: [(0, jsx_runtime_1.jsxs)(ModalContent, { className: (0, cn_1.cn)(contentClass, "rounded-2xl bg-white shadow-xl dark:bg-gray-900", "border border-gray-200 dark:border-gray-800", (contentType?.type === "manageAccount" ||
143
+ contentType?.type === "deposit" ||
144
+ contentType?.type === "send" ||
145
+ contentType?.type === "avatarEditor") &&
146
+ "p-0", "mx-auto w-full max-w-md sm:max-w-lg"), hideCloseButton: hideCloseButton, children: [(0, jsx_runtime_1.jsx)(ModalTitle, { className: "sr-only hidden", children: contentType?.type || "Modal" }), (0, jsx_runtime_1.jsx)(ModalDescription, { className: "sr-only hidden", children: contentType?.type || "Modal Body" }), (0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)("no-scrollbar max-h-[90dvh] overflow-auto sm:max-h-[80dvh]"), children: [(!hideCloseButton || contentType?.showBackButton) && ((0, jsx_runtime_1.jsxs)("button", { onClick: navigateBack, className: "flex items-center gap-2 px-6 py-4 text-gray-600 transition-colors hover:text-gray-900 dark:text-gray-400 dark:hover:text-white", children: [(0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [(0, jsx_runtime_1.jsx)("path", { d: "M15.8337 10H4.16699", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M10.0003 15.8334L4.16699 10L10.0003 4.16669", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] }), (0, jsx_runtime_1.jsx)("span", { className: "font-inter text-sm font-semibold", children: "Back" })] })), renderContent()] })] }), contentType?.type === "avatarEditor" && ((0, jsx_runtime_1.jsx)("button", { onClick: () => setB3ModalOpen(false), className: "fixed right-5 top-5 z-[100] cursor-pointer text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white", children: (0, jsx_runtime_1.jsx)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: (0, jsx_runtime_1.jsx)("path", { d: "M18 6L6 18M6 6L18 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }))] }));
136
147
  }
@@ -0,0 +1 @@
1
+ export declare function Deposit(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Deposit = Deposit;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const constants_1 = require("../../../../anyspend/constants");
9
+ const chain_1 = require("../../../../anyspend/utils/chain");
10
+ const react_1 = require("../../../../global-account/react");
11
+ const relay_kit_ui_1 = require("@relayprotocol/relay-kit-ui");
12
+ const lucide_react_1 = require("lucide-react");
13
+ const qrcode_react_1 = require("qrcode.react");
14
+ const react_2 = require("react");
15
+ const sonner_1 = require("sonner");
16
+ const chains_1 = require("thirdweb/chains");
17
+ const ModalHeader_1 = __importDefault(require("../ModalHeader/ModalHeader"));
18
+ const button_1 = require("../ui/button");
19
+ const dropdown_menu_1 = require("../ui/dropdown-menu");
20
+ // Coinbase logo SVG
21
+ const CoinbaseLogo = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [(0, jsx_runtime_1.jsx)("path", { d: "M8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16Z", fill: "#0052FF" }), (0, jsx_runtime_1.jsx)("path", { d: "M8.00065 11.3337C6.16065 11.3337 4.66732 9.84033 4.66732 8.00033C4.66732 6.16033 6.16065 4.66699 8.00065 4.66699C9.47399 4.66699 10.734 5.64699 11.1607 7.00033H13.2273C12.774 4.54699 10.6273 2.66699 8.00065 2.66699C5.05399 2.66699 2.66732 5.05366 2.66732 8.00033C2.66732 10.947 5.05399 13.3337 8.00065 13.3337C10.6273 13.3337 12.774 11.4537 13.2273 9.00033H11.1607C10.734 10.3537 9.47399 11.3337 8.00065 11.3337Z", fill: "white" })] }));
22
+ function Deposit() {
23
+ const { address } = (0, react_1.useAccountWallet)();
24
+ const navigateBack = (0, react_1.useModalStore)(state => state.navigateBack);
25
+ const setB3ModalOpen = (0, react_1.useModalStore)(state => state.setB3ModalOpen);
26
+ const history = (0, react_1.useModalStore)(state => state.history);
27
+ const [selectedChainId, setSelectedChainId] = (0, react_2.useState)(chains_1.base.id);
28
+ const [selectedToken, setSelectedToken] = (0, react_2.useState)({
29
+ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
30
+ chainId: chains_1.base.id,
31
+ decimals: 6,
32
+ symbol: "USDC",
33
+ name: "USD Coin",
34
+ metadata: {
35
+ logoURI: "https://assets.relay.link/icons/1/light/usdc.png",
36
+ },
37
+ });
38
+ // Get the selected chain object
39
+ const selectedChain = (0, react_2.useMemo)(() => chain_1.ALL_CHAINS[selectedChainId], [selectedChainId]);
40
+ // Get all supported chains for the dropdown
41
+ const supportedChains = (0, react_2.useMemo)(() => Object.values(chain_1.ALL_CHAINS), []);
42
+ // The deposit address is the user's active wallet address
43
+ const depositAddress = address || "0x0000000000000000000000000000000000000000";
44
+ const handleTokenSelect = (token) => {
45
+ setSelectedChainId(token.chainId);
46
+ setSelectedToken({
47
+ address: token.address,
48
+ chainId: token.chainId,
49
+ decimals: token.decimals,
50
+ metadata: { logoURI: token.logoURI },
51
+ name: token.name,
52
+ symbol: token.symbol,
53
+ });
54
+ };
55
+ const handleCopyAddress = async () => {
56
+ try {
57
+ await navigator.clipboard.writeText(depositAddress);
58
+ sonner_1.toast.success("Address copied to clipboard");
59
+ }
60
+ catch (error) {
61
+ sonner_1.toast.error("Failed to copy address");
62
+ }
63
+ };
64
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex w-full flex-col", children: [(0, jsx_runtime_1.jsx)(ModalHeader_1.default, { title: "Deposit", showCloseButton: false }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col pb-5 pt-5", children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-4 px-5", children: (0, jsx_runtime_1.jsx)("p", { className: "font-neue-montreal-medium text-base leading-snug text-[#3f3f46]", children: "Send any accepted token and we'll convert it to B3 on Base for you to use." }) }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-3 px-5", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-1.5 block text-sm font-medium text-[#3f3f46]", children: "Chain" }), (0, jsx_runtime_1.jsxs)(dropdown_menu_1.DropdownMenu, { children: [(0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuTrigger, { asChild: true, children: (0, jsx_runtime_1.jsxs)("button", { className: "flex h-10 w-full items-center justify-between rounded-lg border border-[#d1d1d6] bg-white px-2.5 py-2 transition-colors hover:bg-[#fafafa]", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [selectedChain?.logoUrl && ((0, jsx_runtime_1.jsx)("img", { src: selectedChain.logoUrl, alt: selectedChain.name, className: "h-6 w-6 rounded-full" })), (0, jsx_runtime_1.jsx)("span", { className: "text-base text-[#18181b]", children: selectedChain?.name || "Select Chain" })] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { className: "h-4 w-4 text-[#51525c]" })] }) }), (0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuContent, { className: "max-h-[300px] w-full overflow-y-auto", children: supportedChains.map(chain => ((0, jsx_runtime_1.jsx)(dropdown_menu_1.DropdownMenuItem, { onClick: () => setSelectedChainId(chain.id), children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [chain.logoUrl && (0, jsx_runtime_1.jsx)("img", { src: chain.logoUrl, alt: chain.name, className: "h-6 w-6 rounded-full" }), (0, jsx_runtime_1.jsx)("span", { className: "text-[#18181b]", children: chain.name })] }) }, chain.id))) })] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "mb-1.5 block text-sm font-medium text-[#3f3f46]", children: "Accepted tokens" }), (0, jsx_runtime_1.jsx)(relay_kit_ui_1.TokenSelector, { address: address, chainIdsFilter: [selectedChainId], context: "from", fromChainWalletVMSupported: true, isValidAddress: true, lockedChainIds: [selectedChainId], multiWalletSupportEnabled: true, onAnalyticEvent: undefined, popularChainIds: [1, 8453, constants_1.RELAY_SOLANA_MAINNET_CHAIN_ID], setToken: handleTokenSelect, supportedWalletVMs: ["evm", "svm"], token: undefined, trigger: (0, jsx_runtime_1.jsxs)("button", { className: "flex h-10 w-full items-center justify-between rounded-lg border border-[#d1d1d6] bg-white px-2.5 py-2 transition-colors hover:bg-[#fafafa]", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [selectedToken?.metadata?.logoURI && ((0, jsx_runtime_1.jsx)("img", { src: selectedToken.metadata.logoURI, alt: selectedToken.symbol, className: "h-6 w-6 rounded-full" })), (0, jsx_runtime_1.jsx)("span", { className: "text-base text-[#18181b]", children: selectedToken.symbol })] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { className: "h-4 w-4 text-[#51525c]" })] }) })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mx-5 mt-4 flex items-start rounded-xl border border-[#e4e4e7] bg-[#fafafa]", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-1 flex-col items-center gap-2 px-5 pb-3 pt-5", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex w-full items-center justify-center", children: (0, jsx_runtime_1.jsx)("div", { className: "w-full", children: (0, jsx_runtime_1.jsx)("div", { className: "flex aspect-[144/146] w-full flex-col items-center justify-center overflow-hidden", children: (0, jsx_runtime_1.jsx)(qrcode_react_1.QRCodeSVG, { value: depositAddress, size: 144, level: "M" }) }) }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-xs font-semibold leading-[18px] text-[#0b57c2]", children: "SCAN WITH" }), (0, jsx_runtime_1.jsx)(CoinbaseLogo, {})] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "relative flex flex-1 flex-col gap-2 self-stretch border-l border-[#e4e4e7] p-6", children: [(0, jsx_runtime_1.jsx)("label", { className: "text-sm font-medium leading-5 text-[#3f3f46]", children: "Deposit address:" }), (0, jsx_runtime_1.jsxs)("div", { className: "relative flex w-full flex-wrap items-center gap-2", children: [(0, jsx_runtime_1.jsx)("p", { className: "h-[74px] flex-1 overflow-hidden text-ellipsis whitespace-pre-wrap break-all pr-6 text-base font-semibold leading-6 text-[#18181b]", children: depositAddress }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCopyAddress, className: "absolute bottom-0 right-0 h-4 w-4 transition-opacity hover:opacity-70", "aria-label": "Copy address", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Copy, { className: "h-full w-full text-[#51525c]" }) })] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "mx-5 mt-4", children: (0, jsx_runtime_1.jsxs)("p", { className: "font-neue-montreal-italic text-center text-sm leading-[1.3] text-[#3f3f46]", children: ["Do not send any tokens other than the ones specified.", (0, jsx_runtime_1.jsx)("br", {}), "Tokens not accepted will not be converted."] }) }), (0, jsx_runtime_1.jsx)("div", { className: "mt-4 px-5", children: (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: handleCopyAddress, className: "h-12 w-full rounded-xl bg-[#0c68e9] text-base font-semibold text-white shadow-[inset_0px_0px_0px_1px_rgba(10,13,18,0.18),inset_0px_-2px_0px_0px_rgba(10,13,18,0.05)] hover:bg-[#0b5fd4]", children: "Copy deposit address" }) })] })] }));
65
+ }
@@ -0,0 +1,39 @@
1
+ import type { ThirdwebClient } from "thirdweb";
2
+ interface IPFSMediaRendererProps {
3
+ /** The source URL - can be IPFS URL (ipfs://...) or HTTP URL */
4
+ src: string | null | undefined;
5
+ /** Alt text for the media */
6
+ alt?: string;
7
+ /** CSS class name */
8
+ className?: string;
9
+ /** Thirdweb client instance (optional, uses default if not provided) */
10
+ client?: ThirdwebClient;
11
+ /** Width of the media */
12
+ width?: string | number;
13
+ /** Height of the media */
14
+ height?: string | number;
15
+ /** Controls property for video/audio */
16
+ controls?: boolean;
17
+ /** Style object */
18
+ style?: React.CSSProperties;
19
+ }
20
+ /**
21
+ * IPFSMediaRenderer - A wrapper around Thirdweb's MediaRenderer that configures
22
+ * the IPFS gateway URL to use our validated gateway.
23
+ *
24
+ * Features:
25
+ * - Configures MediaRenderer to use cloudflare-ipfs.com gateway
26
+ * - Gateway matches our allowed list in profileDisplay.ts
27
+ * - Provides fallback for missing sources
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * <IPFSMediaRenderer
32
+ * src="ipfs://QmX..."
33
+ * alt="Profile Avatar"
34
+ * className="size-14 rounded-full"
35
+ * />
36
+ * ```
37
+ */
38
+ export declare function IPFSMediaRenderer({ src, alt, className, client, width, height, controls, style, }: IPFSMediaRendererProps): import("react/jsx-runtime").JSX.Element;
39
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.IPFSMediaRenderer = IPFSMediaRenderer;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const thirdweb_1 = require("../../../../shared/utils/thirdweb");
7
+ const react_1 = require("thirdweb/react");
8
+ // Primary IPFS gateway URL - matches our allowed list in profileDisplay.ts
9
+ // Note: MediaRenderer expects the base gateway URL without /ipfs path
10
+ const IPFS_GATEWAY_URL = "https://cloudflare-ipfs.com";
11
+ /**
12
+ * IPFSMediaRenderer - A wrapper around Thirdweb's MediaRenderer that configures
13
+ * the IPFS gateway URL to use our validated gateway.
14
+ *
15
+ * Features:
16
+ * - Configures MediaRenderer to use cloudflare-ipfs.com gateway
17
+ * - Gateway matches our allowed list in profileDisplay.ts
18
+ * - Provides fallback for missing sources
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <IPFSMediaRenderer
23
+ * src="ipfs://QmX..."
24
+ * alt="Profile Avatar"
25
+ * className="size-14 rounded-full"
26
+ * />
27
+ * ```
28
+ */
29
+ function IPFSMediaRenderer({ src, alt = "Media", className, client = thirdweb_1.client, width, height, controls, style, }) {
30
+ // If no source, render fallback
31
+ if (!src) {
32
+ return ((0, jsx_runtime_1.jsx)("div", { className: className, style: style, "aria-label": alt, children: (0, jsx_runtime_1.jsx)("div", { className: "bg-b3-primary-wash flex h-full w-full items-center justify-center", children: (0, jsx_runtime_1.jsx)("span", { className: "text-b3-grey font-neue-montreal-semibold text-xs", children: alt.charAt(0).toUpperCase() }) }) }));
33
+ }
34
+ // Convert IPFS URLs to HTTP gateway URLs if needed
35
+ // This handles both ipfs:// URLs and existing HTTP gateway URLs
36
+ return ((0, jsx_runtime_1.jsx)(react_1.MediaRenderer, { src: src, client: client, alt: alt, className: className, width: width ? width.toString() : undefined, height: height ? height.toString() : undefined, controls: controls, style: style }));
37
+ }
@@ -1,4 +1,6 @@
1
- import { LinkAccountModalProps } from "../../stores/useModalStore";
2
- export declare function LinkAccount({ onSuccess: onSuccessCallback, onError, onClose, chain, partnerId, className, }: LinkAccountModalProps & {
3
- className?: string;
4
- }): import("react/jsx-runtime").JSX.Element;
1
+ import { Chain } from "thirdweb";
2
+ export declare const LinkAccount: ({ partnerId, onLogout, chain, }: {
3
+ partnerId: string;
4
+ onLogout?: () => void;
5
+ chain: Chain;
6
+ }) => import("react/jsx-runtime").JSX.Element;