@b3dotfun/sdk 0.0.73-test.3 → 0.0.74-alpha.0

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 (461) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +75 -50
  2. package/dist/cjs/anyspend/react/components/AnySpendBuySpin.js +9 -10
  3. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +41 -41
  4. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.d.ts +1 -0
  5. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.js +17 -9
  6. package/dist/cjs/anyspend/react/components/AnySpendStakeB3.js +7 -8
  7. package/dist/cjs/anyspend/react/components/AnySpendStakeB3ExactIn.js +7 -8
  8. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.d.ts +2 -1
  9. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.js +2 -2
  10. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  11. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +18 -14
  12. package/dist/cjs/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  13. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  14. package/dist/cjs/anyspend/react/components/common/InsufficientDepositPayment.js +6 -6
  15. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +35 -35
  16. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +1 -2
  17. package/dist/cjs/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  18. package/dist/cjs/anyspend/react/components/common/OrderHistory.js +7 -3
  19. package/dist/cjs/anyspend/react/components/common/OrderHistoryItem.js +1 -1
  20. package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +4 -4
  21. package/dist/cjs/anyspend/react/components/common/PanelOnrampPayment.js +8 -9
  22. package/dist/cjs/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  23. package/dist/cjs/anyspend/react/components/common/RecipientSelection.js +1 -1
  24. package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.js +2 -3
  25. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampOrderStatus.js +1 -2
  26. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampPayment.js +12 -12
  27. package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.js +4 -5
  28. package/dist/cjs/anyspend/react/hooks/useConnectedWalletDisplay.js +3 -2
  29. package/dist/cjs/anyspend/react/hooks/usePhantomTransfer.js +17 -17
  30. package/dist/cjs/anyspend/react/utils/toast.d.ts +6 -0
  31. package/dist/cjs/anyspend/react/utils/toast.js +9 -0
  32. package/dist/cjs/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  33. package/dist/cjs/global-account/react/components/AvatarCreator/AvatarCreator.js +2 -3
  34. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +1 -0
  35. package/dist/cjs/global-account/react/components/AvatarEditor/AvatarEditor.js +275 -39
  36. package/dist/cjs/global-account/react/components/B3DynamicModal.js +40 -13
  37. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.d.ts +1 -1
  38. package/dist/cjs/global-account/react/components/B3Provider/B3Provider.js +19 -3
  39. package/dist/cjs/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  40. package/dist/cjs/global-account/react/components/Deposit/Deposit.js +61 -0
  41. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  42. package/dist/cjs/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +34 -0
  43. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  44. package/dist/cjs/global-account/react/components/LinkAccount/LinkAccount.js +104 -283
  45. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  46. package/dist/cjs/global-account/react/components/LinkAccount/LinkNewAccount.js +320 -0
  47. package/dist/cjs/global-account/react/components/LinkAccount/LinkedAccountItem.d.ts +16 -0
  48. package/dist/cjs/global-account/react/components/LinkAccount/LinkedAccountItem.js +44 -0
  49. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  50. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.js +23 -0
  51. package/dist/cjs/global-account/react/components/ManageAccount/ContentTokens.js +1 -2
  52. package/dist/cjs/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  53. package/dist/cjs/global-account/react/components/ManageAccount/Header.js +120 -0
  54. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  55. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.js +43 -0
  56. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  57. package/dist/cjs/global-account/react/components/ManageAccount/HomeContent.js +16 -0
  58. package/dist/cjs/global-account/react/components/ManageAccount/ManageAccount.js +16 -194
  59. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  60. package/dist/cjs/global-account/react/components/ManageAccount/NFTContent.js +15 -0
  61. package/dist/cjs/global-account/react/components/ManageAccount/NotificationChannel.d.ts +16 -0
  62. package/dist/cjs/global-account/react/components/ManageAccount/NotificationChannel.js +13 -0
  63. package/dist/cjs/global-account/react/components/ManageAccount/NotificationsContent.d.ts +8 -0
  64. package/dist/cjs/global-account/react/components/ManageAccount/NotificationsContent.js +152 -0
  65. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  66. package/dist/cjs/global-account/react/components/ManageAccount/ProfileSection.js +47 -0
  67. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  68. package/dist/cjs/global-account/react/components/ManageAccount/SettingsContent.js +60 -0
  69. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  70. package/dist/cjs/global-account/react/components/ManageAccount/SettingsMenuItem.js +8 -0
  71. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  72. package/dist/cjs/global-account/react/components/ManageAccount/SettingsProfileCard.js +116 -0
  73. package/dist/cjs/global-account/react/components/ManageAccount/TokenBalanceRow.d.ts +3 -3
  74. package/dist/cjs/global-account/react/components/ManageAccount/TokenBalanceRow.js +2 -2
  75. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  76. package/dist/cjs/global-account/react/components/ManageAccount/TokenContent.js +44 -0
  77. package/dist/cjs/global-account/react/components/ManageAccount/channels/DiscordChannel.d.ts +11 -0
  78. package/dist/cjs/global-account/react/components/ManageAccount/channels/DiscordChannel.js +48 -0
  79. package/dist/cjs/global-account/react/components/ManageAccount/channels/EmailChannel.d.ts +11 -0
  80. package/dist/cjs/global-account/react/components/ManageAccount/channels/EmailChannel.js +68 -0
  81. package/dist/cjs/global-account/react/components/ManageAccount/channels/PhoneChannel.d.ts +14 -0
  82. package/dist/cjs/global-account/react/components/ManageAccount/channels/PhoneChannel.js +79 -0
  83. package/dist/cjs/global-account/react/components/ManageAccount/channels/TelegramChannel.d.ts +11 -0
  84. package/dist/cjs/global-account/react/components/ManageAccount/channels/TelegramChannel.js +79 -0
  85. package/dist/cjs/global-account/react/components/ManageAccount/channels/index.d.ts +4 -0
  86. package/dist/cjs/global-account/react/components/ManageAccount/channels/index.js +11 -0
  87. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.d.ts +11 -0
  88. package/dist/cjs/global-account/react/components/ModalHeader/ModalHeader.js +12 -0
  89. package/dist/cjs/global-account/react/components/Send/Send.d.ts +5 -0
  90. package/dist/cjs/global-account/react/components/Send/Send.js +195 -0
  91. package/dist/cjs/global-account/react/components/SignInWithB3/SignIn.js +5 -4
  92. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  93. package/dist/cjs/global-account/react/components/Toast/ToastComponents.d.ts +15 -0
  94. package/dist/cjs/global-account/react/components/Toast/ToastComponents.js +54 -0
  95. package/dist/cjs/global-account/react/components/Toast/ToastContext.d.ts +19 -0
  96. package/dist/cjs/global-account/react/components/Toast/ToastContext.js +59 -0
  97. package/dist/cjs/global-account/react/components/Toast/index.d.ts +4 -0
  98. package/dist/cjs/global-account/react/components/Toast/index.js +12 -0
  99. package/dist/cjs/global-account/react/components/Toast/toastApi.d.ts +21 -0
  100. package/dist/cjs/global-account/react/components/Toast/toastApi.js +93 -0
  101. package/dist/cjs/global-account/react/components/WalletImage/WalletImage.d.ts +4 -0
  102. package/dist/cjs/global-account/react/components/WalletImage/WalletImage.js +13 -0
  103. package/dist/cjs/global-account/react/components/icons/BellIcon.d.ts +3 -0
  104. package/dist/cjs/global-account/react/components/icons/BellIcon.js +5 -0
  105. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  106. package/dist/cjs/global-account/react/components/icons/ChevronDownIcon.js +7 -0
  107. package/dist/cjs/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  108. package/dist/cjs/global-account/react/components/icons/CopyIcon.js +7 -0
  109. package/dist/cjs/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  110. package/dist/cjs/global-account/react/components/icons/LinkIcon.js +5 -0
  111. package/dist/cjs/global-account/react/components/icons/LockIcon.d.ts +3 -0
  112. package/dist/cjs/global-account/react/components/icons/LockIcon.js +5 -0
  113. package/dist/cjs/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  114. package/dist/cjs/global-account/react/components/icons/WalletIcon.js +7 -0
  115. package/dist/cjs/global-account/react/components/index.d.ts +10 -4
  116. package/dist/cjs/global-account/react/components/index.js +29 -9
  117. package/dist/cjs/global-account/react/components/ui/Tabs.js +2 -2
  118. package/dist/cjs/global-account/react/components/ui/dialog.js +2 -2
  119. package/dist/cjs/global-account/react/components/ui/drawer.js +1 -1
  120. package/dist/cjs/global-account/react/hooks/index.d.ts +3 -2
  121. package/dist/cjs/global-account/react/hooks/index.js +7 -3
  122. package/dist/cjs/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  123. package/dist/cjs/global-account/react/hooks/useAccountWallet.js +18 -0
  124. package/dist/cjs/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  125. package/dist/cjs/global-account/react/hooks/useChainSwitchWithAction.js +11 -11
  126. package/dist/cjs/global-account/react/hooks/useNativeBalance.js +2 -2
  127. package/dist/cjs/global-account/react/hooks/useNotifications.d.ts +48 -0
  128. package/dist/cjs/global-account/react/hooks/useNotifications.js +189 -0
  129. package/dist/cjs/global-account/react/hooks/useSimBalance.js +3 -3
  130. package/dist/cjs/global-account/react/hooks/useTokenBalanceDirect.d.ts +1 -0
  131. package/dist/cjs/global-account/react/hooks/useTokenBalanceDirect.js +1 -0
  132. package/dist/cjs/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +17 -17
  133. package/dist/cjs/global-account/react/stores/index.d.ts +1 -0
  134. package/dist/cjs/global-account/react/stores/index.js +3 -1
  135. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +47 -6
  136. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  137. package/dist/cjs/global-account/react/stores/useRecentAddressesStore.js +36 -0
  138. package/dist/cjs/global-account/react/utils/index.d.ts +4 -0
  139. package/dist/cjs/global-account/react/utils/index.js +20 -0
  140. package/dist/cjs/global-account/react/utils/notificationsAPI.d.ts +80 -0
  141. package/dist/cjs/global-account/react/utils/notificationsAPI.js +257 -0
  142. package/dist/cjs/global-account/react/utils/profileDisplay.d.ts +3 -0
  143. package/dist/cjs/global-account/react/utils/profileDisplay.js +8 -4
  144. package/dist/cjs/global-account/react/utils/toast.d.ts +6 -0
  145. package/dist/cjs/global-account/react/utils/toast.js +9 -0
  146. package/dist/cjs/shared/constants/chains/supported.d.ts +3 -2
  147. package/dist/cjs/shared/constants/chains/supported.js +4 -0
  148. package/dist/cjs/shared/utils/ipfs.js +10 -3
  149. package/dist/esm/anyspend/react/components/AnySpend.js +67 -42
  150. package/dist/esm/anyspend/react/components/AnySpendBuySpin.js +1 -2
  151. package/dist/esm/anyspend/react/components/AnySpendCustom.js +10 -10
  152. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.d.ts +1 -0
  153. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.js +12 -4
  154. package/dist/esm/anyspend/react/components/AnySpendStakeB3.js +1 -2
  155. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.js +1 -2
  156. package/dist/esm/anyspend/react/components/AnyspendDepositHype.d.ts +2 -1
  157. package/dist/esm/anyspend/react/components/AnyspendDepositHype.js +2 -2
  158. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  159. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +9 -5
  160. package/dist/esm/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  161. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  162. package/dist/esm/anyspend/react/components/common/InsufficientDepositPayment.js +1 -1
  163. package/dist/esm/anyspend/react/components/common/OrderDetails.js +2 -2
  164. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +1 -2
  165. package/dist/esm/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  166. package/dist/esm/anyspend/react/components/common/OrderHistory.js +6 -5
  167. package/dist/esm/anyspend/react/components/common/OrderHistoryItem.js +2 -2
  168. package/dist/esm/anyspend/react/components/common/PanelOnramp.js +4 -4
  169. package/dist/esm/anyspend/react/components/common/PanelOnrampPayment.js +2 -3
  170. package/dist/esm/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  171. package/dist/esm/anyspend/react/components/common/RecipientSelection.js +1 -1
  172. package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.js +1 -2
  173. package/dist/esm/anyspend/react/components/webview/WebviewOnrampOrderStatus.js +1 -2
  174. package/dist/esm/anyspend/react/components/webview/WebviewOnrampPayment.js +1 -1
  175. package/dist/esm/anyspend/react/hooks/useAnyspendFlow.js +1 -2
  176. package/dist/esm/anyspend/react/hooks/useConnectedWalletDisplay.js +3 -2
  177. package/dist/esm/anyspend/react/hooks/usePhantomTransfer.js +1 -1
  178. package/dist/esm/anyspend/react/utils/toast.d.ts +6 -0
  179. package/dist/esm/anyspend/react/utils/toast.js +5 -0
  180. package/dist/esm/global-account/react/components/AccountAssets/AccountAssets.js +38 -2
  181. package/dist/esm/global-account/react/components/AvatarCreator/AvatarCreator.js +1 -2
  182. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +1 -0
  183. package/dist/esm/global-account/react/components/AvatarEditor/AvatarEditor.js +276 -40
  184. package/dist/esm/global-account/react/components/B3DynamicModal.js +37 -13
  185. package/dist/esm/global-account/react/components/B3Provider/B3Provider.d.ts +1 -1
  186. package/dist/esm/global-account/react/components/B3Provider/B3Provider.js +19 -3
  187. package/dist/esm/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  188. package/dist/esm/global-account/react/components/Deposit/Deposit.js +55 -0
  189. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  190. package/dist/esm/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.js +31 -0
  191. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  192. package/dist/esm/global-account/react/components/LinkAccount/LinkAccount.js +103 -283
  193. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  194. package/dist/esm/global-account/react/components/LinkAccount/LinkNewAccount.js +314 -0
  195. package/dist/esm/global-account/react/components/LinkAccount/LinkedAccountItem.d.ts +16 -0
  196. package/dist/esm/global-account/react/components/LinkAccount/LinkedAccountItem.js +42 -0
  197. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  198. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.js +21 -0
  199. package/dist/esm/global-account/react/components/ManageAccount/ContentTokens.js +1 -2
  200. package/dist/esm/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  201. package/dist/esm/global-account/react/components/ManageAccount/Header.js +81 -0
  202. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  203. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.js +41 -0
  204. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  205. package/dist/esm/global-account/react/components/ManageAccount/HomeContent.js +10 -0
  206. package/dist/esm/global-account/react/components/ManageAccount/ManageAccount.js +18 -196
  207. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  208. package/dist/esm/global-account/react/components/ManageAccount/NFTContent.js +13 -0
  209. package/dist/esm/global-account/react/components/ManageAccount/NotificationChannel.d.ts +16 -0
  210. package/dist/esm/global-account/react/components/ManageAccount/NotificationChannel.js +9 -0
  211. package/dist/esm/global-account/react/components/ManageAccount/NotificationsContent.d.ts +8 -0
  212. package/dist/esm/global-account/react/components/ManageAccount/NotificationsContent.js +147 -0
  213. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  214. package/dist/esm/global-account/react/components/ManageAccount/ProfileSection.js +45 -0
  215. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  216. package/dist/esm/global-account/react/components/ManageAccount/SettingsContent.js +55 -0
  217. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  218. package/dist/esm/global-account/react/components/ManageAccount/SettingsMenuItem.js +6 -0
  219. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  220. package/dist/esm/global-account/react/components/ManageAccount/SettingsProfileCard.js +111 -0
  221. package/dist/esm/global-account/react/components/ManageAccount/TokenBalanceRow.d.ts +3 -3
  222. package/dist/esm/global-account/react/components/ManageAccount/TokenBalanceRow.js +3 -3
  223. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  224. package/dist/esm/global-account/react/components/ManageAccount/TokenContent.js +42 -0
  225. package/dist/esm/global-account/react/components/ManageAccount/channels/DiscordChannel.d.ts +11 -0
  226. package/dist/esm/global-account/react/components/ManageAccount/channels/DiscordChannel.js +44 -0
  227. package/dist/esm/global-account/react/components/ManageAccount/channels/EmailChannel.d.ts +11 -0
  228. package/dist/esm/global-account/react/components/ManageAccount/channels/EmailChannel.js +64 -0
  229. package/dist/esm/global-account/react/components/ManageAccount/channels/PhoneChannel.d.ts +14 -0
  230. package/dist/esm/global-account/react/components/ManageAccount/channels/PhoneChannel.js +75 -0
  231. package/dist/esm/global-account/react/components/ManageAccount/channels/TelegramChannel.d.ts +11 -0
  232. package/dist/esm/global-account/react/components/ManageAccount/channels/TelegramChannel.js +75 -0
  233. package/dist/esm/global-account/react/components/ManageAccount/channels/index.d.ts +4 -0
  234. package/dist/esm/global-account/react/components/ManageAccount/channels/index.js +4 -0
  235. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.d.ts +11 -0
  236. package/dist/esm/global-account/react/components/ModalHeader/ModalHeader.js +10 -0
  237. package/dist/esm/global-account/react/components/Send/Send.d.ts +5 -0
  238. package/dist/esm/global-account/react/components/Send/Send.js +189 -0
  239. package/dist/esm/global-account/react/components/SignInWithB3/SignIn.js +7 -6
  240. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +1 -1
  241. package/dist/esm/global-account/react/components/Toast/ToastComponents.d.ts +15 -0
  242. package/dist/esm/global-account/react/components/Toast/ToastComponents.js +50 -0
  243. package/dist/esm/global-account/react/components/Toast/ToastContext.d.ts +19 -0
  244. package/dist/esm/global-account/react/components/Toast/ToastContext.js +55 -0
  245. package/dist/esm/global-account/react/components/Toast/index.d.ts +4 -0
  246. package/dist/esm/global-account/react/components/Toast/index.js +3 -0
  247. package/dist/esm/global-account/react/components/Toast/toastApi.d.ts +21 -0
  248. package/dist/esm/global-account/react/components/Toast/toastApi.js +89 -0
  249. package/dist/esm/global-account/react/components/WalletImage/WalletImage.d.ts +4 -0
  250. package/dist/esm/global-account/react/components/WalletImage/WalletImage.js +11 -0
  251. package/dist/esm/global-account/react/components/icons/BellIcon.d.ts +3 -0
  252. package/dist/esm/global-account/react/components/icons/BellIcon.js +3 -0
  253. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  254. package/dist/esm/global-account/react/components/icons/ChevronDownIcon.js +4 -0
  255. package/dist/esm/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  256. package/dist/esm/global-account/react/components/icons/CopyIcon.js +4 -0
  257. package/dist/esm/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  258. package/dist/esm/global-account/react/components/icons/LinkIcon.js +3 -0
  259. package/dist/esm/global-account/react/components/icons/LockIcon.d.ts +3 -0
  260. package/dist/esm/global-account/react/components/icons/LockIcon.js +3 -0
  261. package/dist/esm/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  262. package/dist/esm/global-account/react/components/icons/WalletIcon.js +4 -0
  263. package/dist/esm/global-account/react/components/index.d.ts +10 -4
  264. package/dist/esm/global-account/react/components/index.js +14 -5
  265. package/dist/esm/global-account/react/components/ui/Tabs.js +2 -2
  266. package/dist/esm/global-account/react/components/ui/dialog.js +2 -2
  267. package/dist/esm/global-account/react/components/ui/drawer.js +1 -1
  268. package/dist/esm/global-account/react/hooks/index.d.ts +3 -2
  269. package/dist/esm/global-account/react/hooks/index.js +3 -2
  270. package/dist/esm/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  271. package/dist/esm/global-account/react/hooks/useAccountWallet.js +17 -0
  272. package/dist/esm/global-account/react/hooks/useB3BalanceFromAddresses.js +1 -0
  273. package/dist/esm/global-account/react/hooks/useChainSwitchWithAction.js +2 -2
  274. package/dist/esm/global-account/react/hooks/useNativeBalance.js +1 -1
  275. package/dist/esm/global-account/react/hooks/useNotifications.d.ts +48 -0
  276. package/dist/esm/global-account/react/hooks/useNotifications.js +186 -0
  277. package/dist/esm/global-account/react/hooks/useSimBalance.js +3 -3
  278. package/dist/esm/global-account/react/hooks/useTokenBalanceDirect.d.ts +1 -0
  279. package/dist/esm/global-account/react/hooks/useTokenBalanceDirect.js +1 -0
  280. package/dist/esm/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +2 -2
  281. package/dist/esm/global-account/react/stores/index.d.ts +1 -0
  282. package/dist/esm/global-account/react/stores/index.js +1 -0
  283. package/dist/esm/global-account/react/stores/useModalStore.d.ts +47 -6
  284. package/dist/esm/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  285. package/dist/esm/global-account/react/stores/useRecentAddressesStore.js +33 -0
  286. package/dist/esm/global-account/react/utils/index.d.ts +4 -0
  287. package/dist/esm/global-account/react/utils/index.js +4 -0
  288. package/dist/esm/global-account/react/utils/notificationsAPI.d.ts +80 -0
  289. package/dist/esm/global-account/react/utils/notificationsAPI.js +254 -0
  290. package/dist/esm/global-account/react/utils/profileDisplay.d.ts +3 -0
  291. package/dist/esm/global-account/react/utils/profileDisplay.js +8 -4
  292. package/dist/esm/global-account/react/utils/toast.d.ts +6 -0
  293. package/dist/esm/global-account/react/utils/toast.js +5 -0
  294. package/dist/esm/shared/constants/chains/supported.d.ts +3 -2
  295. package/dist/esm/shared/constants/chains/supported.js +3 -0
  296. package/dist/esm/shared/utils/ipfs.js +10 -3
  297. package/dist/styles/index.css +1 -1
  298. package/dist/types/anyspend/react/components/AnySpendCustomExactIn.d.ts +1 -0
  299. package/dist/types/anyspend/react/components/AnyspendDepositHype.d.ts +2 -1
  300. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +0 -6
  301. package/dist/types/anyspend/react/components/common/OrderHistory.d.ts +1 -1
  302. package/dist/types/anyspend/react/utils/toast.d.ts +6 -0
  303. package/dist/types/global-account/react/components/AvatarEditor/AvatarEditor.d.ts +1 -0
  304. package/dist/types/global-account/react/components/B3Provider/B3Provider.d.ts +1 -1
  305. package/dist/types/global-account/react/components/Deposit/Deposit.d.ts +1 -0
  306. package/dist/types/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.d.ts +39 -0
  307. package/dist/types/global-account/react/components/LinkAccount/LinkAccount.d.ts +6 -4
  308. package/dist/types/global-account/react/components/LinkAccount/LinkNewAccount.d.ts +4 -0
  309. package/dist/types/global-account/react/components/LinkAccount/LinkedAccountItem.d.ts +16 -0
  310. package/dist/types/global-account/react/components/ManageAccount/BottomNavigation.d.ts +2 -0
  311. package/dist/types/global-account/react/components/ManageAccount/Header.d.ts +3 -0
  312. package/dist/types/global-account/react/components/ManageAccount/HomeActions.d.ts +5 -0
  313. package/dist/types/global-account/react/components/ManageAccount/HomeContent.d.ts +6 -0
  314. package/dist/types/global-account/react/components/ManageAccount/NFTContent.d.ts +2 -0
  315. package/dist/types/global-account/react/components/ManageAccount/NotificationChannel.d.ts +16 -0
  316. package/dist/types/global-account/react/components/ManageAccount/NotificationsContent.d.ts +8 -0
  317. package/dist/types/global-account/react/components/ManageAccount/ProfileSection.d.ts +2 -0
  318. package/dist/types/global-account/react/components/ManageAccount/SettingsContent.d.ts +7 -0
  319. package/dist/types/global-account/react/components/ManageAccount/SettingsMenuItem.d.ts +9 -0
  320. package/dist/types/global-account/react/components/ManageAccount/SettingsProfileCard.d.ts +2 -0
  321. package/dist/types/global-account/react/components/ManageAccount/TokenBalanceRow.d.ts +3 -3
  322. package/dist/types/global-account/react/components/ManageAccount/TokenContent.d.ts +2 -0
  323. package/dist/types/global-account/react/components/ManageAccount/channels/DiscordChannel.d.ts +11 -0
  324. package/dist/types/global-account/react/components/ManageAccount/channels/EmailChannel.d.ts +11 -0
  325. package/dist/types/global-account/react/components/ManageAccount/channels/PhoneChannel.d.ts +14 -0
  326. package/dist/types/global-account/react/components/ManageAccount/channels/TelegramChannel.d.ts +11 -0
  327. package/dist/types/global-account/react/components/ManageAccount/channels/index.d.ts +4 -0
  328. package/dist/types/global-account/react/components/ModalHeader/ModalHeader.d.ts +11 -0
  329. package/dist/types/global-account/react/components/Send/Send.d.ts +5 -0
  330. package/dist/types/global-account/react/components/Toast/ToastComponents.d.ts +15 -0
  331. package/dist/types/global-account/react/components/Toast/ToastContext.d.ts +19 -0
  332. package/dist/types/global-account/react/components/Toast/index.d.ts +4 -0
  333. package/dist/types/global-account/react/components/Toast/toastApi.d.ts +21 -0
  334. package/dist/types/global-account/react/components/WalletImage/WalletImage.d.ts +4 -0
  335. package/dist/types/global-account/react/components/icons/BellIcon.d.ts +3 -0
  336. package/dist/types/global-account/react/components/icons/ChevronDownIcon.d.ts +2 -0
  337. package/dist/types/global-account/react/components/icons/CopyIcon.d.ts +2 -0
  338. package/dist/types/global-account/react/components/icons/LinkIcon.d.ts +3 -0
  339. package/dist/types/global-account/react/components/icons/LockIcon.d.ts +3 -0
  340. package/dist/types/global-account/react/components/icons/WalletIcon.d.ts +2 -0
  341. package/dist/types/global-account/react/components/index.d.ts +10 -4
  342. package/dist/types/global-account/react/hooks/index.d.ts +3 -2
  343. package/dist/types/global-account/react/hooks/useAccountWallet.d.ts +1 -0
  344. package/dist/types/global-account/react/hooks/useNotifications.d.ts +48 -0
  345. package/dist/types/global-account/react/hooks/useTokenBalanceDirect.d.ts +1 -0
  346. package/dist/types/global-account/react/stores/index.d.ts +1 -0
  347. package/dist/types/global-account/react/stores/useModalStore.d.ts +47 -6
  348. package/dist/types/global-account/react/stores/useRecentAddressesStore.d.ts +25 -0
  349. package/dist/types/global-account/react/utils/index.d.ts +4 -0
  350. package/dist/types/global-account/react/utils/notificationsAPI.d.ts +80 -0
  351. package/dist/types/global-account/react/utils/profileDisplay.d.ts +3 -0
  352. package/dist/types/global-account/react/utils/toast.d.ts +6 -0
  353. package/dist/types/shared/constants/chains/supported.d.ts +3 -2
  354. package/package.json +2 -1
  355. package/src/anyspend/react/components/AnySpend.tsx +213 -173
  356. package/src/anyspend/react/components/AnySpendBuySpin.tsx +2 -1
  357. package/src/anyspend/react/components/AnySpendCustom.tsx +80 -77
  358. package/src/anyspend/react/components/AnySpendCustomExactIn.tsx +20 -4
  359. package/src/anyspend/react/components/AnySpendStakeB3.tsx +2 -1
  360. package/src/anyspend/react/components/AnySpendStakeB3ExactIn.tsx +2 -1
  361. package/src/anyspend/react/components/AnyspendDepositHype.tsx +3 -0
  362. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +56 -22
  363. package/src/anyspend/react/components/common/FeeDetailPanel.tsx +1 -1
  364. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +2 -2
  365. package/src/anyspend/react/components/common/InsufficientDepositPayment.tsx +1 -1
  366. package/src/anyspend/react/components/common/OrderDetails.tsx +6 -2
  367. package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +2 -2
  368. package/src/anyspend/react/components/common/OrderHistory.tsx +8 -13
  369. package/src/anyspend/react/components/common/OrderHistoryItem.tsx +69 -25
  370. package/src/anyspend/react/components/common/PanelOnramp.tsx +6 -4
  371. package/src/anyspend/react/components/common/PanelOnrampPayment.tsx +3 -3
  372. package/src/anyspend/react/components/common/PointsDetailPanel.tsx +1 -1
  373. package/src/anyspend/react/components/common/RecipientSelection.tsx +1 -1
  374. package/src/anyspend/react/components/common/TransferCryptoDetails.tsx +2 -2
  375. package/src/anyspend/react/components/webview/WebviewOnrampOrderStatus.tsx +3 -3
  376. package/src/anyspend/react/components/webview/WebviewOnrampPayment.tsx +2 -1
  377. package/src/anyspend/react/hooks/useAnyspendFlow.ts +2 -1
  378. package/src/anyspend/react/hooks/useConnectedWalletDisplay.ts +3 -2
  379. package/src/anyspend/react/hooks/usePhantomTransfer.ts +1 -1
  380. package/src/anyspend/react/utils/toast.ts +6 -0
  381. package/src/global-account/react/components/AccountAssets/AccountAssets.tsx +115 -25
  382. package/src/global-account/react/components/AvatarCreator/AvatarCreator.tsx +2 -2
  383. package/src/global-account/react/components/AvatarEditor/AvatarEditor.tsx +491 -130
  384. package/src/global-account/react/components/B3DynamicModal.tsx +76 -17
  385. package/src/global-account/react/components/B3Provider/B3Provider.tsx +40 -20
  386. package/src/global-account/react/components/Deposit/Deposit.tsx +208 -0
  387. package/src/global-account/react/components/IPFSMediaRenderer/IPFSMediaRenderer.tsx +84 -0
  388. package/src/global-account/react/components/LinkAccount/LinkAccount.tsx +269 -434
  389. package/src/global-account/react/components/LinkAccount/LinkNewAccount.tsx +480 -0
  390. package/src/global-account/react/components/LinkAccount/LinkedAccountItem.tsx +135 -0
  391. package/src/global-account/react/components/ManageAccount/BottomNavigation.tsx +83 -0
  392. package/src/global-account/react/components/ManageAccount/ContentTokens.tsx +2 -1
  393. package/src/global-account/react/components/ManageAccount/Header.tsx +230 -0
  394. package/src/global-account/react/components/ManageAccount/HomeActions.tsx +118 -0
  395. package/src/global-account/react/components/ManageAccount/HomeContent.tsx +42 -0
  396. package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +74 -597
  397. package/src/global-account/react/components/ManageAccount/NFTContent.tsx +24 -0
  398. package/src/global-account/react/components/ManageAccount/NotificationChannel.tsx +94 -0
  399. package/src/global-account/react/components/ManageAccount/NotificationsContent.tsx +268 -0
  400. package/src/global-account/react/components/ManageAccount/ProfileSection.tsx +79 -0
  401. package/src/global-account/react/components/ManageAccount/SettingsContent.tsx +106 -0
  402. package/src/global-account/react/components/ManageAccount/SettingsMenuItem.tsx +31 -0
  403. package/src/global-account/react/components/ManageAccount/SettingsProfileCard.tsx +197 -0
  404. package/src/global-account/react/components/ManageAccount/TokenBalanceRow.tsx +20 -5
  405. package/src/global-account/react/components/ManageAccount/TokenContent.tsx +66 -0
  406. package/src/global-account/react/components/ManageAccount/channels/DiscordChannel.tsx +119 -0
  407. package/src/global-account/react/components/ManageAccount/channels/EmailChannel.tsx +168 -0
  408. package/src/global-account/react/components/ManageAccount/channels/PhoneChannel.tsx +227 -0
  409. package/src/global-account/react/components/ManageAccount/channels/TelegramChannel.tsx +150 -0
  410. package/src/global-account/react/components/ManageAccount/channels/index.ts +4 -0
  411. package/src/global-account/react/components/ModalHeader/ModalHeader.tsx +61 -0
  412. package/src/global-account/react/components/Send/Send.tsx +621 -0
  413. package/src/global-account/react/components/SignInWithB3/SignIn.tsx +13 -12
  414. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +1 -1
  415. package/src/global-account/react/components/Toast/README.md +350 -0
  416. package/src/global-account/react/components/Toast/ToastComponents.tsx +159 -0
  417. package/src/global-account/react/components/Toast/ToastContext.tsx +86 -0
  418. package/src/global-account/react/components/Toast/index.ts +4 -0
  419. package/src/global-account/react/components/Toast/toastApi.ts +98 -0
  420. package/src/global-account/react/components/WalletImage/WalletImage.tsx +12 -0
  421. package/src/global-account/react/components/icons/BellIcon.tsx +15 -0
  422. package/src/global-account/react/components/icons/ChevronDownIcon.tsx +17 -0
  423. package/src/global-account/react/components/icons/CopyIcon.tsx +22 -0
  424. package/src/global-account/react/components/icons/LinkIcon.tsx +15 -0
  425. package/src/global-account/react/components/icons/LockIcon.tsx +15 -0
  426. package/src/global-account/react/components/icons/WalletIcon.tsx +21 -0
  427. package/src/global-account/react/components/index.ts +19 -5
  428. package/src/global-account/react/components/ui/Tabs.tsx +5 -13
  429. package/src/global-account/react/components/ui/dialog.tsx +23 -14
  430. package/src/global-account/react/components/ui/drawer.tsx +1 -1
  431. package/src/global-account/react/hooks/index.ts +5 -1
  432. package/src/global-account/react/hooks/useAccountWallet.tsx +26 -0
  433. package/src/global-account/react/hooks/useB3BalanceFromAddresses.ts +1 -0
  434. package/src/global-account/react/hooks/useChainSwitchWithAction.ts +3 -2
  435. package/src/global-account/react/hooks/useNativeBalance.tsx +2 -1
  436. package/src/global-account/react/hooks/useNotifications.ts +229 -0
  437. package/src/global-account/react/hooks/useSimBalance.ts +3 -3
  438. package/src/global-account/react/hooks/useTokenBalanceDirect.tsx +2 -0
  439. package/src/global-account/react/hooks/useUnifiedChainSwitchAndExecute.ts +3 -2
  440. package/src/global-account/react/stores/index.ts +1 -0
  441. package/src/global-account/react/stores/useModalStore.ts +53 -6
  442. package/src/global-account/react/stores/useRecentAddressesStore.ts +54 -0
  443. package/src/global-account/react/utils/index.ts +4 -0
  444. package/src/global-account/react/utils/notificationsAPI.ts +305 -0
  445. package/src/global-account/react/utils/profileDisplay.ts +12 -4
  446. package/src/global-account/react/utils/toast.ts +6 -0
  447. package/src/shared/constants/chains/supported.ts +4 -0
  448. package/src/shared/utils/ipfs.ts +10 -3
  449. package/src/styles/index.css +12 -1
  450. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.d.ts +0 -7
  451. package/dist/cjs/global-account/react/components/ManageAccount/BalanceContent.js +0 -107
  452. package/dist/cjs/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  453. package/dist/cjs/global-account/react/components/ProfileEditor/ProfileEditor.js +0 -151
  454. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.d.ts +0 -7
  455. package/dist/esm/global-account/react/components/ManageAccount/BalanceContent.js +0 -104
  456. package/dist/esm/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  457. package/dist/esm/global-account/react/components/ProfileEditor/ProfileEditor.js +0 -145
  458. package/dist/types/global-account/react/components/ManageAccount/BalanceContent.d.ts +0 -7
  459. package/dist/types/global-account/react/components/ProfileEditor/ProfileEditor.d.ts +0 -6
  460. package/src/global-account/react/components/ManageAccount/BalanceContent.tsx +0 -258
  461. package/src/global-account/react/components/ProfileEditor/ProfileEditor.tsx +0 -279
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { ens_normalize } from "@adraffy/ens-normalize";
3
+ import app from "../../../../global-account/app.js";
4
+ import { toast, useB3, useModalStore, useProfile } from "../../../../global-account/react/index.js";
5
+ import { formatUsername } from "../../../../shared/utils/index.js";
6
+ import { Check, Loader2, Pencil, X } from "lucide-react";
7
+ import { useEffect, useRef, useState } from "react";
8
+ import { useActiveAccount } from "thirdweb/react";
9
+ import { useFirstEOA } from "../../hooks/useFirstEOA.js";
10
+ import { IPFSMediaRenderer } from "../IPFSMediaRenderer/IPFSMediaRenderer.js";
11
+ const SettingsProfileCard = () => {
12
+ const account = useActiveAccount();
13
+ const { address: eoaAddress } = useFirstEOA();
14
+ const { data: profile, refetch: refreshProfile } = useProfile({
15
+ address: eoaAddress || account?.address,
16
+ fresh: true,
17
+ });
18
+ const { user, setUser } = useB3();
19
+ const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
20
+ const setB3ModalContentType = useModalStore(state => state.setB3ModalContentType);
21
+ const navigateBack = useModalStore(state => state.navigateBack);
22
+ // State for inline username editing
23
+ const [isEditingUsername, setIsEditingUsername] = useState(false);
24
+ const [editedUsername, setEditedUsername] = useState("");
25
+ const [isSaving, setIsSaving] = useState(false);
26
+ const inputRef = useRef(null);
27
+ // IPFSMediaRenderer will handle IPFS URL conversion and validation
28
+ const avatarSrc = user?.avatar || profile?.avatar;
29
+ // Get current username - prioritize user.username, fallback to profile data
30
+ const currentUsername = user?.username || profile?.displayName || formatUsername(profile?.name || "");
31
+ // Focus input when entering edit mode
32
+ useEffect(() => {
33
+ if (isEditingUsername && inputRef.current) {
34
+ inputRef.current.focus();
35
+ inputRef.current.select();
36
+ }
37
+ }, [isEditingUsername]);
38
+ const handleEditAvatar = () => {
39
+ setB3ModalOpen(true);
40
+ setB3ModalContentType({
41
+ type: "avatarEditor",
42
+ onSuccess: () => {
43
+ // navigate back on success
44
+ navigateBack();
45
+ },
46
+ });
47
+ };
48
+ const handleEditUsername = () => {
49
+ setEditedUsername(currentUsername || "");
50
+ setIsEditingUsername(true);
51
+ };
52
+ const handleCancelEdit = () => {
53
+ setIsEditingUsername(false);
54
+ setEditedUsername("");
55
+ };
56
+ const handleSaveUsername = async () => {
57
+ if (!editedUsername.trim()) {
58
+ toast.error("Username cannot be empty");
59
+ return;
60
+ }
61
+ if (editedUsername === currentUsername) {
62
+ // No change, just exit edit mode
63
+ handleCancelEdit();
64
+ return;
65
+ }
66
+ setIsSaving(true);
67
+ try {
68
+ const sanitizedUsername = ens_normalize(editedUsername.trim());
69
+ const b3Username = `${sanitizedUsername}.b3.fun`;
70
+ const usernameSignMessage = `Register "${b3Username}"`;
71
+ const usernameSignature = await account?.signMessage({ message: usernameSignMessage });
72
+ if (!usernameSignature) {
73
+ throw new Error("Failed to sign username registration message");
74
+ }
75
+ console.log("@@usernameSignature", usernameSignature);
76
+ // Register username with ENS
77
+ // Note: Type assertion needed until @b3dotfun/b3-api package is updated with RegisterUsername type
78
+ const updatedUser = (await app
79
+ .service("users")
80
+ .registerUsername({ username: b3Username, message: usernameSignMessage, hash: usernameSignature }, {}));
81
+ // Update user state - registerUsername returns an array with single user
82
+ setUser(Array.isArray(updatedUser) ? updatedUser[0] : updatedUser);
83
+ // Refresh profile to get updated data
84
+ await refreshProfile();
85
+ toast.success("Username updated successfully!");
86
+ setIsEditingUsername(false);
87
+ setEditedUsername("");
88
+ }
89
+ catch (error) {
90
+ console.error("Error updating username:", error);
91
+ toast.error("Failed to update username. Please try again.");
92
+ }
93
+ finally {
94
+ setIsSaving(false);
95
+ }
96
+ };
97
+ const handleKeyDown = (e) => {
98
+ if (e.key === "Enter") {
99
+ handleSaveUsername();
100
+ }
101
+ else if (e.key === "Escape") {
102
+ handleCancelEdit();
103
+ }
104
+ };
105
+ return (_jsxs("div", { className: "flex w-full items-center gap-3", children: [_jsxs("div", { className: "relative shrink-0", children: [_jsx(IPFSMediaRenderer, { src: avatarSrc, alt: "Profile", className: "border-black/8 size-14 rounded-full border object-cover" }), _jsx("button", { onClick: handleEditAvatar, className: "absolute -bottom-0.5 -right-0.5 flex size-[18px] items-center justify-center rounded-full border-[1.5px] border-white bg-[#a0a0ab] transition-colors hover:bg-[#a0a0ab]/80", "aria-label": "Edit avatar", children: _jsx(Pencil, { size: 10, className: "text-white", strokeWidth: 2.5 }) })] }), _jsx("div", { className: "flex shrink-0 flex-col gap-1", children: isEditingUsername ? (
106
+ /* Edit mode - inline input */
107
+ _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { ref: inputRef, type: "text", value: editedUsername, onChange: e => setEditedUsername(e.target.value), onKeyDown: handleKeyDown, disabled: isSaving, className: "border-b3-line bg-b3-background text-b3-grey placeholder:text-b3-foreground-muted font-neue-montreal-medium focus:border-b3-primary-blue text-md w-full rounded-md border px-2 py-1 leading-none transition-colors focus:outline-none disabled:opacity-50", placeholder: "Enter username" }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: handleSaveUsername, disabled: isSaving, className: "text-b3-primary-blue hover:text-b3-primary-blue/80 flex items-center justify-center rounded-md p-1 transition-colors disabled:opacity-50", "aria-label": "Save username", children: isSaving ? _jsx(Loader2, { size: 18, className: "animate-spin" }) : _jsx(Check, { size: 18, strokeWidth: 2.5 }) }), _jsx("button", { onClick: handleCancelEdit, disabled: isSaving, className: "text-b3-foreground-muted hover:text-b3-grey flex items-center justify-center rounded-md p-1 transition-colors disabled:opacity-50", "aria-label": "Cancel editing", children: _jsx(X, { size: 18, strokeWidth: 2.5 }) })] })] })) : (
108
+ /* Display mode */
109
+ _jsxs(_Fragment, { children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx("p", { className: "b3-modal-username font-neue-montreal-semibold text-lg leading-none text-[#0B57C2]", children: currentUsername }) }), _jsx("button", { onClick: handleEditUsername, className: "flex items-center justify-center gap-1 text-left transition-opacity hover:opacity-80", children: _jsx("p", { className: "font-inter text-sm font-semibold leading-5 text-[#51525C]", children: "Edit Username" }) })] })) })] }));
110
+ };
111
+ export default SettingsProfileCard;
@@ -1,10 +1,10 @@
1
- import { ReactNode } from "react";
2
1
  interface TokenBalanceRowProps {
3
- icon: ReactNode;
2
+ tokenLogo: string;
3
+ chainLogo: string;
4
4
  name: string;
5
5
  balance: string;
6
6
  usdValue: string;
7
7
  priceChange?: number | null;
8
8
  }
