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

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 (342) 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 +10 -2
  8. package/dist/cjs/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -4
  9. package/dist/cjs/anyspend/react/components/checkout/CheckoutSuccess.d.ts +2 -1
  10. package/dist/cjs/anyspend/react/components/checkout/CheckoutSuccess.js +5 -3
  11. package/dist/cjs/anyspend/react/components/checkout/CryptoPayPanel.js +43 -23
  12. package/dist/cjs/anyspend/react/components/checkout/FiatCheckoutPanel.js +1 -2
  13. package/dist/cjs/anyspend/react/components/checkout/KycGate.js +1 -2
  14. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +8 -0
  15. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +10 -9
  16. package/dist/cjs/anyspend/react/components/common/InsufficientDepositPayment.js +2 -2
  17. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +7 -2
  18. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +2 -2
  19. package/dist/cjs/anyspend/react/components/common/OrderStatus.js +37 -6
  20. package/dist/cjs/anyspend/react/components/common/StepProgress.d.ts +2 -0
  21. package/dist/cjs/anyspend/react/components/common/StepProgress.js +7 -2
  22. package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.js +2 -2
  23. package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +4 -6
  24. package/dist/cjs/anyspend/react/hooks/useKycStatus.d.ts +3 -1
  25. package/dist/cjs/anyspend/react/hooks/useKycStatus.js +11 -7
  26. package/dist/cjs/anyspend/utils/chain.js +8 -7
  27. package/dist/cjs/app.shared.js +9 -7
  28. package/dist/cjs/global-account/better-auth-client.d.ts +1883 -0
  29. package/dist/cjs/global-account/better-auth-client.js +17 -0
  30. package/dist/cjs/global-account/bsmnt.d.ts +0 -1
  31. package/dist/cjs/global-account/bsmnt.js +0 -6
  32. package/dist/cjs/global-account/react/components/B3DynamicModal.js +5 -2
  33. package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +4 -1
  34. package/dist/cjs/global-account/react/components/B3Provider/B3ConfigProvider.js +2 -1
  35. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.d.ts +8 -1
  36. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.js +9 -12
  37. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.native.js +6 -8
  38. package/dist/cjs/global-account/react/components/B3Provider/BetterAuthProvider.d.ts +16 -0
  39. package/dist/cjs/global-account/react/components/B3Provider/BetterAuthProvider.js +120 -0
  40. package/dist/cjs/global-account/react/components/B3Provider/LocalSDKProvider.d.ts +3 -1
  41. package/dist/cjs/global-account/react/components/B3Provider/LocalSDKProvider.js +3 -1
  42. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +3 -1
  43. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +4 -2
  44. package/dist/cjs/global-account/react/components/LinkAccount/LinkedAccountItem.js +2 -1
  45. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +15 -6
  46. package/dist/cjs/global-account/react/components/ManageAccount/SessionDurationContent.d.ts +5 -0
  47. package/dist/cjs/global-account/react/components/ManageAccount/SessionDurationContent.js +57 -0
  48. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +12 -29
  49. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +2 -2
  50. package/dist/cjs/global-account/react/components/Send/Send.js +5 -2
  51. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthResetPassword.d.ts +21 -0
  52. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthResetPassword.js +67 -0
  53. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +34 -0
  54. package/dist/cjs/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +163 -0
  55. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +13 -4
  56. package/dist/cjs/global-account/react/components/SignInWithB3/components/AuthButton.js +10 -1
  57. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +6 -0
  58. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +138 -0
  59. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +96 -15
  60. package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
  61. package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.js +20 -3
  62. package/dist/cjs/global-account/react/components/SingleUserSearchSelector/SingleUserSearchSelector.js +2 -1
  63. package/dist/cjs/global-account/react/components/Toast/ToastContext.d.ts +3 -0
  64. package/dist/cjs/global-account/react/components/Toast/ToastContext.js +30 -7
  65. package/dist/cjs/global-account/react/components/custom/Button.d.ts +1 -1
  66. package/dist/cjs/global-account/react/components/index.d.ts +3 -0
  67. package/dist/cjs/global-account/react/components/index.js +7 -3
  68. package/dist/cjs/global-account/react/components/ui/button.d.ts +1 -1
  69. package/dist/cjs/global-account/react/hooks/index.d.ts +1 -0
  70. package/dist/cjs/global-account/react/hooks/index.js +5 -2
  71. package/dist/cjs/global-account/react/hooks/useAuth.js +26 -15
  72. package/dist/cjs/global-account/react/hooks/useAuthentication.js +23 -12
  73. package/dist/cjs/global-account/react/hooks/useBetterAuth.d.ts +973 -0
  74. package/dist/cjs/global-account/react/hooks/useBetterAuth.js +157 -0
  75. package/dist/cjs/global-account/react/hooks/useConnect.d.ts +2 -2
  76. package/dist/cjs/global-account/react/hooks/useFirstEOA.d.ts +8 -8
  77. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +10 -1
  78. package/dist/cjs/global-account/react/utils/createWagmiConfig.d.ts +4 -31
  79. package/dist/cjs/global-account/react/utils/createWagmiConfig.js +5 -24
  80. package/dist/cjs/global-account/react/utils/index.d.ts +0 -1
  81. package/dist/cjs/global-account/react/utils/index.js +0 -1
  82. package/dist/cjs/global-account/react/utils/profileDisplay.js +17 -18
  83. package/dist/cjs/shared/constants/chains/b3Chain.d.ts +7 -7
  84. package/dist/cjs/shared/constants/chains/b3Chain.js +4 -4
  85. package/dist/cjs/shared/constants/chains/b3Viem.d.ts +6 -0
  86. package/dist/cjs/shared/constants/chains/b3Viem.js +19 -0
  87. package/dist/cjs/shared/constants/chains/supported.d.ts +1 -1
  88. package/dist/cjs/shared/generated/chain-networks.json +2 -2
  89. package/dist/cjs/shared/utils/chains.d.ts +1 -1
  90. package/dist/cjs/shared/utils/chains.js +2 -2
  91. package/dist/cjs/shared/utils/session-duration.d.ts +15 -0
  92. package/dist/cjs/shared/utils/session-duration.js +69 -0
  93. package/dist/cjs/wallet/react/components/ConnectWallet.d.ts +11 -0
  94. package/dist/cjs/wallet/react/components/ConnectWallet.js +467 -0
  95. package/dist/cjs/wallet/react/components/WalletProvider.d.ts +35 -0
  96. package/dist/cjs/wallet/react/components/WalletProvider.js +20 -0
  97. package/dist/cjs/wallet/react/hooks/useWalletDisconnect.d.ts +13 -0
  98. package/dist/cjs/wallet/react/hooks/useWalletDisconnect.js +22 -0
  99. package/dist/cjs/wallet/react/hooks/useWalletState.d.ts +31 -0
  100. package/dist/cjs/wallet/react/hooks/useWalletState.js +63 -0
  101. package/dist/cjs/wallet/react/index.d.ts +5 -0
  102. package/dist/cjs/wallet/react/index.js +16 -0
  103. package/dist/cjs/wallet/utils/createWalletConfig.d.ts +21 -0
  104. package/dist/cjs/wallet/utils/createWalletConfig.js +24 -0
  105. package/dist/esm/anyspend/constants/rpc.d.ts +1 -1
  106. package/dist/esm/anyspend/constants/rpc.js +1 -1
  107. package/dist/esm/anyspend/react/components/AnySpendNFT.js +2 -2
  108. package/dist/esm/anyspend/react/components/AnySpendStakeB3.js +2 -2
  109. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.js +2 -2
  110. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.d.ts +3 -1
  111. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.js +10 -2
  112. package/dist/esm/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -4
  113. package/dist/esm/anyspend/react/components/checkout/CheckoutSuccess.d.ts +2 -1
  114. package/dist/esm/anyspend/react/components/checkout/CheckoutSuccess.js +5 -3
  115. package/dist/esm/anyspend/react/components/checkout/CryptoPayPanel.js +44 -24
  116. package/dist/esm/anyspend/react/components/checkout/FiatCheckoutPanel.js +2 -3
  117. package/dist/esm/anyspend/react/components/checkout/KycGate.js +2 -3
  118. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +8 -0
  119. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +9 -8
  120. package/dist/esm/anyspend/react/components/common/InsufficientDepositPayment.js +2 -2
  121. package/dist/esm/anyspend/react/components/common/OrderDetails.js +8 -3
  122. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +2 -2
  123. package/dist/esm/anyspend/react/components/common/OrderStatus.js +34 -3
  124. package/dist/esm/anyspend/react/components/common/StepProgress.d.ts +2 -0
  125. package/dist/esm/anyspend/react/components/common/StepProgress.js +4 -2
  126. package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.js +2 -2
  127. package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +5 -7
  128. package/dist/esm/anyspend/react/hooks/useKycStatus.d.ts +3 -1
  129. package/dist/esm/anyspend/react/hooks/useKycStatus.js +9 -5
  130. package/dist/esm/anyspend/utils/chain.js +10 -9
  131. package/dist/esm/app.shared.js +9 -7
  132. package/dist/esm/global-account/better-auth-client.d.ts +1883 -0
  133. package/dist/esm/global-account/better-auth-client.js +13 -0
  134. package/dist/esm/global-account/bsmnt.d.ts +0 -1
  135. package/dist/esm/global-account/bsmnt.js +0 -5
  136. package/dist/esm/global-account/react/components/B3DynamicModal.js +5 -2
  137. package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +4 -1
  138. package/dist/esm/global-account/react/components/B3Provider/B3ConfigProvider.js +2 -1
  139. package/dist/esm/global-account/react/components/B3Provider/B3Provider.d.ts +8 -1
  140. package/dist/esm/global-account/react/components/B3Provider/B3Provider.js +4 -7
  141. package/dist/esm/global-account/react/components/B3Provider/B3Provider.native.js +4 -6
  142. package/dist/esm/global-account/react/components/B3Provider/BetterAuthProvider.d.ts +16 -0
  143. package/dist/esm/global-account/react/components/B3Provider/BetterAuthProvider.js +115 -0
  144. package/dist/esm/global-account/react/components/B3Provider/LocalSDKProvider.d.ts +3 -1
  145. package/dist/esm/global-account/react/components/B3Provider/LocalSDKProvider.js +3 -1
  146. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +3 -1
  147. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +4 -2
  148. package/dist/esm/global-account/react/components/LinkAccount/LinkedAccountItem.js +2 -1
  149. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +13 -7
  150. package/dist/esm/global-account/react/components/ManageAccount/SessionDurationContent.d.ts +5 -0
  151. package/dist/esm/global-account/react/components/ManageAccount/SessionDurationContent.js +52 -0
  152. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +12 -29
  153. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +2 -2
  154. package/dist/esm/global-account/react/components/Send/Send.js +5 -2
  155. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthResetPassword.d.ts +21 -0
  156. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthResetPassword.js +64 -0
  157. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +34 -0
  158. package/dist/esm/global-account/react/components/SignInWithB3/BetterAuthSignIn.js +160 -0
  159. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +13 -4
  160. package/dist/esm/global-account/react/components/SignInWithB3/components/AuthButton.js +11 -2
  161. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +6 -0
  162. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.js +135 -0
  163. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +100 -19
  164. package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
  165. package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.js +19 -2
  166. package/dist/esm/global-account/react/components/SingleUserSearchSelector/SingleUserSearchSelector.js +2 -1
  167. package/dist/esm/global-account/react/components/Toast/ToastContext.d.ts +3 -0
  168. package/dist/esm/global-account/react/components/Toast/ToastContext.js +30 -7
  169. package/dist/esm/global-account/react/components/custom/Button.d.ts +1 -1
  170. package/dist/esm/global-account/react/components/index.d.ts +3 -0
  171. package/dist/esm/global-account/react/components/index.js +2 -0
  172. package/dist/esm/global-account/react/components/ui/button.d.ts +1 -1
  173. package/dist/esm/global-account/react/hooks/index.d.ts +1 -0
  174. package/dist/esm/global-account/react/hooks/index.js +1 -0
  175. package/dist/esm/global-account/react/hooks/useAuth.js +28 -17
  176. package/dist/esm/global-account/react/hooks/useAuthentication.js +24 -13
  177. package/dist/esm/global-account/react/hooks/useBetterAuth.d.ts +973 -0
  178. package/dist/esm/global-account/react/hooks/useBetterAuth.js +149 -0
  179. package/dist/esm/global-account/react/hooks/useConnect.d.ts +2 -2
  180. package/dist/esm/global-account/react/hooks/useFirstEOA.d.ts +8 -8
  181. package/dist/esm/global-account/react/stores/useModalStore.d.ts +10 -1
  182. package/dist/esm/global-account/react/utils/createWagmiConfig.d.ts +4 -31
  183. package/dist/esm/global-account/react/utils/createWagmiConfig.js +5 -23
  184. package/dist/esm/global-account/react/utils/index.d.ts +0 -1
  185. package/dist/esm/global-account/react/utils/index.js +0 -1
  186. package/dist/esm/global-account/react/utils/profileDisplay.js +17 -18
  187. package/dist/esm/shared/constants/chains/b3Chain.d.ts +7 -7
  188. package/dist/esm/shared/constants/chains/b3Chain.js +4 -4
  189. package/dist/esm/shared/constants/chains/b3Viem.d.ts +6 -0
  190. package/dist/esm/shared/constants/chains/b3Viem.js +16 -0
  191. package/dist/esm/shared/constants/chains/supported.d.ts +1 -1
  192. package/dist/esm/shared/generated/chain-networks.json +2 -2
  193. package/dist/esm/shared/utils/chains.d.ts +1 -1
  194. package/dist/esm/shared/utils/chains.js +2 -2
  195. package/dist/esm/shared/utils/session-duration.d.ts +15 -0
  196. package/dist/esm/shared/utils/session-duration.js +64 -0
  197. package/dist/esm/wallet/react/components/ConnectWallet.d.ts +11 -0
  198. package/dist/esm/wallet/react/components/ConnectWallet.js +431 -0
  199. package/dist/esm/wallet/react/components/WalletProvider.d.ts +35 -0
  200. package/dist/esm/wallet/react/components/WalletProvider.js +17 -0
  201. package/dist/esm/wallet/react/hooks/useWalletDisconnect.d.ts +13 -0
  202. package/dist/esm/wallet/react/hooks/useWalletDisconnect.js +19 -0
  203. package/dist/esm/wallet/react/hooks/useWalletState.d.ts +31 -0
  204. package/dist/esm/wallet/react/hooks/useWalletState.js +60 -0
  205. package/dist/esm/wallet/react/index.d.ts +5 -0
  206. package/dist/esm/wallet/react/index.js +8 -0
  207. package/dist/esm/wallet/utils/createWalletConfig.d.ts +21 -0
  208. package/dist/esm/wallet/utils/createWalletConfig.js +21 -0
  209. package/dist/styles/index.css +1 -1
  210. package/dist/types/anyspend/constants/rpc.d.ts +1 -1
  211. package/dist/types/anyspend/react/components/checkout/AnySpendCheckout.d.ts +3 -1
  212. package/dist/types/anyspend/react/components/checkout/CheckoutSuccess.d.ts +2 -1
  213. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +8 -0
  214. package/dist/types/anyspend/react/components/common/StepProgress.d.ts +2 -0
  215. package/dist/types/anyspend/react/hooks/useKycStatus.d.ts +3 -1
  216. package/dist/types/global-account/better-auth-client.d.ts +1883 -0
  217. package/dist/types/global-account/bsmnt.d.ts +0 -1
  218. package/dist/types/global-account/react/components/B3Provider/B3ConfigProvider.d.ts +4 -1
  219. package/dist/types/global-account/react/components/B3Provider/B3Provider.d.ts +8 -1
  220. package/dist/types/global-account/react/components/B3Provider/BetterAuthProvider.d.ts +16 -0
  221. package/dist/types/global-account/react/components/B3Provider/LocalSDKProvider.d.ts +3 -1
  222. package/dist/types/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +3 -1
  223. package/dist/types/global-account/react/components/ManageAccount/SessionDurationContent.d.ts +5 -0
  224. package/dist/types/global-account/react/components/SignInWithB3/BetterAuthResetPassword.d.ts +21 -0
  225. package/dist/types/global-account/react/components/SignInWithB3/BetterAuthSignIn.d.ts +34 -0
  226. package/dist/types/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.d.ts +6 -0
  227. package/dist/types/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
  228. package/dist/types/global-account/react/components/Toast/ToastContext.d.ts +3 -0
  229. package/dist/types/global-account/react/components/custom/Button.d.ts +1 -1
  230. package/dist/types/global-account/react/components/index.d.ts +3 -0
  231. package/dist/types/global-account/react/components/ui/button.d.ts +1 -1
  232. package/dist/types/global-account/react/hooks/index.d.ts +1 -0
  233. package/dist/types/global-account/react/hooks/useBetterAuth.d.ts +973 -0
  234. package/dist/types/global-account/react/hooks/useConnect.d.ts +2 -2
  235. package/dist/types/global-account/react/hooks/useFirstEOA.d.ts +8 -8
  236. package/dist/types/global-account/react/stores/useModalStore.d.ts +10 -1
  237. package/dist/types/global-account/react/utils/createWagmiConfig.d.ts +4 -31
  238. package/dist/types/global-account/react/utils/index.d.ts +0 -1
  239. package/dist/types/shared/constants/chains/b3Chain.d.ts +7 -7
  240. package/dist/types/shared/constants/chains/b3Viem.d.ts +6 -0
  241. package/dist/types/shared/constants/chains/supported.d.ts +1 -1
  242. package/dist/types/shared/utils/chains.d.ts +1 -1
  243. package/dist/types/shared/utils/session-duration.d.ts +15 -0
  244. package/dist/types/wallet/react/components/ConnectWallet.d.ts +11 -0
  245. package/dist/types/wallet/react/components/WalletProvider.d.ts +35 -0
  246. package/dist/types/wallet/react/hooks/useWalletDisconnect.d.ts +13 -0
  247. package/dist/types/wallet/react/hooks/useWalletState.d.ts +31 -0
  248. package/dist/types/wallet/react/index.d.ts +5 -0
  249. package/dist/types/wallet/utils/createWalletConfig.d.ts +21 -0
  250. package/package.json +15 -6
  251. package/src/anyspend/constants/rpc.ts +2 -1
  252. package/src/anyspend/react/components/AnySpendNFT.tsx +2 -2
  253. package/src/anyspend/react/components/AnySpendStakeB3.tsx +2 -2
  254. package/src/anyspend/react/components/AnySpendStakeB3ExactIn.tsx +2 -2
  255. package/src/anyspend/react/components/checkout/AnySpendCheckout.tsx +15 -1
  256. package/src/anyspend/react/components/checkout/CheckoutPaymentPanel.tsx +2 -4
  257. package/src/anyspend/react/components/checkout/CheckoutSuccess.tsx +13 -3
  258. package/src/anyspend/react/components/checkout/CryptoPayPanel.tsx +45 -27
  259. package/src/anyspend/react/components/checkout/FiatCheckoutPanel.tsx +9 -3
  260. package/src/anyspend/react/components/checkout/KycGate.tsx +8 -3
  261. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +10 -8
  262. package/src/anyspend/react/components/common/InsufficientDepositPayment.tsx +2 -2
  263. package/src/anyspend/react/components/common/OrderDetails.tsx +10 -2
  264. package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +4 -4
  265. package/src/anyspend/react/components/common/OrderStatus.tsx +38 -3
  266. package/src/anyspend/react/components/common/StepProgress.tsx +15 -5
  267. package/src/anyspend/react/components/common/TransferCryptoDetails.tsx +2 -2
  268. package/src/anyspend/react/hooks/useAnyspendCreateOnrampOrder.ts +5 -7
  269. package/src/anyspend/react/hooks/useKycStatus.ts +8 -5
  270. package/src/anyspend/utils/chain.ts +9 -9
  271. package/src/app.shared.ts +9 -8
  272. package/src/global-account/better-auth-client.ts +17 -0
  273. package/src/global-account/bsmnt.ts +0 -6
  274. package/src/global-account/react/components/B3DynamicModal.tsx +5 -2
  275. package/src/global-account/react/components/B3Provider/B3ConfigProvider.tsx +6 -0
  276. package/src/global-account/react/components/B3Provider/B3Provider.native.tsx +16 -21
  277. package/src/global-account/react/components/B3Provider/B3Provider.tsx +52 -40
  278. package/src/global-account/react/components/B3Provider/BetterAuthProvider.tsx +127 -0
  279. package/src/global-account/react/components/B3Provider/LocalSDKProvider.tsx +5 -0
  280. package/src/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.tsx +17 -10
  281. package/src/global-account/react/components/LinkAccount/LinkedAccountItem.tsx +2 -1
  282. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +29 -11
  283. package/src/global-account/react/components/ManageAccount/SessionDurationContent.tsx +107 -0
  284. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +28 -30
  285. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +2 -2
  286. package/src/global-account/react/components/Send/Send.tsx +8 -5
  287. package/src/global-account/react/components/SignInWithB3/BetterAuthResetPassword.tsx +146 -0
  288. package/src/global-account/react/components/SignInWithB3/BetterAuthSignIn.tsx +426 -0
  289. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +13 -4
  290. package/src/global-account/react/components/SignInWithB3/components/AuthButton.tsx +21 -2
  291. package/src/global-account/react/components/SignInWithB3/steps/LoginStepBetterAuth.tsx +308 -0
  292. package/src/global-account/react/components/SignInWithB3/steps/LoginStepCustom.tsx +207 -54
  293. package/src/global-account/react/components/SignInWithB3/utils/signInUtils.ts +24 -4
  294. package/src/global-account/react/components/SingleUserSearchSelector/SingleUserSearchSelector.tsx +2 -1
  295. package/src/global-account/react/components/Toast/ToastContext.tsx +39 -7
  296. package/src/global-account/react/components/index.ts +3 -0
  297. package/src/global-account/react/hooks/index.ts +1 -0
  298. package/src/global-account/react/hooks/useAuth.ts +28 -17
  299. package/src/global-account/react/hooks/useAuthentication.ts +24 -13
  300. package/src/global-account/react/hooks/useBetterAuth.ts +191 -0
  301. package/src/global-account/react/hooks/useConnect.tsx +2 -2
  302. package/src/global-account/react/stores/useModalStore.ts +11 -0
  303. package/src/global-account/react/utils/createWagmiConfig.tsx +6 -25
  304. package/src/global-account/react/utils/index.ts +0 -1
  305. package/src/global-account/react/utils/profileDisplay.ts +21 -19
  306. package/src/shared/constants/chains/b3Chain.ts +5 -5
  307. package/src/shared/constants/chains/b3Viem.ts +18 -0
  308. package/src/shared/generated/chain-networks.json +2 -2
  309. package/src/shared/utils/chains.ts +3 -2
  310. package/src/shared/utils/session-duration.ts +64 -0
  311. package/src/types/torph.d.ts +4 -0
  312. package/src/wallet/__tests__/createWalletConfig.test.ts +39 -0
  313. package/src/wallet/react/components/ConnectWallet.tsx +665 -0
  314. package/src/wallet/react/components/WalletProvider.tsx +64 -0
  315. package/src/wallet/react/hooks/useWalletDisconnect.ts +22 -0
  316. package/src/wallet/react/hooks/useWalletState.ts +93 -0
  317. package/src/wallet/react/index.ts +10 -0
  318. package/src/wallet/utils/createWalletConfig.ts +39 -0
  319. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +0 -6
  320. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.js +0 -54
  321. package/dist/cjs/global-account/react/components/ProfileAvatar.d.ts +0 -0
  322. package/dist/cjs/global-account/react/components/ProfileAvatar.js +0 -127
  323. package/dist/cjs/global-account/react/hooks/useRPMToken.d.ts +0 -7
  324. package/dist/cjs/global-account/react/hooks/useRPMToken.js +0 -11
  325. package/dist/cjs/global-account/react/utils/updateAvatar.d.ts +0 -4
  326. package/dist/cjs/global-account/react/utils/updateAvatar.js +0 -54
  327. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +0 -6
  328. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.js +0 -51
  329. package/dist/esm/global-account/react/components/ProfileAvatar.d.ts +0 -0
  330. package/dist/esm/global-account/react/components/ProfileAvatar.js +0 -127
  331. package/dist/esm/global-account/react/hooks/useRPMToken.d.ts +0 -7
  332. package/dist/esm/global-account/react/hooks/useRPMToken.js +0 -8
  333. package/dist/esm/global-account/react/utils/updateAvatar.d.ts +0 -4
  334. package/dist/esm/global-account/react/utils/updateAvatar.js +0 -18
  335. package/dist/types/global-account/react/components/AvatarCreator/AvatarCreator.d.ts +0 -6
  336. package/dist/types/global-account/react/components/ProfileAvatar.d.ts +0 -0
  337. package/dist/types/global-account/react/hooks/useRPMToken.d.ts +0 -7
  338. package/dist/types/global-account/react/utils/updateAvatar.d.ts +0 -4
  339. package/src/global-account/react/components/AvatarCreator/AvatarCreator.tsx +0 -90
  340. package/src/global-account/react/components/ProfileAvatar.tsx +0 -138
  341. package/src/global-account/react/hooks/useRPMToken.ts +0 -17
  342. package/src/global-account/react/utils/updateAvatar.ts +0 -21
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useAuthentication, useModalStore } from "../../../../global-account/react/index.js";
3
3
  import { client } from "../../../../shared/utils/thirdweb.js";
