@b3dotfun/sdk 0.0.35 → 0.0.36

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 (160) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +5 -3
  2. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.js +2 -2
  3. package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.d.ts +3 -1
  4. package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.js +5 -2
  5. package/dist/cjs/anyspend/react/components/common/CryptoPaySection.d.ts +16 -0
  6. package/dist/cjs/anyspend/react/components/common/CryptoPaySection.js +58 -0
  7. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +1 -0
  8. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +22 -15
  9. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +12 -4
  10. package/dist/cjs/anyspend/react/components/common/PaySection.d.ts +2 -6
  11. package/dist/cjs/anyspend/react/components/common/PaySection.js +10 -15
  12. package/dist/cjs/anyspend/react/components/index.d.ts +2 -2
  13. package/dist/cjs/anyspend/react/components/index.js +5 -5
  14. package/dist/cjs/global-account/bsmnt.d.ts +2 -0
  15. package/dist/cjs/global-account/bsmnt.js +42 -1
  16. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +6 -0
  17. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.js +55 -0
  18. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +6 -0
  19. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +108 -0
  20. package/dist/cjs/global-account/react/components/B3DynamicModal.js +9 -1
  21. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.d.ts +3 -1
  22. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.js +21 -11
  23. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.d.ts +3 -1
  24. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.js +19 -5
  25. package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.d.ts +3 -1
  26. package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.js +6 -6
  27. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3.js +2 -2
  28. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -13
  29. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Privy.js +1 -3
  30. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStep.js +0 -3
  31. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +0 -3
  32. package/dist/cjs/global-account/react/components/icons/AppleIcon.d.ts +9 -0
  33. package/dist/cjs/global-account/react/components/icons/AppleIcon.js +8 -0
  34. package/dist/cjs/global-account/react/components/icons/DiscordIcon.d.ts +9 -0
  35. package/dist/cjs/global-account/react/components/icons/DiscordIcon.js +8 -0
  36. package/dist/cjs/global-account/react/components/icons/FarcasterIcon.d.ts +9 -0
  37. package/dist/cjs/global-account/react/components/icons/FarcasterIcon.js +8 -0
  38. package/dist/cjs/global-account/react/components/icons/GoogleIcon.d.ts +8 -0
  39. package/dist/cjs/global-account/react/components/icons/GoogleIcon.js +8 -0
  40. package/dist/cjs/global-account/react/components/icons/XIcon.d.ts +9 -0
  41. package/dist/cjs/global-account/react/components/icons/XIcon.js +8 -0
  42. package/dist/cjs/global-account/react/hooks/useAccountWallet.js +3 -2
  43. package/dist/cjs/global-account/react/hooks/useAuthentication.d.ts +1 -2
  44. package/dist/cjs/global-account/react/hooks/useAuthentication.js +16 -15
  45. package/dist/cjs/global-account/react/hooks/useProfile.d.ts +1 -1
  46. package/dist/cjs/global-account/react/hooks/useRPMToken.d.ts +7 -0
  47. package/dist/cjs/global-account/react/hooks/useRPMToken.js +11 -0
  48. package/dist/cjs/global-account/react/stores/useAuthStore.d.ts +2 -4
  49. package/dist/cjs/global-account/react/stores/useAuthStore.js +2 -4
  50. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +11 -1
  51. package/dist/cjs/global-account/react/utils/updateAvatar.d.ts +4 -0
  52. package/dist/cjs/global-account/react/utils/updateAvatar.js +54 -0
  53. package/dist/esm/anyspend/react/components/AnySpend.js +5 -3
  54. package/dist/esm/anyspend/react/components/AnyspendDepositHype.js +2 -2
  55. package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.d.ts +3 -1
  56. package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.js +5 -2
  57. package/dist/esm/anyspend/react/components/common/CryptoPaySection.d.ts +16 -0
  58. package/dist/esm/anyspend/react/components/common/CryptoPaySection.js +55 -0
  59. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +1 -0
  60. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +22 -15
  61. package/dist/esm/anyspend/react/components/common/OrderDetails.js +12 -4
  62. package/dist/esm/anyspend/react/components/common/PaySection.d.ts +2 -6
  63. package/dist/esm/anyspend/react/components/common/PaySection.js +10 -15
  64. package/dist/esm/anyspend/react/components/index.d.ts +2 -2
  65. package/dist/esm/anyspend/react/components/index.js +2 -2
  66. package/dist/esm/global-account/bsmnt.d.ts +2 -0
  67. package/dist/esm/global-account/bsmnt.js +39 -0
  68. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +6 -0
  69. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.js +52 -0
  70. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +6 -0
  71. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +102 -0
  72. package/dist/esm/global-account/react/components/B3DynamicModal.js +9 -1
  73. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.d.ts +3 -1
  74. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.js +22 -12
  75. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.d.ts +3 -1
  76. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.js +20 -6
  77. package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.d.ts +3 -1
  78. package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.js +6 -6
  79. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3.js +2 -2
  80. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -13
  81. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Privy.js +1 -3
  82. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStep.js +0 -3
  83. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +0 -3
  84. package/dist/esm/global-account/react/components/icons/AppleIcon.d.ts +9 -0
  85. package/dist/esm/global-account/react/components/icons/AppleIcon.js +5 -0
  86. package/dist/esm/global-account/react/components/icons/DiscordIcon.d.ts +9 -0
  87. package/dist/esm/global-account/react/components/icons/DiscordIcon.js +5 -0
  88. package/dist/esm/global-account/react/components/icons/FarcasterIcon.d.ts +9 -0
  89. package/dist/esm/global-account/react/components/icons/FarcasterIcon.js +5 -0
  90. package/dist/esm/global-account/react/components/icons/GoogleIcon.d.ts +8 -0
  91. package/dist/esm/global-account/react/components/icons/GoogleIcon.js +5 -0
  92. package/dist/esm/global-account/react/components/icons/XIcon.d.ts +9 -0
  93. package/dist/esm/global-account/react/components/icons/XIcon.js +5 -0
  94. package/dist/esm/global-account/react/hooks/useAccountWallet.js +3 -2
  95. package/dist/esm/global-account/react/hooks/useAuthentication.d.ts +1 -2
  96. package/dist/esm/global-account/react/hooks/useAuthentication.js +16 -15
  97. package/dist/esm/global-account/react/hooks/useProfile.d.ts +1 -1
  98. package/dist/esm/global-account/react/hooks/useRPMToken.d.ts +7 -0
  99. package/dist/esm/global-account/react/hooks/useRPMToken.js +8 -0
  100. package/dist/esm/global-account/react/stores/useAuthStore.d.ts +2 -4
  101. package/dist/esm/global-account/react/stores/useAuthStore.js +2 -4
  102. package/dist/esm/global-account/react/stores/useModalStore.d.ts +11 -1
  103. package/dist/esm/global-account/react/utils/updateAvatar.d.ts +4 -0
  104. package/dist/esm/global-account/react/utils/updateAvatar.js +18 -0
  105. package/dist/styles/index.css +1 -1
  106. package/dist/types/anyspend/react/components/common/ConnectWalletPayment.d.ts +3 -1
  107. package/dist/types/anyspend/react/components/common/CryptoPaySection.d.ts +16 -0
  108. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +1 -0
  109. package/dist/types/anyspend/react/components/common/PaySection.d.ts +2 -6
  110. package/dist/types/anyspend/react/components/index.d.ts +2 -2
  111. package/dist/types/global-account/bsmnt.d.ts +2 -0
  112. package/dist/types/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +6 -0
  113. package/dist/types/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +6 -0
  114. package/dist/types/global-account/react/components/LinkAccount/LinkAccount.d.ts +3 -1
  115. package/dist/types/global-account/react/components/ManageAccount/BalanceContent.d.ts +3 -1
  116. package/dist/types/global-account/react/components/ManageAccount/ManageAccount.d.ts +3 -1
  117. package/dist/types/global-account/react/components/icons/AppleIcon.d.ts +9 -0
  118. package/dist/types/global-account/react/components/icons/DiscordIcon.d.ts +9 -0
  119. package/dist/types/global-account/react/components/icons/FarcasterIcon.d.ts +9 -0
  120. package/dist/types/global-account/react/components/icons/GoogleIcon.d.ts +8 -0
  121. package/dist/types/global-account/react/components/icons/XIcon.d.ts +9 -0
  122. package/dist/types/global-account/react/hooks/useAuthentication.d.ts +1 -2
  123. package/dist/types/global-account/react/hooks/useProfile.d.ts +1 -1
  124. package/dist/types/global-account/react/hooks/useRPMToken.d.ts +7 -0
  125. package/dist/types/global-account/react/stores/useAuthStore.d.ts +2 -4
  126. package/dist/types/global-account/react/stores/useModalStore.d.ts +11 -1
  127. package/dist/types/global-account/react/utils/updateAvatar.d.ts +4 -0
  128. package/package.json +8 -7
  129. package/src/anyspend/react/components/AnySpend.tsx +7 -6
  130. package/src/anyspend/react/components/AnyspendDepositHype.tsx +2 -5
  131. package/src/anyspend/react/components/common/ConnectWalletPayment.tsx +6 -1
  132. package/src/anyspend/react/components/common/CryptoPaySection.tsx +153 -0
  133. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +80 -43
  134. package/src/anyspend/react/components/common/OrderDetails.tsx +13 -4
  135. package/src/anyspend/react/components/common/PaySection.tsx +64 -140
  136. package/src/anyspend/react/components/index.ts +2 -2
  137. package/src/global-account/bsmnt.ts +47 -0
  138. package/src/global-account/react/components/AvatarCreator/AvatarCreator.tsx +90 -0
  139. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +233 -0
  140. package/src/global-account/react/components/B3DynamicModal.tsx +27 -2
  141. package/src/global-account/react/components/LinkAccount/LinkAccount.tsx +40 -18
  142. package/src/global-account/react/components/ManageAccount/BalanceContent.tsx +63 -35
  143. package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +106 -78
  144. package/src/global-account/react/components/SignInWithB3/SignInWithB3.tsx +2 -2
  145. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -13
  146. package/src/global-account/react/components/SignInWithB3/SignInWithB3Privy.tsx +1 -3
  147. package/src/global-account/react/components/SignInWithB3/steps/LoginStep.tsx +0 -3
  148. package/src/global-account/react/components/SignInWithB3/steps/LoginStepCustom.tsx +0 -3
  149. package/src/global-account/react/components/icons/AppleIcon.tsx +33 -0
  150. package/src/global-account/react/components/icons/DiscordIcon.tsx +32 -0
  151. package/src/global-account/react/components/icons/FarcasterIcon.tsx +37 -0
  152. package/src/global-account/react/components/icons/GoogleIcon.tsx +40 -0
  153. package/src/global-account/react/components/icons/XIcon.tsx +28 -0
  154. package/src/global-account/react/hooks/useAccountWallet.tsx +3 -2
  155. package/src/global-account/react/hooks/useAuthentication.ts +18 -15
  156. package/src/global-account/react/hooks/useProfile.ts +1 -1
  157. package/src/global-account/react/hooks/useRPMToken.ts +17 -0
  158. package/src/global-account/react/stores/useAuthStore.ts +4 -8
  159. package/src/global-account/react/stores/useModalStore.ts +13 -1
  160. package/src/global-account/react/utils/updateAvatar.ts +21 -0