9
- export declare function TokenBalanceRow({ icon, name, balance, usdValue, priceChange }: TokenBalanceRowProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function TokenBalanceRow({ tokenLogo, chainLogo, name, balance, usdValue, priceChange }: TokenBalanceRowProps): import("react/jsx-runtime").JSX.Element;
10
10
  export {};
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Triangle } from "lucide-react";
3
- export function TokenBalanceRow({ icon, name, balance, usdValue, priceChange }) {
4
- return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full", children: icon }), _jsxs("div", { children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-b3-grey font-neue-montreal-semibold", children: name }) }), _jsx("div", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: balance })] })] }), _jsxs("div", { className: "text-right", children: [_jsxs("div", { className: "text-b3-grey font-neue-montreal-semibold", children: ["$", usdValue] }), _jsx("div", { className: "flex items-center gap-1", children: priceChange !== null && priceChange !== undefined ? (_jsxs(_Fragment, { children: [_jsx(Triangle, { className: `size-3 ${priceChange >= 0 ? "text-b3-positive fill-b3-positive" : "text-b3-negative fill-b3-negative rotate-180"}` }), _jsxs("span", { className: `font-neue-montreal-medium text-sm ${priceChange >= 0 ? "text-b3-positive" : "text-b3-negative"}`, children: [priceChange >= 0 ? "+" : "", priceChange.toFixed(2), "%"] })] })) : (_jsx("span", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: "--" })) })] })] }));
2
+ import { Coins, Triangle } from "lucide-react";
3
+ export function TokenBalanceRow({ tokenLogo, chainLogo, name, balance, usdValue, priceChange }) {
4
+ return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("div", { className: "relative flex h-10 w-10 items-center justify-center", children: [tokenLogo ? (_jsx("img", { src: tokenLogo, alt: name, className: "h-full w-full rounded-full object-cover" })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center rounded-full bg-gray-200", children: _jsx(Coins, { className: "h-5 w-5 text-gray-400" }) })), chainLogo && (_jsx("div", { className: "absolute -bottom-0.5 -right-0.5 flex h-4 w-4 items-center justify-center rounded-full border-2 border-white bg-white", children: _jsx("img", { src: chainLogo, alt: "chain", className: "h-full w-full rounded-full object-cover" }) }))] }), _jsxs("div", { children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-b3-grey font-neue-montreal-semibold", children: name }) }), _jsx("div", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: balance })] })] }), _jsxs("div", { className: "text-right", children: [_jsxs("div", { className: "text-b3-grey font-neue-montreal-semibold", children: ["$", usdValue] }), _jsx("div", { className: "flex items-center gap-1", children: priceChange !== null && priceChange !== undefined ? (_jsxs(_Fragment, { children: [_jsx(Triangle, { className: `size-3 ${priceChange >= 0 ? "text-b3-positive fill-b3-positive" : "text-b3-negative fill-b3-negative rotate-180"}` }), _jsxs("span", { className: `font-neue-montreal-medium text-sm ${priceChange >= 0 ? "text-b3-positive" : "text-b3-negative"}`, children: [priceChange >= 0 ? "+" : "", priceChange.toFixed(2), "%"] })] })) : (_jsx("span", { className: "text-b3-foreground-muted font-neue-montreal-medium text-sm", children: "--" })) })] })] }));
5
5
  }
