@b3dotfun/sdk 0.1.69-alpha.2 → 0.1.69-alpha.21

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 (382) hide show
  1. package/dist/cjs/anyspend/constants/rpc.d.ts +1 -1
  2. package/dist/cjs/anyspend/constants/rpc.js +1 -1
  3. package/dist/cjs/anyspend/react/components/AnySpendNFT.js +2 -2
  4. package/dist/cjs/anyspend/react/components/AnySpendStakeB3.js +1 -1
  5. package/dist/cjs/anyspend/react/components/AnySpendStakeB3ExactIn.js +1 -1
  6. package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckout.d.ts +3 -1
  7. package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckout.js +15 -6
  8. package/dist/cjs/anyspend/react/components/checkout/CartItemRow.d.ts +2 -1
  9. package/dist/cjs/anyspend/react/components/checkout/CartSummary.d.ts +6 -4
  10. package/dist/cjs/anyspend/react/components/checkout/CartSummary.js +13 -11
  11. package/dist/cjs/anyspend/react/components/checkout/CheckoutCartPanel.d.ts +3 -1
  12. package/dist/cjs/anyspend/react/components/checkout/CheckoutCartPanel.js +5 -4
  13. package/dist/cjs/anyspend/react/components/checkout/CheckoutFormPanel.d.ts +3 -1
  14. package/dist/cjs/anyspend/react/components/checkout/CheckoutFormPanel.js +2 -2
  15. package/dist/cjs/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -4
  16. package/dist/cjs/anyspend/react/components/checkout/CheckoutSuccess.d.ts +2 -1
  17. package/dist/cjs/anyspend/react/components/checkout/CheckoutSuccess.js +5 -3
  18. package/dist/cjs/anyspend/react/components/checkout/CryptoPayPanel.js +43 -23
  19. package/dist/cjs/anyspend/react/components/checkout/DiscountCodeInput.d.ts +3 -1
  20. package/dist/cjs/anyspend/react/components/checkout/DiscountCodeInput.js +3 -6
  21. package/dist/cjs/anyspend/react/components/checkout/FiatCheckoutPanel.js +1 -2
  22. package/dist/cjs/anyspend/react/components/checkout/KycGate.js +1 -2
  23. package/dist/cjs/anyspend/react/components/checkout/PriceSkeleton.d.ts +5 -0
  24. package/dist/cjs/anyspend/react/components/checkout/PriceSkeleton.js +9 -0
  25. package/dist/cjs/anyspend/react/components/checkout/ShippingSelector.d.ts +3 -1
  26. package/dist/cjs/anyspend/react/components/checkout/ShippingSelector.js +3 -2
  27. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +8 -0
  28. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +10 -9
  29. package/dist/cjs/anyspend/react/components/common/InsufficientDepositPayment.js +2 -2
  30. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +7 -2
  31. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +2 -2
  32. package/dist/cjs/anyspend/react/components/common/OrderStatus.js +37 -6
  33. package/dist/cjs/anyspend/react/components/common/StepProgress.d.ts +2 -0
  34. package/dist/cjs/anyspend/react/components/common/StepProgress.js +7 -2
  35. package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.js +2 -2
  36. package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +4 -6
  37. package/dist/cjs/anyspend/react/hooks/useKycStatus.d.ts +3 -1
  38. package/dist/cjs/anyspend/react/hooks/useKycStatus.js +11 -7
  39. package/dist/cjs/anyspend/utils/chain.js +8 -7
  40. package/dist/cjs/app.shared.js +9 -7
  41. package/dist/cjs/global-account/better-auth-client.d.ts +1883 -0
  42. package/dist/cjs/global-account/better-auth-client.js +17 -0
  43. package/dist/cjs/global-account/bsmnt.d.ts +0 -1
  44. package/dist/cjs/global-account/bsmnt.js +0 -6
  45. package/dist/cjs/global-account/react/components/B3DynamicModal.js +5 -2
  46. package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +4 -1
  47. package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.js +2 -1
  48. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.d.ts +8 -1
  49. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.js +9 -12
  50. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.native.js +6 -8
  51. package/dist/cjs/global-account/react/components/B3Provider/BetterAuthProvider.d.ts +16 -0
  52. package/dist/cjs/global-account/react/components/B3Provider/BetterAuthProvider.js +120 -0
  53. package/dist/cjs/global-account/react/components/B3Provider/LocalSDKProvider.d.ts +3 -1
  54. package/dist/cjs/global-account/react/components/B3Provider/LocalSDKProvider.js +3 -1
  55. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +3 -1
  56. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +4 -2
  57. package/dist/cjs/global-account/react/components/LinkAccount/LinkedAccountItem.js +2 -1
  58. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +15 -6
  59. package/dist/cjs/global-account/react/components/ManageAccount/SessionDurationContent.d.ts +5 -0
  60. package/dist/cjs/global-account/react/components/ManageAccount/SessionDurationContent.js +57 -0
  61. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +12 -29
  62. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +2 -2
  63. package/dist/cjs/global-account/react/components/Send/Send.js +5 -2
  64. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthResetPassword.d.ts +21 -0
  65. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthResetPassword.js +67 -0
  66. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +34 -0
  67. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +163 -0
  68. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +13 -4
  69. package/dist/cjs/global-account/react/components/SignInWithB3/components/AuthButton.js +10 -1
  70. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +6 -0
  71. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +138 -0
  72. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +96 -15
  73. package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
  74. package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.js +20 -3
  75. package/dist/cjs/global-account/react/components/SingleUserSearchSelector/SingleUserSearchSelector.js +2 -1
  76. package/dist/cjs/global-account/react/components/Toast/ToastContext.d.ts +3 -0
  77. package/dist/cjs/global-account/react/components/Toast/ToastContext.js +30 -7
  78. package/dist/cjs/global-account/react/components/custom/Button.d.ts +1 -1
  79. package/dist/cjs/global-account/react/components/index.d.ts +3 -0
  80. package/dist/cjs/global-account/react/components/index.js +7 -3
  81. package/dist/cjs/global-account/react/components/ui/button.d.ts +1 -1
  82. package/dist/cjs/global-account/react/hooks/index.d.ts +1 -0
  83. package/dist/cjs/global-account/react/hooks/index.js +5 -2
  84. package/dist/cjs/global-account/react/hooks/useAuth.js +26 -15
  85. package/dist/cjs/global-account/react/hooks/useAuthentication.js +23 -12
  86. package/dist/cjs/global-account/react/hooks/useBetterAuth.d.ts +973 -0
  87. package/dist/cjs/global-account/react/hooks/useBetterAuth.js +157 -0
  88. package/dist/cjs/global-account/react/hooks/useConnect.d.ts +2 -2
  89. package/dist/cjs/global-account/react/hooks/useFirstEOA.d.ts +8 -8
  90. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +10 -1
  91. package/dist/cjs/global-account/react/utils/createWagmiConfig.d.ts +4 -31
  92. package/dist/cjs/global-account/react/utils/createWagmiConfig.js +5 -24
  93. package/dist/cjs/global-account/react/utils/index.d.ts +0 -1
  94. package/dist/cjs/global-account/react/utils/index.js +0 -1
  95. package/dist/cjs/global-account/react/utils/profileDisplay.js +17 -18
  96. package/dist/cjs/shared/constants/chains/b3Chain.d.ts +7 -7
  97. package/dist/cjs/shared/constants/chains/b3Chain.js +4 -4
  98. package/dist/cjs/shared/constants/chains/b3Viem.d.ts +6 -0
  99. package/dist/cjs/shared/constants/chains/b3Viem.js +19 -0
  100. package/dist/cjs/shared/constants/chains/supported.d.ts +1 -1
  101. package/dist/cjs/shared/generated/chain-networks.json +2 -2
  102. package/dist/cjs/shared/utils/chains.d.ts +1 -1
  103. package/dist/cjs/shared/utils/chains.js +2 -2
  104. package/dist/cjs/shared/utils/session-duration.d.ts +15 -0
  105. package/dist/cjs/shared/utils/session-duration.js +69 -0
  106. package/dist/cjs/wallet/react/components/ConnectWallet.d.ts +11 -0
  107. package/dist/cjs/wallet/react/components/ConnectWallet.js +467 -0
  108. package/dist/cjs/wallet/react/components/WalletProvider.d.ts +35 -0
  109. package/dist/cjs/wallet/react/components/WalletProvider.js +20 -0
  110. package/dist/cjs/wallet/react/hooks/useWalletDisconnect.d.ts +13 -0
  111. package/dist/cjs/wallet/react/hooks/useWalletDisconnect.js +22 -0
  112. package/dist/cjs/wallet/react/hooks/useWalletState.d.ts +31 -0
  113. package/dist/cjs/wallet/react/hooks/useWalletState.js +63 -0
  114. package/dist/cjs/wallet/react/index.d.ts +5 -0
  115. package/dist/cjs/wallet/react/index.js +16 -0
  116. package/dist/cjs/wallet/utils/createWalletConfig.d.ts +21 -0
  117. package/dist/cjs/wallet/utils/createWalletConfig.js +24 -0
  118. package/dist/esm/anyspend/constants/rpc.d.ts +1 -1
  119. package/dist/esm/anyspend/constants/rpc.js +1 -1
  120. package/dist/esm/anyspend/react/components/AnySpendNFT.js +2 -2
  121. package/dist/esm/anyspend/react/components/AnySpendStakeB3.js +2 -2
  122. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.js +2 -2
  123. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.d.ts +3 -1
  124. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.js +15 -6
  125. package/dist/esm/anyspend/react/components/checkout/CartItemRow.d.ts +2 -1
  126. package/dist/esm/anyspend/react/components/checkout/CartSummary.d.ts +6 -4
  127. package/dist/esm/anyspend/react/components/checkout/CartSummary.js +13 -11
  128. package/dist/esm/anyspend/react/components/checkout/CheckoutCartPanel.d.ts +3 -1
  129. package/dist/esm/anyspend/react/components/checkout/CheckoutCartPanel.js +5 -4
  130. package/dist/esm/anyspend/react/components/checkout/CheckoutFormPanel.d.ts +3 -1
  131. package/dist/esm/anyspend/react/components/checkout/CheckoutFormPanel.js +2 -2
  132. package/dist/esm/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -4
  133. package/dist/esm/anyspend/react/components/checkout/CheckoutSuccess.d.ts +2 -1
  134. package/dist/esm/anyspend/react/components/checkout/CheckoutSuccess.js +5 -3
  135. package/dist/esm/anyspend/react/components/checkout/CryptoPayPanel.js +44 -24
  136. package/dist/esm/anyspend/react/components/checkout/DiscountCodeInput.d.ts +3 -1
  137. package/dist/esm/anyspend/react/components/checkout/DiscountCodeInput.js +3 -6
  138. package/dist/esm/anyspend/react/components/checkout/FiatCheckoutPanel.js +2 -3
  139. package/dist/esm/anyspend/react/components/checkout/KycGate.js +2 -3
  140. package/dist/esm/anyspend/react/components/checkout/PriceSkeleton.d.ts +5 -0
  141. package/dist/esm/anyspend/react/components/checkout/PriceSkeleton.js +6 -0
  142. package/dist/esm/anyspend/react/components/checkout/ShippingSelector.d.ts +3 -1
  143. package/dist/esm/anyspend/react/components/checkout/ShippingSelector.js +3 -2
  144. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +8 -0
  145. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +9 -8
  146. package/dist/esm/anyspend/react/components/common/InsufficientDepositPayment.js +2 -2
  147. package/dist/esm/anyspend/react/components/common/OrderDetails.js +8 -3
  148. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +2 -2
  149. package/dist/esm/anyspend/react/components/common/OrderStatus.js +34 -3
  150. package/dist/esm/anyspend/react/components/common/StepProgress.d.ts +2 -0
  151. package/dist/esm/anyspend/react/components/common/StepProgress.js +4 -2
  152. package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.js +2 -2
  153. package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +5 -7
  154. package/dist/esm/anyspend/react/hooks/useKycStatus.d.ts +3 -1
  155. package/dist/esm/anyspend/react/hooks/useKycStatus.js +9 -5
  156. package/dist/esm/anyspend/utils/chain.js +10 -9
  157. package/dist/esm/app.shared.js +9 -7
  158. package/dist/esm/global-account/better-auth-client.d.ts +1883 -0
  159. package/dist/esm/global-account/better-auth-client.js +13 -0
  160. package/dist/esm/global-account/bsmnt.d.ts +0 -1
  161. package/dist/esm/global-account/bsmnt.js +0 -5
  162. package/dist/esm/global-account/react/components/B3DynamicModal.js +5 -2
  163. package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +4 -1
  164. package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.js +2 -1
  165. package/dist/esm/global-account/react/components/B3Provider/B3Provider.d.ts +8 -1
  166. package/dist/esm/global-account/react/components/B3Provider/B3Provider.js +4 -7
  167. package/dist/esm/global-account/react/components/B3Provider/B3Provider.native.js +4 -6
  168. package/dist/esm/global-account/react/components/B3Provider/BetterAuthProvider.d.ts +16 -0
  169. package/dist/esm/global-account/react/components/B3Provider/BetterAuthProvider.js +115 -0
  170. package/dist/esm/global-account/react/components/B3Provider/LocalSDKProvider.d.ts +3 -1
  171. package/dist/esm/global-account/react/components/B3Provider/LocalSDKProvider.js +3 -1
  172. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +3 -1
  173. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +4 -2
  174. package/dist/esm/global-account/react/components/LinkAccount/LinkedAccountItem.js +2 -1
  175. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +13 -7
  176. package/dist/esm/global-account/react/components/ManageAccount/SessionDurationContent.d.ts +5 -0
  177. package/dist/esm/global-account/react/components/ManageAccount/SessionDurationContent.js +52 -0
  178. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +12 -29
  179. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +2 -2
  180. package/dist/esm/global-account/react/components/Send/Send.js +5 -2
  181. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthResetPassword.d.ts +21 -0
  182. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthResetPassword.js +64 -0
  183. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +34 -0
  184. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +160 -0
  185. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +13 -4
  186. package/dist/esm/global-account/react/components/SignInWithB3/components/AuthButton.js +11 -2
  187. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +6 -0
  188. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +135 -0
  189. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +100 -19
  190. package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
  191. package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.js +19 -2
  192. package/dist/esm/global-account/react/components/SingleUserSearchSelector/SingleUserSearchSelector.js +2 -1
  193. package/dist/esm/global-account/react/components/Toast/ToastContext.d.ts +3 -0
  194. package/dist/esm/global-account/react/components/Toast/ToastContext.js +30 -7
  195. package/dist/esm/global-account/react/components/custom/Button.d.ts +1 -1
  196. package/dist/esm/global-account/react/components/index.d.ts +3 -0
  197. package/dist/esm/global-account/react/components/index.js +2 -0
  198. package/dist/esm/global-account/react/components/ui/button.d.ts +1 -1
  199. package/dist/esm/global-account/react/hooks/index.d.ts +1 -0
  200. package/dist/esm/global-account/react/hooks/index.js +1 -0
  201. package/dist/esm/global-account/react/hooks/useAuth.js +28 -17
  202. package/dist/esm/global-account/react/hooks/useAuthentication.js +24 -13
  203. package/dist/esm/global-account/react/hooks/useBetterAuth.d.ts +973 -0
  204. package/dist/esm/global-account/react/hooks/useBetterAuth.js +149 -0
  205. package/dist/esm/global-account/react/hooks/useConnect.d.ts +2 -2
  206. package/dist/esm/global-account/react/hooks/useFirstEOA.d.ts +8 -8
  207. package/dist/esm/global-account/react/stores/useModalStore.d.ts +10 -1
  208. package/dist/esm/global-account/react/utils/createWagmiConfig.d.ts +4 -31
  209. package/dist/esm/global-account/react/utils/createWagmiConfig.js +5 -23
  210. package/dist/esm/global-account/react/utils/index.d.ts +0 -1
  211. package/dist/esm/global-account/react/utils/index.js +0 -1
  212. package/dist/esm/global-account/react/utils/profileDisplay.js +17 -18
  213. package/dist/esm/shared/constants/chains/b3Chain.d.ts +7 -7
  214. package/dist/esm/shared/constants/chains/b3Chain.js +4 -4
  215. package/dist/esm/shared/constants/chains/b3Viem.d.ts +6 -0
  216. package/dist/esm/shared/constants/chains/b3Viem.js +16 -0
  217. package/dist/esm/shared/constants/chains/supported.d.ts +1 -1
  218. package/dist/esm/shared/generated/chain-networks.json +2 -2
  219. package/dist/esm/shared/utils/chains.d.ts +1 -1
  220. package/dist/esm/shared/utils/chains.js +2 -2
  221. package/dist/esm/shared/utils/session-duration.d.ts +15 -0
  222. package/dist/esm/shared/utils/session-duration.js +64 -0
  223. package/dist/esm/wallet/react/components/ConnectWallet.d.ts +11 -0
  224. package/dist/esm/wallet/react/components/ConnectWallet.js +431 -0
  225. package/dist/esm/wallet/react/components/WalletProvider.d.ts +35 -0
  226. package/dist/esm/wallet/react/components/WalletProvider.js +17 -0
  227. package/dist/esm/wallet/react/hooks/useWalletDisconnect.d.ts +13 -0
  228. package/dist/esm/wallet/react/hooks/useWalletDisconnect.js +19 -0
  229. package/dist/esm/wallet/react/hooks/useWalletState.d.ts +31 -0
  230. package/dist/esm/wallet/react/hooks/useWalletState.js +60 -0
  231. package/dist/esm/wallet/react/index.d.ts +5 -0
  232. package/dist/esm/wallet/react/index.js +8 -0
  233. package/dist/esm/wallet/utils/createWalletConfig.d.ts +21 -0
  234. package/dist/esm/wallet/utils/createWalletConfig.js +21 -0
  235. package/dist/styles/index.css +1 -1
  236. package/dist/types/anyspend/constants/rpc.d.ts +1 -1
  237. package/dist/types/anyspend/react/components/checkout/AnySpendCheckout.d.ts +3 -1
  238. package/dist/types/anyspend/react/components/checkout/CartItemRow.d.ts +2 -1
  239. package/dist/types/anyspend/react/components/checkout/CartSummary.d.ts +6 -4
  240. package/dist/types/anyspend/react/components/checkout/CheckoutCartPanel.d.ts +3 -1
  241. package/dist/types/anyspend/react/components/checkout/CheckoutFormPanel.d.ts +3 -1
  242. package/dist/types/anyspend/react/components/checkout/CheckoutSuccess.d.ts +2 -1
  243. package/dist/types/anyspend/react/components/checkout/DiscountCodeInput.d.ts +3 -1
  244. package/dist/types/anyspend/react/components/checkout/PriceSkeleton.d.ts +5 -0
  245. package/dist/types/anyspend/react/components/checkout/ShippingSelector.d.ts +3 -1
  246. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +8 -0
  247. package/dist/types/anyspend/react/components/common/StepProgress.d.ts +2 -0
  248. package/dist/types/anyspend/react/hooks/useKycStatus.d.ts +3 -1
  249. package/dist/types/global-account/better-auth-client.d.ts +1883 -0
  250. package/dist/types/global-account/bsmnt.d.ts +0 -1
  251. package/dist/types/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +4 -1
  252. package/dist/types/global-account/react/components/B3Provider/B3Provider.d.ts +8 -1
  253. package/dist/types/global-account/react/components/B3Provider/BetterAuthProvider.d.ts +16 -0
  254. package/dist/types/global-account/react/components/B3Provider/LocalSDKProvider.d.ts +3 -1
  255. package/dist/types/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +3 -1
  256. package/dist/types/global-account/react/components/ManageAccount/SessionDurationContent.d.ts +5 -0
  257. package/dist/types/global-account/react/components/SignInWithB3/BetterAuthResetPassword.d.ts +21 -0
  258. package/dist/types/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +34 -0
  259. package/dist/types/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +6 -0
  260. package/dist/types/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
  261. package/dist/types/global-account/react/components/Toast/ToastContext.d.ts +3 -0
  262. package/dist/types/global-account/react/components/custom/Button.d.ts +1 -1
  263. package/dist/types/global-account/react/components/index.d.ts +3 -0
  264. package/dist/types/global-account/react/components/ui/button.d.ts +1 -1
  265. package/dist/types/global-account/react/hooks/index.d.ts +1 -0
  266. package/dist/types/global-account/react/hooks/useBetterAuth.d.ts +973 -0
  267. package/dist/types/global-account/react/hooks/useConnect.d.ts +2 -2
  268. package/dist/types/global-account/react/hooks/useFirstEOA.d.ts +8 -8
  269. package/dist/types/global-account/react/stores/useModalStore.d.ts +10 -1
  270. package/dist/types/global-account/react/utils/createWagmiConfig.d.ts +4 -31
  271. package/dist/types/global-account/react/utils/index.d.ts +0 -1
  272. package/dist/types/shared/constants/chains/b3Chain.d.ts +7 -7
  273. package/dist/types/shared/constants/chains/b3Viem.d.ts +6 -0
  274. package/dist/types/shared/constants/chains/supported.d.ts +1 -1
  275. package/dist/types/shared/utils/chains.d.ts +1 -1
  276. package/dist/types/shared/utils/session-duration.d.ts +15 -0
  277. package/dist/types/wallet/react/components/ConnectWallet.d.ts +11 -0
  278. package/dist/types/wallet/react/components/WalletProvider.d.ts +35 -0
  279. package/dist/types/wallet/react/hooks/useWalletDisconnect.d.ts +13 -0
  280. package/dist/types/wallet/react/hooks/useWalletState.d.ts +31 -0
  281. package/dist/types/wallet/react/index.d.ts +5 -0
  282. package/dist/types/wallet/utils/createWalletConfig.d.ts +21 -0
  283. package/package.json +15 -6
  284. package/src/anyspend/constants/rpc.ts +2 -1
  285. package/src/anyspend/react/components/AnySpendNFT.tsx +2 -2
  286. package/src/anyspend/react/components/AnySpendStakeB3.tsx +2 -2
  287. package/src/anyspend/react/components/AnySpendStakeB3ExactIn.tsx +2 -2
  288. package/src/anyspend/react/components/checkout/AnySpendCheckout.tsx +25 -5
  289. package/src/anyspend/react/components/checkout/CartItemRow.tsx +2 -1
  290. package/src/anyspend/react/components/checkout/CartSummary.tsx +24 -20
  291. package/src/anyspend/react/components/checkout/CheckoutCartPanel.tsx +12 -3
  292. package/src/anyspend/react/components/checkout/CheckoutFormPanel.tsx +5 -0
  293. package/src/anyspend/react/components/checkout/CheckoutPaymentPanel.tsx +2 -4
  294. package/src/anyspend/react/components/checkout/CheckoutSuccess.tsx +13 -3
  295. package/src/anyspend/react/components/checkout/CryptoPayPanel.tsx +45 -27
  296. package/src/anyspend/react/components/checkout/DiscountCodeInput.tsx +15 -5
  297. package/src/anyspend/react/components/checkout/FiatCheckoutPanel.tsx +9 -3
  298. package/src/anyspend/react/components/checkout/KycGate.tsx +8 -3
  299. package/src/anyspend/react/components/checkout/PriceSkeleton.tsx +19 -0
  300. package/src/anyspend/react/components/checkout/ShippingSelector.tsx +5 -1
  301. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +10 -8
  302. package/src/anyspend/react/components/common/InsufficientDepositPayment.tsx +2 -2
  303. package/src/anyspend/react/components/common/OrderDetails.tsx +10 -2
  304. package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +4 -4
  305. package/src/anyspend/react/components/common/OrderStatus.tsx +38 -3
  306. package/src/anyspend/react/components/common/StepProgress.tsx +15 -5
  307. package/src/anyspend/react/components/common/TransferCryptoDetails.tsx +2 -2
  308. package/src/anyspend/react/hooks/useAnyspendCreateOnrampOrder.ts +5 -7
  309. package/src/anyspend/react/hooks/useKycStatus.ts +8 -5
  310. package/src/anyspend/utils/chain.ts +9 -9
  311. package/src/app.shared.ts +9 -8
  312. package/src/global-account/better-auth-client.ts +17 -0
  313. package/src/global-account/bsmnt.ts +0 -6
  314. package/src/global-account/react/components/B3DynamicModal.tsx +5 -2
  315. package/src/global-account/react/components/B3Provider/B3ConfigProvider.tsx +6 -0
  316. package/src/global-account/react/components/B3Provider/B3Provider.native.tsx +16 -21
  317. package/src/global-account/react/components/B3Provider/B3Provider.tsx +52 -40
  318. package/src/global-account/react/components/B3Provider/BetterAuthProvider.tsx +127 -0
  319. package/src/global-account/react/components/B3Provider/LocalSDKProvider.tsx +5 -0
  320. package/src/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.tsx +17 -10
  321. package/src/global-account/react/components/LinkAccount/LinkedAccountItem.tsx +2 -1
  322. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +29 -11
  323. package/src/global-account/react/components/ManageAccount/SessionDurationContent.tsx +107 -0
  324. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +28 -30
  325. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +2 -2
  326. package/src/global-account/react/components/Send/Send.tsx +8 -5
  327. package/src/global-account/react/components/SignInWithB3/BetterAuthResetPassword.tsx +146 -0
  328. package/src/global-account/react/components/SignInWithB3/BetterAuthSignIn.tsx +426 -0
  329. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +13 -4
  330. package/src/global-account/react/components/SignInWithB3/components/AuthButton.tsx +21 -2
  331. package/src/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.tsx +308 -0
  332. package/src/global-account/react/components/SignInWithB3/steps/LoginStepCustom.tsx +207 -54
  333. package/src/global-account/react/components/SignInWithB3/utils/signInUtils.ts +24 -4
  334. package/src/global-account/react/components/SingleUserSearchSelector/SingleUserSearchSelector.tsx +2 -1
  335. package/src/global-account/react/components/Toast/ToastContext.tsx +39 -7
  336. package/src/global-account/react/components/index.ts +3 -0
  337. package/src/global-account/react/hooks/index.ts +1 -0
  338. package/src/global-account/react/hooks/useAuth.ts +28 -17
  339. package/src/global-account/react/hooks/useAuthentication.ts +24 -13
  340. package/src/global-account/react/hooks/useBetterAuth.ts +191 -0
  341. package/src/global-account/react/hooks/useConnect.tsx +2 -2
  342. package/src/global-account/react/stores/useModalStore.ts +11 -0
  343. package/src/global-account/react/utils/createWagmiConfig.tsx +6 -25
  344. package/src/global-account/react/utils/index.ts +0 -1
  345. package/src/global-account/react/utils/profileDisplay.ts +21 -19
  346. package/src/shared/constants/chains/b3Chain.ts +5 -5
  347. package/src/shared/constants/chains/b3Viem.ts +18 -0
  348. package/src/shared/generated/chain-networks.json +2 -2
  349. package/src/shared/utils/chains.ts +3 -2
  350. package/src/shared/utils/session-duration.ts +64 -0
  351. package/src/types/torph.d.ts +4 -0
  352. package/src/wallet/__tests__/createWalletConfig.test.ts +39 -0
  353. package/src/wallet/react/components/ConnectWallet.tsx +665 -0
  354. package/src/wallet/react/components/WalletProvider.tsx +64 -0
  355. package/src/wallet/react/hooks/useWalletDisconnect.ts +22 -0
  356. package/src/wallet/react/hooks/useWalletState.ts +93 -0
  357. package/src/wallet/react/index.ts +10 -0
  358. package/src/wallet/utils/createWalletConfig.ts +39 -0
  359. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +0 -6
  360. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.js +0 -54
  361. package/dist/cjs/global-account/react/components/ProfileAvatar.d.ts +0 -0
  362. package/dist/cjs/global-account/react/components/ProfileAvatar.js +0 -127
  363. package/dist/cjs/global-account/react/hooks/useRPMToken.d.ts +0 -7
  364. package/dist/cjs/global-account/react/hooks/useRPMToken.js +0 -11
  365. package/dist/cjs/global-account/react/utils/updateAvatar.d.ts +0 -4
  366. package/dist/cjs/global-account/react/utils/updateAvatar.js +0 -54
  367. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +0 -6
  368. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.js +0 -51
  369. package/dist/esm/global-account/react/components/ProfileAvatar.d.ts +0 -0
  370. package/dist/esm/global-account/react/components/ProfileAvatar.js +0 -127
  371. package/dist/esm/global-account/react/hooks/useRPMToken.d.ts +0 -7
  372. package/dist/esm/global-account/react/hooks/useRPMToken.js +0 -8
  373. package/dist/esm/global-account/react/utils/updateAvatar.d.ts +0 -4
  374. package/dist/esm/global-account/react/utils/updateAvatar.js +0 -18
  375. package/dist/types/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +0 -6
  376. package/dist/types/global-account/react/components/ProfileAvatar.d.ts +0 -0
  377. package/dist/types/global-account/react/hooks/useRPMToken.d.ts +0 -7
  378. package/dist/types/global-account/react/utils/updateAvatar.d.ts +0 -4
  379. package/src/global-account/react/components/AvatarCreator/AvatarCreator.tsx +0 -90
  380. package/src/global-account/react/components/ProfileAvatar.tsx +0 -138
  381. package/src/global-account/react/hooks/useRPMToken.ts +0 -17
  382. package/src/global-account/react/utils/updateAvatar.ts +0 -21