@@ -12,6 +12,7 @@ import { AnySpendDepositHype } from "@b3dotfun/sdk/anyspend/react/components/Any
12
12
  import { useIsMobile, useModalStore } from "@b3dotfun/sdk/global-account/react";
13
13
  import { cn } from "@b3dotfun/sdk/shared/utils/cn";
14
14
  import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
15
+ import { AvatarEditor } from "./AvatarEditor/AvatarEditor";
15
16
  import { useB3 } from "./B3Provider/useB3";
16
17
  import { LinkAccount } from "./LinkAccount/LinkAccount";
17
18
  import { ManageAccount } from "./ManageAccount/ManageAccount";
@@ -40,6 +41,7 @@ export function B3DynamicModal() {
40
41
  "anySpendSignatureMint",
41
42
  "anySpendBondKit",
42
43
  "linkAccount",
44
+ "avatarEditor",
43
45
  ];
44
46
 
45
47
  const freestyleTypes = [
@@ -65,6 +67,9 @@ export function B3DynamicModal() {
65
67
  isFreestyleType && "b3-modal-freestyle",
66
68
  contentType?.type === "signInWithB3" && "p-0",
67
69
  contentType?.type === "anySpend" && "md:px-6",
70
+ // Add specific styles for avatar editor
71
+ // contentType?.type === "avatarEditor_disabled" &&
72
+ // "h-[90dvh] w-[90vw] bg-black p-0 overflow-y-auto overflow-x-hidden max-md:-mt-8 max-md:rounded-t-xl",
68
73
  );
69
74
 
70
75
  debug("contentType", contentType);
@@ -102,6 +107,8 @@ export function B3DynamicModal() {
102
107
  return <LinkAccount {...contentType} />;
103
108
  case "anySpendDepositHype":
104
109
  return <AnySpendDepositHype {...contentType} mode="modal" />;
110
+ case "avatarEditor":
111
+ return <AvatarEditor onSetAvatar={contentType.onSuccess} />;
105
112
  // Add other modal types here
106
113
  default:
107
114
  return null;
@@ -120,8 +127,10 @@ export function B3DynamicModal() {
120
127
  contentClass,
121
128
  "rounded-2xl bg-white shadow-xl dark:bg-gray-900",
122
129
  "border border-gray-200 dark:border-gray-800",
123
- "mx-auto w-full max-w-md",
124
- "sm:max-w-lg sm:rounded-b-none",
130
+ // Remove default width classes for avatar editor
131
+ contentType?.type === "avatarEditor"
132
+ ? "!w-[90vw] !max-w-none" // Use !important to override default styles
133
+ : "mx-auto w-full max-w-md sm:max-w-lg",
125
134
  )}
126
135
  hideCloseButton={hideCloseButton}
127
136
  >
@@ -155,6 +164,22 @@ export function B3DynamicModal() {
155
164
  {renderContent()}
156
165
  </div>
157
166
  </ModalContent>
167
+ {contentType?.type === "avatarEditor" && (
168
+ <button
169
+ onClick={() => setB3ModalOpen(false)}
170
+ 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"
171
+ >
172
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
173
+ <path
174
+ d="M18 6L6 18M6 6L18 18"
175
+ stroke="currentColor"
176
+ strokeWidth="2"
177
+ strokeLinecap="round"
178
+ strokeLinejoin="round"
179
+ />
180
+ </svg>
181
+ </button>
182
+ )}
158
183
  </ModalComponent>
159
184
  );
160
185
  }