@@ -0,0 +1,2 @@
1
+ declare const TokenContent: () => import("react/jsx-runtime").JSX.Element;
2
+ export default TokenContent;
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useSimBalance } from "../../../../global-account/react/index.js";
3
+ import { getChainLogo } from "../../../../shared/constants/chains/supported.js";
4
+ import { useActiveWallet } from "thirdweb/react";
5
+ import { TokenBalanceRow } from "./TokenBalanceRow.js";
6
+ // Chain logo URLs mapping
7
+ const CHAIN_LOGOS = [1, 8453, 8333].map(chainId => getChainLogo(chainId));
8
+ const TokenContent = () => {
9
+ // Get active wallet state
10
+ const activeWallet = useActiveWallet();
11
+ const activeAccount = activeWallet?.getAccount();
12
+ const activeAddress = activeAccount?.address;
13
+ const { data: simBalance } = useSimBalance(activeAddress, [8453, 8333, 1]);
14
+ console.log("simBalance :", simBalance);
15
+ if (!activeAddress) {
16
+ return _jsx("div", { className: "col-span-3 py-12 text-center text-gray-500", children: "No tokens found" });
17
+ }
18
+ if (!simBalance?.balances || simBalance.balances.length === 0) {
19
+ return _jsx("div", { className: "col-span-3 py-12 text-center text-gray-500", children: "No tokens found" });
20
+ }
21
+ // Sort by USD value descending
22
+ const sortedBalances = [...simBalance.balances].sort((a, b) => {
23
+ const valueA = a.value_usd || 0;
24
+ const valueB = b.value_usd || 0;
25
+ return valueB - valueA;
26
+ });
27
+ return (_jsx("div", { className: "flex max-h-[132px] flex-col gap-3 overflow-y-auto", children: sortedBalances.map((token, index) => {
28
+ // Format balance
29
+ const balance = (Number(token.amount) / Math.pow(10, token.decimals)).toFixed(4);
30
+ const usdValue = token.value_usd?.toFixed(2) || "0.00";
31
+ // Calculate 24h price change (if available in future API updates)
32
+ const priceChange = null; // API doesn't provide this yet
33
+ // Determine token logo
34
+ // For native tokens, use ETH logo instead of chain logo
35
+ let tokenLogo = token.token_metadata?.logo || "";
36
+ if (token.address === "native" && token.symbol === "ETH") {
37
+ tokenLogo = CHAIN_LOGOS[0];
38
+ }
39
+ return (_jsx(TokenBalanceRow, { tokenLogo: tokenLogo, chainLogo: CHAIN_LOGOS[token.chain_id] || "", name: token.name || token.symbol, balance: `${balance} ${token.symbol}`, usdValue: usdValue, priceChange: priceChange }, `${token.chain_id}-${token.address}-${index}`));
40
+ }) }));
41
+ };
42
+ export default TokenContent;
@@ -0,0 +1,11 @@
1
+ interface DiscordChannelProps {
2
+ userId: string;
3
+ jwtToken: string;
4
+ discordChannel: any;
5
+ isConnected: boolean;
6
+ isOptimisticallyConnected: boolean;
7
+ onConnectionChange: () => void;
8
+ onToggle: (enabled: boolean) => void;
9
+ }
10
+ export declare const DiscordChannel: ({ userId, jwtToken, discordChannel, isConnected, isOptimisticallyConnected, onConnectionChange, onToggle, }: DiscordChannelProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { debugB3React } from "../../../../../shared/utils/debug.js";
3
+ import { useState } from "react";
4
+ import { notificationsAPI } from "../../../utils/notificationsAPI.js";
5
+ import { useB3 } from "../../B3Provider/useB3.js";
6
+ import { toast } from "../../Toast/toastApi.js";
7
+ import { NotificationChannel } from "../NotificationChannel.js";
8
+ const debug = debugB3React("DiscordChannel");
9
+ export const DiscordChannel = ({ userId, jwtToken, discordChannel, isConnected, isOptimisticallyConnected, onConnectionChange, onToggle, }) => {
10
+ const { partnerId } = useB3();
11
+ const [discordId, setDiscordId] = useState("");
12
+ const [isConnecting, setIsConnecting] = useState(false);
13
+ // Detect if we're disconnecting
14
+ const isDisconnecting = isConnected && !isOptimisticallyConnected;
15
+ const handleConnect = async () => {
16
+ if (!discordId || !userId || !jwtToken)
17
+ return;
18
+ try {
19
+ setIsConnecting(true);
20
+ await notificationsAPI.connectDiscord(userId, discordId, jwtToken);
21
+ await notificationsAPI.ensureNotificationSettings(userId, partnerId, "general", jwtToken);
22
+ setDiscordId("");
23
+ toast.success("Discord connected successfully!");
24
+ onConnectionChange();
25
+ }
26
+ catch (err) {
27
+ debug("Error connecting Discord:", err);
28
+ toast.error("Failed to connect Discord");
29
+ }
30
+ finally {
31
+ setIsConnecting(false);
32
+ }
33
+ };
34
+ const handleToggle = () => {
35
+ onToggle(isConnected);
36
+ };
37
+ const icon = (_jsx("svg", { id: "Discord-Logo", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 126.644 96", children: _jsx("path", { id: "Discord-Symbol-Blurple", className: "fill-[#ffffff]", d: "M81.15,0c-1.2376,2.1973-2.3489,4.4704-3.3591,6.794-9.5975-1.4396-19.3718-1.4396-28.9945,0-.985-2.3236-2.1216-4.5967-3.3591-6.794-9.0166,1.5407-17.8059,4.2431-26.1405,8.0568C2.779,32.5304-1.6914,56.3725.5312,79.8863c9.6732,7.1476,20.5083,12.603,32.0505,16.0884,2.6014-3.4854,4.8998-7.1981,6.8698-11.0623-3.738-1.3891-7.3497-3.1318-10.8098-5.1523.9092-.6567,1.7932-1.3386,2.6519-1.9953,20.281,9.547,43.7696,9.547,64.0758,0,.8587.7072,1.7427,1.3891,2.6519,1.9953-3.4601,2.0457-7.0718,3.7632-10.835,5.1776,1.97,3.8642,4.2683,7.5769,6.8698,11.0623,11.5419-3.4854,22.3769-8.9156,32.0509-16.0631,2.626-27.2771-4.496-50.9172-18.817-71.8548C98.9811,4.2684,90.1918,1.5659,81.1752.0505l-.0252-.0505ZM42.2802,65.4144c-6.2383,0-11.4159-5.6575-11.4159-12.6535s4.9755-12.6788,11.3907-12.6788,11.5169,5.708,11.4159,12.6788c-.101,6.9708-5.026,12.6535-11.3907,12.6535ZM84.3576,65.4144c-6.2637,0-11.3907-5.6575-11.3907-12.6535s4.9755-12.6788,11.3907-12.6788,11.4917,5.708,11.3906,12.6788c-.101,6.9708-5.026,12.6535-11.3906,12.6535Z" }) }));
38
+ const inputSection = (_jsxs("div", { className: "mt-1 space-y-2", children: [_jsx("input", { type: "text", value: discordId, onChange: e => setDiscordId(e.target.value), onKeyDown: e => {
39
+ if (e.key === "Enter" && discordId) {
40
+ handleConnect();
41
+ }
42
+ }, placeholder: "Discord User ID", className: "w-full rounded-lg border border-gray-300 px-2 py-1.5 font-['Inter',sans-serif] text-sm focus:border-blue-500 focus:outline-none" }), _jsxs("button", { onClick: handleConnect, disabled: isConnecting || !discordId, className: "flex items-center gap-1 disabled:opacity-50", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: isConnecting ? "Connecting..." : "Add Discord" })] })] }));
43
+ return (_jsx(NotificationChannel, { icon: icon, iconClassName: "bg-[#5865f2] rounded-xl p-2", title: "Discord", isConnected: isOptimisticallyConnected, isConnecting: isConnecting, isDisconnecting: isDisconnecting, connectedInfo: discordChannel?.channel_identifier, inputSection: inputSection, onToggle: handleToggle, showBorder: false }));
44
+ };
@@ -0,0 +1,11 @@
1
+ interface EmailChannelProps {
2
+ userId: string;
3
+ jwtToken: string;
4
+ emailChannel: any;
5
+ isConnected: boolean;
6
+ isOptimisticallyConnected: boolean;
7
+ onConnectionChange: () => void;
8
+ onToggle: (enabled: boolean) => void;
9
+ }
10
+ export declare const EmailChannel: ({ userId, jwtToken, emailChannel, isConnected, isOptimisticallyConnected, onConnectionChange, onToggle, }: EmailChannelProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { debugB3React } from "../../../../../shared/utils/debug.js";
3
+ import { useState } from "react";
4
+ import { notificationsAPI } from "../../../utils/notificationsAPI.js";
5
+ import { useB3 } from "../../B3Provider/useB3.js";
6
+ import { toast } from "../../Toast/toastApi.js";
7
+ import { NotificationChannel } from "../NotificationChannel.js";
8
+ const debug = debugB3React("EmailChannel");
9
+ const validateEmail = (email) => {
10
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
11
+ return emailRegex.test(email);
12
+ };
13
+ export const EmailChannel = ({ userId, jwtToken, emailChannel, isConnected, isOptimisticallyConnected, onConnectionChange, onToggle, }) => {
14
+ const { partnerId } = useB3();
15
+ const [email, setEmail] = useState("");
16
+ const [emailError, setEmailError] = useState(null);
17
+ const [isConnecting, setIsConnecting] = useState(false);
18
+ const [showInput, setShowInput] = useState(false);
19
+ // Detect if we're disconnecting by comparing real vs optimistic state
20
+ const isDisconnecting = isConnected && !isOptimisticallyConnected;
21
+ const handleConnect = async () => {
22
+ if (!email || !userId || !jwtToken)
23
+ return;
24
+ if (!validateEmail(email)) {
25
+ setEmailError("Please enter a valid email address");
26
+ return;
27
+ }
28
+ try {
29
+ setIsConnecting(true);
30
+ setEmailError(null);
31
+ await notificationsAPI.connectEmail(userId, email, jwtToken);
32
+ await notificationsAPI.ensureNotificationSettings(userId, partnerId, "general", jwtToken);
33
+ setEmail("");
34
+ setShowInput(false);
35
+ toast.success("Email connected successfully!");
36
+ onConnectionChange();
37
+ }
38
+ catch (err) {
39
+ debug("Error connecting email:", err);
40
+ toast.error("Failed to connect email");
41
+ }
42
+ finally {
43
+ setIsConnecting(false);
44
+ }
45
+ };
46
+ const handleToggle = () => {
47
+ if (isConnected) {
48
+ setShowInput(false);
49
+ }
50
+ onToggle(isConnected); // Pass current state - parent will handle disconnect if true
51
+ };
52
+ const icon = (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", children: [_jsx("path", { d: "M3.55588 13.6357C3.056 13.2787 2.80606 13.1001 2.58815 13.077C2.26227 13.0423 1.93568 13.2104 1.77447 13.4957C1.66667 13.6865 1.66668 13.9903 1.66669 14.5978V25.4022C1.66667 26.7438 1.66665 27.8511 1.74035 28.753C1.81689 29.6899 1.98116 30.551 2.39331 31.3599C3.03247 32.6144 4.05234 33.6342 5.30675 34.2734C6.11564 34.6855 6.97682 34.8498 7.91365 34.9263C8.81563 35 9.92288 35 11.2645 35H28.7356C30.0772 35 31.1844 35 32.0864 34.9263C33.0232 34.8498 33.8844 34.6855 34.6933 34.2734C35.9477 33.6342 36.9676 32.6144 37.6067 31.3599C38.0189 30.551 38.1832 29.6899 38.2597 28.753C38.3334 27.8511 38.3334 26.7438 38.3334 25.4022V14.5978C38.3334 14.3 38.3334 14.1511 38.3061 14.0472C38.1828 13.5771 37.6717 13.3094 37.2151 13.4755C37.1141 13.5123 36.9901 13.5981 36.7422 13.7697L23.8386 22.7032C22.9237 23.3386 22.1204 23.8965 21.2078 24.1177C20.4096 24.3112 19.5761 24.305 18.7808 24.0998C17.8716 23.8652 17.0766 23.2956 16.1711 22.6468L3.55588 13.6357Z", fill: "#0C68E9" }), _jsx("path", { d: "M36.888 9.61453C37.1957 9.40153 37.3495 9.29503 37.444 9.12373C37.5174 8.99071 37.5594 8.78007 37.5426 8.62908C37.5209 8.43465 37.4383 8.30628 37.273 8.04955C36.6399 7.06607 35.7288 6.25426 34.6933 5.72663C33.8844 5.31447 33.0232 5.1502 32.0864 5.07366C31.1844 4.99996 30.0771 4.99998 28.7355 5H11.2645C9.92292 4.99998 8.81563 4.99996 7.91365 5.07366C6.97682 5.1502 6.11564 5.31447 5.30675 5.72663C4.37503 6.20136 3.56969 6.88767 2.95729 7.72225C2.76463 7.98482 2.6683 8.1161 2.63656 8.31534C2.61174 8.47116 2.6464 8.68762 2.71862 8.8279C2.81098 9.00727 2.97117 9.1217 3.29156 9.35055L17.9167 19.7971C19.1288 20.6628 19.386 20.8135 19.6136 20.8722C19.8787 20.9406 20.1565 20.9426 20.4226 20.8782C20.651 20.8228 20.9104 20.6759 22.1351 19.8281L36.888 9.61453Z", fill: "#0C68E9" })] }));
53
+ const addButtonSection = (_jsxs("button", { onClick: () => setShowInput(true), className: "mt-1 flex items-center gap-1", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: "Add Email" })] }));
54
+ const inputSection = showInput ? (_jsxs("div", { className: "mt-1 space-y-2", children: [_jsxs("div", { children: [_jsx("input", { type: "email", value: email, onChange: e => {
55
+ setEmail(e.target.value);
56
+ if (emailError)
57
+ setEmailError(null);
58
+ }, onKeyDown: e => {
59
+ if (e.key === "Enter" && email) {
60
+ handleConnect();
61
+ }
62
+ }, placeholder: "your@email.com", className: `w-full rounded-lg border px-2 py-1.5 font-['Inter',sans-serif] text-sm focus:outline-none ${emailError ? "border-red-500 focus:border-red-500" : "border-gray-300 focus:border-blue-500"}` }), emailError && (_jsx("p", { className: "mt-1 font-['PP_Neue_Montreal','PP_Neue_Montreal_Fallback',sans-serif] text-[12px] leading-[16px] text-red-600", children: emailError }))] }), _jsxs("button", { onClick: handleConnect, disabled: isConnecting || !email, className: "flex items-center gap-1 disabled:opacity-50", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: isConnecting ? "Connecting..." : "Add Email" })] })] })) : null;
63
+ return (_jsx(NotificationChannel, { icon: icon, title: "Email", isConnected: isOptimisticallyConnected, isConnecting: isConnecting, isDisconnecting: isDisconnecting, connectedInfo: emailChannel?.channel_identifier, inputSection: inputSection, addButtonSection: addButtonSection, onToggle: handleToggle }));
64
+ };
@@ -0,0 +1,14 @@
1
+ interface PhoneChannelProps {
2
+ userId: string;
3
+ jwtToken: string;
4
+ smsChannel: any;
5
+ whatsappChannel: any;
6
+ isSMSConnected: boolean;
7
+ isWhatsAppConnected: boolean;
8
+ isOptimisticallySMSConnected: boolean;
9
+ isOptimisticallyWhatsAppConnected: boolean;
10
+ onConnectionChange: () => void;
11
+ onToggle: (type: "sms" | "whatsapp", enabled: boolean) => void;
12
+ }
13
+ export declare const PhoneChannel: ({ userId, jwtToken, smsChannel, whatsappChannel, isSMSConnected, isWhatsAppConnected, isOptimisticallySMSConnected, isOptimisticallyWhatsAppConnected, onConnectionChange, onToggle, }: PhoneChannelProps) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { debugB3React } from "../../../../../shared/utils/debug.js";
3
+ import { useState } from "react";
4
+ import { notificationsAPI } from "../../../utils/notificationsAPI.js";
5
+ import { useB3 } from "../../B3Provider/useB3.js";
6
+ import { toast } from "../../Toast/toastApi.js";
7
+ import { NotificationChannel } from "../NotificationChannel.js";
8
+ const debug = debugB3React("PhoneChannel");
9
+ export const PhoneChannel = ({ userId, jwtToken, smsChannel, whatsappChannel, isSMSConnected, isWhatsAppConnected, isOptimisticallySMSConnected, isOptimisticallyWhatsAppConnected, onConnectionChange, onToggle, }) => {
10
+ const { partnerId } = useB3();
11
+ const [phoneNumber, setPhoneNumber] = useState("");
12
+ const [isConnectingSMS, setIsConnectingSMS] = useState(false);
13
+ const [isConnectingWhatsApp, setIsConnectingWhatsApp] = useState(false);
14
+ const [showInput, setShowInput] = useState(false);
15
+ // Detect if we're disconnecting
16
+ const isDisconnecting = (isSMSConnected && !isOptimisticallySMSConnected) || (isWhatsAppConnected && !isOptimisticallyWhatsAppConnected);
17
+ const handleConnectSMS = async () => {
18
+ if (!phoneNumber || !userId || !jwtToken)
19
+ return;
20
+ try {
21
+ setIsConnectingSMS(true);
22
+ await notificationsAPI.connectSMS(userId, phoneNumber, jwtToken);
23
+ await notificationsAPI.ensureNotificationSettings(userId, partnerId, "general", jwtToken);
24
+ setPhoneNumber("");
25
+ setShowInput(false);
26
+ toast.success("SMS connected successfully!");
27
+ onConnectionChange();
28
+ }
29
+ catch (err) {
30
+ debug("Error connecting SMS:", err);
31
+ toast.error("Failed to connect SMS");
32
+ }
33
+ finally {
34
+ setIsConnectingSMS(false);
35
+ }
36
+ };
37
+ const handleConnectWhatsApp = async () => {
38
+ if (!phoneNumber || !userId || !jwtToken)
39
+ return;
40
+ try {
41
+ setIsConnectingWhatsApp(true);
42
+ await notificationsAPI.connectWhatsApp(userId, phoneNumber, jwtToken);
43
+ await notificationsAPI.ensureNotificationSettings(userId, partnerId, "general", jwtToken);
44
+ setPhoneNumber("");
45
+ setShowInput(false);
46
+ toast.success("WhatsApp connected successfully!");
47
+ onConnectionChange();
48
+ }
49
+ catch (err) {
50
+ debug("Error connecting WhatsApp:", err);
51
+ toast.error("Failed to connect WhatsApp");
52
+ }
53
+ finally {
54
+ setIsConnectingWhatsApp(false);
55
+ }
56
+ };
57
+ const handleToggle = () => {
58
+ if (isSMSConnected || isWhatsAppConnected) {
59
+ setShowInput(false);
60
+ }
61
+ if (isSMSConnected)
62
+ onToggle("sms", true);
63
+ if (isWhatsAppConnected)
64
+ onToggle("whatsapp", true);
65
+ };
66
+ const icon = (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M26.7596 36.4673C21.4375 34.9568 16.416 32.1062 12.2299 27.9201C8.04385 23.7341 5.19327 18.7125 3.68271 13.3905C3.67375 13.3589 3.66487 13.3277 3.65605 13.2966C3.4102 12.4316 3.21956 11.7608 3.21682 10.841C3.21369 9.78971 3.5562 8.47265 4.07108 7.55607C4.95655 5.97979 6.85783 3.9597 8.50003 3.12908C9.91893 2.4114 11.5946 2.4114 13.0135 3.12908C14.4172 3.83908 15.9806 5.42835 16.8521 6.76878C17.9296 8.42601 17.9296 10.5625 16.8521 12.2197C16.5633 12.6638 16.1518 13.0746 15.674 13.5516C15.5253 13.7001 15.3615 13.8074 15.4702 14.0339C16.5499 16.2827 18.0224 18.392 19.8902 20.2598C21.758 22.1276 23.8674 23.6001 26.1162 24.6798C26.3506 24.7924 26.443 24.6317 26.5985 24.476C27.0754 23.9983 27.4863 23.5867 27.9304 23.298C29.5876 22.2205 31.724 22.2205 33.3813 23.298C34.6858 24.1462 36.3165 25.7438 37.021 27.1365C37.7386 28.5554 37.7386 30.2311 37.021 31.65C36.1903 33.2922 34.1703 35.1935 32.594 36.079C31.6774 36.5938 30.3603 36.9364 29.309 36.9332C28.3892 36.9305 27.7184 36.7398 26.8534 36.494C26.8224 36.4852 26.7911 36.4763 26.7596 36.4673Z", fill: "#0C68E9" }) }));
67
+ const addButtonSection = (_jsxs("div", { className: "mt-1 flex gap-2", children: [_jsxs("button", { onClick: () => setShowInput(true), className: "flex items-center gap-1", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: "Add SMS" })] }), _jsx("span", { className: "text-[11px] text-gray-400", children: "|" }), _jsxs("button", { onClick: () => setShowInput(true), className: "flex items-center gap-1", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: "Add WhatsApp" })] })] }));
68
+ const inputSection = showInput ? (_jsxs("div", { className: "mt-1 space-y-2", children: [_jsx("input", { type: "tel", value: phoneNumber, onChange: e => setPhoneNumber(e.target.value), onKeyDown: e => {
69
+ if (e.key === "Enter" && phoneNumber) {
70
+ handleConnectSMS();
71
+ }
72
+ }, placeholder: "+1 (555) 123-4567", className: "w-full rounded-lg border border-gray-300 px-2 py-1.5 font-['Inter',sans-serif] text-sm focus:border-blue-500 focus:outline-none" }), _jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { onClick: handleConnectSMS, disabled: isConnectingSMS || !phoneNumber, className: "flex items-center gap-1 disabled:opacity-50", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: isConnectingSMS ? "Connecting..." : "Add SMS" })] }), _jsx("span", { className: "text-[11px] text-gray-400", children: "|" }), _jsxs("button", { onClick: handleConnectWhatsApp, disabled: isConnectingWhatsApp || !phoneNumber, className: "flex items-center gap-1 disabled:opacity-50", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: isConnectingWhatsApp ? "Connecting..." : "Add WhatsApp" })] })] })] })) : null;
73
+ const connectedInfo = (_jsxs(_Fragment, { children: [isSMSConnected && (_jsx("p", { className: "font-['PP_Neue_Montreal','PP_Neue_Montreal_Fallback',sans-serif] text-[14px] leading-[20px] text-[#51525c]", children: smsChannel?.channel_identifier })), isWhatsAppConnected && (_jsx("p", { className: "font-['PP_Neue_Montreal','PP_Neue_Montreal_Fallback',sans-serif] text-[14px] leading-[20px] text-[#51525c]", children: whatsappChannel?.channel_identifier }))] }));
74
+ return (_jsx(NotificationChannel, { icon: icon, title: "SMS/WhatsApp", isConnected: isOptimisticallySMSConnected || isOptimisticallyWhatsAppConnected, isConnecting: isConnectingSMS || isConnectingWhatsApp, isDisconnecting: isDisconnecting, connectedInfo: isSMSConnected || isWhatsAppConnected ? (_jsx("div", { className: "mt-1 flex flex-col gap-1", children: connectedInfo })) : undefined, inputSection: inputSection, addButtonSection: addButtonSection, onToggle: handleToggle }));
75
+ };
@@ -0,0 +1,11 @@
1
+ interface TelegramChannelProps {
2
+ userId: string;
3
+ jwtToken: string;
4
+ telegramChannel: any;
5
+ isConnected: boolean;
6
+ isOptimisticallyConnected: boolean;
7
+ onConnectionChange: () => void;
8
+ onToggle: (enabled: boolean) => void;
9
+ }
10
+ export declare const TelegramChannel: ({ userId, jwtToken, telegramChannel, isConnected, isOptimisticallyConnected, onConnectionChange, onToggle, }: TelegramChannelProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { debugB3React } from "../../../../../shared/utils/debug.js";
3
+ import { useState } from "react";
4
+ import { notificationsAPI } from "../../../utils/notificationsAPI.js";
5
+ import { useB3 } from "../../B3Provider/useB3.js";
6
+ import { toast } from "../../Toast/toastApi.js";
7
+ import { NotificationChannel } from "../NotificationChannel.js";
8
+ const debug = debugB3React("TelegramChannel");
9
+ export const TelegramChannel = ({ userId, jwtToken, telegramChannel, isConnected, isOptimisticallyConnected, onConnectionChange, onToggle, }) => {
10
+ const { partnerId } = useB3();
11
+ const [isConnecting, setIsConnecting] = useState(false);
12
+ const [status, setStatus] = useState("idle");
13
+ // Detect if we're disconnecting
14
+ const isDisconnecting = isConnected && !isOptimisticallyConnected;
15
+ const handleConnect = async () => {
16
+ if (!userId || !jwtToken)
17
+ return;
18
+ try {
19
+ setIsConnecting(true);
20
+ const { deepLink } = await notificationsAPI.getTelegramLink(jwtToken);
21
+ window.open(deepLink, "_blank");
22
+ setStatus("pending");
23
+ // Poll for connection using nested timeouts to avoid overlapping requests
24
+ const startTime = Date.now();
25
+ const maxDuration = 120000; // 2 minutes
26
+ let timeoutId = null;
27
+ const pollStatus = async () => {
28
+ try {
29
+ const { connected } = await notificationsAPI.checkTelegramStatus(userId, jwtToken);
30
+ if (connected) {
31
+ if (timeoutId)
32
+ clearTimeout(timeoutId);
33
+ setStatus("connected");
34
+ await notificationsAPI.ensureNotificationSettings(userId, partnerId, "general", jwtToken);
35
+ toast.success("Telegram connected successfully!");
36
+ onConnectionChange();
37
+ return;
38
+ }
39
+ }
40
+ catch (err) {
41
+ debug("Error checking Telegram status:", err);
42
+ }
43
+ // Check if we've exceeded max duration
44
+ if (Date.now() - startTime < maxDuration) {
45
+ // Schedule next check after previous one completes
46
+ timeoutId = setTimeout(pollStatus, 2000);
47
+ }
48
+ else {
49
+ setStatus("idle");
50
+ }
51
+ };
52
+ // Start polling
53
+ timeoutId = setTimeout(pollStatus, 2000);
54
+ }
55
+ catch (err) {
56
+ debug("Error connecting Telegram:", err);
57
+ toast.error("Failed to connect Telegram");
58
+ }
59
+ finally {
60
+ setIsConnecting(false);
61
+ }
62
+ };
63
+ const handleToggle = () => {
64
+ if (isConnected) {
65
+ setStatus("idle");
66
+ onToggle(true);
67
+ }
68
+ else {
69
+ handleConnect();
70
+ }
71
+ };
72
+ const icon = (_jsx("svg", { width: "1000px", height: "1000px", viewBox: "0 0 1000 1000", version: "1.1", xmlns: "http://www.w3.org/2000/svg", children: _jsx("g", { id: "Telegram", stroke: "none", "stroke-width": "1", fill: "none", "fill-rule": "evenodd", children: _jsx("path", { d: "M226.328419,494.722069 C372.088573,431.216685 469.284839,389.350049 517.917216,369.122161 C656.772535,311.36743 685.625481,301.334815 704.431427,301.003532 C708.567621,300.93067 717.815839,301.955743 723.806446,306.816707 C728.864797,310.92121 730.256552,316.46581 730.922551,320.357329 C731.588551,324.248848 732.417879,333.113828 731.758626,340.040666 C724.234007,419.102486 691.675104,610.964674 675.110982,699.515267 C668.10208,736.984342 654.301336,749.547532 640.940618,750.777006 C611.904684,753.448938 589.856115,731.588035 561.733393,713.153237 C517.726886,684.306416 492.866009,666.349181 450.150074,638.200013 C400.78442,605.66878 432.786119,587.789048 460.919462,558.568563 C468.282091,550.921423 596.21508,434.556479 598.691227,424.000355 C599.00091,422.680135 599.288312,417.758981 596.36474,415.160431 C593.441168,412.561881 589.126229,413.450484 586.012448,414.157198 C581.598758,415.158943 511.297793,461.625274 375.109553,553.556189 C355.154858,567.258623 337.080515,573.934908 320.886524,573.585046 C303.033948,573.199351 268.692754,563.490928 243.163606,555.192408 C211.851067,545.013936 186.964484,539.632504 189.131547,522.346309 C190.260287,513.342589 202.659244,504.134509 226.328419,494.722069 Z", id: "Path-3", fill: "#FFFFFF" }) }) }));
73
+ const inputSection = status === "pending" ? (_jsxs("div", { className: "mt-1", children: [_jsx("p", { className: "font-['PP_Neue_Montreal','PP_Neue_Montreal_Fallback',sans-serif] text-[14px] leading-[20px] text-yellow-700", children: "Waiting for connection..." }), _jsx("p", { className: "font-['PP_Neue_Montreal','PP_Neue_Montreal_Fallback',sans-serif] text-[12px] text-yellow-600", children: "Send /start to @b3_notifications_bot" })] })) : (_jsxs("button", { onClick: handleConnect, disabled: isConnecting, className: "mt-1 flex items-center gap-1 disabled:opacity-50", children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", children: _jsx("path", { d: "M8 3.33333V12.6667M3.33333 8H12.6667", stroke: "#0c68e9", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), _jsx("span", { className: "font-['Inter',sans-serif] text-[11px] font-semibold leading-[16px] text-[#0b57c2]", children: isConnecting ? "Opening..." : "Add Telegram" })] }));
74
+ return (_jsx(NotificationChannel, { icon: icon, iconClassName: "bg-[#24A1DE] rounded-xl", title: "Telegram", isConnected: isOptimisticallyConnected || status === "connected", isConnecting: isConnecting, isDisconnecting: isDisconnecting, connectedInfo: telegramChannel?.channel_identifier || "Connected", inputSection: inputSection, onToggle: handleToggle }));
75
+ };
@@ -0,0 +1,4 @@
1
+ export { DiscordChannel } from "./DiscordChannel";
2
+ export { EmailChannel } from "./EmailChannel";
3
+ export { PhoneChannel } from "./PhoneChannel";
4
+ export { TelegramChannel } from "./TelegramChannel";
@@ -0,0 +1,4 @@
1
+ export { DiscordChannel } from "./DiscordChannel.js";
2
+ export { EmailChannel } from "./EmailChannel.js";
3
+ export { PhoneChannel } from "./PhoneChannel.js";
4
+ export { TelegramChannel } from "./TelegramChannel.js";
@@ -0,0 +1,11 @@
1
+ declare const ModalHeader: ({ showBackButton, handleBack, handleClose, title, children, showCloseButton, className, showBackWord, }: {
2
+ showBackButton?: boolean;
3
+ handleBack?: () => void;
4
+ handleClose?: () => void;
5
+ title: string;
6
+ children?: React.ReactNode;
7
+ showCloseButton?: boolean;
8
+ className?: string;
9
+ showBackWord?: boolean;
10
+ }) => import("react/jsx-runtime").JSX.Element;
11
+ export default ModalHeader;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../../../shared/utils/index.js";
3
+ import { ChevronLeft, X } from "lucide-react";
4
+ import { useModalStore } from "../../stores/index.js";
5
+ const ModalHeader = ({ showBackButton = true, handleBack, handleClose, title, children, showCloseButton = true, className, showBackWord = false, }) => {
6
+ const navigateBack = useModalStore(state => state.navigateBack);
7
+ const setB3ModalOpen = useModalStore(state => state.setB3ModalOpen);
8
+ return (_jsxs("div", { className: cn("b3-modal-header flex h-16 items-center justify-between border-b border-[#e4e4e7] bg-white px-5 py-3", className), children: [showBackButton ? (_jsxs("button", { onClick: handleBack || navigateBack, className: "flex h-6 w-6 items-center justify-center transition-opacity hover:opacity-70", children: [_jsx(ChevronLeft, { className: "h-6 w-6 text-[#51525c]" }), showBackWord && _jsx("span", { className: "text-sm font-medium", children: "Back" })] })) : (_jsx("div", { className: "w-2" })), _jsx("p", { className: "font-inter text-lg font-semibold leading-7 text-[#18181b]", children: title }), showCloseButton ? (_jsx("button", { onClick: handleClose || (() => setB3ModalOpen(false)), className: "flex h-6 w-6 items-center justify-center transition-opacity hover:opacity-70", children: _jsx(X, { className: "h-6 w-6 text-[#51525c]" }) })) : !children ? (_jsx("div", { className: "w-2" })) : undefined, children] }));
9
+ };
10
+ export default ModalHeader;
@@ -0,0 +1,5 @@
1
+ export interface SendModalProps {
2
+ recipientAddress?: string;
3
+ onSuccess?: (txHash?: string) => void;
4
+ }
5
+ export declare function Send({ recipientAddress: initialRecipient, onSuccess }: SendModalProps): import("react/jsx-runtime").JSX.Element;