4
+ import { getSessionDurationDays, SESSION_DURATION_LABELS } from "../../../../shared/utils/session-duration.js";
4
5
  import { Loader2 } from "lucide-react";
5
6
  import { useState } from "react";
6
7
  import { useProfiles } from "thirdweb/react";
@@ -11,47 +12,29 @@ import SettingsProfileCard from "./SettingsProfileCard.js";
11
12
  const SettingsContent = ({ partnerId, onLogout, chain, }) => {
12
13
  const setB3ModalContentType = useModalStore(state => state.setB3ModalContentType);
13
14
  const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
14
- const { logout } = useAuthentication(partnerId);
15
+ const { logout, user } = useAuthentication(partnerId);
15
16
  const [logoutLoading, setLogoutLoading] = useState(false);
17
+ const sessionDays = getSessionDurationDays(user?.preferences, partnerId);
16
18
  const { data: profilesRaw = [] } = useProfiles({ client });
17
19
  const profiles = profilesRaw.filter((profile) => !["custom_auth_endpoint"].includes(profile.type));
18
20
  const handleNavigate = (type) => {
19
21
  if (type === "home") {
20
- setB3ModalContentType({
21
- type: "manageAccount",
22
- chain,
23
- partnerId,
24
- onLogout,
25
- activeTab: "home",
26
- });
22
+ setB3ModalContentType({ type: "manageAccount", chain, partnerId, onLogout, activeTab: "home" });
27
23
  }
28
24
  else if (type === "swap") {
29
- setB3ModalContentType({
30
- type: "manageAccount",
31
- chain,
32
- partnerId,
33
- onLogout,
34
- activeTab: "tokens",
35
- });
25
+ setB3ModalContentType({ type: "manageAccount", chain, partnerId, onLogout, activeTab: "tokens" });
36
26
  }
37
27
  else if (type === "linkAccount") {
38
- setB3ModalContentType({
39
- type: "linkAccount",
40
- chain,
41
- partnerId,
42
- });
28
+ setB3ModalContentType({ type: "linkAccount", chain, partnerId });
43
29
  }
44
30
  else if (type === "notifications") {
45
- setB3ModalContentType({
46
- type: "notifications",
47
- chain,
48
- partnerId,
49
- });
31
+ setB3ModalContentType({ type: "notifications", chain, partnerId });
32
+ }
33
+ else if (type === "sessionDuration") {
34
+ setB3ModalContentType({ type: "sessionDuration", chain, partnerId });
50
35
  }
51
36
  else {
52
- setB3ModalContentType({
53
- type: "avatarEditor",
54
- });
37
+ setB3ModalContentType({ type: "avatarEditor" });
55
38
  }
56
39
  setB3ModalOpen(true);
57
40
  };
@@ -62,7 +45,7 @@ const SettingsContent = ({ partnerId, onLogout, chain, }) => {
62
45
  setB3ModalOpen(false);
63
46
  setLogoutLoading(false);
64
47
  };
65
- return (_jsxs("div", { className: "flex h-[470px] flex-col", children: [_jsx(ModalHeader, { showBackButton: false, showCloseButton: false, title: "Settings" }), _jsx("div", { className: "p-5", children: _jsx("div", { className: "b3-modal-settings-profile-card dark:border-b3-line dark:bg-b3-background flex items-center rounded-xl border border-[#e4e4e7] bg-[#f4f4f5] p-4", children: _jsx(SettingsProfileCard, {}) }) }), _jsxs("div", { className: "space-y-3 px-5", children: [_jsx(SettingsMenuItem, { icon: _jsx("svg", { width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M0 12C0 5.37258 5.37258 0 12 0H28C34.6274 0 40 5.37258 40 12V28C40 34.6274 34.6274 40 28 40H12C5.37258 40 0 34.6274 0 28V12Z", fill: "#F4F4F5" }) }), title: "Linked Accounts", subtitle: `${profiles.length} connected account${profiles.length > 1 ? "s" : ""}`, onClick: () => handleNavigate("linkAccount") }), _jsx(SettingsMenuItem, { icon: _jsx("svg", { width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M0 12C0 5.37258 5.37258 0 12 0H28C34.6274 0 40 5.37258 40 12V28C40 34.6274 34.6274 40 28 40H12C5.37258 40 0 34.6274 0 28V12Z", fill: "#F4F4F5" }) }), title: "Notifications", subtitle: "Manage your notifications", onClick: () => handleNavigate("notifications") })] }), _jsx("div", { className: "mt-auto px-5 pb-5", children: _jsxs("button", { className: "b3-modal-sign-out-button border-b3-line hover:bg-b3-line bg-b3-background dark:bg-b3-background dark:border-b3-line dark:hover:bg-b3-line/80 flex w-full items-center justify-center gap-1.5 rounded-xl border border-solid p-3 transition-colors", onClick: onLogoutEnhanced, disabled: logoutLoading, style: {
48
+ return (_jsxs("div", { className: "flex h-[470px] flex-col", children: [_jsx(ModalHeader, { showBackButton: false, showCloseButton: false, title: "Settings" }), _jsx("div", { className: "p-5", children: _jsx("div", { className: "b3-modal-settings-profile-card dark:border-b3-line dark:bg-b3-background flex items-center rounded-xl border border-[#e4e4e7] bg-[#f4f4f5] p-4", children: _jsx(SettingsProfileCard, {}) }) }), _jsxs("div", { className: "space-y-3 px-5", children: [_jsx(SettingsMenuItem, { icon: _jsx("svg", { width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M0 12C0 5.37258 5.37258 0 12 0H28C34.6274 0 40 5.37258 40 12V28C40 34.6274 34.6274 40 28 40H12C5.37258 40 0 34.6274 0 28V12Z", fill: "#F4F4F5" }) }), title: "Linked Accounts", subtitle: `${profiles.length} connected account${profiles.length > 1 ? "s" : ""}`, onClick: () => handleNavigate("linkAccount") }), _jsx(SettingsMenuItem, { icon: _jsx("svg", { width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M0 12C0 5.37258 5.37258 0 12 0H28C34.6274 0 40 5.37258 40 12V28C40 34.6274 34.6274 40 28 40H12C5.37258 40 0 34.6274 0 28V12Z", fill: "#F4F4F5" }) }), title: "Notifications", subtitle: "Manage your notifications", onClick: () => handleNavigate("notifications") }), _jsx(SettingsMenuItem, { icon: _jsx("svg", { width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M0 12C0 5.37258 5.37258 0 12 0H28C34.6274 0 40 5.37258 40 12V28C40 34.6274 34.6274 40 28 40H12C5.37258 40 0 34.6274 0 28V12Z", fill: "#F4F4F5" }) }), title: "Stay signed in", subtitle: SESSION_DURATION_LABELS[sessionDays] ?? `${sessionDays} days`, onClick: () => handleNavigate("sessionDuration") })] }), _jsx("div", { className: "mt-auto px-5 pb-5", children: _jsxs("button", { type: "button", className: "b3-modal-sign-out-button border-b3-line hover:bg-b3-line bg-b3-background dark:bg-b3-background dark:border-b3-line dark:hover:bg-b3-line/80 flex w-full items-center justify-center gap-1.5 rounded-xl border border-solid p-3 transition-colors", onClick: onLogoutEnhanced, disabled: logoutLoading, style: {
66
49
  boxShadow: "inset 0px 0px 0px 1px rgba(10,13,18,0.18), inset 0px -2px 0px 0px rgba(10,13,18,0.05)",
67
50
  }, children: [logoutLoading ? (_jsx(Loader2, { className: "text-b3-grey animate-spin", size: 20 })) : (_jsx(SignOutIcon, { size: 20, className: "text-b3-grey", color: "currentColor" })), _jsx("p", { className: "text-b3-grey dark:text-b3-foreground-muted font-neue-montreal-semibold text-base", children: "Sign out" })] }) })] }));
68
51
  };
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { ens_normalize } from "@adraffy/ens-normalize";
3
3
  import app from "../../../../global-account/app.js";
4
4
  import { toast, useAuthentication, useB3Config, useModalStore, useProfile } from "../../../../global-account/react/index.js";
5
+ import { validateImageUrl } from "../../../../global-account/react/utils/profileDisplay.js";
5
6
  import { formatUsername } from "../../../../shared/utils/index.js";
6
7
  import { Check, Loader2, Pencil, X } from "lucide-react";
7
8
  import { useEffect, useRef, useState } from "react";
@@ -25,8 +26,7 @@ const SettingsProfileCard = () => {
25
26
  const [editedUsername, setEditedUsername] = useState("");
26
27
  const [isSaving, setIsSaving] = useState(false);
27
28
  const inputRef = useRef(null);
28
- // IPFSMediaRenderer will handle IPFS URL conversion and validation
29
- const avatarSrc = user?.avatar || profile?.avatar;
29
+ const avatarSrc = validateImageUrl(user?.avatar) || validateImageUrl(profile?.avatar);
30
30
  // Get current username - prioritize user.username, fallback to profile data
31
31
  const currentUsername = user?.username || profile?.displayName || formatUsername(profile?.name || "");
32
32
  // Focus input when entering edit mode
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { ALL_CHAINS, getExplorerTxUrl } from "../../../../anyspend/index.js";
3
3
  import { ChainTokenIcon } from "../../../../anyspend/react/components/common/ChainTokenIcon.js";
4
4
  import { toast, useAccountWallet, useAnalytics, useModalStore, useProfile, useSimBalance, useUnifiedChainSwitchAndExecute, } from "../../../../global-account/react/index.js";
5
+ import { validateImageUrl } from "../../../../global-account/react/utils/profileDisplay.js";
5
6
  import { formatDisplayNumber, formatTokenAmount } from "../../../../shared/utils/number.js";
6
7
  import invariant from "invariant";
7
8
  import { CircleHelp, Clock, Loader2, Send as SendIcon, Wallet } from "lucide-react";
@@ -14,7 +15,8 @@ import { Button } from "../ui/button.js";
14
15
  // Component for displaying a recent address with profile data
15
16
  function RecentAddressItem({ address, onClick }) {
16
17
  const { data: profileData } = useProfile({ address });
17
- return (_jsxs("button", { onClick: onClick, className: "flex items-center gap-2 rounded-xl px-3 py-2 transition-colors hover:bg-[#fafafa]", children: [profileData?.avatar ? (_jsx("img", { src: profileData.avatar, alt: profileData.name || address, className: "h-10 w-10 rounded-full" })) : (_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full border border-[#e4e4e7] bg-[#f4f4f5]", children: _jsx(Wallet, { className: "h-5 w-5 text-[#a0a0ab]" }) })), _jsx("div", { className: "flex flex-col items-start", children: _jsxs("span", { className: "font-neue-montreal-medium text-base tracking-[-0.32px] text-[#70707b]", children: [address.slice(0, 6), "...", address.slice(-4), profileData?.name && ` (${profileData.name})`] }) })] }));
18
+ const validatedAvatar = validateImageUrl(profileData?.avatar);
19
+ return (_jsxs("button", { onClick: onClick, className: "flex items-center gap-2 rounded-xl px-3 py-2 transition-colors hover:bg-[#fafafa]", children: [validatedAvatar ? (_jsx("img", { src: validatedAvatar, alt: profileData?.name || address, className: "h-10 w-10 rounded-full" })) : (_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full border border-[#e4e4e7] bg-[#f4f4f5]", children: _jsx(Wallet, { className: "h-5 w-5 text-[#a0a0ab]" }) })), _jsx("div", { className: "flex flex-col items-start", children: _jsxs("span", { className: "font-neue-montreal-medium text-base tracking-[-0.32px] text-[#70707b]", children: [address.slice(0, 6), "...", address.slice(-4), profileData?.name && ` (${profileData.name})`] }) })] }));
18
20
  }
19
21
  export function Send({ recipientAddress: initialRecipient, onSuccess }) {
20
22
  const { address } = useAccountWallet();
@@ -39,6 +41,7 @@ export function Send({ recipientAddress: initialRecipient, onSuccess }) {
39
41
  const { data: validatedProfileData } = useProfile({
40
42
  address: showValidatedResult && recipientAddress && isAddress(recipientAddress) ? recipientAddress : undefined,
41
43
  });
44
+ const validatedRecipientAvatar = validateImageUrl(validatedProfileData?.avatar);
42
45
  // Address validation
43
46
  const handleRecipientAddressChange = (value) => {
44
47
  setRecipientAddress(value);
@@ -179,7 +182,7 @@ export function Send({ recipientAddress: initialRecipient, onSuccess }) {
179
182
  return "Send";
180
183
  }
181
184
  };
182
- return (_jsxs("div", { className: "dark:bg-b3-background flex h-[600px] w-full flex-col bg-white", children: [_jsx(ModalHeader, { handleBack: handleBack, title: getStepTitle() }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [step === "recipient" && (_jsxs("div", { className: "flex flex-col gap-6 p-5", children: [_jsxs("div", { className: "dark:border-b3-line dark:bg-b3-background flex h-12 w-full items-stretch overflow-hidden rounded-lg border border-[#d1d1d6] bg-white", children: [_jsx("div", { className: "flex w-12 items-center justify-center bg-transparent px-3 py-2", children: _jsx("span", { className: "font-neue-montreal-medium text-base text-[#3f3f46] dark:text-white", children: "To" }) }), _jsxs("div", { className: "flex flex-1 items-center border-l border-[#d1d1d6] px-3 py-2", children: [_jsx("input", { type: "text", value: recipientAddress, onChange: e => handleRecipientAddressChange(e.target.value), placeholder: "ENS or Address", className: "font-neue-montreal-medium dark:bg-b3-background flex-1 text-base text-[#70707b] outline-none placeholder:text-[#70707b] dark:text-white dark:placeholder:text-white" }), _jsx("button", { onClick: handlePaste, className: "font-inter ml-2 rounded-md border border-[#e4e4e7] bg-[#fafafa] px-2.5 py-0.5 text-sm font-medium text-[#3f3f46] transition-colors hover:bg-[#f4f4f5]", children: "Paste" })] })] }), addressError && _jsx("p", { className: "font-neue-montreal-medium -mt-4 text-xs text-red-500", children: addressError }), showValidatedResult && recipientAddress && isAddress(recipientAddress) && (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx("span", { className: "font-sf-pro-text text-sm font-semibold leading-[1.3] tracking-[-0.41px] text-[#0b57c2]", children: "Result" }) }), _jsxs("button", { onClick: handleSelectValidatedAddress, className: "dark:bg-b3-background dark:border-b3-line flex items-center gap-2 rounded-xl bg-[#f4f4f5] px-3 py-2 transition-colors hover:bg-[#e4e4e7]", children: [validatedProfileData?.avatar ? (_jsx("img", { src: validatedProfileData.avatar, alt: validatedProfileData.name || recipientAddress, className: "h-10 w-10 rounded-full" })) : (_jsx("div", { className: "dark:border-b3-line dark:bg-b3-background flex h-10 w-10 items-center justify-center rounded-full border border-[#e4e4e7] bg-[#f4f4f5]", children: _jsx(Wallet, { className: "h-5 w-5 text-[#a0a0ab] dark:text-white" }) })), _jsxs("span", { className: "font-neue-montreal-medium text-base tracking-[-0.32px] text-[#70707b] dark:text-white", children: [recipientAddress.slice(0, 6), "...", recipientAddress.slice(-4), validatedProfileData?.name && ` (${validatedProfileData.name})`] })] })] })), recentAddresses.length > 0 && (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Clock, { className: "h-3.5 w-3.5 text-[#3f3f46]" }), _jsx("span", { className: "font-sf-pro-text text-sm font-semibold leading-[1.3] tracking-[-0.41px] text-[#3f3f46]", children: "Recents" })] }), _jsx("div", { className: "flex flex-col", children: recentAddresses.map((recent, index) => (_jsx(RecentAddressItem, { address: recent.address, onClick: () => {
185
+ return (_jsxs("div", { className: "dark:bg-b3-background flex h-[600px] w-full flex-col bg-white", children: [_jsx(ModalHeader, { handleBack: handleBack, title: getStepTitle() }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [step === "recipient" && (_jsxs("div", { className: "flex flex-col gap-6 p-5", children: [_jsxs("div", { className: "dark:border-b3-line dark:bg-b3-background flex h-12 w-full items-stretch overflow-hidden rounded-lg border border-[#d1d1d6] bg-white", children: [_jsx("div", { className: "flex w-12 items-center justify-center bg-transparent px-3 py-2", children: _jsx("span", { className: "font-neue-montreal-medium text-base text-[#3f3f46] dark:text-white", children: "To" }) }), _jsxs("div", { className: "flex flex-1 items-center border-l border-[#d1d1d6] px-3 py-2", children: [_jsx("input", { type: "text", value: recipientAddress, onChange: e => handleRecipientAddressChange(e.target.value), placeholder: "ENS or Address", className: "font-neue-montreal-medium dark:bg-b3-background flex-1 text-base text-[#70707b] outline-none placeholder:text-[#70707b] dark:text-white dark:placeholder:text-white" }), _jsx("button", { onClick: handlePaste, className: "font-inter ml-2 rounded-md border border-[#e4e4e7] bg-[#fafafa] px-2.5 py-0.5 text-sm font-medium text-[#3f3f46] transition-colors hover:bg-[#f4f4f5]", children: "Paste" })] })] }), addressError && _jsx("p", { className: "font-neue-montreal-medium -mt-4 text-xs text-red-500", children: addressError }), showValidatedResult && recipientAddress && isAddress(recipientAddress) && (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx("span", { className: "font-sf-pro-text text-sm font-semibold leading-[1.3] tracking-[-0.41px] text-[#0b57c2]", children: "Result" }) }), _jsxs("button", { onClick: handleSelectValidatedAddress, className: "dark:bg-b3-background dark:border-b3-line flex items-center gap-2 rounded-xl bg-[#f4f4f5] px-3 py-2 transition-colors hover:bg-[#e4e4e7]", children: [validatedRecipientAvatar ? (_jsx("img", { src: validatedRecipientAvatar, alt: validatedProfileData?.name || recipientAddress, className: "h-10 w-10 rounded-full" })) : (_jsx("div", { className: "dark:border-b3-line dark:bg-b3-background flex h-10 w-10 items-center justify-center rounded-full border border-[#e4e4e7] bg-[#f4f4f5]", children: _jsx(Wallet, { className: "h-5 w-5 text-[#a0a0ab] dark:text-white" }) })), _jsxs("span", { className: "font-neue-montreal-medium text-base tracking-[-0.32px] text-[#70707b] dark:text-white", children: [recipientAddress.slice(0, 6), "...", recipientAddress.slice(-4), validatedProfileData?.name && ` (${validatedProfileData.name})`] })] })] })), recentAddresses.length > 0 && (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Clock, { className: "h-3.5 w-3.5 text-[#3f3f46]" }), _jsx("span", { className: "font-sf-pro-text text-sm font-semibold leading-[1.3] tracking-[-0.41px] text-[#3f3f46]", children: "Recents" })] }), _jsx("div", { className: "flex flex-col", children: recentAddresses.map((recent, index) => (_jsx(RecentAddressItem, { address: recent.address, onClick: () => {
183
186
  // Just fill the input and show validation - don't auto-proceed
184
187
  handleRecipientAddressChange(recent.address);
185
188
  } }, index))) })] }))] })), step === "token" && (_jsx("div", { className: "flex flex-col p-5", children: isLoadingBalance ? (_jsx("div", { className: "space-y-4", children: _jsx("div", { className: "space-y-1", children: [...Array(3)].map((_, index) => (_jsxs("div", { className: "flex items-center justify-between rounded-xl p-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "bg-b3-line h-10 w-10 animate-pulse rounded-full" }), _jsxs("div", { children: [_jsx("div", { className: "bg-b3-line mb-1 h-4 w-16 animate-pulse rounded" }), _jsx("div", { className: "bg-b3-line h-3 w-24 animate-pulse rounded" })] })] }), _jsxs("div", { className: "text-right", children: [_jsx("div", { className: "bg-b3-line mb-1 h-4 w-20 animate-pulse rounded" }), _jsx("div", { className: "bg-b3-line h-3 w-16 animate-pulse rounded" })] })] }, index))) }) })) : simBalance?.balances && simBalance.balances.length > 0 ? (_jsx("div", { className: "space-y-4", children: _jsx("div", { className: "space-y-1", children: simBalance.balances.map(token => (_jsxs("div", { className: "hover:bg-b3-line/60 dark:hover:bg-b3-primary-wash/40 group flex cursor-pointer items-center justify-between rounded-xl p-3 transition-all duration-200", onClick: () => {
@@ -0,0 +1,21 @@
1
+ export interface BetterAuthResetPasswordProps {
2
+ /** The reset token from the URL query param */
3
+ token: string;
4
+ /** Called after password is successfully reset */
5
+ onSuccess?: () => void;
6
+ /** Called on error */
7
+ onError?: (error: Error) => void;
8
+ /** Optional class name */
9
+ className?: string;
10
+ }
11
+ /**
12
+ * Standalone reset password form. Render this on your reset password page.
13
+ * Reads the token from props (extract it from the URL query string).
14
+ *
15
+ * Usage:
16
+ * ```tsx
17
+ * const token = new URLSearchParams(window.location.search).get("token");
18
+ * <BetterAuthResetPassword token={token} onSuccess={() => navigate("/login")} />
19
+ * ```
20
+ */
21
+ export declare function BetterAuthResetPassword({ token, onSuccess, onError, className }: BetterAuthResetPasswordProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Input } from "../../../../global-account/react/index.js";
3
+ import { debugB3React } from "../../../../shared/utils/debug.js";
4
+ import { useState } from "react";
5
+ import { useBetterAuth } from "../../hooks/useBetterAuth.js";
6
+ const debug = debugB3React("BetterAuthResetPassword");
7
+ /**
8
+ * Standalone reset password form. Render this on your reset password page.
9
+ * Reads the token from props (extract it from the URL query string).
10
+ *
11
+ * Usage:
12
+ * ```tsx
13
+ * const token = new URLSearchParams(window.location.search).get("token");
14
+ * <BetterAuthResetPassword token={token} onSuccess={() => navigate("/login")} />
15
+ * ```
16
+ */
17
+ export function BetterAuthResetPassword({ token, onSuccess, onError, className }) {
18
+ const { resetPassword } = useBetterAuth();
19
+ const [password, setPassword] = useState("");
20
+ const [confirmPassword, setConfirmPassword] = useState("");
21
+ const [isLoading, setIsLoading] = useState(false);
22
+ const [error, setError] = useState(null);
23
+ const [success, setSuccess] = useState(false);
24
+ const handleSubmit = async () => {
25
+ if (!password) {
26
+ setError("Please enter a new password");
27
+ return;
28
+ }
29
+ if (password.length < 8) {
30
+ setError("Password must be at least 8 characters");
31
+ return;
32
+ }
33
+ if (password !== confirmPassword) {
34
+ setError("Passwords do not match");
35
+ return;
36
+ }
37
+ try {
38
+ setIsLoading(true);
39
+ setError(null);
40
+ await resetPassword(password, token);
41
+ setSuccess(true);
42
+ debug("Password reset successful");
43
+ onSuccess?.();
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : "Password reset failed";
47
+ setError(message);
48
+ debug("Password reset failed", err);
49
+ onError?.(err);
50
+ }
51
+ finally {
52
+ setPassword("");
53
+ setConfirmPassword("");
54
+ setIsLoading(false);
55
+ }
56
+ };
57
+ if (!token) {
58
+ return (_jsx("div", { className: `w-full max-w-[400px] px-6 text-center ${className || ""}`, children: _jsx("p", { className: "text-sm text-red-500", children: "Invalid or missing reset token." }) }));
59
+ }
60
+ return (_jsxs("div", { className: `w-full max-w-[400px] px-6 ${className || ""}`, children: [_jsxs("div", { className: "mb-10 text-center", children: [_jsx("h1", { className: "text-[28px] font-semibold tracking-tight text-gray-900 dark:text-gray-100", children: success ? "Password reset" : "Set new password" }), _jsx("p", { className: "mt-3 text-[15px] text-gray-500 dark:text-gray-400", children: success ? "Your password has been updated." : "Enter your new password below." })] }), success ? (_jsx("div", { className: "space-y-4 text-center", children: _jsx("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }) })) : (_jsxs("div", { className: "space-y-5", children: [_jsxs("div", { children: [_jsx("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "New password" }), _jsx(Input, { type: "password", placeholder: "At least 8 characters", value: password, onChange: e => setPassword(e.target.value), disabled: isLoading, className: "h-11 px-4 text-[15px]" })] }), _jsxs("div", { children: [_jsx("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Confirm password" }), _jsx(Input, { type: "password", placeholder: "Repeat your password", value: confirmPassword, onChange: e => setConfirmPassword(e.target.value), disabled: isLoading, onKeyDown: e => {
61
+ if (e.key === "Enter")
62
+ handleSubmit();
63
+ }, className: "h-11 px-4 text-[15px]" })] }), error && _jsx("p", { className: "text-sm text-red-500", children: error }), _jsx(Button, { onClick: handleSubmit, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Resetting..." : "Reset password" })] }))] }));
64
+ }
@@ -0,0 +1,34 @@
1
+ import { type BetterAuthSocialProvider } from "../../hooks/useBetterAuth";
2
+ export interface BetterAuthSignInProps {
3
+ /** Title displayed above the form. Default: "Welcome back" for sign-in, "Create an account" for sign-up */
4
+ title?: string;
5
+ /** Subtitle displayed below the title */
6
+ subtitle?: string;
7
+ /** Which social providers to show. Defaults to all. Pass empty array to hide. */
8
+ socialProviders?: BetterAuthSocialProvider[];
9
+ /** Show email/password form. Default: true */
10
+ showEmail?: boolean;
11
+ /** URL to redirect to after password reset link is clicked. Token is appended as ?token=... */
12
+ passwordResetRedirectTo?: string;
13
+ /** Called after successful authentication */
14
+ onSuccess?: () => void;
15
+ /** Called on authentication error */
16
+ onError?: (error: Error) => void;
17
+ /** Optional class name for the root container */
18
+ className?: string;
19
+ }
20
+ /**
21
+ * Standalone inline sign-in component for Better Auth.
22
+ *
23
+ * Renders directly — no modal, no button wrapper. Designed for full-page
24
+ * sign-in layouts (e.g., B3OS web with branding on the left, form on the right).
25
+ *
26
+ * Usage:
27
+ * ```tsx
28
+ * <BetterAuthSignIn
29
+ * socialProviders={["google", "github"]}
30
+ * onSuccess={() => router.push("/dashboard")}
31
+ * />
32
+ * ```
33
+ */
34
+ export declare function BetterAuthSignIn({ title, subtitle, socialProviders, showEmail, passwordResetRedirectTo, onSuccess, onError, className, }: BetterAuthSignInProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,160 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Button, Input, useAuthStore } from "../../../../global-account/react/index.js";
3
+ import { debugB3React } from "../../../../shared/utils/debug.js";
4
+ import { useState } from "react";
5
+ import { EmailVerificationRequiredError, useBetterAuth, } from "../../hooks/useBetterAuth.js";
6
+ import { strategyIcons, strategyLabels } from "./utils/signInUtils.js";
7
+ const debug = debugB3React("BetterAuthSignIn");
8
+ const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
9
+ const DEFAULT_SOCIAL_PROVIDERS = [
10
+ { id: "google", label: "Google" },
11
+ { id: "github", label: "GitHub" },
12
+ { id: "discord", label: "Discord" },
13
+ { id: "microsoft", label: "Microsoft" },
14
+ { id: "slack", label: "Slack" },
15
+ ];
16
+ /**
17
+ * Standalone inline sign-in component for Better Auth.
18
+ *
19
+ * Renders directly — no modal, no button wrapper. Designed for full-page
20
+ * sign-in layouts (e.g., B3OS web with branding on the left, form on the right).
21
+ *
22
+ * Usage:
23
+ * ```tsx
24
+ * <BetterAuthSignIn
25
+ * socialProviders={["google", "github"]}
26
+ * onSuccess={() => router.push("/dashboard")}
27
+ * />
28
+ * ```
29
+ */
30
+ export function BetterAuthSignIn({ title, subtitle = "Enter your credentials to access your account", socialProviders = DEFAULT_SOCIAL_PROVIDERS.map(p => p.id), showEmail = true, passwordResetRedirectTo, onSuccess, onError, className, }) {
31
+ const { signInWithEmail, signUpWithEmail, signInWithSocial, requestPasswordReset } = useBetterAuth();
32
+ const isAuthenticated = useAuthStore(state => state.isAuthenticated);
33
+ const [mode, setMode] = useState("sign-in");
34
+ const [email, setEmail] = useState("");
35
+ const [password, setPassword] = useState("");
36
+ const [name, setName] = useState("");
37
+ const [isLoading, setIsLoading] = useState(false);
38
+ const [loadingProvider, setLoadingProvider] = useState(null);
39
+ const [error, setError] = useState(null);
40
+ const [resetEmailSent, setResetEmailSent] = useState(false);
41
+ const [verificationSent, setVerificationSent] = useState(false);
42
+ const resolvedTitle = title ||
43
+ (mode === "forgot-password" ? "Reset password" : mode === "sign-in" ? "Welcome back" : "Create an account");
44
+ const resolvedSubtitle = mode === "forgot-password"
45
+ ? "Enter your email and we'll send you a reset link"
46
+ : subtitle || "Enter your credentials to access your account";
47
+ const handleForgotPassword = async () => {
48
+ const normalizedEmail = email.trim().toLowerCase();
49
+ if (!EMAIL_REGEX.test(normalizedEmail)) {
50
+ setError("Please enter a valid email address");
51
+ return;
52
+ }
53
+ try {
54
+ setIsLoading(true);
55
+ setError(null);
56
+ await requestPasswordReset(normalizedEmail, passwordResetRedirectTo);
57
+ setResetEmailSent(true);
58
+ }
59
+ catch (err) {
60
+ const message = err instanceof Error ? err.message : "Failed to send reset email";
61
+ setError(message);
62
+ }
63
+ finally {
64
+ setIsLoading(false);
65
+ }
66
+ };
67
+ const providers = socialProviders
68
+ .map(id => DEFAULT_SOCIAL_PROVIDERS.find(p => p.id === id))
69
+ .filter((p) => !!p);
70
+ if (isAuthenticated) {
71
+ return null;
72
+ }
73
+ const handleEmailSubmit = async () => {
74
+ const normalizedEmail = email.trim().toLowerCase();
75
+ if (!EMAIL_REGEX.test(normalizedEmail)) {
76
+ setError("Please enter a valid email address");
77
+ return;
78
+ }
79
+ if (!password) {
80
+ setError("Please enter a password");
81
+ return;
82
+ }
83
+ if (mode === "sign-up" && !name.trim()) {
84
+ setError("Please enter your name");
85
+ return;
86
+ }
87
+ try {
88
+ setIsLoading(true);
89
+ setError(null);
90
+ if (mode === "sign-up") {
91
+ await signUpWithEmail(normalizedEmail, password, name.trim());
92
+ }
93
+ else {
94
+ await signInWithEmail(normalizedEmail, password);
95
+ }
96
+ debug("Auth successful");
97
+ onSuccess?.();
98
+ }
99
+ catch (err) {
100
+ if (err instanceof EmailVerificationRequiredError) {
101
+ setVerificationSent(true);
102
+ setError(null);
103
+ }
104
+ else {
105
+ const message = err instanceof Error ? err.message : "Authentication failed";
106
+ setError(message);
107
+ onError?.(err);
108
+ }
109
+ debug("Auth failed", err);
110
+ }
111
+ finally {
112
+ setPassword("");
113
+ setIsLoading(false);
114
+ }
115
+ };
116
+ const handleSocialSignIn = async (provider) => {
117
+ try {
118
+ setIsLoading(true);
119
+ setLoadingProvider(provider);
120
+ setError(null);
121
+ await signInWithSocial(provider);
122
+ }
123
+ catch (err) {
124
+ const message = err instanceof Error ? err.message : `Sign in failed`;
125
+ setError(message);
126
+ onError?.(err);
127
+ setIsLoading(false);
128
+ setLoadingProvider(null);
129
+ }
130
+ };
131
+ if (verificationSent) {
132
+ return (_jsx("div", { className: `w-full max-w-[400px] px-6 ${className || ""}`, children: _jsxs("div", { className: "flex flex-col items-center gap-6 text-center", children: [_jsx("div", { className: "flex h-14 w-14 shrink-0 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-7 w-7 shrink-0 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", width: 28, height: 28, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, 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" }) }) }), _jsx("h2", { className: "text-[22px] font-semibold text-gray-900 dark:text-gray-100", children: "Check your email" }), _jsxs("p", { className: "text-[15px] text-gray-500 dark:text-gray-400", children: ["We sent a verification link to ", _jsx("span", { className: "font-medium text-gray-700 dark:text-gray-200", children: email }), ". Click the link to verify your account, then come back and sign in."] }), _jsx("button", { onClick: () => {
133
+ setVerificationSent(false);
134
+ setMode("sign-in");
135
+ setPassword("");
136
+ }, className: "text-[14px] font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: "Back to sign in" })] }) }));
137
+ }
138
+ return (_jsxs("div", { className: `w-full max-w-[400px] px-6 ${className || ""}`, children: [_jsxs("div", { className: "mb-10 text-center", children: [_jsx("h1", { className: "text-[28px] font-semibold tracking-tight text-gray-900 dark:text-gray-100", children: resolvedTitle }), _jsx("p", { className: "mt-3 text-[15px] text-gray-500 dark:text-gray-400", children: resolvedSubtitle })] }), mode === "forgot-password" && (_jsxs("div", { className: "space-y-5", children: [resetEmailSent ? (_jsxs("div", { className: "space-y-4 text-center", children: [_jsx("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }), _jsx("p", { className: "text-[15px] text-gray-600 dark:text-gray-300", children: "Check your email for a reset link." })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Email" }), _jsx(Input, { type: "email", placeholder: "name@company.com", value: email, onChange: e => setEmail(e.target.value), disabled: isLoading, onKeyDown: e => {
139
+ if (e.key === "Enter")
140
+ handleForgotPassword();
141
+ }, className: "h-11 px-4 text-[15px]" })] }), error && _jsx("p", { className: "text-sm text-red-500", children: error }), _jsx(Button, { onClick: handleForgotPassword, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Sending..." : "Send reset link" })] })), _jsx("p", { className: "mt-8 text-center text-[14px] text-gray-500 dark:text-gray-400", children: _jsx("button", { onClick: () => {
142
+ setMode("sign-in");
143
+ setError(null);
144
+ setResetEmailSent(false);
145
+ }, className: "font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: "Back to sign in" }) })] })), showEmail && mode !== "forgot-password" && (_jsxs("div", { className: "space-y-5", children: [mode === "sign-up" && (_jsxs("div", { children: [_jsx("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Name" }), _jsx(Input, { type: "text", placeholder: "Your name", value: name, onChange: e => setName(e.target.value), disabled: isLoading, className: "h-11 px-4 text-[15px]" })] })), _jsxs("div", { children: [_jsx("label", { className: "mb-2 block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Email" }), _jsx(Input, { type: "email", placeholder: "name@company.com", value: email, onChange: e => setEmail(e.target.value), disabled: isLoading, className: "h-11 px-4 text-[15px]" })] }), _jsxs("div", { children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("label", { className: "block text-xs font-medium uppercase tracking-wide text-gray-700 dark:text-gray-300", children: "Password" }), mode === "sign-in" && (_jsx("button", { type: "button", onClick: () => {
146
+ setMode("forgot-password");
147
+ setError(null);
148
+ }, className: "text-xs font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: "Forgot password?" }))] }), _jsx(Input, { type: "password", placeholder: "Password", value: password, onChange: e => setPassword(e.target.value), disabled: isLoading, onKeyDown: e => {
149
+ if (e.key === "Enter")
150
+ handleEmailSubmit();
151
+ }, className: "h-11 px-4 text-[15px]" })] }), error && _jsx("p", { className: "text-sm text-red-500", children: error }), _jsx(Button, { onClick: handleEmailSubmit, disabled: isLoading, className: "h-11 w-full bg-gray-900 text-[15px] font-medium text-white hover:bg-gray-800 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-100", children: isLoading ? "Loading..." : mode === "sign-in" ? "Sign in" : "Sign up" })] })), providers.length > 0 && mode !== "forgot-password" && (_jsxs(_Fragment, { children: [showEmail && (_jsxs("div", { className: "my-8 flex items-center gap-4", children: [_jsx("div", { className: "h-px flex-1 bg-gray-200 dark:bg-gray-700" }), _jsx("span", { className: "text-xs text-gray-400", children: "Or continue with" }), _jsx("div", { className: "h-px flex-1 bg-gray-200 dark:bg-gray-700" })] })), _jsx("div", { className: "space-y-4", children: providers.map(provider => {
152
+ const icon = strategyIcons[provider.id];
153
+ const label = strategyLabels[provider.id] || provider.label;
154
+ const isProviderLoading = loadingProvider === provider.id;
155
+ return (_jsxs("button", { onClick: () => handleSocialSignIn(provider.id), disabled: isLoading, style: { paddingTop: "12px", paddingBottom: "12px" }, className: "flex w-full items-center justify-center gap-3 rounded-lg border border-gray-200 bg-white px-4 text-[14px] font-medium text-gray-700 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700", children: [isProviderLoading ? (_jsxs("svg", { className: "h-5 w-5 animate-spin text-gray-400", viewBox: "0 0 24 24", fill: "none", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })] })) : (icon && _jsx("img", { src: icon, alt: "", className: "h-5 w-5" })), _jsx("span", { children: isProviderLoading ? "Redirecting..." : label })] }, provider.id));
156
+ }) })] })), showEmail && mode !== "forgot-password" && (_jsxs("p", { className: "mt-8 text-center text-[14px] text-gray-500 dark:text-gray-400", children: [mode === "sign-in" ? "Don't have an account? " : "Already have an account? ", _jsx("button", { onClick: () => {
157
+ setMode(mode === "sign-in" ? "sign-up" : "sign-in");
158
+ setError(null);
159
+ }, disabled: isLoading, className: "font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400", children: mode === "sign-in" ? "Sign up" : "Sign in" })] }))] }));
160
+ }
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Loading, useAuthentication, useAuthStore, useB3Config, useGetAllTWSigners, useModalStore, } from "../../../../global-account/react/index.js";
3
+ import { LoginStepBetterAuth } from "./steps/LoginStepBetterAuth.js";
3
4
  import { debugB3React } from "../../../../shared/utils/debug.js";
4
5
  import { useCallback, useEffect, useRef, useState } from "react";
5
6
  import { useActiveAccount } from "thirdweb/react";
@@ -13,18 +14,20 @@ const MAX_REFETCH_ATTEMPTS = 20;
13
14
  * Handles different login providers, authentication steps, and session key management
14
15
  */
15
16
  export function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySuccess, onError, chain, sessionKeyAddress, partnerId, closeAfterLogin = false, source = "signInWithB3Button", signersEnabled = false, }) {
16
- const { automaticallySetFirstEoa } = useB3Config();
17
+ const { automaticallySetFirstEoa, authStrategy } = useB3Config();
17
18
  // skipAutoConnect: this component intentionally logs out on mount to show a fresh login screen.
18
19
  // AuthenticationProvider is the sole owner of useAutoConnect to avoid competing auth cycles.
19
20
  const { user, logout } = useAuthentication(partnerId, { skipAutoConnect: true });
20
21
  // Tracks whether the pre-login logout has finished.
21
22
  // We must not render ConnectEmbed until logout (wallet disconnect) completes,
22
23
  // otherwise the wallet state disrupts ConnectEmbed causing a blank modal.
23
- const [readyToShowLogin, setReadyToShowLogin] = useState(source === "requestPermissions");
24
+ const [readyToShowLogin, setReadyToShowLogin] = useState(source === "requestPermissions" || authStrategy === "better-auth");
24
25
  const hasLoggedOutRef = useRef(false);
25
26
  useEffect(() => {
26
27
  if (hasLoggedOutRef.current)
27
28
  return;
29
+ if (authStrategy === "better-auth")
30
+ return;
28
31
  if (source !== "requestPermissions") {
29
32
  debug("Logging out before login");
30
33
  hasLoggedOutRef.current = true;
@@ -32,7 +35,7 @@ export function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySucce
32
35
  setReadyToShowLogin(true);
33
36
  });
34
37
  }
35
- }, [source, logout]);
38
+ }, [source, logout, authStrategy]);
36
39
  const [step, setStep] = useState(source === "requestPermissions" ? null : "login");
37
40
  const [sessionKeyAdded, setSessionKeyAdded] = useState(source === "requestPermissions" ? true : false);
38
41
  const { setB3ModalContentType, setB3ModalOpen, isOpen, contentType } = useModalStore();
@@ -237,7 +240,13 @@ export function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySucce
237
240
  else if (step === "login") {
238
241
  // Show loading spinner while: authenticating, waiting for pre-login logout to finish,
239
242
  // or fetching signers.
240
- if (!readyToShowLogin || isAuthenticating || isFetchingSigners) {
243
+ if (authStrategy === "better-auth") {
244
+ // Better Auth manages its own loading/verification states internally.
245
+ // Don't gate on isAuthenticating — it would unmount the component
246
+ // and lose verification state when setIsAuthenticating(false) fires.
247
+ content = _jsx(LoginStepBetterAuth, { onSuccess: () => handleLoginSuccess({}), onError: onError });
248
+ }
249
+ else if (!readyToShowLogin || isAuthenticating || isFetchingSigners) {
241
250
  content = (_jsx(LoginStepContainer, { partnerId: partnerId, children: _jsx("div", { className: "my-8 flex min-h-[350px] items-center justify-center", children: _jsx(Loading, { variant: "white", size: "lg" }) }) }));
242
251
  }
243
252
  else {
@@ -1,6 +1,15 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Button } from "../../custom/Button.js";
3
- import { strategyIcons } from "../utils/signInUtils.js";
3
+ import { Github, Mail } from "lucide-react";
4
+ import { strategyIcons, strategyLabels } from "../utils/signInUtils.js";
5
+ const fallbackIcons = {
6
+ github: Github,
7
+ email: Mail,
8
+ };
4
9
  export function AuthButton({ strategy, onClick, isLoading, }) {
5
- return (_jsx(Button, { onClick: onClick, disabled: isLoading, 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", children: _jsx("img", { src: strategyIcons[strategy], className: "h-9 w-9" }) }, strategy));
10
+ const strategyIcon = strategyIcons[strategy];
11
+ const strategyLabel = strategyLabels[strategy] || strategy;
12
+ const FallbackIcon = fallbackIcons[strategy];
13
+ const buttonLabel = `Sign in with ${strategyLabel}`;
14
+ return (_jsx(Button, { onClick: onClick, disabled: isLoading, "aria-label": buttonLabel, title: buttonLabel, 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", children: strategyIcon ? (_jsx("img", { src: strategyIcon, alt: `${strategyLabel} icon`, className: "h-9 w-9" })) : FallbackIcon ? (_jsx(FallbackIcon, { className: "h-9 w-9 text-gray-900 dark:text-gray-100" })) : (_jsx("span", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: strategyLabel.charAt(0) })) }, strategy));
6
15
  }
@@ -0,0 +1,6 @@
1
+ interface LoginStepBetterAuthProps {
2
+ onSuccess?: () => void;
3
+ onError?: (error: Error) => Promise<void>;
4
+ }
5
+ export declare function LoginStepBetterAuth({ onSuccess, onError }: LoginStepBetterAuthProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};