@b3dotfun/sdk 0.0.64-alpha.2 → 0.0.65-test.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +73 -33
  2. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +1 -1
  3. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +1 -1
  4. package/dist/cjs/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  5. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  6. package/dist/cjs/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  7. package/dist/cjs/anyspend/react/components/common/OrderHistory.js +7 -3
  8. package/dist/cjs/anyspend/react/components/common/PanelOnrampPayment.js +1 -1
  9. package/dist/cjs/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  10. package/dist/cjs/anyspend/react/components/common/RecipientSelection.js +1 -1
  11. package/dist/cjs/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  12. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +139 -33
  13. package/dist/cjs/global-account/react/components/B3DynamicModal.js +25 -6
  14. package/dist/cjs/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  15. package/dist/cjs/global-account/react/components/Deposit/Deposit.js +65 -0
  16. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  17. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.js +113 -279
  18. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  19. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.js +331 -0
  20. package/dist/cjs/global-account/react/components/ManageAccount/AppsContent.d.ts +6 -0
  21. package/dist/cjs/global-account/react/components/ManageAccount/AppsContent.js +34 -0
  22. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.js +2 -2
  23. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  24. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.js +23 -0
  25. package/dist/cjs/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  26. package/dist/cjs/global-account/react/components/ManageAccount/Header.js +120 -0
  27. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  28. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.js +43 -0
  29. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  30. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.js +16 -0
  31. package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.js +24 -193
  32. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  33. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.js +15 -0
  34. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  35. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +44 -0
  36. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  37. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +50 -0
  38. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  39. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.js +8 -0
  40. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  41. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +38 -0
  42. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  43. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.js +22 -0
  44. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.d.ts +10 -0
  45. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.js +12 -0
  46. package/dist/cjs/global-account/react/components/Send/Send.d.ts +5 -0
  47. package/dist/cjs/global-account/react/components/Send/Send.js +187 -0
  48. package/dist/cjs/global-account/react/components/icons/BellIcon.d.ts +3 -0
  49. package/dist/cjs/global-account/react/components/icons/BellIcon.js +5 -0
  50. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  51. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.js +7 -0
  52. package/dist/cjs/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  53. package/dist/cjs/global-account/react/components/icons/CopyIcon.js +7 -0
  54. package/dist/cjs/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  55. package/dist/cjs/global-account/react/components/icons/LinkIcon.js +5 -0
  56. package/dist/cjs/global-account/react/components/icons/LockIcon.d.ts +3 -0
  57. package/dist/cjs/global-account/react/components/icons/LockIcon.js +5 -0
  58. package/dist/cjs/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  59. package/dist/cjs/global-account/react/components/icons/WalletIcon.js +7 -0
  60. package/dist/cjs/global-account/react/components/index.d.ts +4 -2
  61. package/dist/cjs/global-account/react/components/index.js +11 -4
  62. package/dist/cjs/global-account/react/components/ui/Tabs.js +2 -2
  63. package/dist/cjs/global-account/react/components/ui/dialog.js +2 -2
  64. package/dist/cjs/global-account/react/hooks/index.d.ts +1 -1
  65. package/dist/cjs/global-account/react/hooks/index.js +3 -1
  66. package/dist/cjs/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  67. package/dist/cjs/global-account/react/stores/index.d.ts +1 -0
  68. package/dist/cjs/global-account/react/stores/index.js +3 -1
  69. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +34 -3
  70. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  71. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.js +36 -0
  72. package/dist/cjs/global-account/react/utils/profileDisplay.d.ts +2 -0
  73. package/dist/cjs/global-account/react/utils/profileDisplay.js +2 -2
  74. package/dist/cjs/shared/constants/chains/supported.d.ts +2 -2
  75. package/dist/cjs/shared/utils/ipfs.js +1 -1
  76. package/dist/esm/anyspend/react/components/AnySpend.js +74 -34
  77. package/dist/esm/anyspend/react/components/AnySpendCustom.js +1 -1
  78. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +1 -1
  79. package/dist/esm/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  80. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  81. package/dist/esm/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  82. package/dist/esm/anyspend/react/components/common/OrderHistory.js +6 -5
  83. package/dist/esm/anyspend/react/components/common/PanelOnrampPayment.js +1 -1
  84. package/dist/esm/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  85. package/dist/esm/anyspend/react/components/common/RecipientSelection.js +1 -1
  86. package/dist/esm/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  87. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +140 -34
  88. package/dist/esm/global-account/react/components/B3DynamicModal.js +25 -6
  89. package/dist/esm/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  90. package/dist/esm/global-account/react/components/Deposit/Deposit.js +59 -0
  91. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  92. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.js +113 -280
  93. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  94. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.js +325 -0
  95. package/dist/esm/global-account/react/components/ManageAccount/AppsContent.d.ts +6 -0
  96. package/dist/esm/global-account/react/components/ManageAccount/AppsContent.js +32 -0
  97. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.js +2 -2
  98. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  99. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.js +21 -0
  100. package/dist/esm/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  101. package/dist/esm/global-account/react/components/ManageAccount/Header.js +81 -0
  102. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  103. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.js +41 -0
  104. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  105. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.js +10 -0
  106. package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.js +26 -195
  107. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  108. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.js +13 -0
  109. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  110. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +42 -0
  111. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  112. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +45 -0
  113. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  114. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.js +6 -0
  115. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  116. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +36 -0
  117. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  118. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.js +20 -0
  119. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.d.ts +10 -0
  120. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.js +10 -0
  121. package/dist/esm/global-account/react/components/Send/Send.d.ts +5 -0
  122. package/dist/esm/global-account/react/components/Send/Send.js +181 -0
  123. package/dist/esm/global-account/react/components/icons/BellIcon.d.ts +3 -0
  124. package/dist/esm/global-account/react/components/icons/BellIcon.js +3 -0
  125. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  126. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.js +4 -0
  127. package/dist/esm/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  128. package/dist/esm/global-account/react/components/icons/CopyIcon.js +4 -0
  129. package/dist/esm/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  130. package/dist/esm/global-account/react/components/icons/LinkIcon.js +3 -0
  131. package/dist/esm/global-account/react/components/icons/LockIcon.d.ts +3 -0
  132. package/dist/esm/global-account/react/components/icons/LockIcon.js +3 -0
  133. package/dist/esm/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  134. package/dist/esm/global-account/react/components/icons/WalletIcon.js +4 -0
  135. package/dist/esm/global-account/react/components/index.d.ts +4 -2
  136. package/dist/esm/global-account/react/components/index.js +7 -2
  137. package/dist/esm/global-account/react/components/ui/Tabs.js +2 -2
  138. package/dist/esm/global-account/react/components/ui/dialog.js +2 -2
  139. package/dist/esm/global-account/react/hooks/index.d.ts +1 -1
  140. package/dist/esm/global-account/react/hooks/index.js +1 -1
  141. package/dist/esm/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  142. package/dist/esm/global-account/react/stores/index.d.ts +1 -0
  143. package/dist/esm/global-account/react/stores/index.js +1 -0
  144. package/dist/esm/global-account/react/stores/useModalStore.d.ts +34 -3
  145. package/dist/esm/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  146. package/dist/esm/global-account/react/stores/useRecentAddressesStore.js +33 -0
  147. package/dist/esm/global-account/react/utils/profileDisplay.d.ts +2 -0
  148. package/dist/esm/global-account/react/utils/profileDisplay.js +2 -2
  149. package/dist/esm/shared/constants/chains/supported.d.ts +2 -2
  150. package/dist/esm/shared/utils/ipfs.js +1 -1
  151. package/dist/styles/index.css +1 -1
  152. package/dist/types/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  153. package/dist/types/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  154. package/dist/types/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  155. package/dist/types/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  156. package/dist/types/global-account/react/components/ManageAccount/AppsContent.d.ts +6 -0
  157. package/dist/types/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  158. package/dist/types/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  159. package/dist/types/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  160. package/dist/types/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  161. package/dist/types/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  162. package/dist/types/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  163. package/dist/types/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  164. package/dist/types/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  165. package/dist/types/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  166. package/dist/types/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  167. package/dist/types/global-account/react/components/ModalHeader/ModalHeader.d.ts +10 -0
  168. package/dist/types/global-account/react/components/Send/Send.d.ts +5 -0
  169. package/dist/types/global-account/react/components/icons/BellIcon.d.ts +3 -0
  170. package/dist/types/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  171. package/dist/types/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  172. package/dist/types/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  173. package/dist/types/global-account/react/components/icons/LockIcon.d.ts +3 -0
  174. package/dist/types/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  175. package/dist/types/global-account/react/components/index.d.ts +4 -2
  176. package/dist/types/global-account/react/hooks/index.d.ts +1 -1
  177. package/dist/types/global-account/react/stores/index.d.ts +1 -0
  178. package/dist/types/global-account/react/stores/useModalStore.d.ts +34 -3
  179. package/dist/types/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  180. package/dist/types/global-account/react/utils/profileDisplay.d.ts +2 -0
  181. package/dist/types/shared/constants/chains/supported.d.ts +2 -2
  182. package/package.json +1 -1
  183. package/src/anyspend/react/components/AnySpend.tsx +225 -167
  184. package/src/anyspend/react/components/AnySpendCustom.tsx +1 -1
  185. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +1 -1
  186. package/src/anyspend/react/components/common/FeeDetailPanel.tsx +1 -1
  187. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +2 -2
  188. package/src/anyspend/react/components/common/OrderHistory.tsx +8 -13
  189. package/src/anyspend/react/components/common/PanelOnrampPayment.tsx +1 -1
  190. package/src/anyspend/react/components/common/PointsDetailPanel.tsx +1 -1
  191. package/src/anyspend/react/components/common/RecipientSelection.tsx +1 -1
  192. package/src/global-account/react/components/AccountAssets/AccountAssets.tsx +115 -25
  193. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +303 -126
  194. package/src/global-account/react/components/B3DynamicModal.tsx +28 -6
  195. package/src/global-account/react/components/Deposit/Deposit.tsx +211 -0
  196. package/src/global-account/react/components/LinkAccount/LinkAccount.tsx +332 -433
  197. package/src/global-account/react/components/LinkAccount/LinkNewAccount.tsx +490 -0
  198. package/src/global-account/react/components/ManageAccount/AppsContent.tsx +79 -0
  199. package/src/global-account/react/components/ManageAccount/BalanceContent.tsx +2 -3
  200. package/src/global-account/react/components/ManageAccount/BottomNavigation.tsx +83 -0
  201. package/src/global-account/react/components/ManageAccount/Header.tsx +230 -0
  202. package/src/global-account/react/components/ManageAccount/HomeActions.tsx +118 -0
  203. package/src/global-account/react/components/ManageAccount/HomeContent.tsx +42 -0
  204. package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +73 -589
  205. package/src/global-account/react/components/ManageAccount/NFTContent.tsx +24 -0
  206. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +74 -0
  207. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +87 -0
  208. package/src/global-account/react/components/ManageAccount/SettingsMenuItem.tsx +31 -0
  209. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +74 -0
  210. package/src/global-account/react/components/ManageAccount/TokenContent.tsx +41 -0
  211. package/src/global-account/react/components/ModalHeader/ModalHeader.tsx +50 -0
  212. package/src/global-account/react/components/Send/Send.tsx +585 -0
  213. package/src/global-account/react/components/icons/BellIcon.tsx +15 -0
  214. package/src/global-account/react/components/icons/ChevronDownIcon.tsx +17 -0
  215. package/src/global-account/react/components/icons/CopyIcon.tsx +22 -0
  216. package/src/global-account/react/components/icons/LinkIcon.tsx +15 -0
  217. package/src/global-account/react/components/icons/LockIcon.tsx +15 -0
  218. package/src/global-account/react/components/icons/WalletIcon.tsx +21 -0
  219. package/src/global-account/react/components/index.ts +9 -2
  220. package/src/global-account/react/components/ui/Tabs.tsx +5 -13
  221. package/src/global-account/react/components/ui/dialog.tsx +32 -14
  222. package/src/global-account/react/hooks/index.ts +3 -0
  223. package/src/global-account/react/hooks/useB3BalanceFromAddresses.ts +1 -0
  224. package/src/global-account/react/stores/index.ts +1 -0
  225. package/src/global-account/react/stores/useModalStore.ts +39 -2
  226. package/src/global-account/react/stores/useRecentAddressesStore.ts +55 -0
  227. package/src/global-account/react/utils/profileDisplay.ts +4 -2
  228. package/src/shared/utils/ipfs.ts +1 -1
  229. package/src/styles/index.css +6 -1