@@ -1,6 +1,7 @@
1
+ import app from "@b3dotfun/sdk/global-account/app";
1
2
  import { ecosystemWalletId } from "@b3dotfun/sdk/shared/constants";
2
3
  import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
3
- import { Loader2 } from "lucide-react";
4
+ import { Loader2, Mail, Phone } from "lucide-react";
4
5
  import { useCallback, useEffect, useState } from "react";
5
6
  import { toast } from "sonner";
6
7
  import { useLinkProfile, useProfiles } from "thirdweb/react";
@@ -8,8 +9,12 @@ import { preAuthenticate } from "thirdweb/wallets";
8
9
  import { LinkAccountModalProps, useModalStore } from "../../stores/useModalStore";
9
10
  import { getProfileDisplayInfo } from "../../utils/profileDisplay";
10
11
  import { useB3 } from "../B3Provider/useB3";
12
+ import { AppleIcon } from "../icons/AppleIcon";
13
+ import { DiscordIcon } from "../icons/DiscordIcon";
14
+ import { FarcasterIcon } from "../icons/FarcasterIcon";
15
+ import { GoogleIcon } from "../icons/GoogleIcon";
16
+ import { XIcon } from "../icons/XIcon";
11
17
  import { Button } from "../ui/button";
12
- import app from "@b3dotfun/sdk/global-account/app";
13
18
  type OTPStrategy = "email" | "phone";