@@ -1,5 +1,11 @@
1
1
  import { Button } from "../../custom/Button";
2
- import { strategyIcons } from "../utils/signInUtils";
2
+ import { Github, Mail } from "lucide-react";
3
+ import { strategyIcons, strategyLabels } from "../utils/signInUtils";
4
+
5
+ const fallbackIcons = {
6
+ github: Github,
7
+ email: Mail,
8
+ } as const;
3
9
 
4
10
  export function AuthButton({
5
11
  strategy,
@@ -10,14 +16,27 @@ export function AuthButton({
10
16
  onClick: () => void;
11
17
  isLoading: boolean;
12
18
  }) {
19
+ const strategyIcon = strategyIcons[strategy];
20
+ const strategyLabel = strategyLabels[strategy] || strategy;
21
+ const FallbackIcon = fallbackIcons[strategy as keyof typeof fallbackIcons];
22
+ const buttonLabel = `Sign in with ${strategyLabel}`;
23
+
13
24
  return (
14
25
  <Button
15
26
  key={strategy}
16
27
  onClick={onClick}
17
28
  disabled={isLoading}
29
+ aria-label={buttonLabel}
30
+ title={buttonLabel}
18
31
  className="flex w-full items-center justify-center bg-gray-100 px-2 py-3 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700"
19
32
  >
20
- <img src={strategyIcons[strategy]} className="h-9 w-9" />
33
+ {strategyIcon ? (
34
+ <img src={strategyIcon} alt={`${strategyLabel} icon`} className="h-9 w-9" />
35
+ ) : FallbackIcon ? (
36
+ <FallbackIcon className="h-9 w-9 text-gray-900 dark:text-gray-100" />
37
+ ) : (
38
+ <span className="text-sm font-semibold text-gray-900 dark:text-gray-100">{strategyLabel.charAt(0)}</span>
39
+ )}
21
40
  </Button>
22
41
  );
23
42
  }
@@ -0,0 +1,308 @@
1
+ import { Button, Input, LoginStepContainer, useB3Config } from "@b3dotfun/sdk/global-account/react";
2
+ import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
3
+ import { useState } from "react";
4
+ import {
5
+ EmailVerificationRequiredError,
6
+ type BetterAuthSocialProvider,
7
+ useBetterAuth,
8
+ } from "../../../hooks/useBetterAuth";
9
+ import { AuthButton } from "../components/AuthButton";
10
+
11
+ const debug = debugB3React("LoginStepBetterAuth");
12
+ const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
13
+
14
+ const SOCIAL_PROVIDERS: { id: BetterAuthSocialProvider; label: string }[] = [
15
+ { id: "google", label: "Google" },
16
+ { id: "github", label: "GitHub" },
17
+ { id: "discord", label: "Discord" },
18
+ { id: "microsoft", label: "Microsoft" },
19
+ { id: "slack", label: "Slack" },
20
+ ];
21
+
22
+ interface LoginStepBetterAuthProps {
23
+ onSuccess?: () => void;
24
+ onError?: (error: Error) => Promise<void>;
25
+ }
26
+
27
+ export function LoginStepBetterAuth({ onSuccess, onError }: LoginStepBetterAuthProps) {
28
+ const { partnerId } = useB3Config();
29
+ const { signInWithEmail, signUpWithEmail, signInWithSocial, requestPasswordReset } = useBetterAuth();
30
+
31
+ const [mode, setMode] = useState<"sign-in" | "sign-up" | "forgot-password">("sign-in");
32
+ const [showEmailForm, setShowEmailForm] = useState(false);
33
+ const [email, setEmail] = useState("");
34
+ const [password, setPassword] = useState("");
35
+ const [name, setName] = useState("");
36
+ const [isLoading, setIsLoading] = useState(false);
37
+ const [error, setError] = useState<string | null>(null);
38
+ const [resetEmailSent, setResetEmailSent] = useState(false);
39
+ const [verificationSent, setVerificationSent] = useState(false);
40
+
41
+ const handleEmailSubmit = async () => {
42
+ const normalizedEmail = email.trim().toLowerCase();
43
+
44
+ if (!EMAIL_REGEX.test(normalizedEmail)) {
45
+ setError("Please enter a valid email address");
46
+ return;
47
+ }
48
+
49
+ if (!password) {
50
+ setError("Please enter a password");
51
+ return;
52
+ }
53
+
54
+ if (mode === "sign-up" && !name.trim()) {
55
+ setError("Please enter your name");
56
+ return;
57
+ }
58
+
59
+ try {
60
+ setIsLoading(true);
61
+ setError(null);
62
+
63
+ if (mode === "sign-up") {
64
+ debug("Signing up", { email: normalizedEmail, name: name.trim() });
65
+ await signUpWithEmail(normalizedEmail, password, name.trim());
66
+ } else {
67
+ debug("Signing in", { email: normalizedEmail });
68
+ await signInWithEmail(normalizedEmail, password);
69
+ }
70
+
71
+ debug("Auth successful");
72
+ onSuccess?.();
73
+ } catch (err) {
74
+ if (err instanceof EmailVerificationRequiredError) {
75
+ setVerificationSent(true);
76
+ setError(null);
77
+ } else {
78
+ const message = err instanceof Error ? err.message : "Authentication failed";
79
+ setError(message);
80
+ await onError?.(err as Error);
81
+ }
82
+ debug("Auth failed", err);
83
+ } finally {
84
+ setPassword("");
85
+ setIsLoading(false);
86
+ }
87
+ };
88
+
89
+ const handleForgotPassword = async () => {
90
+ const normalizedEmail = email.trim().toLowerCase();
91
+
92
+ if (!EMAIL_REGEX.test(normalizedEmail)) {
93
+ setError("Please enter a valid email address");
94
+ return;
95
+ }
96
+
97
+ try {
98
+ setIsLoading(true);
99
+ setError(null);
100
+ await requestPasswordReset(normalizedEmail);
101
+ setResetEmailSent(true);
102
+ } catch (err) {
103
+ const message = err instanceof Error ? err.message : "Failed to send reset email";
104
+ setError(message);
105
+ } finally {
106
+ setIsLoading(false);
107
+ }
108
+ };
109
+
110
+ const handleSocialSignIn = async (provider: BetterAuthSocialProvider) => {
111
+ try {
112
+ setIsLoading(true);
113
+ setError(null);
114
+ await signInWithSocial(provider);
115
+ } catch (err) {
116
+ const message = err instanceof Error ? err.message : `${provider} sign in failed`;
117
+ setError(message);
118
+ await onError?.(err as Error);
119
+ setIsLoading(false);
120
+ }
121
+ };
122
+
123
+ if (verificationSent) {
124
+ return (
125
+ <LoginStepContainer partnerId={partnerId}>
126
+ <div className="mb-6 w-full space-y-4 px-3 text-center">
127
+ <div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100">
128
+ <svg className="h-6 w-6 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
129
+ <path
130
+ strokeLinecap="round"
131
+ strokeLinejoin="round"
132
+ strokeWidth={2}
133
+ d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
134
+ />
135
+ </svg>
136
+ </div>
137
+ <p className="text-sm font-medium text-gray-900 dark:text-gray-100">Check your email</p>
138
+ <p className="text-xs text-gray-500 dark:text-gray-400">
139
+ We sent a verification link to <span className="font-medium text-gray-700 dark:text-gray-200">{email}</span>
140
+ . Verify your account, then come back and sign in.
141
+ </p>
142
+ <button
143
+ onClick={() => {
144
+ setVerificationSent(false);
145
+ setMode("sign-in");
146
+ setShowEmailForm(true);
147
+ setPassword("");
148
+ }}
149
+ className="text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
150
+ >
151
+ Back to sign in
152
+ </button>
153
+ </div>
154
+ </LoginStepContainer>
155
+ );
156
+ }
157
+
158
+ return (
159
+ <LoginStepContainer partnerId={partnerId}>
160
+ {mode === "forgot-password" ? (
161
+ <div className="mb-6 w-full space-y-3 px-3">
162
+ <p className="text-center text-sm font-medium text-gray-900 dark:text-gray-100">Reset password</p>
163
+ <p className="text-center text-xs text-gray-500">Enter your email and we'll send you a reset link</p>
164
+
165
+ {resetEmailSent ? (
166
+ <div className="space-y-3 py-4 text-center">
167
+ <p className="text-sm text-green-600">Check your email for a reset link.</p>
168
+ </div>
169
+ ) : (
170
+ <>
171
+ <Input
172
+ type="email"
173
+ placeholder="you@example.com"
174
+ value={email}
175
+ onChange={event => setEmail(event.target.value)}
176
+ disabled={isLoading}
177
+ onKeyDown={event => {
178
+ if (event.key === "Enter") handleForgotPassword();
179
+ }}
180
+ />
181
+
182
+ {error && <p className="text-sm text-red-500">{error}</p>}
183
+
184
+ <Button onClick={handleForgotPassword} disabled={isLoading} className="w-full">
185
+ {isLoading ? "Sending..." : "Send reset link"}
186
+ </Button>
187
+ </>
188
+ )}
189
+
190
+ <button
191
+ onClick={() => {
192
+ setMode("sign-in");
193
+ setShowEmailForm(true);
194
+ setError(null);
195
+ setResetEmailSent(false);
196
+ }}
197
+ className="w-full text-center text-sm text-gray-500 hover:text-gray-700"
198
+ >
199
+ Back to sign in
200
+ </button>
201
+ </div>
202
+ ) : showEmailForm ? (
203
+ <div className="mb-6 w-full space-y-3 px-3">
204
+ <p className="text-center text-sm font-medium text-gray-900 dark:text-gray-100">
205
+ {mode === "sign-in" ? "Sign in with email" : "Create an account"}
206
+ </p>
207
+
208
+ {mode === "sign-up" && (
209
+ <Input
210
+ type="text"
211
+ placeholder="Your name"
212
+ value={name}
213
+ onChange={event => setName(event.target.value)}
214
+ disabled={isLoading}
215
+ />
216
+ )}
217
+
218
+ <Input
219
+ type="email"
220
+ placeholder="you@example.com"
221
+ value={email}
222
+ onChange={event => setEmail(event.target.value)}
223
+ disabled={isLoading}
224
+ />
225
+
226
+ <Input
227
+ type="password"
228
+ placeholder="Password"
229
+ value={password}
230
+ onChange={event => setPassword(event.target.value)}
231
+ disabled={isLoading}
232
+ onKeyDown={event => {
233
+ if (event.key === "Enter") handleEmailSubmit();
234
+ }}
235
+ />
236
+
237
+ {error && <p className="text-sm text-red-500">{error}</p>}
238
+
239
+ <Button onClick={handleEmailSubmit} disabled={isLoading} className="w-full">
240
+ {isLoading ? "Loading..." : mode === "sign-in" ? "Sign in" : "Sign up"}
241
+ </Button>
242
+
243
+ {mode === "sign-in" && (
244
+ <button
245
+ onClick={() => {
246
+ setMode("forgot-password");
247
+ setError(null);
248
+ }}
249
+ disabled={isLoading}
250
+ className="w-full text-center text-xs text-gray-500 hover:text-gray-700"
251
+ >
252
+ Forgot password?
253
+ </button>
254
+ )}
255
+
256
+ <button
257
+ onClick={() => {
258
+ setMode(mode === "sign-in" ? "sign-up" : "sign-in");
259
+ setError(null);
260
+ }}
261
+ disabled={isLoading}
262
+ className="w-full text-center text-sm text-gray-500 hover:text-gray-700"
263
+ >
264
+ {mode === "sign-in" ? "Don't have an account? Sign up" : "Already have an account? Sign in"}
265
+ </button>
266
+
267
+ <Button
268
+ variant="outline"
269
+ onClick={() => {
270
+ setShowEmailForm(false);
271
+ setError(null);
272
+ }}
273
+ disabled={isLoading}
274
+ className="w-full"
275
+ >
276
+ Back
277
+ </Button>
278
+ </div>
279
+ ) : (
280
+ <div className="mb-6 w-full space-y-4 px-3">
281
+ {/* Social providers */}
282
+ <div className="grid w-full grid-cols-3 gap-4">
283
+ {SOCIAL_PROVIDERS.map(provider => (
284
+ <AuthButton
285
+ key={provider.id}
286
+ strategy={provider.id}
287
+ onClick={() => handleSocialSignIn(provider.id)}
288
+ isLoading={isLoading}
289
+ />
290
+ ))}
291
+ </div>
292
+
293
+ {/* Divider */}
294
+ <div className="flex items-center gap-3">
295
+ <div className="h-px flex-1 bg-gray-200" />
296
+ <span className="text-xs text-gray-400">or</span>
297
+ <div className="h-px flex-1 bg-gray-200" />
298
+ </div>
299
+
300
+ {/* Email option */}
301
+ <AuthButton strategy="email" onClick={() => setShowEmailForm(true)} isLoading={isLoading} />
302
+
303
+ {error && <p className="text-center text-sm text-red-500">{error}</p>}
304
+ </div>
305
+ )}
306
+ </LoginStepContainer>
307
+ );
308
+ }
@@ -3,6 +3,7 @@ import {
3
3
  AuthButton,
4
4
  Button,
5
5
  getConnectOptionsFromStrategy,
6
+ Input,
6
7
  isWalletType,
7
8
  LoginStepContainer,
8
9
  useAuthentication,
@@ -11,12 +12,21 @@ import {
11
12
  useConnect,
12
13
  WalletRow,
13
14
  } from "@b3dotfun/sdk/global-account/react";
15
+ import { ecosystemWalletId } from "@b3dotfun/sdk/shared/constants";
14
16
  import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
15
17
  import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
16
18
  import { useState } from "react";
17
19
  import { Chain } from "thirdweb";
18
- import { useConnect as useConnectTW } from "thirdweb/react";
19
- import { Account, createWallet, Wallet, WalletId } from "thirdweb/wallets";
20
+ import { useConnectedWallets, useConnect as useConnectTW } from "thirdweb/react";
21
+ import {
22
+ Account,
23
+ createWallet,
24
+ MultiStepAuthArgsType,
25
+ preAuthenticate,
26
+ SingleStepAuthArgsType,
27
+ Wallet,
28
+ WalletId,
29
+ } from "thirdweb/wallets";
20
30
 
21
31
  interface LoginStepCustomProps {
22
32
  automaticallySetFirstEoa: boolean;
@@ -28,6 +38,7 @@ interface LoginStepCustomProps {
28
38
  }
29
39
 
30
40
  const debug = debugB3React("LoginStepCustom");
41
+ const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
31
42
 
32
43
  export function LoginStepCustom({
33
44
  onSuccess,
@@ -40,32 +51,49 @@ export function LoginStepCustom({
40
51
  const { partnerId } = useB3Config();
41
52
  const [isLoading, setIsLoading] = useState(false);
42
53
  const [showAllWallets, setShowAllWallets] = useState(false);
54
+ const [showEmailFlow, setShowEmailFlow] = useState(false);
55
+ const [email, setEmail] = useState("");
56
+ const [verificationCode, setVerificationCode] = useState("");
57
+ const [emailCodeSent, setEmailCodeSent] = useState(false);
58
+ const [emailError, setEmailError] = useState<string | null>(null);
43
59
  const { connect } = useConnect(partnerId, chain);
44
60
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
45
- const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
46
- const { logout } = useAuthentication(partnerId, { skipAutoConnect: true });
61
+ const { connect: onAuthConnect, logout } = useAuthentication(partnerId, { skipAutoConnect: true });
47
62
  const { connect: connectTW } = useConnectTW();
63
+ const connectedWallets = useConnectedWallets();
48
64
 
49
65
  // Split strategies into auth and wallet types
50
66
  const authStrategies = strategies.filter(s => !isWalletType(s));
51
67
  const walletStrategies = strategies.filter(isWalletType);
52
68
  const initialWallets = walletStrategies.slice(0, maxInitialWallets);
53
69
  const additionalWallets = walletStrategies.slice(maxInitialWallets);
70
+ const authGridColumns = Math.max(1, Math.min(authStrategies.length, 4));
54
71
 
55
- const handleConnect = async (strategy: AllowedStrategy) => {
72
+ const resetEmailFlow = () => {
73
+ setShowEmailFlow(false);
74
+ setEmailCodeSent(false);
75
+ setVerificationCode("");
76
+ setEmailError(null);
77
+ };
78
+
79
+ const connectWithOptions = async (
80
+ strategy: AllowedStrategy,
81
+ options: MultiStepAuthArgsType | SingleStepAuthArgsType,
82
+ ) => {
56
83
  try {
57
84
  setIsLoading(true);
58
85
  debug("setIsAuthenticating:true:3");
59
86
  setIsAuthenticating(true);
60
- const options = getConnectOptionsFromStrategy(strategy);
61
87
  let connectResult: Wallet | null;
62
88
 
63
- if (automaticallySetFirstEoa) {
64
- if (!options.wallet?.id) {
89
+ if (automaticallySetFirstEoa && isWalletType(strategy) && options.strategy === "wallet") {
90
+ const walletId = options.wallet?.id as WalletId | undefined;
91
+ if (!walletId) {
65
92
  throw new Error("Wallet ID is required");
66
93
  }
94
+
67
95
  connectResult = await connectTW(async () => {
68
- const wallet = createWallet(options.wallet?.id as WalletId);
96
+ const wallet = createWallet(walletId);
69
97
  await wallet.connect({
70
98
  client,
71
99
  });
@@ -73,19 +101,27 @@ export function LoginStepCustom({
73
101
  return wallet;
74
102
  });
75
103
  } else {
76
- // @ts-expect-error we have custom strategies too and we also get things like "apple" isn't assignable to "wallet"
77
104
  connectResult = await connect(options);
78
105
  }
79
106
 
80
107
  const account = connectResult?.getAccount();
81
108
  debug("@@connectResult", { connectResult, account, options });
82
- if (!account) throw new Error("Failed to connect");
109
+ if (!account || !connectResult) throw new Error("Failed to connect");
110
+ const allConnectedWallets =
111
+ connectedWallets.length > 0 && connectedWallets.some(wallet => wallet.id === connectResult.id)
112
+ ? connectedWallets
113
+ : [connectResult, ...connectedWallets.filter(wallet => wallet.id !== connectResult.id)];
114
+ await onAuthConnect(connectResult, allConnectedWallets);
83
115
  await onSuccess(account);
84
- setIsAuthenticated(true);
116
+ if (strategy === "email") {
117
+ resetEmailFlow();
118
+ }
85
119
  } catch (error) {
120
+ if (strategy === "email") {
121
+ setEmailError(error instanceof Error ? error.message : "Failed to sign in with email");
122
+ }
86
123
  await onError?.(error as Error);
87
124
  await logout();
88
- setIsAuthenticated(false);
89
125
  } finally {
90
126
  setIsLoading(false);
91
127
  debug("setIsAuthenticating:false:3");
@@ -93,60 +129,177 @@ export function LoginStepCustom({
93
129
  }
94
130
  };
95
131
 
132
+ const handleConnect = async (strategy: AllowedStrategy) => {
133
+ if (strategy === "email") {
134
+ setShowEmailFlow(true);
135
+ setEmailCodeSent(false);
136
+ setVerificationCode("");
137
+ setEmailError(null);
138
+ return;
139
+ }
140
+
141
+ const options = getConnectOptionsFromStrategy(strategy);
142
+ await connectWithOptions(strategy, options as SingleStepAuthArgsType);
143
+ };
144
+
145
+ const handleSendEmailCode = async () => {
146
+ const normalizedEmail = email.trim().toLowerCase();
147
+ if (!normalizedEmail) {
148
+ setEmailError("Please enter your email address");
149
+ return;
150
+ }
151
+
152
+ if (!EMAIL_REGEX.test(normalizedEmail)) {
153
+ setEmailError("Please enter a valid email address");
154
+ return;
155
+ }
156
+
157
+ try {
158
+ setIsLoading(true);
159
+ setEmailError(null);
160
+ await preAuthenticate({
161
+ client,
162
+ strategy: "email",
163
+ email: normalizedEmail,
164
+ ecosystem: {
165
+ id: ecosystemWalletId,
166
+ partnerId,
167
+ },
168
+ });
169
+ setEmail(normalizedEmail);
170
+ setEmailCodeSent(true);
171
+ } catch (error) {
172
+ setEmailError(error instanceof Error ? error.message : "Failed to send verification code");
173
+ await onError?.(error as Error);
174
+ } finally {
175
+ setIsLoading(false);
176
+ }
177
+ };
178
+
179
+ const handleEmailLogin = async () => {
180
+ const normalizedEmail = email.trim().toLowerCase();
181
+ const normalizedCode = verificationCode.trim();
182
+
183
+ if (!EMAIL_REGEX.test(normalizedEmail)) {
184
+ setEmailError("Please enter a valid email address");
185
+ return;
186
+ }
187
+
188
+ if (!normalizedCode) {
189
+ setEmailError("Please enter your verification code");
190
+ return;
191
+ }
192
+
193
+ await connectWithOptions("email", {
194
+ strategy: "email",
195
+ email: normalizedEmail,
196
+ verificationCode: normalizedCode,
197
+ });
198
+ };
199
+
96
200
  return (
97
201
  <LoginStepContainer partnerId={partnerId}>
98
- {/* Auth Strategies */}
99
- {authStrategies.length > 0 && (
100
- <div className={`mb-6 w-full ${authStrategies.length <= 3 ? "space-y-3 px-3" : "grid grid-cols-4 gap-4"}`}>
101
- {authStrategies.map(strategy => {
102
- console.log("strategy", strategy);
103
- return (
104
- <AuthButton
105
- key={strategy}
106
- strategy={strategy}
107
- onClick={() => handleConnect(strategy)}
108
- isLoading={isLoading}
109
- />
110
- );
111
- })}
112
- </div>
113
- )}
114
-
115
- {/* Initial Wallet List */}
116
- <div className="mb-4 w-full space-y-2">
117
- {initialWallets.map(walletId => (
118
- <WalletRow
119
- key={walletId}
120
- walletId={walletId as WalletId}
121
- onClick={() => handleConnect(walletId)}
122
- isLoading={isLoading}
202
+ {showEmailFlow ? (
203
+ <div className="mb-6 w-full space-y-3 px-3">
204
+ <p className="text-center text-sm font-medium text-gray-900 dark:text-gray-100">Sign in with email</p>
205
+ <Input
206
+ type="email"
207
+ placeholder="you@example.com"
208
+ value={email}
209
+ onChange={event => setEmail(event.target.value)}
210
+ disabled={isLoading || emailCodeSent}
123
211
  />
124
- ))}
125
- </div>
126
212
 
127
- {/* Additional Wallets Section */}
128
- {additionalWallets.length > 0 && (
129
- <div className="w-full">
213
+ {emailCodeSent && (
214
+ <Input
215
+ type="text"
216
+ placeholder="Enter verification code"
217
+ value={verificationCode}
218
+ onChange={event => setVerificationCode(event.target.value)}
219
+ disabled={isLoading}
220
+ />
221
+ )}
222
+
223
+ {emailError && <p className="text-sm text-red-500">{emailError}</p>}
224
+
130
225
  <Button
131
- onClick={() => setShowAllWallets(!showAllWallets)}
132
- className="mb-2 w-full bg-transparent text-gray-600 hover:bg-gray-100"
226
+ onClick={emailCodeSent ? handleEmailLogin : handleSendEmailCode}
227
+ disabled={isLoading}
228
+ className="w-full"
133
229
  >
134
- {showAllWallets ? "Show less" : "More options"}
230
+ {isLoading ? "Loading..." : emailCodeSent ? "Verify code" : "Send code"}
135
231
  </Button>
136
232
 
137
- {showAllWallets && (
138
- <div className="max-h-60 space-y-2 overflow-y-auto">
139
- {additionalWallets.map(walletId => (
140
- <WalletRow
141
- key={walletId}
142
- walletId={walletId as WalletId}
143
- onClick={() => handleConnect(walletId)}
233
+ {emailCodeSent && (
234
+ <Button variant="outline" onClick={handleSendEmailCode} disabled={isLoading} className="w-full">
235
+ Resend code
236
+ </Button>
237
+ )}
238
+
239
+ <Button variant="outline" onClick={resetEmailFlow} disabled={isLoading} className="w-full">
240
+ Back
241
+ </Button>
242
+ </div>
243
+ ) : (
244
+ <>
245
+ {/* Auth Strategies */}
246
+ {authStrategies.length > 0 && (
247
+ <div
248
+ className={`mb-6 grid w-full gap-4 px-3 ${authStrategies.length > 4 ? "grid-cols-4" : ""}`}
249
+ style={
250
+ authStrategies.length <= 4
251
+ ? { gridTemplateColumns: `repeat(${authGridColumns}, minmax(0, 1fr))` }
252
+ : undefined
253
+ }
254
+ >
255
+ {authStrategies.map(strategy => (
256
+ <AuthButton
257
+ key={strategy}
258
+ strategy={strategy}
259
+ onClick={() => handleConnect(strategy)}
144
260
  isLoading={isLoading}
145
261
  />
146
262
  ))}
147
263
  </div>
148
264
  )}
149
- </div>
265
+
266
+ {/* Initial Wallet List */}
267
+ <div className="mb-4 w-full space-y-2">
268
+ {initialWallets.map(walletId => (
269
+ <WalletRow
270
+ key={walletId}
271
+ walletId={walletId as WalletId}
272
+ onClick={() => handleConnect(walletId)}
273
+ isLoading={isLoading}
274
+ />
275
+ ))}
276
+ </div>
277
+
278
+ {/* Additional Wallets Section */}
279
+ {additionalWallets.length > 0 && (
280
+ <div className="w-full">
281
+ <Button
282
+ onClick={() => setShowAllWallets(!showAllWallets)}
283
+ className="mb-2 w-full bg-transparent text-gray-600 hover:bg-gray-100"
284
+ >
285
+ {showAllWallets ? "Show less" : "More options"}
286
+ </Button>
287
+
288
+ {showAllWallets && (
289
+ <div className="max-h-60 space-y-2 overflow-y-auto">
290
+ {additionalWallets.map(walletId => (
291
+ <WalletRow
292
+ key={walletId}
293
+ walletId={walletId as WalletId}
294
+ onClick={() => handleConnect(walletId)}
295
+ isLoading={isLoading}
296
+ />
297
+ ))}
298
+ </div>
299
+ )}
300
+ </div>
301
+ )}
302
+ </>
150
303
  )}
151
304
  </LoginStepContainer>
152
305
  );