@@ -4,27 +4,42 @@ import app from "../../../../global-account/app.js";
4
4
  import { Button, useB3, useProfile } from "../../../../global-account/react/index.js";
5
5
  import { cn } from "../../../../shared/utils/cn.js";
6
6
  import { debugB3React } from "../../../../shared/utils/debug.js";
7
+ import { getIpfsUrl } from "../../../../shared/utils/ipfs.js";
7
8
  import { client } from "../../../../shared/utils/thirdweb.js";
8
- import { Check, Loader2, Upload, X } from "lucide-react";
9
+ import { Loader2, Upload, X } from "lucide-react";
9
10
  import { useRef, useState } from "react";
10
11
  import { toast } from "sonner";
11
12
  import { useActiveAccount } from "thirdweb/react";
12
13
  import { upload } from "thirdweb/storage";
14
+ import { useProfileSettings } from "../../hooks/useProfile.js";
15
+ import { useModalStore } from "../../stores/index.js";
16
+ import ModalHeader from "../ModalHeader/ModalHeader.js";
13
17
  const debug = debugB3React("AvatarEditor");
14
18
  export function AvatarEditor({ onSetAvatar, className }) {
19
+ const [viewStep, setViewStep] = useState("select");
20
+ const [selectedAvatar, setSelectedAvatar] = useState(null);
21
+ const [hoveredProfile, setHoveredProfile] = useState(null);
15
22
  const [selectedFile, setSelectedFile] = useState(null);
16
23
  const [previewUrl, setPreviewUrl] = useState(null);
17
24
  const [isUploading, setIsUploading] = useState(false);
18
25
  const [isSaving, setIsSaving] = useState(false);
26
+ const [isDragging, setIsDragging] = useState(false);
19
27
  const fileInputRef = useRef(null);
20
- const { setUser } = useB3();
28
+ const { setUser, user, partnerId } = useB3();
29
+ const setB3ModalContentType = useModalStore(state => state.setB3ModalContentType);
30
+ const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
31
+ const contentType = useModalStore(state => state.contentType);
32
+ const { setPreference } = useProfileSettings();
21
33
  const account = useActiveAccount();
22
34
  const { data: profile, refetch: refreshProfile } = useProfile({
23
35
  address: account?.address,
24
36
  fresh: true,
25
37
  });
26
- // Thirdweb upload function
27
- const hasAvatar = profile?.avatar;
38
+ const currentAvatar = user?.avatar
39
+ ? getIpfsUrl(user?.avatar)
40
+ : profile?.avatar
41
+ ? getIpfsUrl(profile.avatar)
42
+ : undefined;
28
43
  const handleFileSelect = (event) => {
29
44
  const file = event.target.files?.[0];
30
45
  if (file) {
@@ -42,9 +57,11 @@ export function AvatarEditor({ onSetAvatar, className }) {
42
57
  // Create preview URL
43
58
  const url = URL.createObjectURL(file);
44
59
  setPreviewUrl(url);
60
+ setSelectedAvatar(url);
45
61
  }
46
62
  };
47
- const handleRemoveFile = () => {
63
+ const handleRemovePreview = () => {
64
+ setSelectedAvatar(currentAvatar || null);
48
65
  setSelectedFile(null);
49
66
  if (previewUrl) {
50
67
  URL.revokeObjectURL(previewUrl);
@@ -54,49 +71,138 @@ export function AvatarEditor({ onSetAvatar, className }) {
54
71
  fileInputRef.current.value = "";
55
72
  }
56
73
  };
57
- const handleUpload = async () => {
58
- if (!selectedFile) {
59
- toast.error("Please select an image first");
74
+ const handleSaveChanges = async () => {
75
+ if (!account?.address) {
76
+ toast.error("No account connected");
60
77
  return;
61
78
  }
62
- setIsUploading(true);
79
+ setIsSaving(true);
63
80
  try {
64
- debug("Starting upload to IPFS", selectedFile);
65
- // Upload to IPFS using Thirdweb
66
- const ipfsUrl = await upload({
67
- client,
68
- files: [selectedFile],
69
- });
70
- debug("Upload successful", ipfsUrl);
71
- // Save avatar URL using profiles service
72
- setIsSaving(true);
73
- const user = await app.service("users").setAvatar({
74
- avatar: ipfsUrl,
75
- },
76
- // @ts-expect-error - our typed client is expecting context even though it's set elsewhere
77
- {});
78
- // update user
79
- // @ts-expect-error this resolved fine, look into why expect-error needed
80
- setUser(user);
81
+ // If user uploaded a new file
82
+ if (selectedFile) {
83
+ debug("Starting upload to IPFS", selectedFile);
84
+ // Upload to IPFS using Thirdweb
85
+ const ipfsUrl = await upload({
86
+ client,
87
+ files: [selectedFile],
88
+ });
89
+ debug("Upload successful", ipfsUrl);
90
+ // Save avatar URL using profiles service
91
+ const user = await app.service("users").setAvatar({
92
+ avatar: ipfsUrl,
93
+ },
94
+ // @ts-expect-error - our typed client is expecting context even though it's set elsewhere
95
+ {});
96
+ // update user
97
+ // @ts-expect-error this resolved fine, look into why expect-error needed
98
+ setUser(user);
99
+ toast.success("Looks great! Your avatar has been saved!");
100
+ }
101
+ else if (selectedAvatar && selectedAvatar !== currentAvatar) {
102
+ // User selected from existing profile avatars
103
+ // Find the profile that matches the selected avatar
104
+ const selectedProfile = profile?.profiles?.find(p => p.avatar === selectedAvatar);
105
+ if (selectedProfile && selectedProfile.type) {
106
+ debug("Setting profile preference to:", selectedProfile.type);
107
+ // Set preference for this profile type
108
+ await setPreference(account.address, selectedProfile.type, account.address, async (message) => {
109
+ // Sign the message using the active account
110
+ const signature = await account.signMessage({ message });
111
+ return signature;
112
+ });
113
+ toast.success("Avatar updated successfully!");
114
+ }
115
+ }
81
116
  // Refresh profile to get updated avatar
82
117
  await refreshProfile();
83
- toast.success(hasAvatar ? "Nice look! Your avatar has been updated!" : "Looks great! Your avatar has been saved!");
84
118
  onSetAvatar?.();
85
- // Clean up
86
- handleRemoveFile();
87
119
  }
88
120
  catch (error) {
89
- debug("Error uploading avatar:", error);
90
- toast.error("Failed to upload avatar. Please try again.");
121
+ debug("Error saving avatar:", error);
122
+ toast.error("Failed to save avatar. Please try again.");
91
123
  }
92
124
  finally {
93
- setIsUploading(false);
94
125
  setIsSaving(false);
95
126
  }
96
127
  };
97
- const handleFileInputClick = () => {
128
+ const handleCancel = () => {
129
+ if (viewStep === "upload") {
130
+ setViewStep("select");
131
+ handleRemovePreview();
132
+ }
133
+ else {
134
+ setB3ModalContentType({
135
+ type: "manageAccount",
136
+ chain: contentType?.chain,
137
+ partnerId: partnerId,
138
+ });
139
+ }
140
+ };
141
+ const handleProfileAvatarSelect = (avatarUrl) => {
142
+ setSelectedAvatar(avatarUrl);
143
+ };
144
+ const handleUploadImageClick = () => {
145
+ setViewStep("upload");
146
+ };
147
+ const handleOpenFilePicker = () => {
98
148
  fileInputRef.current?.click();
99
149
  };
150
+ const handleDragEnter = (e) => {
151
+ e.preventDefault();
152
+ e.stopPropagation();
153
+ setIsDragging(true);
154
+ };
155
+ const handleDragLeave = (e) => {
156
+ e.preventDefault();
157
+ e.stopPropagation();
158
+ setIsDragging(false);
159
+ };
160
+ const handleDragOver = (e) => {
161
+ e.preventDefault();
162
+ e.stopPropagation();
163
+ };
164
+ const handleDrop = (e) => {
165
+ e.preventDefault();
166
+ e.stopPropagation();
167
+ setIsDragging(false);
168
+ const file = e.dataTransfer.files?.[0];
169
+ if (file) {
170
+ // Validate file type
171
+ if (!file.type.startsWith("image/")) {
172
+ toast.error("Please select an image file");
173
+ return;
174
+ }
175
+ // Validate file size (max 5MB)
176
+ if (file.size > 5 * 1024 * 1024) {
177
+ toast.error("File size must be less than 5MB");
178
+ return;
179
+ }
180
+ setSelectedFile(file);
181
+ // Create preview URL
182
+ const url = URL.createObjectURL(file);
183
+ setPreviewUrl(url);
184
+ setSelectedAvatar(url);
185
+ }
186
+ };
187
+ const handleLinkMoreAccount = () => {
188
+ setB3ModalContentType({
189
+ type: "linkAccount",
190
+ chain: contentType?.chain,
191
+ partnerId: partnerId,
192
+ });
193
+ };
100
194
  const isLoading = isUploading || isSaving;
101
- return (_jsxs("div", { className: cn("flex flex-col items-center justify-center space-y-6 p-8", className), children: [_jsxs("div", { className: "space-y-2 text-center", children: [_jsx("h2", { className: "font-neue-montreal-semibold text-b3-grey text-2xl", children: hasAvatar ? "Update Your Avatar" : "Set Your Avatar" }), _jsx("p", { className: "text-b3-foreground-muted font-neue-montreal-medium", children: "Upload an image to personalize your profile" })] }), hasAvatar && !previewUrl && (_jsx("div", { className: "relative", children: _jsx("div", { className: "border-b3-primary-blue h-32 w-32 overflow-hidden rounded-full border-4", children: _jsx("img", { src: profile.avatar, alt: "Current avatar", className: "h-full w-full object-cover" }) }) })), _jsxs("div", { className: "w-full max-w-md", children: [!selectedFile ? (_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: [_jsx(Upload, { className: "text-b3-grey mx-auto mb-4 h-12 w-12" }), _jsx("p", { className: "text-b3-grey font-neue-montreal-semibold mb-2", children: "Click to select an image" }), _jsx("p", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: "PNG, JPG, or GIF up to 5MB" })] })) : (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "relative", children: [_jsx("div", { className: "border-b3-primary-blue mx-auto h-32 w-32 overflow-hidden rounded-full border-4", children: previewUrl ? (_jsx("img", { src: previewUrl, alt: "Preview", className: "h-full w-full object-cover" })) : (_jsx("div", { className: "bg-b3-primary-wash flex h-full w-full items-center justify-center rounded-full", children: _jsx("p", { className: "text-b3-grey font-neue-montreal-semibold text-sm", children: "No file selected" }) })) }), _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: _jsx(X, { size: 16 }) })] }), _jsxs("div", { className: "space-y-1 text-center", children: [_jsx("p", { className: "text-b3-grey font-neue-montreal-semibold text-sm", children: selectedFile.name }), _jsxs("p", { className: "text-b3-foreground-muted font-neue-montreal-medium text-xs", children: [(selectedFile.size / 1024 / 1024).toFixed(2), " MB"] })] })] })), _jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileSelect, className: "hidden" })] }), _jsxs("div", { className: "flex w-full max-w-md gap-3", children: [selectedFile && (_jsx(Button, { onClick: handleUpload, disabled: isLoading, className: "bg-b3-primary-blue hover:bg-b3-primary-blue/90 flex-1 text-white", children: isLoading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isUploading ? "Uploading..." : "Saving..."] })) : (_jsxs(_Fragment, { children: [_jsx(Check, { className: "mr-2 h-4 w-4" }), hasAvatar ? "Update Avatar" : "Set Avatar"] })) })), _jsxs(Button, { variant: "outline", onClick: handleFileInputClick, disabled: isLoading, className: "flex-1", children: [_jsx(Upload, { className: "mr-2 h-4 w-4" }), selectedFile ? "Change Image" : "Select Image"] })] }), _jsx("div", { className: "text-b3-foreground-muted font-neue-montreal-medium max-w-md text-center text-xs", children: _jsx("p", { children: "Your avatar will be uploaded to IPFS and stored securely. Make sure you have the rights to use this image." }) })] }));
195
+ // Get profile avatars
196
+ const profileAvatars = profile?.profiles
197
+ ?.filter(p => p.avatar)
198
+ .map(p => ({
199
+ type: p.type,
200
+ avatar: getIpfsUrl(p?.avatar || ""),
201
+ name: p.name || p.type,
202
+ })) || [];
203
+ return (_jsxs("div", { className: cn("flex w-full max-w-md flex-col bg-white", className), children: [viewStep === "upload" && _jsx(ModalHeader, { title: "Upload Image" }), _jsxs("div", { className: "flex flex-col items-center p-6", children: [viewStep === "select" ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative mb-6", children: [_jsx("div", { className: "h-32 w-32 overflow-hidden rounded-full", children: _jsx("img", { src: selectedAvatar || currentAvatar || "https://via.placeholder.com/128", alt: "Avatar preview", className: "h-full w-full object-cover" }) }), selectedAvatar && (_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: _jsx(X, { className: "h-4 w-4" }) }))] }), _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: [_jsx(Upload, { className: "h-4 w-4" }), "Upload image"] }), _jsxs("div", { className: "w-full", children: [_jsx("h3", { className: "mb-2 text-base font-semibold text-[#18181b]", children: "Select your profile image" }), _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." }), _jsx("div", { className: "mb-4 flex gap-3", children: profileAvatars.map((profileAvatar, index) => (_jsxs("div", { className: "relative", onMouseEnter: () => setHoveredProfile(profileAvatar.type), onMouseLeave: () => setHoveredProfile(null), children: [_jsx("button", { onClick: () => handleProfileAvatarSelect(profileAvatar.avatar), className: cn("h-16 w-16 overflow-hidden rounded-full border-2 transition-all", selectedAvatar === profileAvatar.avatar
204
+ ? "border-[#3368ef] ring-2 ring-[#3368ef]/20"
205
+ : "border-transparent hover:border-[#e4e4e7]"), children: _jsx("img", { src: profileAvatar.avatar, alt: `${profileAvatar.type} avatar`, className: "h-full w-full object-cover" }) }), hoveredProfile === profileAvatar.type && (_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))) }), _jsxs("button", { onClick: handleLinkMoreAccount, className: "font-inter flex items-center gap-2 text-sm font-semibold text-[#3368ef] hover:underline", children: [_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: _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"] })] })] })) : (_jsx(_Fragment, { children: !selectedFile ? (_jsxs("div", { onClick: handleOpenFilePicker, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, className: 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
206
+ ? "border-[#3368ef] bg-[#f0f5ff]"
207
+ : "border-[#e4e4e7] hover:border-[#3368ef] hover:bg-[#f0f5ff]"), children: [_jsxs("p", { className: "font-inter mb-1 text-sm", children: [_jsx("span", { className: "font-semibold text-[#3368ef]", children: "Click to upload" }), _jsx("span", { className: "text-[#71717a]", children: " or drag and drop" })] }), _jsx("p", { className: "text-xs text-[#71717a]", children: "PNG, JPG or GIF (up to 5MB)" })] })) : (_jsx("div", { className: "mb-6 w-full", children: _jsx("div", { className: "aspect-square w-full overflow-hidden rounded-xl bg-[#f4f4f5]", children: _jsx("img", { src: previewUrl || "", alt: "Preview", className: "h-full w-full object-cover" }) }) })) })), _jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileSelect, className: "hidden" })] }), _jsxs("div", { className: "font-inter flex gap-3 border-t border-[#e4e4e7] p-6 font-semibold", children: [_jsx(Button, { onClick: handleCancel, variant: "outline", disabled: isLoading, className: "flex-1 rounded-xl border-[#e4e4e7] text-[#18181b] hover:bg-[#f4f4f5]", children: "Cancel" }), _jsx(Button, { onClick: handleSaveChanges, disabled: isLoading || !selectedAvatar, className: "flex-1 rounded-xl bg-[#3368ef] text-white hover:bg-[#2952cc]", children: isLoading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Saving..."] })) : ("Save changes") })] })] }));
102
208
  }
@@ -10,16 +10,22 @@ import { useEffect, useRef } from "react";
10
10
  import { useSetActiveWallet } from "thirdweb/react";
11
11
  import { AvatarEditor } from "./AvatarEditor/AvatarEditor.js";
12
12
  import { useB3 } from "./B3Provider/useB3.js";
13
+ import { Deposit } from "./Deposit/Deposit.js";
13
14
  import { LinkAccount } from "./LinkAccount/LinkAccount.js";
14
- import { ProfileEditor } from "./ProfileEditor/ProfileEditor.js";
15
+ import { LinkNewAccount } from "./LinkAccount/LinkNewAccount.js";
15
16
  import { ManageAccount } from "./ManageAccount/ManageAccount.js";
17
+ import { ProfileEditor } from "./ProfileEditor/ProfileEditor.js";
16
18
  import { RequestPermissions } from "./RequestPermissions/RequestPermissions.js";
19
+ import { Send } from "./Send/Send.js";
17
20
  import { SignInWithB3Flow } from "./SignInWithB3/SignInWithB3Flow.js";
18
21
  import { Dialog, DialogContent, DialogDescription, DialogTitle } from "./ui/dialog.js";
19
22
  import { Drawer, DrawerContent, DrawerDescription, DrawerTitle } from "./ui/drawer.js";
20
23
  const debug = debugB3React("B3DynamicModal");
21
24
  export function B3DynamicModal() {
22
- const { isOpen, setB3ModalOpen, contentType, history, navigateBack } = useModalStore();
25
+ const isOpen = useModalStore(state => state.isOpen);
26
+ const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
27
+ const contentType = useModalStore(state => state.contentType);
28
+ const navigateBack = useModalStore(state => state.navigateBack);
23
29
  const { theme } = useB3();
24
30
  const isMobile = useIsMobile();
25
31
  const prevIsOpenRef = useRef(isOpen);
@@ -50,7 +56,10 @@ export function B3DynamicModal() {
50
56
  "anySpendSignatureMint",
51
57
  "anySpendBondKit",
52
58
  "linkAccount",
59
+ "linkNewAccount",
53
60
  "avatarEditor",
61
+ "deposit",
62
+ "send",
54
63
  "profileEditor",
55
64
  ];
56
65
  const freestyleTypes = [
@@ -67,7 +76,7 @@ export function B3DynamicModal() {
67
76
  ];
68
77
  // Check if current content type is in freestyle types
69
78
  const isFreestyleType = freestyleTypes.includes(contentType?.type);
70
- const hideCloseButton = isFreestyleType;
79
+ const hideCloseButton = true;
71
80
  // Build content class using cn utility
72
81
  // eslint-disable-next-line tailwindcss/no-custom-classname
73
82
  const contentClass = 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");
@@ -93,7 +102,7 @@ export function B3DynamicModal() {
93
102
  case "anySpendFundTournament":
94
103
  return _jsx(AnySpendTournament, { ...contentType, mode: "modal", action: "fund" });
95
104
  case "anySpendOrderHistory":
96
- return _jsx(OrderHistory, { onBack: () => { }, mode: "modal" });
105
+ return _jsx(OrderHistory, { ...contentType, mode: "modal" });
97
106
  case "anySpendStakeB3":
98
107
  return _jsx(AnySpendStakeB3, { ...contentType, mode: "modal" });
99
108
  case "anySpendStakeB3ExactIn":
@@ -110,10 +119,16 @@ export function B3DynamicModal() {
110
119
  return _jsx(AnySpendBondKit, { ...contentType });
111
120
  case "linkAccount":
112
121
  return _jsx(LinkAccount, { ...contentType });
122
+ case "linkNewAccount":
123
+ return _jsx(LinkNewAccount, { ...contentType });
113
124
  case "anySpendDepositHype":
114
125
  return _jsx(AnySpendDepositHype, { ...contentType, mode: "modal" });
115
126
  case "avatarEditor":
116
127
  return _jsx(AvatarEditor, { onSetAvatar: contentType.onSuccess });
128
+ case "deposit":
129
+ return _jsx(Deposit, {});
130
+ case "send":
131
+ return _jsx(Send, { ...contentType });
117
132
  case "profileEditor":
118
133
  return _jsx(ProfileEditor, { onSuccess: contentType.onSuccess });
119
134
  // Add other modal types here
@@ -125,9 +140,13 @@ export function B3DynamicModal() {
125
140
  const ModalContent = isMobile ? DrawerContent : DialogContent;
126
141
  const ModalTitle = isMobile ? DrawerTitle : DialogTitle;
127
142
  const ModalDescription = isMobile ? DrawerDescription : DialogDescription;
128
- return (_jsxs(ModalComponent, { open: isOpen, onOpenChange: setB3ModalOpen, children: [_jsxs(ModalContent, { className: cn(contentClass, "rounded-2xl bg-white shadow-xl dark:bg-gray-900", "border border-gray-200 dark:border-gray-800",
143
+ return (_jsxs(ModalComponent, { open: isOpen, onOpenChange: setB3ModalOpen, children: [_jsxs(ModalContent, { className: cn(contentClass, "rounded-2xl bg-white shadow-xl dark:bg-gray-900", "border border-gray-200 dark:border-gray-800", (contentType?.type === "manageAccount" ||
144
+ contentType?.type === "deposit" ||
145
+ contentType?.type === "send" ||
146
+ contentType?.type === "avatarEditor") &&
147
+ "p-0", "mx-auto w-full max-w-md sm:max-w-lg", // TODO CHECK THIS
129
148
  // Remove default width classes for avatar editor and profile editor
130
149
  contentType?.type === "avatarEditor" || contentType?.type === "profileEditor"
131
150
  ? "!w-[90vw] !max-w-none" // Use !important to override default styles
132
- : "mx-auto w-full max-w-md sm:max-w-lg"), hideCloseButton: hideCloseButton, children: [_jsx(ModalTitle, { className: "sr-only hidden", children: contentType?.type || "Modal" }), _jsx(ModalDescription, { className: "sr-only hidden", children: contentType?.type || "Modal Body" }), _jsxs("div", { className: cn("no-scrollbar max-h-[90dvh] overflow-auto sm:max-h-[80dvh]"), children: [history.length > 0 && contentType?.showBackButton && (_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: [_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("path", { d: "M15.8337 10H4.16699", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M10.0003 15.8334L4.16699 10L10.0003 4.16669", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { className: "text-sm font-medium", children: "Back" })] })), renderContent()] })] }), (contentType?.type === "avatarEditor" || contentType?.type === "profileEditor") && (_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: _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M18 6L6 18M6 6L18 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }))] }));
151
+ : "mx-auto w-full max-w-md sm:max-w-lg"), hideCloseButton: hideCloseButton, children: [_jsx(ModalTitle, { className: "sr-only hidden", children: contentType?.type || "Modal" }), _jsx(ModalDescription, { className: "sr-only hidden", children: contentType?.type || "Modal Body" }), _jsxs("div", { className: cn("no-scrollbar max-h-[90dvh] overflow-auto sm:max-h-[80dvh]"), children: [(!hideCloseButton || contentType?.showBackButton) && (_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: [_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("path", { d: "M15.8337 10H4.16699", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M10.0003 15.8334L4.16699 10L10.0003 4.16669", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { className: "font-inter text-sm font-semibold", children: "Back" })] })), renderContent()] })] }), (contentType?.type === "avatarEditor" || contentType?.type === "profileEditor") && (_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: _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M18 6L6 18M6 6L18 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }))] }));
133
152
  }
@@ -0,0 +1 @@
1
+ export declare function Deposit(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { RELAY_SOLANA_MAINNET_CHAIN_ID } from "../../../../anyspend/constants/index.js";
3
+ import { ALL_CHAINS } from "../../../../anyspend/utils/chain.js";
4
+ import { useAccountWallet, useModalStore } from "../../../../global-account/react/index.js";
5
+ import { TokenSelector } from "@relayprotocol/relay-kit-ui";
6
+ import { ChevronDown, Copy } from "lucide-react";
7
+ import { QRCodeSVG } from "qrcode.react";
8
+ import { useMemo, useState } from "react";
9
+ import { toast } from "sonner";
10
+ import { base } from "thirdweb/chains";
11
+ import ModalHeader from "../ModalHeader/ModalHeader.js";
12
+ import { Button } from "../ui/button.js";
13
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
14
+ // Coinbase logo SVG
15
+ const CoinbaseLogo = () => (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [_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" }), _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" })] }));
16
+ export function Deposit() {
17
+ const { address } = useAccountWallet();
18
+ const navigateBack = useModalStore(state => state.navigateBack);
19
+ const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
20
+ const history = useModalStore(state => state.history);
21
+ const [selectedChainId, setSelectedChainId] = useState(base.id);
22
+ const [selectedToken, setSelectedToken] = useState({
23
+ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
24
+ chainId: base.id,
25
+ decimals: 6,
26
+ symbol: "USDC",
27
+ name: "USD Coin",
28
+ metadata: {
29
+ logoURI: "https://assets.relay.link/icons/1/light/usdc.png",
30
+ },
31
+ });
32
+ // Get the selected chain object
33
+ const selectedChain = useMemo(() => ALL_CHAINS[selectedChainId], [selectedChainId]);
34
+ // Get all supported chains for the dropdown
35
+ const supportedChains = useMemo(() => Object.values(ALL_CHAINS), []);
36
+ // The deposit address is the user's active wallet address
37
+ const depositAddress = address || "0x0000000000000000000000000000000000000000";
38
+ const handleTokenSelect = (token) => {
39
+ setSelectedChainId(token.chainId);
40
+ setSelectedToken({
41
+ address: token.address,
42
+ chainId: token.chainId,
43
+ decimals: token.decimals,
44
+ metadata: { logoURI: token.logoURI },
45
+ name: token.name,
46
+ symbol: token.symbol,
47
+ });
48
+ };
49
+ const handleCopyAddress = async () => {
50
+ try {
51
+ await navigator.clipboard.writeText(depositAddress);
52
+ toast.success("Address copied to clipboard");
53
+ }
54
+ catch (error) {
55
+ toast.error("Failed to copy address");
56
+ }
57
+ };
58
+ return (_jsxs("div", { className: "flex w-full flex-col", children: [_jsx(ModalHeader, { title: "Deposit", showCloseButton: false }), _jsxs("div", { className: "flex flex-col pb-5 pt-5", children: [_jsx("div", { className: "mb-4 px-5", children: _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." }) }), _jsxs("div", { className: "space-y-3 px-5", children: [_jsxs("div", { children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-[#3f3f46]", children: "Chain" }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _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: [_jsxs("div", { className: "flex items-center gap-2", children: [selectedChain?.logoUrl && (_jsx("img", { src: selectedChain.logoUrl, alt: selectedChain.name, className: "h-6 w-6 rounded-full" })), _jsx("span", { className: "text-base text-[#18181b]", children: selectedChain?.name || "Select Chain" })] }), _jsx(ChevronDown, { className: "h-4 w-4 text-[#51525c]" })] }) }), _jsx(DropdownMenuContent, { className: "max-h-[300px] w-full overflow-y-auto", children: supportedChains.map(chain => (_jsx(DropdownMenuItem, { onClick: () => setSelectedChainId(chain.id), children: _jsxs("div", { className: "flex items-center gap-2", children: [chain.logoUrl && _jsx("img", { src: chain.logoUrl, alt: chain.name, className: "h-6 w-6 rounded-full" }), _jsx("span", { className: "text-[#18181b]", children: chain.name })] }) }, chain.id))) })] })] }), _jsxs("div", { children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-[#3f3f46]", children: "Accepted tokens" }), _jsx(TokenSelector, { address: address, chainIdsFilter: [selectedChainId], context: "from", fromChainWalletVMSupported: true, isValidAddress: true, lockedChainIds: [selectedChainId], multiWalletSupportEnabled: true, onAnalyticEvent: undefined, popularChainIds: [1, 8453, RELAY_SOLANA_MAINNET_CHAIN_ID], setToken: handleTokenSelect, supportedWalletVMs: ["evm", "svm"], token: undefined, trigger: _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: [_jsxs("div", { className: "flex items-center gap-2", children: [selectedToken?.metadata?.logoURI && (_jsx("img", { src: selectedToken.metadata.logoURI, alt: selectedToken.symbol, className: "h-6 w-6 rounded-full" })), _jsx("span", { className: "text-base text-[#18181b]", children: selectedToken.symbol })] }), _jsx(ChevronDown, { className: "h-4 w-4 text-[#51525c]" })] }) })] })] }), _jsxs("div", { className: "mx-5 mt-4 flex items-start rounded-xl border border-[#e4e4e7] bg-[#fafafa]", children: [_jsxs("div", { className: "flex flex-1 flex-col items-center gap-2 px-5 pb-3 pt-5", children: [_jsx("div", { className: "flex w-full items-center justify-center", children: _jsx("div", { className: "w-full", children: _jsx("div", { className: "flex aspect-[144/146] w-full flex-col items-center justify-center overflow-hidden", children: _jsx(QRCodeSVG, { value: depositAddress, size: 144, level: "M" }) }) }) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs font-semibold leading-[18px] text-[#0b57c2]", children: "SCAN WITH" }), _jsx(CoinbaseLogo, {})] })] }), _jsxs("div", { className: "relative flex flex-1 flex-col gap-2 self-stretch border-l border-[#e4e4e7] p-6", children: [_jsx("label", { className: "text-sm font-medium leading-5 text-[#3f3f46]", children: "Deposit address:" }), _jsxs("div", { className: "relative flex w-full flex-wrap items-center gap-2", children: [_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 }), _jsx("button", { onClick: handleCopyAddress, className: "absolute bottom-0 right-0 h-4 w-4 transition-opacity hover:opacity-70", "aria-label": "Copy address", children: _jsx(Copy, { className: "h-full w-full text-[#51525c]" }) })] })] })] }), _jsx("div", { className: "mx-5 mt-4", children: _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.", _jsx("br", {}), "Tokens not accepted will not be converted."] }) }), _jsx("div", { className: "mt-4 px-5", children: _jsx(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" }) })] })] }));
59
+ }
@@ -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;