14
19
  type SocialStrategy = "google" | "x" | "discord" | "apple" | "farcaster";
15
20
  type Strategy = OTPStrategy | SocialStrategy;
@@ -18,17 +23,22 @@ interface AuthMethod {
18
23
  id: Strategy;
19
24
  label: string;
20
25
  enabled: boolean;
21
- icon?: string;
26
+ icon: React.ReactNode;
22
27
  }
23
28
 
24
29
  const AUTH_METHODS: AuthMethod[] = [
25
- { id: "email", label: "Email", enabled: true },
26
- { id: "phone", label: "Phone", enabled: true },
27
- { id: "google", label: "Google", enabled: true },
28
- { id: "x", label: "X (Twitter)", enabled: true },
29
- { id: "discord", label: "Discord", enabled: true },
30
- { id: "apple", label: "Apple", enabled: true },
31
- { id: "farcaster", label: "Farcaster", enabled: true },
30
+ { id: "email", label: "Email", enabled: true, icon: <Mail className="text-b3-primary-blue size-6" /> },
31
+ { id: "phone", label: "Phone", enabled: true, icon: <Phone className="text-b3-primary-blue size-6" /> },
32
+ { id: "google", label: "Google", enabled: true, icon: <GoogleIcon className="size-6" /> },
33
+ { id: "x", label: "X (Twitter)", enabled: true, icon: <XIcon className="size-6" /> },
34
+ { id: "discord", label: "Discord", enabled: true, icon: <DiscordIcon className="size-6" /> },
35
+ { id: "apple", label: "Apple", enabled: true, icon: <AppleIcon className="size-6" /> },
36
+ {
37
+ id: "farcaster",
38
+ label: "Farcaster",
39
+ enabled: true,
40
+ icon: <FarcasterIcon className="size-6" />,
41
+ },
32
42
  ];
