@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
@@ -42,6 +42,8 @@ interface ManageAccountProps {
42
42
  chain: Chain;
43
43
  partnerId: string;
44
44
  containerClassName?: string;
45
+ showSwap?: boolean;
46
+ showDeposit?: boolean;
45
47
  }
46
48
 
47
49
  export function ManageAccount({
@@ -50,6 +52,8 @@ export function ManageAccount({
50
52
  onDeposit: _onDeposit,
51
53
  chain,
52
54
  partnerId,
55
+ showSwap,
56
+ showDeposit,
53
57
  }: ManageAccountProps) {
54
58
  const [revokingSignerId, setRevokingSignerId] = useState<string | null>(null);
55
59
  const account = useActiveAccount();
@@ -89,7 +93,6 @@ export function ManageAccount({
89
93
  setB3ModalOpen(false);
90
94
  setLogoutLoading(false);
91
95
  };
92
-
93
96
  const AppsContent = () => (
94
97
  <div className="space-y-4">
95
98
  {signers?.map((signer: TWSignerWithMetadata) => (
@@ -234,53 +237,64 @@ export function ManageAccount({
234
237
  };
235
238
 
236
239
  return (
237
- <div className="space-y-8">
240
+ <div className="linked-accounts-settings space-y-8">
238
241
  {/* Linked Accounts Section */}
239
- <div className="space-y-4">
240
- <div className="flex items-center justify-between">
241
- <h3 className="text-b3-grey font-neue-montreal-semibold text-xl">Linked Accounts</h3>
242
+ <div className="linked-accounts-section space-y-4">
243
+ <div className="linked-accounts-header flex items-center justify-between">
244
+ <h3 className="text-b3-grey font-neue-montreal-semibold linked-accounts-settings-title text-xl">
245
+ Linked Accounts
246
+ </h3>
242
247
  <Button
243
- className="bg-b3-primary-wash hover:bg-b3-primary-wash/70 flex items-center gap-2 rounded-full px-4 py-2"
248
+ className="linked-accounts-settings-button linked-accounts-link-button bg-b3-primary-wash hover:bg-b3-primary-wash/70 flex items-center gap-2 rounded-full px-4 py-2"
244
249
  onClick={handleOpenLinkModal}
245
250
  disabled={isLinking}
246
251
  >
247
252
  {isLinking ? (
248
- <Loader2 className="text-b3-primary-blue animate-spin" size={16} />
253
+ <Loader2 className="linked-accounts-link-loading text-b3-primary-blue animate-spin" size={16} />
249
254
  ) : (
250
- <LinkIcon size={16} className="text-b3-primary-blue" />
255
+ <LinkIcon size={16} className="linked-accounts-link-icon text-b3-primary-blue" />
251
256
  )}
252
- <span className="text-b3-grey font-neue-montreal-semibold">
257
+ <span className="linked-accounts-link-text text-b3-grey font-neue-montreal-semibold">
253
258
  {isLinking ? "Linking..." : "Link New Account"}
254
259
  </span>
255
260
  </Button>
256
261
  </div>
257
262
 
258
263
  {isLoadingProfiles ? (
259
- <div className="flex justify-center py-8">
264
+ <div className="linked-accounts-loading flex justify-center py-8">
260
265
  <Loader2 className="text-b3-grey animate-spin" />
261
266
  </div>
262
267
  ) : profiles.length > 0 ? (
263
- <div className="space-y-4">
268
+ <div className="linked-accounts-list space-y-4">
264
269
  {profiles.map(profile => (
265
- <div key={profile.title} className="bg-b3-line flex items-center justify-between rounded-xl p-4">
266
- <div className="flex items-center gap-3">
270
+ <div
271
+ key={profile.title}
272
+ className="linked-account-item bg-b3-line flex items-center justify-between rounded-xl p-4"
273
+ >
274
+ <div className="linked-account-info flex items-center gap-3">
267
275
  {profile.imageUrl ? (
268
- <img src={profile.imageUrl} alt={profile.title} className="size-10 rounded-full" />
276
+ <img
277
+ src={profile.imageUrl}
278
+ alt={profile.title}
279
+ className="linked-account-avatar linked-account-avatar-image size-10 rounded-full"
280
+ />
269
281
  ) : (
270
- <div className="bg-b3-primary-wash flex h-10 w-10 items-center justify-center rounded-full">
271
- <span className="text-b3-grey font-neue-montreal-semibold text-sm uppercase">
282
+ <div className="linked-account-avatar linked-account-avatar-placeholder bg-b3-primary-wash flex h-10 w-10 items-center justify-center rounded-full">
283
+ <span className="linked-account-initial text-b3-grey font-neue-montreal-semibold text-sm uppercase">
272
284
  {profile.initial}
273
285
  </span>
274
286
  </div>
275
287
  )}
276
- <div>
277
- <div className="flex items-center gap-2">
278
- <span className="text-b3-grey font-neue-montreal-semibold">{profile.title}</span>
279
- <span className="text-b3-foreground-muted font-neue-montreal-medium bg-b3-primary-wash rounded px-2 py-0.5 text-xs">
288
+ <div className="linked-account-details">
289
+ <div className="linked-account-title-row flex items-center gap-2">
290
+ <span className="linked-account-title text-b3-grey font-neue-montreal-semibold">
291
+ {profile.title}
292
+ </span>
293
+ <span className="linked-account-type text-b3-foreground-muted font-neue-montreal-medium bg-b3-primary-wash rounded px-2 py-0.5 text-xs">
280
294
  {profile.type.toUpperCase()}
281
295
  </span>
282
296
  </div>
283
- <div className="text-b3-foreground-muted font-neue-montreal-medium text-sm">
297
+ <div className="linked-account-subtitle text-b3-foreground-muted font-neue-montreal-medium text-sm">
284
298
  {profile.subtitle}
285
299
  </div>
286
300
  </div>
@@ -288,69 +302,79 @@ export function ManageAccount({
288
302
  <Button
289
303
  variant="ghost"
290
304
  size="icon"
291
- className="text-b3-grey hover:text-b3-negative"
305
+ className="linked-account-unlink-button text-b3-grey hover:text-b3-negative"
292
306
  onClick={() => handleUnlink(profile)}
293
307
  disabled={unlinkingAccountId === profile.title || isUnlinking}
294
308
  >
295
309
  {unlinkingAccountId === profile.title || isUnlinking ? (
296
- <Loader2 className="animate-spin" />
310
+ <Loader2 className="linked-account-unlink-loading animate-spin" />
297
311
  ) : (
298
- <UnlinkIcon size={16} />
312
+ <UnlinkIcon size={16} className="linked-account-unlink-icon" />
299
313
  )}
300
314
  </Button>
301
315
  </div>
302
316
  ))}
303
317
  </div>
304
318
  ) : (
305
- <div className="text-b3-foreground-muted py-8 text-center">No linked accounts found</div>
319
+ <div className="linked-accounts-empty text-b3-foreground-muted py-8 text-center">
320
+ No linked accounts found
321
+ </div>
306
322
  )}
307
323
  </div>
308
324
 
309
325
  {showReferralInfo && (
310
326
  /* Referral Section */
311
- <div className="space-y-4">
312
- <h3 className="text-b3-grey font-neue-montreal-semibold text-xl">Referrals</h3>
327
+ <div className="referrals-section space-y-4">
328
+ <h3 className="referrals-title text-b3-grey font-neue-montreal-semibold text-xl">Referrals</h3>
313
329
 
314
330
  {/* Referral Code */}
315
- <div className="bg-b3-line rounded-xl p-4">
331
+ <div className="referral-code-container bg-b3-line rounded-xl p-4">
316
332
  {isEditingCode && (
317
- <div>
318
- <div className="text-b3-grey font-neue-montreal-semibold">Your Referral Code</div>
319
- <div className="text-b3-foreground-muted font-neue-montreal-medium text-sm">
333
+ <div className="referral-code-header-editing">
334
+ <div className="referral-code-title text-b3-grey font-neue-montreal-semibold">Your Referral Code</div>
335
+ <div className="referral-code-description text-b3-foreground-muted font-neue-montreal-medium text-sm">
320
336
  Share this code with friends to earn rewards
321
337
  </div>
322
338
  </div>
323
339
  )}
324
- <div className="flex items-center justify-between">
340
+ <div className="referral-code-content flex items-center justify-between">
325
341
  {!isEditingCode && (
326
- <div>
327
- <div className="text-b3-grey font-neue-montreal-semibold">Your Referral Code</div>
328
- <div className="text-b3-foreground-muted font-neue-montreal-medium text-sm">
342
+ <div className="referral-code-header">
343
+ <div className="referral-code-title text-b3-grey font-neue-montreal-semibold">
344
+ Your Referral Code
345
+ </div>
346
+ <div className="referral-code-description text-b3-foreground-muted font-neue-montreal-medium text-sm">
329
347
  Share this code with friends to earn rewards
330
348
  </div>
331
349
  </div>
332
350
  )}
333
- <div className="flex items-center gap-2">
351
+ <div className="referral-code-actions flex items-center gap-2">
334
352
  {isEditingCode ? (
335
- <div className="flex items-center gap-2">
353
+ <div className="referral-code-edit-form flex items-center gap-2">
336
354
  <input
337
355
  type="text"
338
356
  value={newReferralCode}
339
357
  onChange={e => setNewReferralCode(e.target.value)}
340
- className="rounded-lg border border-gray-200 bg-white px-3 py-1.5 text-sm"
358
+ className="referral-code-input rounded-lg border border-gray-200 bg-white px-3 py-1.5 text-sm"
341
359
  placeholder="Enter new code"
342
360
  ref={referallCodeRef}
343
361
  />
344
362
  <Button
345
363
  size="sm"
364
+ className="referral-code-save-button"
346
365
  onClick={handleUpdateReferralCode}
347
366
  disabled={isUpdatingCode || !newReferralCode}
348
367
  >
349
- {isUpdatingCode ? <Loader2 className="h-4 w-4 animate-spin" /> : "Save"}
368
+ {isUpdatingCode ? (
369
+ <Loader2 className="referral-code-save-loading h-4 w-4 animate-spin" />
370
+ ) : (
371
+ "Save"
372
+ )}
350
373
  </Button>
351
374
  <Button
352
375
  size="sm"
353
376
  variant="ghost"
377
+ className="referral-code-cancel-button"
354
378
  onClick={() => {
355
379
  setIsEditingCode(false);
356
380
  setNewReferralCode("");
@@ -361,15 +385,21 @@ export function ManageAccount({
361
385
  </div>
362
386
  ) : (
363
387
  <>
364
- <div className="rounded-lg border border-gray-200 bg-white px-3 py-1.5 text-sm">
388
+ <div className="referral-code-display rounded-lg border border-gray-200 bg-white px-3 py-1.5 text-sm">
365
389
  {currentReferralCode}
366
390
  </div>
367
- <Button size="icon" variant="ghost" onClick={handleCopyCode}>
368
- <Copy className="h-4 w-4" />
391
+ <Button
392
+ size="icon"
393
+ variant="ghost"
394
+ className="referral-code-copy-button"
395
+ onClick={handleCopyCode}
396
+ >
397
+ <Copy className="referral-code-copy-icon h-4 w-4" />
369
398
  </Button>
370
399
  <Button
371
400
  size="icon"
372
401
  variant="ghost"
402
+ className="referral-code-edit-button"
373
403
  onClick={() => {
374
404
  setIsEditingCode(true);
375
405
  setTimeout(() => {
@@ -377,7 +407,7 @@ export function ManageAccount({
377
407
  }, 100);
378
408
  }}
379
409
  >
380
- <Pencil className="h-4 w-4" />
410
+ <Pencil className="referral-code-edit-icon h-4 w-4" />
381
411
  </Button>
382
412
  </>
383
413
  )}
@@ -386,67 +416,65 @@ export function ManageAccount({
386
416
  </div>
387
417
 
388
418
  {/* Referred Users */}
389
- <div className="bg-b3-line rounded-xl p-4">
390
- <div className="text-b3-grey font-neue-montreal-semibold mb-4">Referred Users</div>
419
+ <div className="referred-users-container bg-b3-line rounded-xl p-4">
420
+ <div className="referred-users-title text-b3-grey font-neue-montreal-semibold mb-4">Referred Users</div>
391
421
  {isLoadingReferrals ? (
392
- <div className="flex justify-center py-4">
422
+ <div className="referred-users-loading flex justify-center py-4">
393
423
  <Loader2 className="h-6 w-6 animate-spin text-gray-400" />
394
424
  </div>
395
425
  ) : referrals?.data?.length ? (
396
- <div className="space-y-3">
426
+ <div className="referred-users-list space-y-3">
397
427
  {referrals.data.map((referral: Referrals) => (
398
428
  <div
399
429
  key={String(referral._id)}
400
- className="flex items-center justify-between rounded-lg bg-white p-3"
430
+ className="referred-user-item flex items-center justify-between rounded-lg bg-white p-3"
401
431
  >
402
- <div className="text-sm font-medium">{referral.referreeId}</div>
403
- <div className="text-sm text-gray-500">{new Date(referral.createdAt).toLocaleDateString()}</div>
432
+ <div className="referred-user-id text-sm font-medium">{referral.referreeId}</div>
433
+ <div className="referred-user-date text-sm text-gray-500">
434
+ {new Date(referral.createdAt).toLocaleDateString()}
435
+ </div>
404
436
  </div>
405
437
  ))}
406
438
  </div>
407
439
  ) : (
408
- <div className="py-4 text-center text-gray-500">No referred users yet</div>
440
+ <div className="referred-users-empty py-4 text-center text-gray-500">No referred users yet</div>
409
441
  )}
410
442
  </div>
411
443
  </div>
412
444
  )}
413
445
 
414
446
  {/* Additional Settings Sections */}
415
- <div className="space-y-4">
416
- <h3 className="text-b3-grey font-neue-montreal-semibold text-xl">Account Preferences</h3>
417
- <div className="bg-b3-line rounded-xl p-4">
418
- <div className="flex items-center justify-between">
419
- <div>
420
- <div className="text-b3-grey font-neue-montreal-semibold">Dark Mode</div>
421
- <div className="text-b3-foreground-muted font-neue-montreal-medium text-sm">
447
+ <div className="account-preferences-section space-y-4">
448
+ <h3 className="account-preferences-title text-b3-grey font-neue-montreal-semibold text-xl">
449
+ Account Preferences
450
+ </h3>
451
+ <div className="account-preferences-container bg-b3-line rounded-xl p-4">
452
+ <div className="account-preference-item flex items-center justify-between">
453
+ <div className="account-preference-info">
454
+ <div className="account-preference-title text-b3-grey font-neue-montreal-semibold">Dark Mode</div>
455
+ <div className="account-preference-description text-b3-foreground-muted font-neue-montreal-medium text-sm">
422
456
  Switch between light and dark theme
423
457
  </div>
424
458
  </div>
425
459
  {/* Theme toggle placeholder - can be implemented later */}
426
- <div className="bg-b3-primary-wash h-6 w-12 rounded-full"></div>
460
+ <div className="account-preference-toggle theme-toggle-placeholder bg-b3-primary-wash h-6 w-12 rounded-full"></div>
427
461
  </div>
428
462
  </div>
429
463
  </div>
430
464
 
431
- {/* Global Account Info */}
432
- <div className="border-b3-line flex items-center justify-between rounded-2xl border p-4">
433
- <div>
434
- <div className="flex items-center gap-2">
435
- <img src="https://cdn.b3.fun/b3_logo.svg" alt="B3" className="h-4" />
436
- <h3 className="font-neue-montreal-semibold text-b3-grey">Global Account</h3>
437
- </div>
438
-
439
- <p className="text-b3-foreground-muted font-neue-montreal-medium mt-2 text-sm">
440
- Your universal account for all B3 apps
441
- </p>
465
+ <button
466
+ className="logout-button logout-section border-b3-line hover:bg-b3-line relative flex w-full items-center justify-center rounded-2xl border p-4 transition-colors"
467
+ onClick={onLogoutEnhanced}
468
+ >
469
+ <span className="logout-text font-neue-montreal-semibold text-b3-grey">Sign out</span>
470
+ <div className="logout-icon-container absolute right-4">
471
+ {logoutLoading ? (
472
+ <Loader2 className="logout-loading animate-spin" size={16} />
473
+ ) : (
474
+ <SignOutIcon size={16} className="logout-icon text-b3-grey" />
475
+ )}
442
476
  </div>
443
- <button
444
- className="text-b3-grey hover:text-b3-grey/80 hover:bg-b3-line border-b3-line flex size-12 items-center justify-center rounded-full border"
445
- onClick={onLogoutEnhanced}
446
- >
447
- {logoutLoading ? <Loader2 className="animate-spin" /> : <SignOutIcon size={16} className="text-b3-grey" />}
448
- </button>
449
- </div>
477
+ </button>
450
478
  </div>
451
479
  );
452
480
  };
@@ -521,7 +549,7 @@ export function ManageAccount({
521
549
  </div>
522
550
 
523
551
  <TabsContentPrimitive value="overview" className="px-4 pb-4 pt-2">
524
- <BalanceContent onLogout={onLogout} partnerId={partnerId} />
552
+ <BalanceContent onLogout={onLogout} partnerId={partnerId} showDeposit={showDeposit} showSwap={showSwap} />
525
553
  </TabsContentPrimitive>
526
554
 
527
555
  <TabsContentPrimitive value="tokens" className="px-4 pb-4 pt-2">
@@ -21,7 +21,7 @@ export type SignInWithB3Props = Omit<SignInWithB3ModalProps, "type" | "showBackB
21
21
  export function SignInWithB3(props: SignInWithB3Props) {
22
22
  const { setB3ModalOpen, setB3ModalContentType, setEcoSystemAccountAddress } = useModalStore();
23
23
  const { account } = useB3();
24
- const { isAuthenticatingV2, isAuthenticated } = useAuthentication(props.partnerId, props.loginWithSiwe);
24
+ const { isAuthenticating, isAuthenticated } = useAuthentication(props.partnerId, props.loginWithSiwe);
25
25
  const isMobile = useIsMobile();
26
26
 
27
27
  useEffect(() => {
@@ -43,7 +43,7 @@ export function SignInWithB3(props: SignInWithB3Props) {
43
43
  return <ManageAccountButton {...props} />;
44
44
  }
45
45
 
46
- if (isAuthenticatingV2) {
46
+ if (isAuthenticating) {
47
47
  return (
48
48
  <StyleRoot>
49
49
  <Button disabled style={{ backgroundColor: "#3368ef" }} className="flex items-center gap-2 text-white">
@@ -41,7 +41,6 @@ export function SignInWithB3Flow({
41
41
  const { setB3ModalContentType, setB3ModalOpen, isOpen } = useModalStore();
42
42
  const account = useActiveAccount();
43
43
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
44
- const setIsAuthenticatingV2 = useAuthStore(state => state.setIsAuthenticatingV2);
45
44
  const isAuthenticating = useAuthStore(state => state.isAuthenticating);
46
45
  const isConnected = useAuthStore(state => state.isConnected);
47
46
  const setIsConnected = useAuthStore(state => state.setIsConnected);
@@ -199,7 +198,6 @@ export function SignInWithB3Flow({
199
198
  if (loginWithSiwe) {
200
199
  debug("setIsAuthenticating:true:1");
201
200
  setIsAuthenticating(true);
202
- setIsAuthenticatingV2(true);
203
201
  const userAuth = await authenticate(account, partnerId);
204
202
  setUser(userAuth.user);
205
203
  }
@@ -207,18 +205,8 @@ export function SignInWithB3Flow({
207
205
  onLoginSuccess?.(account);
208
206
  debug("setIsAuthenticating:false:1");
209
207
  setIsAuthenticating(false);
210
- setIsAuthenticatingV2(false);
211
208
  },
212
- [
213
- loginWithSiwe,
214
- onLoginSuccess,
215
- setIsAuthenticating,
216
- authenticate,
217
- partnerId,
218
- setUser,
219
- setIsConnected,
220
- setIsAuthenticatingV2,
221
- ],
209
+ [loginWithSiwe, onLoginSuccess, authenticate, partnerId, setUser, setIsConnected, setIsAuthenticating],
222
210
  );
223
211
 
224
212
  useEffect(() => {
@@ -21,7 +21,6 @@ interface SignInWithB3PrivyProps {
21
21
  export function SignInWithB3Privy({ onSuccess, onError, partnerId, chain }: SignInWithB3PrivyProps) {
22
22
  const { isLoading, connectTw, fullToken } = useHandleConnectWithPrivy(partnerId, chain, onSuccess);
23
23
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
24
- const setIsAuthenticatingV2 = useAuthStore(state => state.setIsAuthenticatingV2);
25
24
  const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
26
25
  const { logout } = useAuthentication(partnerId);
27
26
 
@@ -49,11 +48,10 @@ export function SignInWithB3Privy({ onSuccess, onError, partnerId, chain }: Sign
49
48
  } finally {
50
49
  debug("setIsAuthenticating:false:7");
51
50
  setIsAuthenticating(false);
52
- setIsAuthenticatingV2(false);
53
51
  }
54
52
  }
55
53
  autoConnect();
56
- }, [connectTw, onSuccess, onError, setIsAuthenticating, setIsAuthenticated, logout, setIsAuthenticatingV2]);
54
+ }, [connectTw, onSuccess, onError, setIsAuthenticated, logout, setIsAuthenticating]);
57
55
 
58
56
  // Currently we auto login, so we can show loading immediately and the onSuccess will proceed to the next modal
59
57
  return (
@@ -63,7 +63,6 @@ export function LoginStep({ onSuccess, onError, partnerId, chain }: LoginStepPro
63
63
 
64
64
  const { theme } = useB3();
65
65
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
66
- const setIsAuthenticatingV2 = useAuthStore(state => state.setIsAuthenticatingV2);
67
66
  const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
68
67
  const { logout } = useAuthentication(partnerId);
69
68
 
@@ -118,7 +117,6 @@ export function LoginStep({ onSuccess, onError, partnerId, chain }: LoginStepPro
118
117
  onConnect={async wallet => {
119
118
  try {
120
119
  setIsAuthenticating(true);
121
- setIsAuthenticatingV2(true);
122
120
  debug("setIsAuthenticating:true:6");
123
121
 
124
122
  const account = wallet.getAccount();
@@ -135,7 +133,6 @@ export function LoginStep({ onSuccess, onError, partnerId, chain }: LoginStepPro
135
133
  } finally {
136
134
  debug("setIsAuthenticating:false:6");
137
135
  setIsAuthenticating(false);
138
- setIsAuthenticatingV2(false);
139
136
  }
140
137
  }}
141
138
  />
@@ -40,7 +40,6 @@ export function LoginStepCustom({
40
40
  const [showAllWallets, setShowAllWallets] = useState(false);
41
41
  const { connect } = useConnect(partnerId, chain);
42
42
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
43
- const setIsAuthenticatingV2 = useAuthStore(state => state.setIsAuthenticatingV2);
44
43
  const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
45
44
  const { logout } = useAuthentication(partnerId);
46
45
  const { connect: connectTW } = useConnectTW();
@@ -56,7 +55,6 @@ export function LoginStepCustom({
56
55
  setIsLoading(true);
57
56
  debug("setIsAuthenticating:true:3");
58
57
  setIsAuthenticating(true);
59
- setIsAuthenticatingV2(true);
60
58
  const options = getConnectOptionsFromStrategy(strategy);
61
59
  let connectResult: Wallet | null;
62
60
 
@@ -90,7 +88,6 @@ export function LoginStepCustom({
90
88
  setIsLoading(false);
91
89
  debug("setIsAuthenticating:false:3");
92
90
  setIsAuthenticating(false);
93
- setIsAuthenticatingV2(false);
94
91
  }
95
92
  };
96
93
 
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+
3
+ export interface AppleIconProps {
4
+ className?: string;
5
+ size?: number;
6
+ color?: string;
7
+ style?: React.CSSProperties;
8
+ }
9
+
10
+ export function AppleIcon({ className, size = 24, color = "currentColor", style }: AppleIconProps) {
11
+ return (
12
+ <svg
13
+ width={size}
14
+ height={size}
15
+ viewBox="0 0 41.5 51"
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ className={className}
18
+ style={style}
19
+ >
20
+ <g>
21
+ <path
22
+ fill={color}
23
+ d="M40.2,17.4c-3.4,2.1-5.5,5.7-5.5,9.7c0,4.5,2.7,8.6,6.8,10.3c-0.8,2.6-2,5-3.5,7.2c-2.2,3.1-4.5,6.3-7.9,6.3s-4.4-2-8.4-2
24
+ c-3.9,0-5.3,2.1-8.5,2.1s-5.4-2.9-7.9-6.5C2,39.5,0.1,33.7,0,27.6c0-9.9,6.4-15.2,12.8-15.2c3.4,0,6.2,2.2,8.3,2.2
25
+ c2,0,5.2-2.3,9-2.3C34.1,12.2,37.9,14.1,40.2,17.4z M28.3,8.1C30,6.1,30.9,3.6,31,1c0-0.3,0-0.7-0.1-1c-2.9,0.3-5.6,1.7-7.5,3.9
26
+ c-1.7,1.9-2.7,4.3-2.8,6.9c0,0.3,0,0.6,0.1,0.9c0.2,0,0.5,0.1,0.7,0.1C24.1,11.6,26.6,10.2,28.3,8.1z"
27
+ />
28
+ </g>
29
+ </svg>
30
+ );
31
+ }
32
+
33
+ export default AppleIcon;
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+
3
+ export interface DiscordIconProps {
4
+ className?: string;
5
+ size?: number;
6
+ color?: string;
7
+ style?: React.CSSProperties;
8
+ }
9
+
10
+ export function DiscordIcon({ className, size = 24, color = "#5865F2", style }: DiscordIconProps) {
11
+ return (
12
+ <svg
13
+ width={size}
14
+ height={size}
15
+ viewBox="0 -28.5 256 256"
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ className={className}
18
+ style={style}
19
+ preserveAspectRatio="xMidYMid"
20
+ >
21
+ <g>
22
+ <path
23
+ d="M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z"
24
+ fill={color}
25
+ fillRule="nonzero"
26
+ />
27
+ </g>
28
+ </svg>
29
+ );
30
+ }
31
+
32
+ export default DiscordIcon;
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+
3
+ export interface FarcasterIconProps {
4
+ className?: string;
5
+ size?: number;
6
+ color?: string;
7
+ style?: React.CSSProperties;
8
+ }
9
+
10
+ export function FarcasterIcon({ className, size = 24, color = "#855DCD", style }: FarcasterIconProps) {
11
+ return (
12
+ <svg
13
+ width={size}
14
+ height={size}
15
+ viewBox="0 0 1000 1000"
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ className={className}
18
+ style={style}
19
+ >
20
+ <rect width="1000" height="1000" rx="200" fill={color} />
21
+ <path
22
+ d="M257.778 155.556H742.222V844.444H671.111V528.889H670.414C662.554 441.677 589.258 373.333 500 373.333C410.742 373.333 337.446 441.677 329.586 528.889H328.889V844.444H257.778V155.556Z"
23
+ fill="white"
24
+ />
25
+ <path
26
+ d="M128.889 253.333L157.778 351.111H182.222V746.667C169.949 746.667 160 756.616 160 768.889V795.556H155.556C143.283 795.556 133.333 805.505 133.333 817.778V844.444H382.222V817.778C382.222 805.505 372.273 795.556 360 795.556H355.556V768.889C355.556 756.616 345.606 746.667 333.333 746.667H306.667V253.333H128.889Z"
27
+ fill="white"
28
+ />
29
+ <path
30
+ d="M675.556 746.667C663.283 746.667 653.333 756.616 653.333 768.889V795.556H648.889C636.616 795.556 626.667 805.505 626.667 817.778V844.444H875.556V817.778C875.556 805.505 865.606 795.556 853.333 795.556H848.889V768.889C848.889 756.616 838.94 746.667 826.667 746.667V351.111H851.111L880 253.333H702.222V746.667H675.556Z"
31
+ fill="white"
32
+ />
33
+ </svg>
34
+ );
35
+ }
36
+
37
+ export default FarcasterIcon;
@@ -0,0 +1,40 @@
1
+ import React from "react";
2
+
3
+ export interface GoogleIconProps {
4
+ className?: string;
5
+ size?: number;
6
+ style?: React.CSSProperties;
7
+ }
8
+
9
+ export function GoogleIcon({ className, size = 24, style }: GoogleIconProps) {
10
+ return (
11
+ <svg
12
+ width={size}
13
+ height={size}
14
+ viewBox="0 0 48 48"
15
+ xmlns="http://www.w3.org/2000/svg"
16
+ className={className}
17
+ style={style}
18
+ >
19
+ <path
20
+ fill="#EA4335"
21
+ d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"
22
+ />
23
+ <path
24
+ fill="#4285F4"
25
+ d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"
26
+ />
27
+ <path
28
+ fill="#FBBC05"
29
+ d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"
30
+ />
31
+ <path
32
+ fill="#34A853"
33
+ d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"
34
+ />
35
+ <path fill="none" d="M0 0h48v48H0z" />
36
+ </svg>
37
+ );
38
+ }
39
+
40
+ export default GoogleIcon;
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+
3
+ export interface XIconProps {
4
+ className?: string;
5
+ size?: number;
6
+ color?: string;
7
+ style?: React.CSSProperties;
8
+ }
9
+
10
+ export function XIcon({ className, size = 24, color = "currentColor", style }: XIconProps) {
11
+ return (
12
+ <svg
13
+ width={size}
14
+ height={size}
15
+ viewBox="0 0 300 300.251"
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ className={className}
18
+ style={style}
19
+ >
20
+ <path
21
+ d="M178.57 127.15 290.27 0h-26.46l-97.03 110.38L89.34 0H0l117.13 166.93L0 300.25h26.46l102.4-116.59 81.8 116.59h89.34M36.01 19.54H76.66l187.13 262.13h-40.66"
22
+ fill={color}
23
+ />
24
+ </svg>
25
+ );
26
+ }
27
+
28
+ export default XIcon;