33
43
 
34
44
  export function LinkAccount({
@@ -37,7 +47,8 @@ export function LinkAccount({
37
47
  onClose,
38
48
  chain,
39
49
  partnerId,
40
- }: LinkAccountModalProps) {
50
+ className,
51
+ }: LinkAccountModalProps & { className?: string }) {
41
52
  const { isLinking, linkingMethod, setLinkingState, navigateBack, setB3ModalContentType } = useModalStore();
42
53
  const [selectedMethod, setSelectedMethod] = useState<Strategy | null>(null);
43
54
  const [email, setEmail] = useState("");
@@ -288,9 +299,9 @@ export function LinkAccount({
288
299
  }
289
300
 
290
301
  return (
291
- <div className="space-y-6 p-6">
292
- <div className="flex items-center justify-between">
293
- <h2 className="text-b3-grey font-neue-montreal-semibold text-2xl">Link New Account</h2>
302
+ <div className={`b3-link-account space-y-6 p-6 ${className || ""}`} data-testid="link-account">
303
+ <div className="b3-link-account-header flex items-center justify-between">
304
+ <h2 className="b3-link-account-title text-b3-grey font-neue-montreal-semibold text-2xl">Link New Account</h2>
294
305
  {selectedMethod && (
295
306
  <Button variant="ghost" className="text-b3-grey hover:text-b3-grey/80" onClick={handleBack}>
296
307
  Backs
@@ -299,11 +310,13 @@ export function LinkAccount({
299
310
  </div>
300
311
 
301
312
  {!selectedMethod ? (
302
- <div className="grid gap-3">
313
+ <div className="b3-link-account-methods grid gap-3">
303
314
  {availableAuthMethods.map(method => (
304
315
  <Button
305
316
  key={method.id}
306
- className="bg-b3-primary-wash hover:bg-b3-primary-wash/70 text-b3-grey font-neue-montreal-semibold h-16 justify-start px-6 text-lg"
317
+ variant="outline"
318
+ className="b3-link-account-method-button border-b3-line hover:border-b3-primary-blue/30 hover:bg-b3-primary-blue/5 text-b3-grey font-neue-montreal-medium h-14 justify-start bg-transparent px-6 text-base transition-all duration-200"
319
+ data-method={method.id}
307
320
  onClick={() => {
308
321
  if (method.id === "email" || method.id === "phone") {
309
322
  setSelectedMethod(method.id);
@@ -313,7 +326,16 @@ export function LinkAccount({
313
326
  }}
314
327
  disabled={linkingMethod === method.id}
315
328
  >
316
- {isLinking && linkingMethod === method.id ? <Loader2 className="animate-spin" /> : method.label}
329
+ {isLinking && linkingMethod === method.id ? (
330
+ <Loader2 className="h-5 w-5 animate-spin" />
331
+ ) : (
332
+ <div className="b3-link-account-method-content flex items-center gap-4">
333
+ <div className="b3-link-account-method-icon flex items-center justify-center rounded-full">
334
+ {method.icon}
335
+ </div>
336
+ <span className="b3-link-account-method-label font-medium">{method.label}</span>
337
+ </div>
338
+ )}
317
339
  </Button>
318
340
  ))}
319
341
  {availableAuthMethods.length === 0 && (
@@ -323,7 +345,7 @@ export function LinkAccount({
323
345
  )}
324
346
  </div>
325
347
  ) : (
326
- <div className="space-y-4">
348
+ <div className="b3-link-account-form space-y-4">
327
349
  {selectedMethod === "email" && (
328
350
  <div className="space-y-2">
329
351
  <label className="text-b3-grey font-neue-montreal-medium text-sm">Email Address</label>
@@ -2,6 +2,7 @@ import {
2
2
  Button,
3
3
  CopyToClipboard,
4
4
  useAuthentication,
5
+ useB3,
5
6
  useB3BalanceFromAddresses,
6
7
  useModalStore,
7
8
  useNativeBalance,
@@ -11,6 +12,7 @@ import { BankIcon } from "@b3dotfun/sdk/global-account/react/components/icons/Ba
11
12
  import { SignOutIcon } from "@b3dotfun/sdk/global-account/react/components/icons/SignOutIcon";
12
13
  import { SwapIcon } from "@b3dotfun/sdk/global-account/react/components/icons/SwapIcon";
13
14
  import { formatUsername } from "@b3dotfun/sdk/shared/utils";
15
+ import { getIpfsUrl } from "@b3dotfun/sdk/shared/utils/ipfs";
14
16
  import { Loader2, Pencil } from "lucide-react";
15
17
  import { useEffect, useRef, useState } from "react";
16
18
  import { useActiveAccount } from "thirdweb/react";
@@ -22,6 +24,8 @@ import { TokenBalanceRow } from "./TokenBalanceRow";
22
24
  interface BalanceContentProps {
23
25
  onLogout?: () => void;
24
26
  partnerId: string;
27
+ showDeposit?: boolean;
28
+ showSwap?: boolean;
25
29
  }
26
30
 
27
31
  function centerTruncate(str: string, length = 4) {
@@ -29,19 +33,34 @@ function centerTruncate(str: string, length = 4) {
29
33
  return `${str.slice(0, length)}...${str.slice(-length)}`;
30
34
  }
31
35
 
32
- export function BalanceContent({ onLogout, partnerId }: BalanceContentProps) {
36
+ export function BalanceContent({ onLogout, partnerId, showDeposit = true, showSwap = true }: BalanceContentProps) {
33
37
  const account = useActiveAccount();
34
38
  const { address: eoaAddress, info: eoaInfo } = useFirstEOA();
35
39
  const { data: profile } = useProfile({
36
40
  address: eoaAddress || account?.address,
37
41
  fresh: true,
38
42
  });
39
- const { setB3ModalOpen, setB3ModalContentType } = useModalStore();
43
+ const { user } = useB3();
44
+ const { setB3ModalOpen, setB3ModalContentType, navigateBack } = useModalStore();
40
45
  const { logout } = useAuthentication(partnerId);
41
46
  const [logoutLoading, setLogoutLoading] = useState(false);
42
47
  const [openAccordions, setOpenAccordions] = useState<string[]>([]);
43
48
  const hasExpandedRef = useRef(false);
44
49
 
50
+ const avatarUrl = user?.avatar ? getIpfsUrl(user?.avatar) : profile?.avatar;
51
+
52
+ const handleEditAvatar = () => {
53
+ setB3ModalOpen(true);
54
+ setB3ModalContentType({
55
+ type: "avatarEditor",
56
+ showBackButton: true,
57
+ onSuccess: () => {
58
+ // navigate back on success
59
+ navigateBack();
60
+ },
61
+ });
62
+ };
63
+
45
64
  console.log("eoaAddress", eoaAddress);
46
65
  console.log("account?.address", account?.address);
47
66
 
@@ -98,14 +117,17 @@ export function BalanceContent({ onLogout, partnerId }: BalanceContentProps) {
98
117
  <div className="flex items-center justify-between">
99
118
  <div className="global-account-profile flex items-center gap-4">
100
119
  <div className="global-account-profile-avatar relative">
101
- {profile?.avatar ? (
102
- <img src={profile?.avatar} alt="Profile" className="size-24 rounded-full" />
120
+ {avatarUrl ? (
121
+ <img src={avatarUrl} alt="Profile" className="size-24 rounded-full" />
103
122
  ) : (
104
123
  <div className="bg-b3-primary-wash size-24 rounded-full" />
105
124
  )}
106
- <div className="bg-b3-grey border-b3-background absolute -bottom-1 -right-1 flex size-8 items-center justify-center rounded-full border-4">
125
+ <button
126
+ onClick={handleEditAvatar}
127
+ className="bg-b3-grey border-b3-background hover:bg-b3-grey/80 absolute -bottom-1 -right-1 flex size-8 items-center justify-center rounded-full border-4 transition-colors"
128
+ >
107
129
  <Pencil size={16} className="text-b3-background" />
108
- </div>
130
+ </button>
109
131
  </div>
110
132
  <div className="global-account-profile-info">
111
133
  <h2 className="text-b3-grey text-xl font-semibold">
@@ -122,35 +144,41 @@ export function BalanceContent({ onLogout, partnerId }: BalanceContentProps) {
122
144
  </div>
123
145
 
124
146
  {/* Quick Actions */}
125
- <div className="grid grid-cols-2 gap-3">
126
- <Button
127
- className="manage-account-deposit bg-b3-primary-wash hover:bg-b3-primary-wash/70 h-[84px] w-full flex-col items-start gap-2 rounded-2xl"
128
- onClick={() => {
129
- setB3ModalOpen(true);
130
- setB3ModalContentType({
131
- type: "anySpend",
132
- defaultActiveTab: "fiat",
133
- showBackButton: true,
134
- });
135
- }}
136
- >
137
- <BankIcon size={24} className="text-b3-primary-blue shrink-0" />
138
- <div className="text-b3-grey font-neue-montreal-semibold">Deposit</div>
139
- </Button>
140
- <Button
141
- className="manage-account-swap bg-b3-primary-wash hover:bg-b3-primary-wash/70 flex h-[84px] w-full flex-col items-start gap-2 rounded-2xl"
142
- onClick={() => {
143
- setB3ModalOpen(true);
144
- setB3ModalContentType({
145
- type: "anySpend",
146
- showBackButton: true,
147
- });
148
- }}
149
- >
150
- <SwapIcon size={24} className="text-b3-primary-blue" />
151
- <div className="text-b3-grey font-neue-montreal-semibold">Swap</div>
152
- </Button>
153
- </div>
147
+ {(showDeposit || showSwap) && (
148
+ <div className="grid grid-cols-2 gap-3">
149
+ {showDeposit && (
150
+ <Button
151
+ className="manage-account-deposit bg-b3-primary-wash hover:bg-b3-primary-wash/70 h-[84px] w-full flex-col items-start gap-2 rounded-2xl"
152
+ onClick={() => {
153
+ setB3ModalOpen(true);
154
+ setB3ModalContentType({
155
+ type: "anySpend",
156
+ defaultActiveTab: "fiat",
157
+ showBackButton: true,
158
+ });
159
+ }}
160
+ >
161
+ <BankIcon size={24} className="text-b3-primary-blue shrink-0" />
162
+ <div className="text-b3-grey font-neue-montreal-semibold">Deposit</div>
163
+ </Button>
164
+ )}
165
+ {showSwap && (
166
+ <Button
167
+ className="manage-account-swap bg-b3-primary-wash hover:bg-b3-primary-wash/70 flex h-[84px] w-full flex-col items-start gap-2 rounded-2xl"
168
+ onClick={() => {
169
+ setB3ModalOpen(true);
170
+ setB3ModalContentType({
171
+ type: "anySpend",
172
+ showBackButton: true,
173
+ });
174
+ }}
175
+ >
176
+ <SwapIcon size={24} className="text-b3-primary-blue" />
177
+ <div className="text-b3-grey font-neue-montreal-semibold">Swap</div>
178
+ </Button>
179
+ )}
180
+ </div>
181
+ )}
154
182
 
155
183
  {/* Balance Sections with Accordions */}
156
184
  <Accordion type="multiple" value={openAccordions} onValueChange={setOpenAccordions} className="space-y-2">