@lifi/widget 0.0.0-preview-6cc63bac → 0.0.0-preview-fe8dc5e6

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 (312) hide show
  1. package/dist/esm/App.d.ts +4 -2
  2. package/dist/esm/App.d.ts.map +1 -1
  3. package/dist/esm/App.js +4 -4
  4. package/dist/esm/App.js.map +1 -1
  5. package/dist/esm/AppDrawer.d.ts +1 -1
  6. package/dist/esm/AppDrawer.d.ts.map +1 -1
  7. package/dist/esm/AppDrawer.js +5 -6
  8. package/dist/esm/AppDrawer.js.map +1 -1
  9. package/dist/esm/AppDrawerContext.js +2 -2
  10. package/dist/esm/AppDrawerContext.js.map +1 -1
  11. package/dist/esm/components/ActionRow/ActionRow.style.js.map +1 -1
  12. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  13. package/dist/esm/components/AmountInput/AmountInput.style.js.map +1 -1
  14. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js.map +1 -1
  15. package/dist/esm/components/AmountInput/PriceFormHelperText.style.js.map +1 -1
  16. package/dist/esm/components/AppContainer.js.map +1 -1
  17. package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
  18. package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
  19. package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
  20. package/dist/esm/components/BottomSheet/BottomSheet.js +3 -3
  21. package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
  22. package/dist/esm/components/ButtonTertiary.js.map +1 -1
  23. package/dist/esm/components/Card/Card.js.map +1 -1
  24. package/dist/esm/components/Card/CardButton.style.js.map +1 -1
  25. package/dist/esm/components/Card/CardHeader.js.map +1 -1
  26. package/dist/esm/components/Card/CardIconButton.js.map +1 -1
  27. package/dist/esm/components/Card/CardLabel.js.map +1 -1
  28. package/dist/esm/components/Card/CardTitle.js.map +1 -1
  29. package/dist/esm/components/Card/InputCard.js.map +1 -1
  30. package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
  31. package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
  32. package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
  33. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  34. package/dist/esm/components/Chains/ChainList.js.map +1 -1
  35. package/dist/esm/components/Chains/ChainList.style.js.map +1 -1
  36. package/dist/esm/components/Chains/ChainsExpanded.style.js.map +1 -1
  37. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  38. package/dist/esm/components/ContextMenu.style.js.map +1 -1
  39. package/dist/esm/components/ContractComponent/NFT/NFT.style.js.map +1 -1
  40. package/dist/esm/components/Dialog/Dialog.style.js.map +1 -1
  41. package/dist/esm/components/EmptyListIndicator/EmptyListIndicator.style.js.map +1 -1
  42. package/dist/esm/components/ExecutionStatusCard/StatusIcon.js.map +1 -1
  43. package/dist/esm/components/ExecutionStatusCard/StatusIcon.style.js.map +1 -1
  44. package/dist/esm/components/ExecutionStatusCard/iconKey.js.map +1 -1
  45. package/dist/esm/components/Expansion/Expansion.style.js.map +1 -1
  46. package/dist/esm/components/Header/ActivitiesButton.style.js.map +1 -1
  47. package/dist/esm/components/Header/Header.js +7 -10
  48. package/dist/esm/components/Header/Header.js.map +1 -1
  49. package/dist/esm/components/Header/Header.style.js.map +1 -1
  50. package/dist/esm/components/Header/HeaderNavigationTabs.js +26 -0
  51. package/dist/esm/components/Header/HeaderNavigationTabs.js.map +1 -0
  52. package/dist/esm/components/Header/HeaderTabs.js +33 -0
  53. package/dist/esm/components/Header/HeaderTabs.js.map +1 -0
  54. package/dist/esm/components/Header/NavigationHeader.js +7 -5
  55. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  56. package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
  57. package/dist/esm/components/Header/WalletMenu.style.js.map +1 -1
  58. package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
  59. package/dist/esm/components/IconTypography.js.map +1 -1
  60. package/dist/esm/components/Input.js.map +1 -1
  61. package/dist/esm/components/ListItem/ListItem.js.map +1 -1
  62. package/dist/esm/components/ListItem/ListItemButton.js.map +1 -1
  63. package/dist/esm/components/ListItemButton.js.map +1 -1
  64. package/dist/esm/components/ListItemText.js.map +1 -1
  65. package/dist/esm/components/Menu.js.map +1 -1
  66. package/dist/esm/components/Messages/AlertMessage.style.js.map +1 -1
  67. package/dist/esm/components/Messages/GasRefuelMessage.style.js.map +1 -1
  68. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  69. package/dist/esm/components/PageContainer.js.map +1 -1
  70. package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
  71. package/dist/esm/components/PoweredBy/PoweredBy.style.js.map +1 -1
  72. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.style.js.map +1 -1
  73. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  74. package/dist/esm/components/RouteCard/RouteDetails.style.js +2 -2
  75. package/dist/esm/components/RouteCard/RouteDetails.style.js.map +1 -1
  76. package/dist/esm/components/RouteCard/RouteToken.style.js.map +1 -1
  77. package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
  78. package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
  79. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  80. package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
  81. package/dist/esm/components/Search/SearchInput.style.js.map +1 -1
  82. package/dist/esm/components/Search/SearchNotFound.style.js.map +1 -1
  83. package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
  84. package/dist/esm/components/SendToWallet/SendToWalletButton.style.js.map +1 -1
  85. package/dist/esm/components/SettingsListItemButton.js.map +1 -1
  86. package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
  87. package/dist/esm/components/Step/StepActions.js.map +1 -1
  88. package/dist/esm/components/Step/StepActions.style.js.map +1 -1
  89. package/dist/esm/components/StepActions/SentToWalletRow.style.js.map +1 -1
  90. package/dist/esm/components/StepActions/StepActionRow.style.js.map +1 -1
  91. package/dist/esm/components/Switch.js.map +1 -1
  92. package/dist/esm/components/Tabs/NavigationTabs.js +3 -0
  93. package/dist/esm/components/Tabs/NavigationTabs.js.map +1 -1
  94. package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
  95. package/dist/esm/components/Timer/StepStatusTimer.style.js.map +1 -1
  96. package/dist/esm/components/Token/Token.style.js.map +1 -1
  97. package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
  98. package/dist/esm/components/TokenList/TokenDetailsSheet.js +4 -4
  99. package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
  100. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js +4 -4
  101. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
  102. package/dist/esm/components/TokenList/TokenDetailsSheetContent.style.js.map +1 -1
  103. package/dist/esm/components/TokenList/TokenList.style.js.map +1 -1
  104. package/dist/esm/components/TokenList/TokenListItem.js +2 -2
  105. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  106. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  107. package/dist/esm/components/TokenList/useTokenSelect.js +3 -3
  108. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  109. package/dist/esm/components/TokenRate/TokenRate.style.js.map +1 -1
  110. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  111. package/dist/esm/components/TransactionCard/ActiveTransactionCard.style.js.map +1 -1
  112. package/dist/esm/components/TransactionCard/TransactionCard.style.js.map +1 -1
  113. package/dist/esm/config/version.d.ts +1 -1
  114. package/dist/esm/config/version.js +1 -1
  115. package/dist/esm/config/version.js.map +1 -1
  116. package/dist/esm/hooks/timer/validate.js.map +1 -1
  117. package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
  118. package/dist/esm/hooks/useAvailableChains.js +1 -1
  119. package/dist/esm/hooks/useChainSearch.js.map +1 -1
  120. package/dist/esm/hooks/useChains.js +1 -1
  121. package/dist/esm/hooks/useExplorer.js.map +1 -1
  122. package/dist/esm/hooks/useFilteredByTokenBalances.js +1 -1
  123. package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
  124. package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
  125. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  126. package/dist/esm/hooks/useLanguages.js +2 -2
  127. package/dist/esm/hooks/useLanguages.js.map +1 -1
  128. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  129. package/dist/esm/hooks/useRouteExecutionMessage.js.map +1 -1
  130. package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
  131. package/dist/esm/hooks/useRoutes.js.map +1 -1
  132. package/dist/esm/hooks/useSwapOnly.js +2 -4
  133. package/dist/esm/hooks/useSwapOnly.js.map +1 -1
  134. package/dist/esm/hooks/useToAddressRequirements.js +2 -2
  135. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  136. package/dist/esm/hooks/useToken.js.map +1 -1
  137. package/dist/esm/hooks/useTokenBalance.js.map +1 -1
  138. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  139. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  140. package/dist/esm/hooks/useTokenSearch.js +1 -1
  141. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  142. package/dist/esm/hooks/useTokens.js +1 -1
  143. package/dist/esm/hooks/useTokens.js.map +1 -1
  144. package/dist/esm/hooks/useTools.js +1 -1
  145. package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
  146. package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
  147. package/dist/esm/hooks/useTransactionList.js.map +1 -1
  148. package/dist/esm/i18n/en.json +3 -0
  149. package/dist/esm/index.d.ts +2 -2
  150. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
  151. package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
  152. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  153. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  154. package/dist/esm/pages/RoutesPage/RoutesPage.style.js.map +1 -1
  155. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  156. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js +3 -3
  157. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
  158. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js +3 -3
  159. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
  160. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  161. package/dist/esm/pages/SendToWallet/SendToWalletPage.style.js.map +1 -1
  162. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  163. package/dist/esm/pages/SettingsPage/GasPriceSettings.js +1 -1
  164. package/dist/esm/pages/SettingsPage/ResetSettingsButton.style.js.map +1 -1
  165. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js +1 -1
  166. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCard.style.js.map +1 -1
  167. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js +3 -3
  168. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
  169. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js +3 -3
  170. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
  171. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  172. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  173. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.style.js.map +1 -1
  174. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  175. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
  176. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js +3 -3
  177. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
  178. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js +16 -15
  179. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
  180. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.style.js.map +1 -1
  181. package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
  182. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +3 -3
  183. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  184. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.style.js.map +1 -1
  185. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +27 -31
  186. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
  187. package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
  188. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  189. package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
  190. package/dist/esm/providers/QueryClientProvider.js +2 -2
  191. package/dist/esm/providers/QueryClientProvider.js.map +1 -1
  192. package/dist/esm/providers/SDKClientProvider.js +26 -27
  193. package/dist/esm/providers/SDKClientProvider.js.map +1 -1
  194. package/dist/esm/providers/WidgetProvider/WidgetProvider.js +25 -27
  195. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  196. package/dist/esm/stores/StoreProvider.js +3 -4
  197. package/dist/esm/stores/StoreProvider.js.map +1 -1
  198. package/dist/esm/stores/bookmarks/BookmarkStore.js +3 -3
  199. package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
  200. package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
  201. package/dist/esm/stores/chains/ChainOrderStore.js +4 -4
  202. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  203. package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
  204. package/dist/esm/stores/form/FormStore.js +1 -1
  205. package/dist/esm/stores/form/FormStore.js.map +1 -1
  206. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  207. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  208. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  209. package/dist/esm/stores/form/useFieldActions.js.map +1 -1
  210. package/dist/esm/stores/form/useFieldValues.js.map +1 -1
  211. package/dist/esm/stores/form/useFormRef.js.map +1 -1
  212. package/dist/esm/stores/form/useFormStore.js +2 -2
  213. package/dist/esm/stores/form/useFormStore.js.map +1 -1
  214. package/dist/esm/stores/header/useHeaderStore.js +3 -3
  215. package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
  216. package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
  217. package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js +22 -0
  218. package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js.map +1 -0
  219. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js +62 -0
  220. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -0
  221. package/dist/esm/stores/navigationTabs/utils.js +92 -0
  222. package/dist/esm/stores/navigationTabs/utils.js.map +1 -0
  223. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js +3 -3
  224. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
  225. package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
  226. package/dist/esm/stores/routes/RouteExecutionStore.js +3 -3
  227. package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
  228. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  229. package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
  230. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  231. package/dist/esm/stores/routes/utils.js.map +1 -1
  232. package/dist/esm/stores/settings/SettingsStore.js +3 -3
  233. package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
  234. package/dist/esm/stores/settings/createSettingsStore.js +122 -96
  235. package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
  236. package/dist/esm/stores/settings/types.d.ts +0 -2
  237. package/dist/esm/stores/settings/types.d.ts.map +1 -1
  238. package/dist/esm/stores/settings/types.js.map +1 -1
  239. package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
  240. package/dist/esm/themes/createTheme.js.map +1 -1
  241. package/dist/esm/themes/utils.js.map +1 -1
  242. package/dist/esm/types/widget.d.ts +19 -2
  243. package/dist/esm/types/widget.d.ts.map +1 -1
  244. package/dist/esm/types/widget.js.map +1 -1
  245. package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
  246. package/dist/esm/utils/converters.js.map +1 -1
  247. package/dist/esm/utils/deepEqual.js.map +1 -1
  248. package/dist/esm/utils/fees.js.map +1 -1
  249. package/dist/esm/utils/format.js.map +1 -1
  250. package/dist/esm/utils/getActionMessage.js.map +1 -1
  251. package/dist/esm/utils/getErrorMessage.js.map +1 -1
  252. package/dist/esm/utils/item.js.map +1 -1
  253. package/dist/esm/utils/{variant.js → mode.js} +2 -2
  254. package/dist/esm/utils/mode.js.map +1 -0
  255. package/dist/esm/utils/prepareActions.js +1 -1
  256. package/dist/esm/utils/prepareActions.js.map +1 -1
  257. package/dist/esm/utils/timer.js.map +1 -1
  258. package/dist/esm/utils/token.js +1 -1
  259. package/dist/esm/utils/token.js.map +1 -1
  260. package/dist/esm/utils/tokenList.js.map +1 -1
  261. package/package.json +11 -11
  262. package/src/App.tsx +7 -7
  263. package/src/AppDrawer.tsx +77 -78
  264. package/src/AppDrawerContext.ts +2 -2
  265. package/src/components/BottomSheet/BottomSheet.tsx +56 -52
  266. package/src/components/Header/Header.tsx +20 -18
  267. package/src/components/Header/HeaderNavigationTabs.tsx +25 -0
  268. package/src/components/Header/HeaderTabs.tsx +48 -0
  269. package/src/components/Header/NavigationHeader.tsx +11 -8
  270. package/src/components/Tabs/NavigationTabs.tsx +3 -0
  271. package/src/components/TokenList/TokenDetailsSheet.tsx +9 -7
  272. package/src/components/TokenList/TokenDetailsSheetContent.tsx +176 -177
  273. package/src/components/TokenList/useTokenSelect.ts +2 -2
  274. package/src/config/version.ts +1 -1
  275. package/src/hooks/useSwapOnly.ts +2 -5
  276. package/src/hooks/useToAddressRequirements.ts +2 -2
  277. package/src/pages/MainPage/ReviewButton.tsx +2 -2
  278. package/src/pages/SendToWallet/BookmarkAddressSheet.tsx +176 -185
  279. package/src/pages/SendToWallet/ConfirmAddressSheet.tsx +9 -6
  280. package/src/pages/SettingsPage/SettingsCard/SettingCardExpandable.tsx +58 -65
  281. package/src/pages/SettingsPage/SettingsCard/SettingsAccordian.tsx +4 -4
  282. package/src/pages/TransactionPage/ConfirmToAddressSheet.tsx +9 -6
  283. package/src/pages/TransactionPage/ExchangeRateBottomSheet.tsx +53 -58
  284. package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +24 -21
  285. package/src/pages/TransactionPage/TransactionExecutionContent.tsx +8 -6
  286. package/src/providers/QueryClientProvider.tsx +2 -2
  287. package/src/providers/SDKClientProvider.tsx +3 -7
  288. package/src/providers/WidgetProvider/WidgetProvider.tsx +6 -7
  289. package/src/stores/StoreProvider.tsx +3 -10
  290. package/src/stores/bookmarks/BookmarkStore.tsx +4 -4
  291. package/src/stores/chains/ChainOrderStore.tsx +4 -4
  292. package/src/stores/form/FormStore.tsx +2 -2
  293. package/src/stores/form/useFormStore.ts +2 -2
  294. package/src/stores/header/useHeaderStore.tsx +3 -5
  295. package/src/stores/navigationTabs/types.ts +27 -0
  296. package/src/stores/navigationTabs/useNavigationTabLabel.ts +28 -0
  297. package/src/stores/navigationTabs/useNavigationTabsStore.tsx +108 -0
  298. package/src/stores/navigationTabs/utils.ts +134 -0
  299. package/src/stores/pinnedTokens/PinnedTokensStore.tsx +4 -4
  300. package/src/stores/routes/RouteExecutionStore.tsx +4 -4
  301. package/src/stores/settings/SettingsStore.tsx +4 -4
  302. package/src/stores/settings/createSettingsStore.ts +48 -12
  303. package/src/stores/settings/types.ts +1 -16
  304. package/src/types/widget.ts +31 -1
  305. package/dist/esm/components/Header/SplitNavigationTabs.js +0 -33
  306. package/dist/esm/components/Header/SplitNavigationTabs.js.map +0 -1
  307. package/dist/esm/stores/settings/useSplitModeStore.js +0 -36
  308. package/dist/esm/stores/settings/useSplitModeStore.js.map +0 -1
  309. package/dist/esm/utils/variant.js.map +0 -1
  310. package/src/components/Header/SplitNavigationTabs.tsx +0 -32
  311. package/src/stores/settings/useSplitModeStore.tsx +0 -58
  312. /package/src/utils/{variant.ts → mode.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenBalance.js","names":[],"sources":["../../../src/hooks/useTokenBalance.ts"],"sourcesContent":["import {\n getTokenBalances,\n type SDKClient,\n type Token,\n type TokenAmount,\n} from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nconst defaultRefetchInterval = 30_000\n\nexport const useTokenBalance = (\n accountAddress?: string,\n token?: Token\n): {\n token: TokenAmount | undefined\n isLoading: boolean\n refetch: () => void\n refetchNewBalance: () => void\n getTokenBalancesWithRetry: typeof getTokenBalancesWithRetry\n} => {\n const queryClient = useQueryClient()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const tokenBalanceQueryKey = useMemo(\n () =>\n [\n getQueryKey('token-balance', keyPrefix),\n accountAddress,\n token?.chainId,\n token?.address,\n ] as const,\n [token?.address, token?.chainId, accountAddress, keyPrefix]\n )\n\n const { data, isLoading, refetch } = useQuery({\n queryKey: tokenBalanceQueryKey,\n queryFn: async ({\n queryKey: [, accountAddress, tokenChainId, tokenAddress],\n }) => {\n const tokenBalances = await getTokenBalancesWithRetry(\n sdkClient,\n accountAddress as string,\n [token!]\n )\n\n if (!tokenBalances?.length) {\n throw new Error('Could not get tokens balance.')\n }\n\n const cachedTokenAmount =\n queryClient.getQueryData<TokenAmount>(tokenBalanceQueryKey)\n\n const tokenAmount = tokenBalances[0].amount\n\n if (cachedTokenAmount?.amount !== tokenAmount) {\n queryClient.setQueryDefaults(tokenBalanceQueryKey, {\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n })\n }\n\n queryClient.setQueriesData<TokenAmount[]>(\n {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n accountAddress,\n tokenChainId,\n ],\n },\n (data) => {\n if (data) {\n const clonedData = [...data]\n const index = clonedData.findIndex(\n (dataToken) => dataToken.address === tokenAddress\n )\n clonedData[index] = {\n ...clonedData[index],\n amount: tokenAmount,\n }\n return clonedData\n }\n }\n )\n\n return {\n ...tokenBalances[0],\n amount: tokenAmount,\n } as TokenAmount\n },\n\n enabled: Boolean(accountAddress && token),\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n })\n\n const refetchNewBalance = useCallback(() => {\n queryClient.setQueryDefaults(tokenBalanceQueryKey, {\n refetchInterval: 250,\n staleTime: 250,\n })\n }, [queryClient, tokenBalanceQueryKey])\n\n return {\n token: data,\n isLoading,\n refetch,\n refetchNewBalance,\n getTokenBalancesWithRetry,\n }\n}\n\nexport const getTokenBalancesWithRetry = async (\n sdkClient: SDKClient,\n accountAddress: string,\n tokens: Token[],\n depth = 0\n): Promise<TokenAmount[] | undefined> => {\n try {\n const tokenBalances = await getTokenBalances(\n sdkClient,\n accountAddress as string,\n tokens\n )\n if (!tokenBalances.every((token) => token.blockNumber)) {\n if (depth > 10) {\n console.warn('Token balance backoff depth exceeded.')\n return undefined\n }\n await new Promise((resolve) => {\n setTimeout(resolve, 1.5 ** depth * 100)\n })\n return getTokenBalancesWithRetry(\n sdkClient,\n accountAddress,\n tokens,\n depth + 1\n )\n }\n return tokenBalances\n } catch (_error) {\n console.warn(_error)\n }\n}\n"],"mappings":";;;;;;;AAYA,MAAM,yBAAyB;AAE/B,MAAa,mBACX,gBACA,UAOG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAE/B,MAAM,uBAAuB,cAEzB;EACE,YAAY,iBAAiB,SAAS;EACtC;EACA,OAAO;EACP,OAAO;CACT,GACF;EAAC,OAAO;EAAS,OAAO;EAAS;EAAgB;CAAS,CAC5D;CAEA,MAAM,EAAE,MAAM,WAAW,YAAY,SAAS;EAC5C,UAAU;EACV,SAAS,OAAO,EACd,UAAU,GAAG,gBAAgB,cAAc,oBACvC;GACJ,MAAM,gBAAgB,MAAM,0BAC1B,WACA,gBACA,CAAC,KAAM,CACT;GAEA,IAAI,CAAC,eAAe,QAClB,MAAM,IAAI,MAAM,+BAA+B;GAGjD,MAAM,oBACJ,YAAY,aAA0B,oBAAoB;GAE5D,MAAM,cAAc,cAAc,GAAG;GAErC,IAAI,mBAAmB,WAAW,aAChC,YAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;GACb,CAAC;GAGH,YAAY,eACV,EACE,UAAU;IACR,YAAY,kBAAkB,SAAS;IACvC;IACA;GACF,EACF,IACC,SAAS;IACR,IAAI,MAAM;KACR,MAAM,aAAa,CAAC,GAAG,IAAI;KAC3B,MAAM,QAAQ,WAAW,WACtB,cAAc,UAAU,YAAY,YACvC;KACA,WAAW,SAAS;MAClB,GAAG,WAAW;MACd,QAAQ;KACV;KACA,OAAO;IACT;GACF,CACF;GAEA,OAAO;IACL,GAAG,cAAc;IACjB,QAAQ;GACV;EACF;EAEA,SAAS,QAAQ,kBAAkB,KAAK;EACxC,iBAAiB;EACjB,WAAW;CACb,CAAC;CASD,OAAO;EACL,OAAO;EACP;EACA;EACA,mBAXwB,kBAAkB;GAC1C,YAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;GACb,CAAC;EACH,GAAG,CAAC,aAAa,oBAAoB,CAMnB;EAChB;CACF;AACF;AAEA,MAAa,4BAA4B,OACvC,WACA,gBACA,QACA,QAAQ,MAC+B;CACvC,IAAI;EACF,MAAM,gBAAgB,MAAM,iBAC1B,WACA,gBACA,MACF;EACA,IAAI,CAAC,cAAc,OAAO,UAAU,MAAM,WAAW,GAAG;GACtD,IAAI,QAAQ,IAAI;IACd,QAAQ,KAAK,uCAAuC;IACpD;GACF;GACA,MAAM,IAAI,SAAS,YAAY;IAC7B,WAAW,SAAS,OAAO,QAAQ,GAAG;GACxC,CAAC;GACD,OAAO,0BACL,WACA,gBACA,QACA,QAAQ,CACV;EACF;EACA,OAAO;CACT,SAAS,QAAQ;EACf,QAAQ,KAAK,MAAM;CACrB;AACF"}
1
+ {"version":3,"file":"useTokenBalance.js","names":[],"sources":["../../../src/hooks/useTokenBalance.ts"],"sourcesContent":["import {\n getTokenBalances,\n type SDKClient,\n type Token,\n type TokenAmount,\n} from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nconst defaultRefetchInterval = 30_000\n\nexport const useTokenBalance = (\n accountAddress?: string,\n token?: Token\n): {\n token: TokenAmount | undefined\n isLoading: boolean\n refetch: () => void\n refetchNewBalance: () => void\n getTokenBalancesWithRetry: typeof getTokenBalancesWithRetry\n} => {\n const queryClient = useQueryClient()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const tokenBalanceQueryKey = useMemo(\n () =>\n [\n getQueryKey('token-balance', keyPrefix),\n accountAddress,\n token?.chainId,\n token?.address,\n ] as const,\n [token?.address, token?.chainId, accountAddress, keyPrefix]\n )\n\n const { data, isLoading, refetch } = useQuery({\n queryKey: tokenBalanceQueryKey,\n queryFn: async ({\n queryKey: [, accountAddress, tokenChainId, tokenAddress],\n }) => {\n const tokenBalances = await getTokenBalancesWithRetry(\n sdkClient,\n accountAddress as string,\n [token!]\n )\n\n if (!tokenBalances?.length) {\n throw new Error('Could not get tokens balance.')\n }\n\n const cachedTokenAmount =\n queryClient.getQueryData<TokenAmount>(tokenBalanceQueryKey)\n\n const tokenAmount = tokenBalances[0].amount\n\n if (cachedTokenAmount?.amount !== tokenAmount) {\n queryClient.setQueryDefaults(tokenBalanceQueryKey, {\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n })\n }\n\n queryClient.setQueriesData<TokenAmount[]>(\n {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n accountAddress,\n tokenChainId,\n ],\n },\n (data) => {\n if (data) {\n const clonedData = [...data]\n const index = clonedData.findIndex(\n (dataToken) => dataToken.address === tokenAddress\n )\n clonedData[index] = {\n ...clonedData[index],\n amount: tokenAmount,\n }\n return clonedData\n }\n }\n )\n\n return {\n ...tokenBalances[0],\n amount: tokenAmount,\n } as TokenAmount\n },\n\n enabled: Boolean(accountAddress && token),\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n })\n\n const refetchNewBalance = useCallback(() => {\n queryClient.setQueryDefaults(tokenBalanceQueryKey, {\n refetchInterval: 250,\n staleTime: 250,\n })\n }, [queryClient, tokenBalanceQueryKey])\n\n return {\n token: data,\n isLoading,\n refetch,\n refetchNewBalance,\n getTokenBalancesWithRetry,\n }\n}\n\nexport const getTokenBalancesWithRetry = async (\n sdkClient: SDKClient,\n accountAddress: string,\n tokens: Token[],\n depth = 0\n): Promise<TokenAmount[] | undefined> => {\n try {\n const tokenBalances = await getTokenBalances(\n sdkClient,\n accountAddress as string,\n tokens\n )\n if (!tokenBalances.every((token) => token.blockNumber)) {\n if (depth > 10) {\n console.warn('Token balance backoff depth exceeded.')\n return undefined\n }\n await new Promise((resolve) => {\n setTimeout(resolve, 1.5 ** depth * 100)\n })\n return getTokenBalancesWithRetry(\n sdkClient,\n accountAddress,\n tokens,\n depth + 1\n )\n }\n return tokenBalances\n } catch (_error) {\n console.warn(_error)\n }\n}\n"],"mappings":";;;;;;;AAYA,MAAM,yBAAyB;AAE/B,MAAa,mBACX,gBACA,UAOG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAE/B,MAAM,uBAAuB,cAEzB;EACE,YAAY,iBAAiB,SAAS;EACtC;EACA,OAAO;EACP,OAAO;CACT,GACF;EAAC,OAAO;EAAS,OAAO;EAAS;EAAgB;CAAS,CAC5D;CAEA,MAAM,EAAE,MAAM,WAAW,YAAY,SAAS;EAC5C,UAAU;EACV,SAAS,OAAO,EACd,UAAU,GAAG,gBAAgB,cAAc,oBACvC;GACJ,MAAM,gBAAgB,MAAM,0BAC1B,WACA,gBACA,CAAC,KAAM,CACT;GAEA,IAAI,CAAC,eAAe,QAClB,MAAM,IAAI,MAAM,+BAA+B;GAGjD,MAAM,oBACJ,YAAY,aAA0B,oBAAoB;GAE5D,MAAM,cAAc,cAAc,EAAE,CAAC;GAErC,IAAI,mBAAmB,WAAW,aAChC,YAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;GACb,CAAC;GAGH,YAAY,eACV,EACE,UAAU;IACR,YAAY,kBAAkB,SAAS;IACvC;IACA;GACF,EACF,IACC,SAAS;IACR,IAAI,MAAM;KACR,MAAM,aAAa,CAAC,GAAG,IAAI;KAC3B,MAAM,QAAQ,WAAW,WACtB,cAAc,UAAU,YAAY,YACvC;KACA,WAAW,SAAS;MAClB,GAAG,WAAW;MACd,QAAQ;KACV;KACA,OAAO;IACT;GACF,CACF;GAEA,OAAO;IACL,GAAG,cAAc;IACjB,QAAQ;GACV;EACF;EAEA,SAAS,QAAQ,kBAAkB,KAAK;EACxC,iBAAiB;EACjB,WAAW;CACb,CAAC;CASD,OAAO;EACL,OAAO;EACP;EACA;EACA,mBAXwB,kBAAkB;GAC1C,YAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;GACb,CAAC;EACH,GAAG,CAAC,aAAa,oBAAoB,CAMnB;EAChB;CACF;AACF;AAEA,MAAa,4BAA4B,OACvC,WACA,gBACA,QACA,QAAQ,MAC+B;CACvC,IAAI;EACF,MAAM,gBAAgB,MAAM,iBAC1B,WACA,gBACA,MACF;EACA,IAAI,CAAC,cAAc,OAAO,UAAU,MAAM,WAAW,GAAG;GACtD,IAAI,QAAQ,IAAI;IACd,QAAQ,KAAK,uCAAuC;IACpD;GACF;GACA,MAAM,IAAI,SAAS,YAAY;IAC7B,WAAW,SAAS,OAAO,QAAQ,GAAG;GACxC,CAAC;GACD,OAAO,0BACL,WACA,gBACA,QACA,QAAQ,CACV;EACF;EACA,OAAO;CACT,SAAS,QAAQ;EACf,QAAQ,KAAK,MAAM;CACrB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenBalances.js","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { usePinnedTokensStore } from '../stores/pinnedTokens/PinnedTokensStore.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport type { TokenAmount } from '../types/token.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport { isSearchMatch, processTokenBalances } from '../utils/tokenList.js'\nimport { useAccountsBalancesData } from './useAccountsBalancesData.js'\nimport { useTokenBalancesQueries } from './useTokenBalancesQueries.js'\nimport { useTokens } from './useTokens.js'\n\nexport const useTokenBalances = (\n selectedChainId?: number,\n formType?: FormType,\n isAllNetworks?: boolean,\n search?: string\n): {\n tokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n isTokensLoading: boolean\n isSearchLoading: boolean\n isBalanceLoading: boolean\n} => {\n const { hiddenUI } = useWidgetConfig()\n const {\n allTokens,\n isLoading: isTokensLoading,\n isSearchLoading,\n } = useTokens(formType, search, isAllNetworks ? undefined : selectedChainId)\n\n const { data: accountsWithAllTokens, isLoading: isAccountsLoading } =\n useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens)\n\n const isBalanceLoadingEnabled =\n Boolean(accountsWithAllTokens) && !isAccountsLoading\n\n const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } =\n useTokenBalancesQueries(accountsWithAllTokens, isBalanceLoadingEnabled)\n\n const { tokens: configTokens } = useWidgetConfig()\n const { smallBalanceThreshold } = useSettings(['smallBalanceThreshold'])\n\n const pinnedTokens = usePinnedTokensStore((state) => state.pinnedTokens)\n\n const isBalanceLoading =\n (isBalanceQueriesLoading || isAccountsLoading) &&\n !allTokensWithBalances?.length\n\n // Create function to check if token is pinned\n const isPinnedToken = useMemo(() => {\n if (isAllNetworks) {\n // For all networks, check all pinned tokens\n const allPinned: Array<{ chainId: number; tokenAddress: string }> = []\n Object.entries(pinnedTokens).forEach(([chainIdStr, addresses]) => {\n const chainId = Number.parseInt(chainIdStr, 10)\n addresses.forEach((address) => {\n allPinned.push({ chainId, tokenAddress: address })\n })\n })\n const pinnedSet = new Set(\n allPinned.map((p) => `${p.chainId}-${p.tokenAddress.toLowerCase()}`)\n )\n return (chainId: number, tokenAddress: string) => {\n const key = `${chainId}-${tokenAddress.toLowerCase()}`\n return pinnedSet.has(key)\n }\n } else if (selectedChainId) {\n // For single chain, check only selected chain\n const chainPinnedTokens = pinnedTokens[selectedChainId] || []\n const pinnedSet = new Set(\n chainPinnedTokens.map((addr) => addr.toLowerCase())\n )\n return (chainId: number, tokenAddress: string) => {\n return (\n chainId === selectedChainId &&\n pinnedSet.has(tokenAddress.toLowerCase())\n )\n }\n }\n return undefined\n }, [isAllNetworks, selectedChainId, pinnedTokens])\n\n const displayedTokensList = useMemo(() => {\n const tokensByChain = isAllNetworks\n ? Object.values(allTokens ?? {}).flat()\n : selectedChainId\n ? allTokens?.[selectedChainId]\n : undefined\n return tokensByChain?.filter((t) => isSearchMatch(t, search)) ?? []\n }, [allTokens, isAllNetworks, selectedChainId, search])\n\n const displayedTokensWithBalances = useMemo(() => {\n const balancesByChain = isAllNetworks\n ? allTokensWithBalances\n : selectedChainId\n ? allTokensWithBalances?.filter((t) => t.chainId === selectedChainId)\n : undefined\n const displayedTokensSet = new Set(\n displayedTokensList?.map(\n (t) => `${t.chainId}-${t.address.toLowerCase()}`\n ) || []\n )\n\n const hideSmallBalances =\n !!smallBalanceThreshold && !hiddenUI?.hideSmallBalances\n const threshold = hideSmallBalances\n ? Number.parseFloat(smallBalanceThreshold)\n : undefined\n\n if (!balancesByChain) {\n return undefined\n }\n\n return balancesByChain.reduce<typeof balancesByChain>((acc, token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n // Check if token is in displayed list and has amount\n const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount\n // Check if it matches search (for cached appended tokens)\n const matchesSearch = isSearchMatch(token, search)\n\n // Filter: only include tokens that match our criteria\n if (!isInDisplayedList && !matchesSearch) {\n return acc\n }\n\n // Apply small balance threshold transformation if enabled\n let processedToken = token\n if (\n hideSmallBalances &&\n threshold !== undefined &&\n threshold >= 0 &&\n token.amount\n ) {\n const balanceUSD = formatTokenPrice(\n token.amount,\n token.priceUSD,\n token.decimals\n )\n if (balanceUSD < threshold) {\n processedToken = {\n ...token,\n amount: 0n,\n }\n }\n }\n\n acc.push(processedToken)\n return acc\n }, [])\n }, [\n allTokensWithBalances,\n displayedTokensList,\n search,\n selectedChainId,\n isAllNetworks,\n smallBalanceThreshold,\n hiddenUI,\n ])\n\n const { processedTokens, withCategories, withPinnedTokens } = useMemo(() => {\n return processTokenBalances(\n isBalanceLoading,\n isAllNetworks || !!search,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n isPinnedToken\n )\n }, [\n isBalanceLoading,\n isAllNetworks,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n search,\n isPinnedToken,\n ])\n\n return {\n tokens: processedTokens ?? [],\n withCategories,\n withPinnedTokens,\n isTokensLoading,\n isSearchLoading,\n isBalanceLoading,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useTokenBalances.js","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { usePinnedTokensStore } from '../stores/pinnedTokens/PinnedTokensStore.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport type { TokenAmount } from '../types/token.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport { isSearchMatch, processTokenBalances } from '../utils/tokenList.js'\nimport { useAccountsBalancesData } from './useAccountsBalancesData.js'\nimport { useTokenBalancesQueries } from './useTokenBalancesQueries.js'\nimport { useTokens } from './useTokens.js'\n\nexport const useTokenBalances = (\n selectedChainId?: number,\n formType?: FormType,\n isAllNetworks?: boolean,\n search?: string\n): {\n tokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n isTokensLoading: boolean\n isSearchLoading: boolean\n isBalanceLoading: boolean\n} => {\n const { hiddenUI } = useWidgetConfig()\n const {\n allTokens,\n isLoading: isTokensLoading,\n isSearchLoading,\n } = useTokens(formType, search, isAllNetworks ? undefined : selectedChainId)\n\n const { data: accountsWithAllTokens, isLoading: isAccountsLoading } =\n useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens)\n\n const isBalanceLoadingEnabled =\n Boolean(accountsWithAllTokens) && !isAccountsLoading\n\n const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } =\n useTokenBalancesQueries(accountsWithAllTokens, isBalanceLoadingEnabled)\n\n const { tokens: configTokens } = useWidgetConfig()\n const { smallBalanceThreshold } = useSettings(['smallBalanceThreshold'])\n\n const pinnedTokens = usePinnedTokensStore((state) => state.pinnedTokens)\n\n const isBalanceLoading =\n (isBalanceQueriesLoading || isAccountsLoading) &&\n !allTokensWithBalances?.length\n\n // Create function to check if token is pinned\n const isPinnedToken = useMemo(() => {\n if (isAllNetworks) {\n // For all networks, check all pinned tokens\n const allPinned: Array<{ chainId: number; tokenAddress: string }> = []\n Object.entries(pinnedTokens).forEach(([chainIdStr, addresses]) => {\n const chainId = Number.parseInt(chainIdStr, 10)\n addresses.forEach((address) => {\n allPinned.push({ chainId, tokenAddress: address })\n })\n })\n const pinnedSet = new Set(\n allPinned.map((p) => `${p.chainId}-${p.tokenAddress.toLowerCase()}`)\n )\n return (chainId: number, tokenAddress: string) => {\n const key = `${chainId}-${tokenAddress.toLowerCase()}`\n return pinnedSet.has(key)\n }\n } else if (selectedChainId) {\n // For single chain, check only selected chain\n const chainPinnedTokens = pinnedTokens[selectedChainId] || []\n const pinnedSet = new Set(\n chainPinnedTokens.map((addr) => addr.toLowerCase())\n )\n return (chainId: number, tokenAddress: string) => {\n return (\n chainId === selectedChainId &&\n pinnedSet.has(tokenAddress.toLowerCase())\n )\n }\n }\n return undefined\n }, [isAllNetworks, selectedChainId, pinnedTokens])\n\n const displayedTokensList = useMemo(() => {\n const tokensByChain = isAllNetworks\n ? Object.values(allTokens ?? {}).flat()\n : selectedChainId\n ? allTokens?.[selectedChainId]\n : undefined\n return tokensByChain?.filter((t) => isSearchMatch(t, search)) ?? []\n }, [allTokens, isAllNetworks, selectedChainId, search])\n\n const displayedTokensWithBalances = useMemo(() => {\n const balancesByChain = isAllNetworks\n ? allTokensWithBalances\n : selectedChainId\n ? allTokensWithBalances?.filter((t) => t.chainId === selectedChainId)\n : undefined\n const displayedTokensSet = new Set(\n displayedTokensList?.map(\n (t) => `${t.chainId}-${t.address.toLowerCase()}`\n ) || []\n )\n\n const hideSmallBalances =\n !!smallBalanceThreshold && !hiddenUI?.hideSmallBalances\n const threshold = hideSmallBalances\n ? Number.parseFloat(smallBalanceThreshold)\n : undefined\n\n if (!balancesByChain) {\n return undefined\n }\n\n return balancesByChain.reduce<typeof balancesByChain>((acc, token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n // Check if token is in displayed list and has amount\n const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount\n // Check if it matches search (for cached appended tokens)\n const matchesSearch = isSearchMatch(token, search)\n\n // Filter: only include tokens that match our criteria\n if (!isInDisplayedList && !matchesSearch) {\n return acc\n }\n\n // Apply small balance threshold transformation if enabled\n let processedToken = token\n if (\n hideSmallBalances &&\n threshold !== undefined &&\n threshold >= 0 &&\n token.amount\n ) {\n const balanceUSD = formatTokenPrice(\n token.amount,\n token.priceUSD,\n token.decimals\n )\n if (balanceUSD < threshold) {\n processedToken = {\n ...token,\n amount: 0n,\n }\n }\n }\n\n acc.push(processedToken)\n return acc\n }, [])\n }, [\n allTokensWithBalances,\n displayedTokensList,\n search,\n selectedChainId,\n isAllNetworks,\n smallBalanceThreshold,\n hiddenUI,\n ])\n\n const { processedTokens, withCategories, withPinnedTokens } = useMemo(() => {\n return processTokenBalances(\n isBalanceLoading,\n isAllNetworks || !!search,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n isPinnedToken\n )\n }, [\n isBalanceLoading,\n isAllNetworks,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n search,\n isPinnedToken,\n ])\n\n return {\n tokens: processedTokens ?? [],\n withCategories,\n withPinnedTokens,\n isTokensLoading,\n isSearchLoading,\n isBalanceLoading,\n }\n}\n"],"mappings":";;;;;;;;;;AAYA,MAAa,oBACX,iBACA,UACA,eACA,WAQG;CACH,MAAM,EAAE,aAAa,gBAAgB;CACrC,MAAM,EACJ,WACA,WAAW,iBACX,oBACE,UAAU,UAAU,QAAQ,gBAAgB,KAAA,IAAY,eAAe;CAE3E,MAAM,EAAE,MAAM,uBAAuB,WAAW,sBAC9C,wBAAwB,iBAAiB,UAAU,eAAe,SAAS;CAK7E,MAAM,EAAE,MAAM,uBAAuB,WAAW,4BAC9C,wBAAwB,uBAHxB,QAAQ,qBAAqB,KAAK,CAAC,iBAGmC;CAExE,MAAM,EAAE,QAAQ,iBAAiB,gBAAgB;CACjD,MAAM,EAAE,0BAA0B,YAAY,CAAC,uBAAuB,CAAC;CAEvE,MAAM,eAAe,sBAAsB,UAAU,MAAM,YAAY;CAEvE,MAAM,oBACH,2BAA2B,sBAC5B,CAAC,uBAAuB;CAG1B,MAAM,gBAAgB,cAAc;EAClC,IAAI,eAAe;GAEjB,MAAM,YAA8D,CAAC;GACrE,OAAO,QAAQ,YAAY,CAAC,CAAC,SAAS,CAAC,YAAY,eAAe;IAChE,MAAM,UAAU,OAAO,SAAS,YAAY,EAAE;IAC9C,UAAU,SAAS,YAAY;KAC7B,UAAU,KAAK;MAAE;MAAS,cAAc;KAAQ,CAAC;IACnD,CAAC;GACH,CAAC;GACD,MAAM,YAAY,IAAI,IACpB,UAAU,KAAK,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,aAAa,YAAY,GAAG,CACrE;GACA,QAAQ,SAAiB,iBAAyB;IAChD,MAAM,MAAM,GAAG,QAAQ,GAAG,aAAa,YAAY;IACnD,OAAO,UAAU,IAAI,GAAG;GAC1B;EACF,OAAO,IAAI,iBAAiB;GAE1B,MAAM,oBAAoB,aAAa,oBAAoB,CAAC;GAC5D,MAAM,YAAY,IAAI,IACpB,kBAAkB,KAAK,SAAS,KAAK,YAAY,CAAC,CACpD;GACA,QAAQ,SAAiB,iBAAyB;IAChD,OACE,YAAY,mBACZ,UAAU,IAAI,aAAa,YAAY,CAAC;GAE5C;EACF;CAEF,GAAG;EAAC;EAAe;EAAiB;CAAY,CAAC;CAEjD,MAAM,sBAAsB,cAAc;EAMxC,QALsB,gBAClB,OAAO,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,IACpC,kBACE,YAAY,mBACZ,KAAA,EAAA,EACgB,QAAQ,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;CACpE,GAAG;EAAC;EAAW;EAAe;EAAiB;CAAM,CAAC;CAEtD,MAAM,8BAA8B,cAAc;EAChD,MAAM,kBAAkB,gBACpB,wBACA,kBACE,uBAAuB,QAAQ,MAAM,EAAE,YAAY,eAAe,IAClE,KAAA;EACN,MAAM,qBAAqB,IAAI,IAC7B,qBAAqB,KAClB,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,YAAY,GAC/C,KAAK,CAAC,CACR;EAEA,MAAM,oBACJ,CAAC,CAAC,yBAAyB,CAAC,UAAU;EACxC,MAAM,YAAY,oBACd,OAAO,WAAW,qBAAqB,IACvC,KAAA;EAEJ,IAAI,CAAC,iBACH;EAGF,OAAO,gBAAgB,QAAgC,KAAK,UAAU;GACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,YAAY;GAE/D,MAAM,oBAAoB,mBAAmB,IAAI,QAAQ,KAAK,MAAM;GAEpE,MAAM,gBAAgB,cAAc,OAAO,MAAM;GAGjD,IAAI,CAAC,qBAAqB,CAAC,eACzB,OAAO;GAIT,IAAI,iBAAiB;GACrB,IACE,qBACA,cAAc,KAAA,KACd,aAAa,KACb,MAAM;QAEa,iBACjB,MAAM,QACN,MAAM,UACN,MAAM,QAEK,IAAI,WACf,iBAAiB;KACf,GAAG;KACH,QAAQ;IACV;GAAA;GAIJ,IAAI,KAAK,cAAc;GACvB,OAAO;EACT,GAAG,CAAC,CAAC;CACP,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,iBAAiB,gBAAgB,qBAAqB,cAAc;EAC1E,OAAO,qBACL,kBACA,iBAAiB,CAAC,CAAC,QACnB,cACA,iBACA,qBACA,6BACA,aACF;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,OAAO;EACL,QAAQ,mBAAmB,CAAC;EAC5B;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenBalancesQueries.js","names":[],"sources":["../../../src/hooks/useTokenBalancesQueries.ts"],"sourcesContent":["import { getTokenBalances, type TokenExtended } from '@lifi/sdk'\nimport { useQueries } from '@tanstack/react-query'\nimport { useMemo, useRef } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { TokenAmount, TokenAmountExtended } from '../types/token.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nconst defaultRefetchInterval = 32_000\n\nexport const useTokenBalancesQueries = (\n accountsWithTokens?: Record<string, Record<number, TokenExtended[]>>,\n isBalanceLoadingEnabled?: boolean\n): {\n data: TokenAmount[] | undefined\n isLoading: boolean\n isError: boolean\n} => {\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const firstLoadStartRef = useRef<number | null>(null)\n\n const queryConfig = useMemo(() => {\n if (!accountsWithTokens) {\n return []\n }\n return Object.entries(accountsWithTokens).flatMap(\n ([accountAddress, chainTokens]) =>\n Object.entries(chainTokens).map(([chainIdStr, tokens]) => {\n const chainId = Number(chainIdStr)\n return {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n accountAddress,\n chainId,\n tokens.length,\n ],\n queryFn: async (): Promise<TokenAmountExtended[]> => {\n if (!accountAddress || !tokens) {\n return []\n }\n return await getTokenBalances(sdkClient, accountAddress, tokens)\n },\n enabled: isBalanceLoadingEnabled,\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n keepPreviousData: true,\n }\n })\n )\n }, [accountsWithTokens, isBalanceLoadingEnabled, keyPrefix, sdkClient])\n\n const result = useQueries({\n queries: queryConfig,\n combine: (results) => {\n const now = Date.now()\n\n const hasLoadingQueries = results.some((result) => result.isLoading)\n if (hasLoadingQueries && firstLoadStartRef.current === null) {\n firstLoadStartRef.current = now\n }\n\n const allComplete = results.every(\n (result) => result.isSuccess || result.isError\n )\n\n // Reset the start time when all queries complete\n if (allComplete) {\n firstLoadStartRef.current = null\n }\n\n // Calculate time since first load started\n const timeSinceStart = firstLoadStartRef.current\n ? now - firstLoadStartRef.current\n : 0\n\n // Return results if all complete OR if 500ms have passed since first query started\n const shouldReturnResults = allComplete || timeSinceStart >= 500\n\n if (shouldReturnResults) {\n const data: TokenAmount[] = results\n .flatMap((result) => result.data || [])\n .filter((token) => token.amount)\n return {\n data,\n isLoading: !allComplete,\n isError: results.some((result) => result.isError),\n }\n }\n\n return {\n data: undefined,\n isLoading: true,\n isError: false,\n }\n },\n })\n\n return result\n}\n"],"mappings":";;;;;;;AAQA,MAAM,yBAAyB;AAE/B,MAAa,2BACX,oBACA,4BAKG;CACH,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAC/B,MAAM,oBAAoB,OAAsB,IAAI;CA8EpD,OA9Ce,WAAW;EACxB,SA/BkB,cAAc;GAChC,IAAI,CAAC,oBACH,OAAO,CAAC;GAEV,OAAO,OAAO,QAAQ,kBAAkB,EAAE,SACvC,CAAC,gBAAgB,iBAChB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC,YAAY,YAAY;IACxD,MAAM,UAAU,OAAO,UAAU;IACjC,OAAO;KACL,UAAU;MACR,YAAY,kBAAkB,SAAS;MACvC;MACA;MACA,OAAO;KACT;KACA,SAAS,YAA4C;MACnD,IAAI,CAAC,kBAAkB,CAAC,QACtB,OAAO,CAAC;MAEV,OAAO,MAAM,iBAAiB,WAAW,gBAAgB,MAAM;KACjE;KACA,SAAS;KACT,iBAAiB;KACjB,WAAW;KACX,kBAAkB;IACpB;GACF,CAAC,CACL;EACF,GAAG;GAAC;GAAoB;GAAyB;GAAW;EAAS,CAGhD;EACnB,UAAU,YAAY;GACpB,MAAM,MAAM,KAAK,IAAI;GAGrB,IAD0B,QAAQ,MAAM,WAAW,OAAO,SACtC,KAAK,kBAAkB,YAAY,MACrD,kBAAkB,UAAU;GAG9B,MAAM,cAAc,QAAQ,OACzB,WAAW,OAAO,aAAa,OAAO,OACzC;GAGA,IAAI,aACF,kBAAkB,UAAU;GAI9B,MAAM,iBAAiB,kBAAkB,UACrC,MAAM,kBAAkB,UACxB;GAKJ,IAF4B,eAAe,kBAAkB,KAM3D,OAAO;IACL,MAJ0B,QACzB,SAAS,WAAW,OAAO,QAAQ,CAAC,CAAC,EACrC,QAAQ,UAAU,MAAM,MAEtB;IACH,WAAW,CAAC;IACZ,SAAS,QAAQ,MAAM,WAAW,OAAO,OAAO;GAClD;GAGF,OAAO;IACL,MAAM,KAAA;IACN,WAAW;IACX,SAAS;GACX;EACF;CACF,CAEY;AACd"}
1
+ {"version":3,"file":"useTokenBalancesQueries.js","names":[],"sources":["../../../src/hooks/useTokenBalancesQueries.ts"],"sourcesContent":["import { getTokenBalances, type TokenExtended } from '@lifi/sdk'\nimport { useQueries } from '@tanstack/react-query'\nimport { useMemo, useRef } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { TokenAmount, TokenAmountExtended } from '../types/token.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nconst defaultRefetchInterval = 32_000\n\nexport const useTokenBalancesQueries = (\n accountsWithTokens?: Record<string, Record<number, TokenExtended[]>>,\n isBalanceLoadingEnabled?: boolean\n): {\n data: TokenAmount[] | undefined\n isLoading: boolean\n isError: boolean\n} => {\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const firstLoadStartRef = useRef<number | null>(null)\n\n const queryConfig = useMemo(() => {\n if (!accountsWithTokens) {\n return []\n }\n return Object.entries(accountsWithTokens).flatMap(\n ([accountAddress, chainTokens]) =>\n Object.entries(chainTokens).map(([chainIdStr, tokens]) => {\n const chainId = Number(chainIdStr)\n return {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n accountAddress,\n chainId,\n tokens.length,\n ],\n queryFn: async (): Promise<TokenAmountExtended[]> => {\n if (!accountAddress || !tokens) {\n return []\n }\n return await getTokenBalances(sdkClient, accountAddress, tokens)\n },\n enabled: isBalanceLoadingEnabled,\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n keepPreviousData: true,\n }\n })\n )\n }, [accountsWithTokens, isBalanceLoadingEnabled, keyPrefix, sdkClient])\n\n const result = useQueries({\n queries: queryConfig,\n combine: (results) => {\n const now = Date.now()\n\n const hasLoadingQueries = results.some((result) => result.isLoading)\n if (hasLoadingQueries && firstLoadStartRef.current === null) {\n firstLoadStartRef.current = now\n }\n\n const allComplete = results.every(\n (result) => result.isSuccess || result.isError\n )\n\n // Reset the start time when all queries complete\n if (allComplete) {\n firstLoadStartRef.current = null\n }\n\n // Calculate time since first load started\n const timeSinceStart = firstLoadStartRef.current\n ? now - firstLoadStartRef.current\n : 0\n\n // Return results if all complete OR if 500ms have passed since first query started\n const shouldReturnResults = allComplete || timeSinceStart >= 500\n\n if (shouldReturnResults) {\n const data: TokenAmount[] = results\n .flatMap((result) => result.data || [])\n .filter((token) => token.amount)\n return {\n data,\n isLoading: !allComplete,\n isError: results.some((result) => result.isError),\n }\n }\n\n return {\n data: undefined,\n isLoading: true,\n isError: false,\n }\n },\n })\n\n return result\n}\n"],"mappings":";;;;;;;AAQA,MAAM,yBAAyB;AAE/B,MAAa,2BACX,oBACA,4BAKG;CACH,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAC/B,MAAM,oBAAoB,OAAsB,IAAI;CA8EpD,OA9Ce,WAAW;EACxB,SA/BkB,cAAc;GAChC,IAAI,CAAC,oBACH,OAAO,CAAC;GAEV,OAAO,OAAO,QAAQ,kBAAkB,CAAC,CAAC,SACvC,CAAC,gBAAgB,iBAChB,OAAO,QAAQ,WAAW,CAAC,CAAC,KAAK,CAAC,YAAY,YAAY;IACxD,MAAM,UAAU,OAAO,UAAU;IACjC,OAAO;KACL,UAAU;MACR,YAAY,kBAAkB,SAAS;MACvC;MACA;MACA,OAAO;KACT;KACA,SAAS,YAA4C;MACnD,IAAI,CAAC,kBAAkB,CAAC,QACtB,OAAO,CAAC;MAEV,OAAO,MAAM,iBAAiB,WAAW,gBAAgB,MAAM;KACjE;KACA,SAAS;KACT,iBAAiB;KACjB,WAAW;KACX,kBAAkB;IACpB;GACF,CAAC,CACL;EACF,GAAG;GAAC;GAAoB;GAAyB;GAAW;EAAS,CAGhD;EACnB,UAAU,YAAY;GACpB,MAAM,MAAM,KAAK,IAAI;GAGrB,IAD0B,QAAQ,MAAM,WAAW,OAAO,SACtC,KAAK,kBAAkB,YAAY,MACrD,kBAAkB,UAAU;GAG9B,MAAM,cAAc,QAAQ,OACzB,WAAW,OAAO,aAAa,OAAO,OACzC;GAGA,IAAI,aACF,kBAAkB,UAAU;GAI9B,MAAM,iBAAiB,kBAAkB,UACrC,MAAM,kBAAkB,UACxB;GAKJ,IAF4B,eAAe,kBAAkB,KAM3D,OAAO;IACL,MAJ0B,QACzB,SAAS,WAAW,OAAO,QAAQ,CAAC,CAAC,CAAC,CACtC,QAAQ,UAAU,MAAM,MAEtB;IACH,WAAW,CAAC;IACZ,SAAS,QAAQ,MAAM,WAAW,OAAO,OAAO;GAClD;GAGF,OAAO;IACL,MAAM,KAAA;IACN,WAAW;IACX,SAAS;GACX;EACF;CACF,CAEY;AACd"}
@@ -1,5 +1,5 @@
1
- import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
1
  import { getConfigItemSets, isFormItemAllowed } from "../utils/item.js";
2
+ import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
3
3
  import { useSDKClient } from "../providers/SDKClientProvider.js";
4
4
  import { getQueryKey } from "../utils/queries.js";
5
5
  import { getToken } from "@lifi/sdk";
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenSearch.js","names":[],"sources":["../../../src/hooks/useTokenSearch.ts"],"sourcesContent":["import {\n type BaseToken,\n type ChainId,\n getToken,\n type TokenExtended,\n} from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTokenSearch = (\n chainId?: number,\n tokenQuery?: string,\n enabled?: boolean,\n formType?: FormType\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const queryClient = useQueryClient()\n const { tokens: configTokens, keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { data, isLoading } = useQuery({\n queryKey: [getQueryKey('token-search', keyPrefix), chainId, tokenQuery],\n queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {\n const token = await getToken(\n sdkClient,\n chainId as ChainId,\n tokenQuery as string,\n {\n signal,\n }\n )\n\n if (token) {\n // Filter config tokens by chain before checking if token is allowed\n const filteredConfigTokens = getConfigItemSets(\n configTokens,\n (tokens: BaseToken[]) =>\n new Set(\n tokens\n .filter((t) => t.chainId === token.chainId)\n .map((t) => t.address.toLowerCase())\n ),\n formType\n )\n\n // Return undefined if the token is denied\n if (\n !isFormItemAllowed(token, filteredConfigTokens, formType, (t) =>\n t.address.toLowerCase()\n )\n ) {\n return null\n }\n\n // Add token to main tokens cache\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => {\n if (!data) {\n return data\n }\n const chainTokens = data[chainId as number]\n if (\n chainTokens?.some(\n (t) => t.address.toLowerCase() === token.address.toLowerCase()\n )\n ) {\n return data\n }\n // Mark token from search as unverified\n return {\n ...data,\n [chainId as number]: [\n ...(chainTokens ?? []),\n { ...token, verified: false },\n ],\n }\n }\n )\n }\n return token as TokenExtended\n },\n\n enabled: Boolean(chainId && tokenQuery && enabled),\n retry: false,\n })\n return {\n token: data || undefined,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;AAcA,MAAa,kBACX,SACA,YACA,SACA,aAIG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,QAAQ,cAAc,cAAc,gBAAgB;CAC5D,MAAM,YAAY,aAAa;CAE/B,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,SAAS;GAAG;GAAS;EAAU;EACtE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,OACF,CACF;GAEA,IAAI,OAAO;IAcT,IACE,CAAC,kBAAkB,OAbQ,kBAC3B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,EAAE,YAAY,MAAM,OAAO,EACzC,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACvC,GACF,QAK6C,GAAG,WAAW,MACzD,EAAE,QAAQ,YAAY,CACxB,GAEA,OAAO;IAIT,YAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC,EAAE,IAC9C,SAAS;KACR,IAAI,CAAC,MACH,OAAO;KAET,MAAM,cAAc,KAAK;KACzB,IACE,aAAa,MACV,MAAM,EAAE,QAAQ,YAAY,MAAM,MAAM,QAAQ,YAAY,CAC/D,GAEA,OAAO;KAGT,OAAO;MACL,GAAG;OACF,UAAoB,CACnB,GAAI,eAAe,CAAC,GACpB;OAAE,GAAG;OAAO,UAAU;MAAM,CAC9B;KACF;IACF,CACF;GACF;GACA,OAAO;EACT;EAEA,SAAS,QAAQ,WAAW,cAAc,OAAO;EACjD,OAAO;CACT,CAAC;CACD,OAAO;EACL,OAAO,QAAQ,KAAA;EACf;CACF;AACF"}
1
+ {"version":3,"file":"useTokenSearch.js","names":[],"sources":["../../../src/hooks/useTokenSearch.ts"],"sourcesContent":["import {\n type BaseToken,\n type ChainId,\n getToken,\n type TokenExtended,\n} from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTokenSearch = (\n chainId?: number,\n tokenQuery?: string,\n enabled?: boolean,\n formType?: FormType\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const queryClient = useQueryClient()\n const { tokens: configTokens, keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { data, isLoading } = useQuery({\n queryKey: [getQueryKey('token-search', keyPrefix), chainId, tokenQuery],\n queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {\n const token = await getToken(\n sdkClient,\n chainId as ChainId,\n tokenQuery as string,\n {\n signal,\n }\n )\n\n if (token) {\n // Filter config tokens by chain before checking if token is allowed\n const filteredConfigTokens = getConfigItemSets(\n configTokens,\n (tokens: BaseToken[]) =>\n new Set(\n tokens\n .filter((t) => t.chainId === token.chainId)\n .map((t) => t.address.toLowerCase())\n ),\n formType\n )\n\n // Return undefined if the token is denied\n if (\n !isFormItemAllowed(token, filteredConfigTokens, formType, (t) =>\n t.address.toLowerCase()\n )\n ) {\n return null\n }\n\n // Add token to main tokens cache\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => {\n if (!data) {\n return data\n }\n const chainTokens = data[chainId as number]\n if (\n chainTokens?.some(\n (t) => t.address.toLowerCase() === token.address.toLowerCase()\n )\n ) {\n return data\n }\n // Mark token from search as unverified\n return {\n ...data,\n [chainId as number]: [\n ...(chainTokens ?? []),\n { ...token, verified: false },\n ],\n }\n }\n )\n }\n return token as TokenExtended\n },\n\n enabled: Boolean(chainId && tokenQuery && enabled),\n retry: false,\n })\n return {\n token: data || undefined,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;AAcA,MAAa,kBACX,SACA,YACA,SACA,aAIG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,QAAQ,cAAc,cAAc,gBAAgB;CAC5D,MAAM,YAAY,aAAa;CAE/B,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,SAAS;GAAG;GAAS;EAAU;EACtE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,OACF,CACF;GAEA,IAAI,OAAO;IAcT,IACE,CAAC,kBAAkB,OAbQ,kBAC3B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,EAAE,YAAY,MAAM,OAAO,CAAC,CAC1C,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACvC,GACF,QAK6C,GAAG,WAAW,MACzD,EAAE,QAAQ,YAAY,CACxB,GAEA,OAAO;IAIT,YAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC,EAAE,IAC9C,SAAS;KACR,IAAI,CAAC,MACH,OAAO;KAET,MAAM,cAAc,KAAK;KACzB,IACE,aAAa,MACV,MAAM,EAAE,QAAQ,YAAY,MAAM,MAAM,QAAQ,YAAY,CAC/D,GAEA,OAAO;KAGT,OAAO;MACL,GAAG;OACF,UAAoB,CACnB,GAAI,eAAe,CAAC,GACpB;OAAE,GAAG;OAAO,UAAU;MAAM,CAC9B;KACF;IACF,CACF;GACF;GACA,OAAO;EACT;EAEA,SAAS,QAAQ,WAAW,cAAc,OAAO;EACjD,OAAO;CACT,CAAC;CACD,OAAO;EACL,OAAO,QAAQ,KAAA;EACf;CACF;AACF"}
@@ -1,5 +1,5 @@
1
- import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
1
  import { isItemAllowed } from "../utils/item.js";
2
+ import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
3
3
  import { useSDKClient } from "../providers/SDKClientProvider.js";
4
4
  import { getQueryKey } from "../utils/queries.js";
5
5
  import { filterAllowedTokens, mergeVerifiedWithSearchTokens } from "../utils/token.js";
@@ -1 +1 @@
1
- {"version":3,"file":"useTokens.js","names":[],"sources":["../../../src/hooks/useTokens.ts"],"sourcesContent":["import {\n ChainType,\n getToken,\n getTokens,\n type TokenExtended,\n type TokensExtendedResponse,\n} from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { defaultChainIdsByType } from '../utils/chainType.js'\nimport { isItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport {\n filterAllowedTokens,\n mergeVerifiedWithSearchTokens,\n} from '../utils/token.js'\n\nconst refetchInterval = 300_000\n\nexport const useTokens = (\n formType?: FormType,\n search?: string,\n chainId?: number\n): {\n allTokens: Record<number, TokenExtended[]> | undefined\n isLoading: boolean\n isSearchLoading: boolean\n} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n\n // Main tokens cache - verified tokens from API\n const { data: verifiedTokens, isLoading } = useQuery({\n queryKey: [getQueryKey('tokens', keyPrefix)],\n queryFn: async ({ signal }) => {\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // Mark all tokens as verified\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, verified: true })),\n ])\n )\n\n return tokens\n },\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Search tokens cache - unverified tokens from search\n const { data: searchTokens, isLoading: isSearchLoading } = useQuery({\n queryKey: [getQueryKey('tokens-search', keyPrefix), search, chainId],\n queryFn: async ({ queryKey, signal }) => {\n const [, searchQuery, searchChainId] = queryKey as [\n string,\n string,\n number,\n ]\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n search: searchQuery,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // If the chainId is not provided, try to get it from the search query\n let _chainId = searchChainId\n if (!_chainId) {\n const chainType = getChainTypeFromAddress(searchQuery)\n if (chainType && chainType in defaultChainIdsByType) {\n _chainId = defaultChainIdsByType[chainType]\n }\n }\n\n // Fallback: If the main search returned no tokens for the specific chainId,\n // fetch a single token using the /token endpoint\n if (_chainId && searchQuery) {\n const existingTokens = tokensResponse.tokens[_chainId] || []\n if (!existingTokens.length) {\n const token = await getToken(sdkClient, _chainId, searchQuery, {\n signal,\n })\n if (token) {\n tokensResponse.tokens[_chainId] = [token]\n }\n }\n }\n\n // Mark all search tokens as unverified\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, verified: false })),\n ])\n )\n\n return tokens\n },\n enabled: !!search,\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Merge tokens at read time - single place where caches are combined\n const allTokens = useMemo(() => {\n const merged = mergeVerifiedWithSearchTokens(verifiedTokens, searchTokens)\n return filterAllowedTokens(merged, configTokens, chainsConfig, formType)\n }, [verifiedTokens, searchTokens, configTokens, chainsConfig, formType])\n\n return {\n allTokens,\n isLoading,\n isSearchLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;AAsBA,MAAM,kBAAkB;AAExB,MAAa,aACX,UACA,QACA,YAKG;CACH,MAAM,EACJ,QAAQ,cACR,QAAQ,cACR,cACE,gBAAgB;CACpB,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,4BAA4B,wBAAwB;CAG5D,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC;EAC3C,SAAS,OAAO,EAAE,aAAa;GAS7B,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE,YAXe;KACjB,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;IACZ,EAAE,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAKvD;IACT,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAUA,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,EAAE,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;GAAK,EAAE,CACtD,CAAC,CAGS;EACd;EACA;EACA,WAAW;CACb,CAAC;CAGD,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GAAC,YAAY,iBAAiB,SAAS;GAAG;GAAQ;EAAO;EACnE,SAAS,OAAO,EAAE,UAAU,aAAa;GACvC,MAAM,GAAG,aAAa,iBAAiB;GAavC,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE,YAXe;KACjB,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;IACZ,EAAE,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAKvD;IACT,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAGA,IAAI,WAAW;GACf,IAAI,CAAC,UAAU;IACb,MAAM,YAAY,wBAAwB,WAAW;IACrD,IAAI,aAAa,aAAa,uBAC5B,WAAW,sBAAsB;GAErC;GAIA,IAAI,YAAY;QAEV,EADmB,eAAe,OAAO,aAAa,CAAC,GACvC,QAAQ;KAC1B,MAAM,QAAQ,MAAM,SAAS,WAAW,UAAU,aAAa,EAC7D,OACF,CAAC;KACD,IAAI,OACF,eAAe,OAAO,YAAY,CAAC,KAAK;IAE5C;;GAWF,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,EAAE,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;GAAM,EAAE,CACvD,CAAC,CAGS;EACd;EACA,SAAS,CAAC,CAAC;EACX;EACA,WAAW;CACb,CAAC;CAQD,OAAO;EACL,WANgB,cAAc;GAE9B,OAAO,oBADQ,8BAA8B,gBAAgB,YAC7B,GAAG,cAAc,cAAc,QAAQ;EACzE,GAAG;GAAC;GAAgB;GAAc;GAAc;GAAc;EAAQ,CAG5D;EACR;EACA;CACF;AACF"}
1
+ {"version":3,"file":"useTokens.js","names":[],"sources":["../../../src/hooks/useTokens.ts"],"sourcesContent":["import {\n ChainType,\n getToken,\n getTokens,\n type TokenExtended,\n type TokensExtendedResponse,\n} from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { defaultChainIdsByType } from '../utils/chainType.js'\nimport { isItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport {\n filterAllowedTokens,\n mergeVerifiedWithSearchTokens,\n} from '../utils/token.js'\n\nconst refetchInterval = 300_000\n\nexport const useTokens = (\n formType?: FormType,\n search?: string,\n chainId?: number\n): {\n allTokens: Record<number, TokenExtended[]> | undefined\n isLoading: boolean\n isSearchLoading: boolean\n} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n\n // Main tokens cache - verified tokens from API\n const { data: verifiedTokens, isLoading } = useQuery({\n queryKey: [getQueryKey('tokens', keyPrefix)],\n queryFn: async ({ signal }) => {\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // Mark all tokens as verified\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, verified: true })),\n ])\n )\n\n return tokens\n },\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Search tokens cache - unverified tokens from search\n const { data: searchTokens, isLoading: isSearchLoading } = useQuery({\n queryKey: [getQueryKey('tokens-search', keyPrefix), search, chainId],\n queryFn: async ({ queryKey, signal }) => {\n const [, searchQuery, searchChainId] = queryKey as [\n string,\n string,\n number,\n ]\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n search: searchQuery,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // If the chainId is not provided, try to get it from the search query\n let _chainId = searchChainId\n if (!_chainId) {\n const chainType = getChainTypeFromAddress(searchQuery)\n if (chainType && chainType in defaultChainIdsByType) {\n _chainId = defaultChainIdsByType[chainType]\n }\n }\n\n // Fallback: If the main search returned no tokens for the specific chainId,\n // fetch a single token using the /token endpoint\n if (_chainId && searchQuery) {\n const existingTokens = tokensResponse.tokens[_chainId] || []\n if (!existingTokens.length) {\n const token = await getToken(sdkClient, _chainId, searchQuery, {\n signal,\n })\n if (token) {\n tokensResponse.tokens[_chainId] = [token]\n }\n }\n }\n\n // Mark all search tokens as unverified\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, verified: false })),\n ])\n )\n\n return tokens\n },\n enabled: !!search,\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Merge tokens at read time - single place where caches are combined\n const allTokens = useMemo(() => {\n const merged = mergeVerifiedWithSearchTokens(verifiedTokens, searchTokens)\n return filterAllowedTokens(merged, configTokens, chainsConfig, formType)\n }, [verifiedTokens, searchTokens, configTokens, chainsConfig, formType])\n\n return {\n allTokens,\n isLoading,\n isSearchLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;AAsBA,MAAM,kBAAkB;AAExB,MAAa,aACX,UACA,QACA,YAKG;CACH,MAAM,EACJ,QAAQ,cACR,QAAQ,cACR,cACE,gBAAgB;CACpB,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,4BAA4B,wBAAwB;CAG5D,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC;EAC3C,SAAS,OAAO,EAAE,aAAa;GAS7B,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE,YAXe;KACjB,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;IACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAKvD;IACT,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAUA,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;GAAK,EAAE,CACtD,CAAC,CAGS;EACd;EACA;EACA,WAAW;CACb,CAAC;CAGD,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GAAC,YAAY,iBAAiB,SAAS;GAAG;GAAQ;EAAO;EACnE,SAAS,OAAO,EAAE,UAAU,aAAa;GACvC,MAAM,GAAG,aAAa,iBAAiB;GAavC,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE,YAXe;KACjB,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;IACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAKvD;IACT,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAGA,IAAI,WAAW;GACf,IAAI,CAAC,UAAU;IACb,MAAM,YAAY,wBAAwB,WAAW;IACrD,IAAI,aAAa,aAAa,uBAC5B,WAAW,sBAAsB;GAErC;GAIA,IAAI,YAAY;QAEV,EADmB,eAAe,OAAO,aAAa,CAAC,EAAA,CACvC,QAAQ;KAC1B,MAAM,QAAQ,MAAM,SAAS,WAAW,UAAU,aAAa,EAC7D,OACF,CAAC;KACD,IAAI,OACF,eAAe,OAAO,YAAY,CAAC,KAAK;IAE5C;;GAWF,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;GAAM,EAAE,CACvD,CAAC,CAGS;EACd;EACA,SAAS,CAAC,CAAC;EACX;EACA,WAAW;CACb,CAAC;CAQD,OAAO;EACL,WANgB,cAAc;GAE9B,OAAO,oBADQ,8BAA8B,gBAAgB,YAC7B,GAAG,cAAc,cAAc,QAAQ;EACzE,GAAG;GAAC;GAAgB;GAAc;GAAc;GAAc;EAAQ,CAG5D;EACR;EACA;CACF;AACF"}
@@ -1,6 +1,6 @@
1
+ import { getConfigItemSets, isItemAllowedForSets } from "../utils/item.js";
1
2
  import { useSettingsStoreContext } from "../stores/settings/SettingsStore.js";
2
3
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
3
- import { getConfigItemSets, isItemAllowedForSets } from "../utils/item.js";
4
4
  import { useSDKClient } from "../providers/SDKClientProvider.js";
5
5
  import { getQueryKey } from "../utils/queries.js";
6
6
  import { getTools } from "@lifi/sdk";
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactionDetails.js","names":[],"sources":["../../../src/hooks/useTransactionDetails.ts"],"sourcesContent":["import type { FullStatusData } from '@lifi/sdk'\nimport { getStatus, type StatusResponse } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport {\n keepPreviousData,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTransactionDetails = (\n transactionHash?: string\n): {\n transaction: StatusResponse | undefined\n isLoading: boolean\n} => {\n const { account, accounts } = useAccount()\n const queryClient = useQueryClient()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const transactionHistoryQueryKey = useMemo(\n () => getQueryKey('transaction-history', keyPrefix),\n [keyPrefix]\n )\n\n const { data, isLoading } = useQuery({\n queryKey: [transactionHistoryQueryKey, transactionHash],\n queryFn: async ({ queryKey: [, transactionHash], signal }) => {\n if (transactionHash) {\n for (const account of accounts) {\n const cachedHistory = queryClient.getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n\n const transaction = cachedHistory?.find(\n (t) => t.sending.txHash === transactionHash\n )\n\n if (transaction) {\n return transaction\n }\n }\n\n const transaction = await getStatus(\n sdkClient,\n {\n txHash: transactionHash,\n },\n { signal }\n )\n\n const fromAddress = (transaction as FullStatusData)?.fromAddress\n\n if (fromAddress) {\n queryClient.setQueryData<StatusResponse[]>(\n [transactionHistoryQueryKey, fromAddress],\n (data) => {\n return [...data!, transaction!]\n }\n )\n }\n\n return transaction\n }\n },\n refetchInterval: 300_000,\n enabled: account.isConnected && Boolean(transactionHash),\n initialData: () => {\n for (const account of accounts) {\n const transaction = queryClient\n .getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n ?.find((t) => t.sending.txHash === transactionHash)\n if (transaction) {\n return transaction\n }\n }\n },\n placeholderData: keepPreviousData,\n })\n\n return {\n transaction: data,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,yBACX,oBAIG;CACH,MAAM,EAAE,SAAS,aAAa,WAAW;CACzC,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAE/B,MAAM,6BAA6B,cAC3B,YAAY,uBAAuB,SAAS,GAClD,CAAC,SAAS,CACZ;CAEA,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU,CAAC,4BAA4B,eAAe;EACtD,SAAS,OAAO,EAAE,UAAU,GAAG,kBAAkB,aAAa;GAC5D,IAAI,iBAAiB;IACnB,KAAK,MAAM,WAAW,UAAU;KAM9B,MAAM,cALgB,YAAY,aAA+B,CAC/D,4BACA,QAAQ,OACV,CAEgC,GAAG,MAChC,MAAM,EAAE,QAAQ,WAAW,eAC9B;KAEA,IAAI,aACF,OAAO;IAEX;IAEA,MAAM,cAAc,MAAM,UACxB,WACA,EACE,QAAQ,gBACV,GACA,EAAE,OAAO,CACX;IAEA,MAAM,cAAe,aAAgC;IAErD,IAAI,aACF,YAAY,aACV,CAAC,4BAA4B,WAAW,IACvC,SAAS;KACR,OAAO,CAAC,GAAG,MAAO,WAAY;IAChC,CACF;IAGF,OAAO;GACT;EACF;EACA,iBAAiB;EACjB,SAAS,QAAQ,eAAe,QAAQ,eAAe;EACvD,mBAAmB;GACjB,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,cAAc,YACjB,aAA+B,CAC9B,4BACA,QAAQ,OACV,CAAC,GACC,MAAM,MAAM,EAAE,QAAQ,WAAW,eAAe;IACpD,IAAI,aACF,OAAO;GAEX;EACF;EACA,iBAAiB;CACnB,CAAC;CAED,OAAO;EACL,aAAa;EACb;CACF;AACF"}
1
+ {"version":3,"file":"useTransactionDetails.js","names":[],"sources":["../../../src/hooks/useTransactionDetails.ts"],"sourcesContent":["import type { FullStatusData } from '@lifi/sdk'\nimport { getStatus, type StatusResponse } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport {\n keepPreviousData,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTransactionDetails = (\n transactionHash?: string\n): {\n transaction: StatusResponse | undefined\n isLoading: boolean\n} => {\n const { account, accounts } = useAccount()\n const queryClient = useQueryClient()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const transactionHistoryQueryKey = useMemo(\n () => getQueryKey('transaction-history', keyPrefix),\n [keyPrefix]\n )\n\n const { data, isLoading } = useQuery({\n queryKey: [transactionHistoryQueryKey, transactionHash],\n queryFn: async ({ queryKey: [, transactionHash], signal }) => {\n if (transactionHash) {\n for (const account of accounts) {\n const cachedHistory = queryClient.getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n\n const transaction = cachedHistory?.find(\n (t) => t.sending.txHash === transactionHash\n )\n\n if (transaction) {\n return transaction\n }\n }\n\n const transaction = await getStatus(\n sdkClient,\n {\n txHash: transactionHash,\n },\n { signal }\n )\n\n const fromAddress = (transaction as FullStatusData)?.fromAddress\n\n if (fromAddress) {\n queryClient.setQueryData<StatusResponse[]>(\n [transactionHistoryQueryKey, fromAddress],\n (data) => {\n return [...data!, transaction!]\n }\n )\n }\n\n return transaction\n }\n },\n refetchInterval: 300_000,\n enabled: account.isConnected && Boolean(transactionHash),\n initialData: () => {\n for (const account of accounts) {\n const transaction = queryClient\n .getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n ?.find((t) => t.sending.txHash === transactionHash)\n if (transaction) {\n return transaction\n }\n }\n },\n placeholderData: keepPreviousData,\n })\n\n return {\n transaction: data,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,yBACX,oBAIG;CACH,MAAM,EAAE,SAAS,aAAa,WAAW;CACzC,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAE/B,MAAM,6BAA6B,cAC3B,YAAY,uBAAuB,SAAS,GAClD,CAAC,SAAS,CACZ;CAEA,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU,CAAC,4BAA4B,eAAe;EACtD,SAAS,OAAO,EAAE,UAAU,GAAG,kBAAkB,aAAa;GAC5D,IAAI,iBAAiB;IACnB,KAAK,MAAM,WAAW,UAAU;KAM9B,MAAM,cALgB,YAAY,aAA+B,CAC/D,4BACA,QAAQ,OACV,CAEgC,CAAC,EAAE,MAChC,MAAM,EAAE,QAAQ,WAAW,eAC9B;KAEA,IAAI,aACF,OAAO;IAEX;IAEA,MAAM,cAAc,MAAM,UACxB,WACA,EACE,QAAQ,gBACV,GACA,EAAE,OAAO,CACX;IAEA,MAAM,cAAe,aAAgC;IAErD,IAAI,aACF,YAAY,aACV,CAAC,4BAA4B,WAAW,IACvC,SAAS;KACR,OAAO,CAAC,GAAG,MAAO,WAAY;IAChC,CACF;IAGF,OAAO;GACT;EACF;EACA,iBAAiB;EACjB,SAAS,QAAQ,eAAe,QAAQ,eAAe;EACvD,mBAAmB;GACjB,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,cAAc,YACjB,aAA+B,CAC9B,4BACA,QAAQ,OACV,CAAC,CAAC,EACA,MAAM,MAAM,EAAE,QAAQ,WAAW,eAAe;IACpD,IAAI,aACF,OAAO;GAEX;EACF;EACA,iBAAiB;CACnB,CAAC;CAED,OAAO;EACL,aAAa;EACb;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactionHistory.js","names":[],"sources":["../../../src/hooks/useTransactionHistory.ts"],"sourcesContent":["import type { FullStatusData, StatusResponse } from '@lifi/sdk'\nimport { getTransactionHistory } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport type { QueryFunction } from '@tanstack/react-query'\nimport { useQueries } from '@tanstack/react-query'\nimport { useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useRouteExecutionStoreContext } from '../stores/routes/RouteExecutionStore.js'\nimport type {\n RouteExecution,\n RouteExecutionState,\n} from '../stores/routes/types.js'\nimport { getSourceTxHash } from '../stores/routes/utils.js'\nimport { buildRouteFromTxHistory } from '../utils/converters.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useTools } from './useTools.js'\n\nexport const useTransactionHistory = (): {\n data: RouteExecution[]\n isLoading: boolean\n} => {\n const store = useRouteExecutionStoreContext()\n const { accounts } = useAccount()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { tools } = useTools()\n\n const { data: routeExecutions, isLoading } = useQueries({\n queries: accounts.map((account) => ({\n queryKey: [\n getQueryKey('transaction-history', keyPrefix),\n account.address,\n ],\n queryFn: (async ({ queryKey: [, accountAddress], signal }) => {\n if (!accountAddress) {\n return []\n }\n const date = new Date()\n date.setFullYear(date.getFullYear() - 10)\n\n const response = await getTransactionHistory(\n sdkClient,\n {\n wallet: accountAddress,\n fromTimestamp: Math.floor(date.getTime() / 1000),\n toTimestamp: Math.floor(Date.now() / 1000),\n },\n { signal }\n )\n\n return response.transfers\n }) as QueryFunction<StatusResponse[], (string | undefined)[], never>,\n refetchInterval: 300_000,\n enabled: Boolean(account.address),\n })),\n combine: (results) => {\n const uniqueTransactions = new Map<string, StatusResponse>()\n results.forEach((result) => {\n if (result.data) {\n result.data.forEach((transaction) => {\n if (\n (transaction as FullStatusData)?.transactionId &&\n (transaction as FullStatusData)?.receiving?.chainId &&\n transaction?.sending.chainId\n ) {\n uniqueTransactions.set(\n (transaction as FullStatusData).transactionId,\n transaction\n )\n }\n })\n }\n })\n // Convert raw API transactions into RouteExecution objects.\n const data = Array.from(uniqueTransactions.values()).flatMap(\n (transaction) => {\n const routeExecution = buildRouteFromTxHistory(\n transaction as FullStatusData,\n tools\n )\n return routeExecution ? [routeExecution] : []\n }\n )\n return {\n data,\n isLoading: results.some((result) => result.isLoading),\n }\n },\n })\n\n // Stable Set — only recreated when data actually changes (TanStack Query structural sharing).\n const apiTxHashes = useMemo(\n () => new Set(routeExecutions.map((r) => getSourceTxHash(r.route))),\n [routeExecutions]\n )\n\n // Remove local store routes already indexed by the API to avoid duplicates.\n // Must be in an effect — combine runs during render, so store mutations there\n // would trigger \"Cannot update a component while rendering\" in concurrent mode.\n useEffect(() => {\n if (!apiTxHashes.size) {\n return\n }\n const { routes, deleteRoute } = store.getState() as RouteExecutionState\n for (const [id, routeExecution] of Object.entries(routes)) {\n const txHash = getSourceTxHash(\n (routeExecution as RouteExecution | undefined)?.route\n )\n if (txHash && apiTxHashes.has(txHash)) {\n deleteRoute(id)\n }\n }\n }, [apiTxHashes, store])\n\n return {\n data: routeExecutions,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,MAAa,8BAGR;CACH,MAAM,QAAQ,8BAA8B;CAC5C,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,UAAU,SAAS;CAE3B,MAAM,EAAE,MAAM,iBAAiB,cAAc,WAAW;EACtD,SAAS,SAAS,KAAK,aAAa;GAClC,UAAU,CACR,YAAY,uBAAuB,SAAS,GAC5C,QAAQ,OACV;GACA,UAAU,OAAO,EAAE,UAAU,GAAG,iBAAiB,aAAa;IAC5D,IAAI,CAAC,gBACH,OAAO,CAAC;IAEV,MAAM,uBAAO,IAAI,KAAK;IACtB,KAAK,YAAY,KAAK,YAAY,IAAI,EAAE;IAYxC,QAAO,MAVgB,sBACrB,WACA;KACE,QAAQ;KACR,eAAe,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAI;KAC/C,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;IAC3C,GACA,EAAE,OAAO,CACX,GAEgB;GAClB;GACA,iBAAiB;GACjB,SAAS,QAAQ,QAAQ,OAAO;EAClC,EAAE;EACF,UAAU,YAAY;GACpB,MAAM,qCAAqB,IAAI,IAA4B;GAC3D,QAAQ,SAAS,WAAW;IAC1B,IAAI,OAAO,MACT,OAAO,KAAK,SAAS,gBAAgB;KACnC,IACG,aAAgC,iBAChC,aAAgC,WAAW,WAC5C,aAAa,QAAQ,SAErB,mBAAmB,IAChB,YAA+B,eAChC,WACF;IAEJ,CAAC;GAEL,CAAC;GAWD,OAAO;IACL,MAVW,MAAM,KAAK,mBAAmB,OAAO,CAAC,EAAE,SAClD,gBAAgB;KACf,MAAM,iBAAiB,wBACrB,aACA,KACF;KACA,OAAO,iBAAiB,CAAC,cAAc,IAAI,CAAC;IAC9C,CAGG;IACH,WAAW,QAAQ,MAAM,WAAW,OAAO,SAAS;GACtD;EACF;CACF,CAAC;CAGD,MAAM,cAAc,cACZ,IAAI,IAAI,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAClE,CAAC,eAAe,CAClB;CAKA,gBAAgB;EACd,IAAI,CAAC,YAAY,MACf;EAEF,MAAM,EAAE,QAAQ,gBAAgB,MAAM,SAAS;EAC/C,KAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,MAAM,GAAG;GACzD,MAAM,SAAS,gBACZ,gBAA+C,KAClD;GACA,IAAI,UAAU,YAAY,IAAI,MAAM,GAClC,YAAY,EAAE;EAElB;CACF,GAAG,CAAC,aAAa,KAAK,CAAC;CAEvB,OAAO;EACL,MAAM;EACN;CACF;AACF"}
1
+ {"version":3,"file":"useTransactionHistory.js","names":[],"sources":["../../../src/hooks/useTransactionHistory.ts"],"sourcesContent":["import type { FullStatusData, StatusResponse } from '@lifi/sdk'\nimport { getTransactionHistory } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport type { QueryFunction } from '@tanstack/react-query'\nimport { useQueries } from '@tanstack/react-query'\nimport { useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useRouteExecutionStoreContext } from '../stores/routes/RouteExecutionStore.js'\nimport type {\n RouteExecution,\n RouteExecutionState,\n} from '../stores/routes/types.js'\nimport { getSourceTxHash } from '../stores/routes/utils.js'\nimport { buildRouteFromTxHistory } from '../utils/converters.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useTools } from './useTools.js'\n\nexport const useTransactionHistory = (): {\n data: RouteExecution[]\n isLoading: boolean\n} => {\n const store = useRouteExecutionStoreContext()\n const { accounts } = useAccount()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { tools } = useTools()\n\n const { data: routeExecutions, isLoading } = useQueries({\n queries: accounts.map((account) => ({\n queryKey: [\n getQueryKey('transaction-history', keyPrefix),\n account.address,\n ],\n queryFn: (async ({ queryKey: [, accountAddress], signal }) => {\n if (!accountAddress) {\n return []\n }\n const date = new Date()\n date.setFullYear(date.getFullYear() - 10)\n\n const response = await getTransactionHistory(\n sdkClient,\n {\n wallet: accountAddress,\n fromTimestamp: Math.floor(date.getTime() / 1000),\n toTimestamp: Math.floor(Date.now() / 1000),\n },\n { signal }\n )\n\n return response.transfers\n }) as QueryFunction<StatusResponse[], (string | undefined)[], never>,\n refetchInterval: 300_000,\n enabled: Boolean(account.address),\n })),\n combine: (results) => {\n const uniqueTransactions = new Map<string, StatusResponse>()\n results.forEach((result) => {\n if (result.data) {\n result.data.forEach((transaction) => {\n if (\n (transaction as FullStatusData)?.transactionId &&\n (transaction as FullStatusData)?.receiving?.chainId &&\n transaction?.sending.chainId\n ) {\n uniqueTransactions.set(\n (transaction as FullStatusData).transactionId,\n transaction\n )\n }\n })\n }\n })\n // Convert raw API transactions into RouteExecution objects.\n const data = Array.from(uniqueTransactions.values()).flatMap(\n (transaction) => {\n const routeExecution = buildRouteFromTxHistory(\n transaction as FullStatusData,\n tools\n )\n return routeExecution ? [routeExecution] : []\n }\n )\n return {\n data,\n isLoading: results.some((result) => result.isLoading),\n }\n },\n })\n\n // Stable Set — only recreated when data actually changes (TanStack Query structural sharing).\n const apiTxHashes = useMemo(\n () => new Set(routeExecutions.map((r) => getSourceTxHash(r.route))),\n [routeExecutions]\n )\n\n // Remove local store routes already indexed by the API to avoid duplicates.\n // Must be in an effect — combine runs during render, so store mutations there\n // would trigger \"Cannot update a component while rendering\" in concurrent mode.\n useEffect(() => {\n if (!apiTxHashes.size) {\n return\n }\n const { routes, deleteRoute } = store.getState() as RouteExecutionState\n for (const [id, routeExecution] of Object.entries(routes)) {\n const txHash = getSourceTxHash(\n (routeExecution as RouteExecution | undefined)?.route\n )\n if (txHash && apiTxHashes.has(txHash)) {\n deleteRoute(id)\n }\n }\n }, [apiTxHashes, store])\n\n return {\n data: routeExecutions,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,MAAa,8BAGR;CACH,MAAM,QAAQ,8BAA8B;CAC5C,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,UAAU,SAAS;CAE3B,MAAM,EAAE,MAAM,iBAAiB,cAAc,WAAW;EACtD,SAAS,SAAS,KAAK,aAAa;GAClC,UAAU,CACR,YAAY,uBAAuB,SAAS,GAC5C,QAAQ,OACV;GACA,UAAU,OAAO,EAAE,UAAU,GAAG,iBAAiB,aAAa;IAC5D,IAAI,CAAC,gBACH,OAAO,CAAC;IAEV,MAAM,uBAAO,IAAI,KAAK;IACtB,KAAK,YAAY,KAAK,YAAY,IAAI,EAAE;IAYxC,QAAO,MAVgB,sBACrB,WACA;KACE,QAAQ;KACR,eAAe,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAI;KAC/C,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;IAC3C,GACA,EAAE,OAAO,CACX,EAAA,CAEgB;GAClB;GACA,iBAAiB;GACjB,SAAS,QAAQ,QAAQ,OAAO;EAClC,EAAE;EACF,UAAU,YAAY;GACpB,MAAM,qCAAqB,IAAI,IAA4B;GAC3D,QAAQ,SAAS,WAAW;IAC1B,IAAI,OAAO,MACT,OAAO,KAAK,SAAS,gBAAgB;KACnC,IACG,aAAgC,iBAChC,aAAgC,WAAW,WAC5C,aAAa,QAAQ,SAErB,mBAAmB,IAChB,YAA+B,eAChC,WACF;IAEJ,CAAC;GAEL,CAAC;GAWD,OAAO;IACL,MAVW,MAAM,KAAK,mBAAmB,OAAO,CAAC,CAAC,CAAC,SAClD,gBAAgB;KACf,MAAM,iBAAiB,wBACrB,aACA,KACF;KACA,OAAO,iBAAiB,CAAC,cAAc,IAAI,CAAC;IAC9C,CAGG;IACH,WAAW,QAAQ,MAAM,WAAW,OAAO,SAAS;GACtD;EACF;CACF,CAAC;CAGD,MAAM,cAAc,cACZ,IAAI,IAAI,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAClE,CAAC,eAAe,CAClB;CAKA,gBAAgB;EACd,IAAI,CAAC,YAAY,MACf;EAEF,MAAM,EAAE,QAAQ,gBAAgB,MAAM,SAAS;EAC/C,KAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,MAAM,GAAG;GACzD,MAAM,SAAS,gBACZ,gBAA+C,KAClD;GACA,IAAI,UAAU,YAAY,IAAI,MAAM,GAClC,YAAY,EAAE;EAElB;CACF,GAAG,CAAC,aAAa,KAAK,CAAC;CAEvB,OAAO;EACL,MAAM;EACN;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactionList.js","names":[],"sources":["../../../src/hooks/useTransactionList.ts"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport type {\n ActiveItem,\n HistoryItem,\n LocalItem,\n TransactionListItem,\n} from '../pages/ActivitiesPage/types.js'\nimport { useRouteExecutionStore } from '../stores/routes/RouteExecutionStore.js'\nimport type {\n RouteExecution,\n RouteExecutionState,\n} from '../stores/routes/types.js'\nimport { RouteExecutionStatus } from '../stores/routes/types.js'\nimport { getSourceTxHash } from '../stores/routes/utils.js'\nimport { hasEnumFlag } from '../utils/enum.js'\nimport { useTransactionHistory } from './useTransactionHistory.js'\n\nconst routesSelector = (state: RouteExecutionState) => state.routes\n\nexport const useTransactionList = (): {\n items: TransactionListItem[]\n isLoading: boolean\n} => {\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.map((account) => account.address),\n [accounts]\n )\n\n const { data: apiRouteExecutions, isLoading } = useTransactionHistory()\n const routes = useRouteExecutionStore(routesSelector)\n\n const items = useMemo<TransactionListItem[]>(() => {\n const apiTxHashes = new Set(\n apiRouteExecutions.map((r) => getSourceTxHash(r.route))\n )\n\n const activeItems: ActiveItem[] = []\n const localItems: LocalItem[] = []\n\n for (const r of Object.values(routes) as RouteExecution[]) {\n if (!accountAddresses.includes(r.route.fromAddress)) {\n continue\n }\n // Guard against duplicates on the render before the store deletion\n // from useTransactionHistory's combine propagates.\n if (apiTxHashes.has(getSourceTxHash(r.route))) {\n continue\n }\n const startedAt = r.route.steps[0]?.execution?.startedAt ?? 0\n if (\n r.status === RouteExecutionStatus.Pending ||\n r.status === RouteExecutionStatus.Failed\n ) {\n activeItems.push({ type: 'active', routeId: r.route.id, startedAt })\n } else if (hasEnumFlag(r.status, RouteExecutionStatus.Done)) {\n localItems.push({\n type: 'local',\n routeExecution: r,\n txHash: getSourceTxHash(r.route) ?? '',\n // store startedAt is already in ms\n startedAt,\n })\n }\n }\n\n const historyItems: HistoryItem[] = apiRouteExecutions.map(\n (routeExecution) => ({\n type: 'history',\n routeExecution,\n txHash: getSourceTxHash(routeExecution.route) ?? '',\n startedAt: routeExecution.route.steps[0]?.execution?.startedAt ?? 0,\n })\n )\n\n return [...activeItems, ...localItems, ...historyItems].sort(\n (a, b) => b.startedAt - a.startedAt\n )\n }, [accountAddresses, apiRouteExecutions, routes])\n\n return { items, isLoading }\n}\n"],"mappings":";;;;;;;AAkBA,MAAM,kBAAkB,UAA+B,MAAM;AAE7D,MAAa,2BAGR;CACH,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,OAAO,GAC/C,CAAC,QAAQ,CACX;CAEA,MAAM,EAAE,MAAM,oBAAoB,cAAc,sBAAsB;CACtE,MAAM,SAAS,uBAAuB,cAAc;CAkDpD,OAAO;EAAE,OAhDK,cAAqC;GACjD,MAAM,cAAc,IAAI,IACtB,mBAAmB,KAAK,MAAM,gBAAgB,EAAE,KAAK,CAAC,CACxD;GAEA,MAAM,cAA4B,CAAC;GACnC,MAAM,aAA0B,CAAC;GAEjC,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,GAAuB;IACzD,IAAI,CAAC,iBAAiB,SAAS,EAAE,MAAM,WAAW,GAChD;IAIF,IAAI,YAAY,IAAI,gBAAgB,EAAE,KAAK,CAAC,GAC1C;IAEF,MAAM,YAAY,EAAE,MAAM,MAAM,IAAI,WAAW,aAAa;IAC5D,IACE,EAAE,WAAA,KACF,EAAE,WAAA,GAEF,YAAY,KAAK;KAAE,MAAM;KAAU,SAAS,EAAE,MAAM;KAAI;IAAU,CAAC;SAC9D,IAAI,YAAY,EAAE,QAAA,CAAiC,GACxD,WAAW,KAAK;KACd,MAAM;KACN,gBAAgB;KAChB,QAAQ,gBAAgB,EAAE,KAAK,KAAK;KAEpC;IACF,CAAC;GAEL;GAEA,MAAM,eAA8B,mBAAmB,KACpD,oBAAoB;IACnB,MAAM;IACN;IACA,QAAQ,gBAAgB,eAAe,KAAK,KAAK;IACjD,WAAW,eAAe,MAAM,MAAM,IAAI,WAAW,aAAa;GACpE,EACF;GAEA,OAAO;IAAC,GAAG;IAAa,GAAG;IAAY,GAAG;GAAY,EAAE,MACrD,GAAG,MAAM,EAAE,YAAY,EAAE,SAC5B;EACF,GAAG;GAAC;GAAkB;GAAoB;EAAM,CAEnC;EAAG;CAAU;AAC5B"}
1
+ {"version":3,"file":"useTransactionList.js","names":[],"sources":["../../../src/hooks/useTransactionList.ts"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport type {\n ActiveItem,\n HistoryItem,\n LocalItem,\n TransactionListItem,\n} from '../pages/ActivitiesPage/types.js'\nimport { useRouteExecutionStore } from '../stores/routes/RouteExecutionStore.js'\nimport type {\n RouteExecution,\n RouteExecutionState,\n} from '../stores/routes/types.js'\nimport { RouteExecutionStatus } from '../stores/routes/types.js'\nimport { getSourceTxHash } from '../stores/routes/utils.js'\nimport { hasEnumFlag } from '../utils/enum.js'\nimport { useTransactionHistory } from './useTransactionHistory.js'\n\nconst routesSelector = (state: RouteExecutionState) => state.routes\n\nexport const useTransactionList = (): {\n items: TransactionListItem[]\n isLoading: boolean\n} => {\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.map((account) => account.address),\n [accounts]\n )\n\n const { data: apiRouteExecutions, isLoading } = useTransactionHistory()\n const routes = useRouteExecutionStore(routesSelector)\n\n const items = useMemo<TransactionListItem[]>(() => {\n const apiTxHashes = new Set(\n apiRouteExecutions.map((r) => getSourceTxHash(r.route))\n )\n\n const activeItems: ActiveItem[] = []\n const localItems: LocalItem[] = []\n\n for (const r of Object.values(routes) as RouteExecution[]) {\n if (!accountAddresses.includes(r.route.fromAddress)) {\n continue\n }\n // Guard against duplicates on the render before the store deletion\n // from useTransactionHistory's combine propagates.\n if (apiTxHashes.has(getSourceTxHash(r.route))) {\n continue\n }\n const startedAt = r.route.steps[0]?.execution?.startedAt ?? 0\n if (\n r.status === RouteExecutionStatus.Pending ||\n r.status === RouteExecutionStatus.Failed\n ) {\n activeItems.push({ type: 'active', routeId: r.route.id, startedAt })\n } else if (hasEnumFlag(r.status, RouteExecutionStatus.Done)) {\n localItems.push({\n type: 'local',\n routeExecution: r,\n txHash: getSourceTxHash(r.route) ?? '',\n // store startedAt is already in ms\n startedAt,\n })\n }\n }\n\n const historyItems: HistoryItem[] = apiRouteExecutions.map(\n (routeExecution) => ({\n type: 'history',\n routeExecution,\n txHash: getSourceTxHash(routeExecution.route) ?? '',\n startedAt: routeExecution.route.steps[0]?.execution?.startedAt ?? 0,\n })\n )\n\n return [...activeItems, ...localItems, ...historyItems].sort(\n (a, b) => b.startedAt - a.startedAt\n )\n }, [accountAddresses, apiRouteExecutions, routes])\n\n return { items, isLoading }\n}\n"],"mappings":";;;;;;;AAkBA,MAAM,kBAAkB,UAA+B,MAAM;AAE7D,MAAa,2BAGR;CACH,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,OAAO,GAC/C,CAAC,QAAQ,CACX;CAEA,MAAM,EAAE,MAAM,oBAAoB,cAAc,sBAAsB;CACtE,MAAM,SAAS,uBAAuB,cAAc;CAkDpD,OAAO;EAAE,OAhDK,cAAqC;GACjD,MAAM,cAAc,IAAI,IACtB,mBAAmB,KAAK,MAAM,gBAAgB,EAAE,KAAK,CAAC,CACxD;GAEA,MAAM,cAA4B,CAAC;GACnC,MAAM,aAA0B,CAAC;GAEjC,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,GAAuB;IACzD,IAAI,CAAC,iBAAiB,SAAS,EAAE,MAAM,WAAW,GAChD;IAIF,IAAI,YAAY,IAAI,gBAAgB,EAAE,KAAK,CAAC,GAC1C;IAEF,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,EAAE,WAAW,aAAa;IAC5D,IACE,EAAE,WAAA,KACF,EAAE,WAAA,GAEF,YAAY,KAAK;KAAE,MAAM;KAAU,SAAS,EAAE,MAAM;KAAI;IAAU,CAAC;SAC9D,IAAI,YAAY,EAAE,QAAA,CAAiC,GACxD,WAAW,KAAK;KACd,MAAM;KACN,gBAAgB;KAChB,QAAQ,gBAAgB,EAAE,KAAK,KAAK;KAEpC;IACF,CAAC;GAEL;GAEA,MAAM,eAA8B,mBAAmB,KACpD,oBAAoB;IACnB,MAAM;IACN;IACA,QAAQ,gBAAgB,eAAe,KAAK,KAAK;IACjD,WAAW,eAAe,MAAM,MAAM,EAAE,EAAE,WAAW,aAAa;GACpE,EACF;GAEA,OAAO;IAAC,GAAG;IAAa,GAAG;IAAY,GAAG;GAAY,CAAC,CAAC,MACrD,GAAG,MAAM,EAAE,YAAY,EAAE,SAC5B;EACF,GAAG;GAAC;GAAkB;GAAoB;EAAM,CAEnC;EAAG;CAAU;AAC5B"}
@@ -66,7 +66,9 @@
66
66
  "exchange": "Exchange",
67
67
  "from": "Exchange from",
68
68
  "gas": "Gas",
69
+ "limit": "Limit",
69
70
  "payWith": "Pay with",
71
+ "private": "Private",
70
72
  "receive": "Receive",
71
73
  "received": "Received",
72
74
  "recentWallets": "Recent wallets",
@@ -77,6 +79,7 @@
77
79
  "sendToWallet": "Send to wallet",
78
80
  "settings": "Settings",
79
81
  "swap": "Swap",
82
+ "swapAndBridge": "Swap & Bridge",
80
83
  "to": "Exchange to",
81
84
  "transactionDetails": "Transaction details",
82
85
  "activities": "Activities",
@@ -1,5 +1,5 @@
1
1
  import { DefaultFieldValues, DefaultValues, ExtractValueType, FormActions, FormFieldArray, FormFieldNames, FormKeyHelper, FormProps, FormStoreStore, FormType, FormTypeProps, FormValueControl, FormValues, FormValuesState, GenericFormValue, ResetOptions, SetOptions, TouchedFields, ValidationActions, ValidationProps } from "./stores/form/types.js";
2
- import { AllowDeny, AllowDenyItems, AllowDenySet, AllowDenySetItem, AllowDenySets, Appearance, CalculateFeeParams, CustomMode, DefaultUI, DisabledUIConfig, ExpansionType, ExplorerUrl, FieldNames, FieldValues, FormFieldOptions, FormRef, FormRefProps, FormState, HiddenUIConfig, ModeOptions, NavigationProps, PoweredByType, RequiredUIConfig, RouteLabel, RouteLabelRule, SetFieldValueFunction, SplitMode, SplitModeOptions, ToAddress, WidgetChains, WidgetConfig, WidgetConfigPartialProps, WidgetConfigProps, WidgetContractTool, WidgetDrawerProps, WidgetFeeConfig, WidgetLanguages, WidgetMode, WidgetProps, WidgetProvider, WidgetSDKConfig, WidgetTheme, WidgetThemeComponents, WidgetTokens, WidgetVariant, WidgetWalletConfig } from "./types/widget.js";
2
+ import { AllowDeny, AllowDenyItems, AllowDenySet, AllowDenySetItem, AllowDenySets, Appearance, CalculateFeeParams, CustomMode, DefaultUI, DisabledUIConfig, ExpansionType, ExplorerUrl, FieldNames, FieldValues, FormFieldOptions, FormRef, FormRefProps, FormState, HiddenUIConfig, InternalNavigationTabKey, InternalWidgetMode, ModeOptions, NavigationProps, NavigationTabKey, PoweredByType, RequiredUIConfig, RouteLabel, RouteLabelRule, SetFieldValueFunction, SplitMode, SplitModeOptions, SplitNavigationTabKey, ToAddress, WidgetChains, WidgetConfig, WidgetConfigPartialProps, WidgetConfigProps, WidgetContractTool, WidgetDrawerProps, WidgetFeeConfig, WidgetLanguages, WidgetMode, WidgetProps, WidgetProvider, WidgetSDKConfig, WidgetTheme, WidgetThemeComponents, WidgetTokens, WidgetVariant, WidgetWalletConfig } from "./types/widget.js";
3
3
  import { WidgetDrawer } from "./AppDrawer.js";
4
4
  import { App } from "./App.js";
5
5
  import { TokenAmount } from "./types/token.js";
@@ -30,4 +30,4 @@ import { getPriceImpact } from "./utils/getPriceImpact.js";
30
30
  import { percentFormatter } from "./utils/percentFormatter.js";
31
31
  import { ChainId, ChainType, CoinKey } from "@lifi/sdk";
32
32
  export type * from "@lifi/sdk";
33
- export { AllowDeny, AllowDenyItems, AllowDenySet, AllowDenySetItem, AllowDenySets, Appearance, Bookmark, BookmarkActions, BookmarkProps, BookmarkState, BookmarkStore, CalculateFeeParams, ChainId, ChainPinned, ChainTokenSelected, ChainType, CoinKey, ContactSupport, CustomMode, DefaultFieldValues, DefaultUI, DefaultValues, DisabledUIConfig, ExpansionType, ExplorerUrl, ExtractValueType, FieldNames, FieldValues, FormActions, FormFieldArray, FormFieldChanged, FormFieldNames, FormFieldOptions, FormKeyHelper, FormProps, FormRef, FormRefProps, FormState, FormStoreStore, FormType, FormTypeProps, FormValueControl, FormValues, FormValuesState, GenericFormValue, HiddenUIConfig, ItemPrice, ItemPriceProps, App as LiFiWidget, LowAddressActivityConfirmed, ModeOptions, NFT, NFTBase, NFTBaseProps, NFTOwner, NFTProps, NavigationProps, PoweredByType, RequiredUIConfig, ResetOptions, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteLabel, RouteLabelRule, RouteSelected, SetFieldValueFunction, SetOptions, SettingUpdated, SplitMode, SplitModeOptions, ToAddress, type TokenAmount, TokenSearch, TouchedFields, ValidationActions, ValidationProps, WidgetChains, WidgetConfig, WidgetConfigPartialProps, WidgetConfigProps, WidgetContractTool, type WidgetDrawer, WidgetDrawerProps, WidgetEvent, type WidgetEventEmitter, WidgetEvents, WidgetFeeConfig, WidgetLanguages, WidgetMode, WidgetProps, WidgetProvider, WidgetSDKConfig, WidgetSkeleton, WidgetTheme, WidgetThemeComponents, WidgetTokens, WidgetVariant, WidgetWalletConfig, azureLightTheme, compactNumberFormatter, createTheme, currencyExtendedFormatter, defaultMaxHeight, formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, getPriceImpact, jumperTheme, name, navigationRoutes, palette, paletteDark, paletteLight, percentFormatter, priceToTokenAmount, usdDecimals, useFieldActions, useFieldValues, useWidgetChains, useWidgetEvents, version, watermelonLightTheme, widgetEvents, windows95Theme, wrapLongWords };
33
+ export { AllowDeny, AllowDenyItems, AllowDenySet, AllowDenySetItem, AllowDenySets, Appearance, Bookmark, BookmarkActions, BookmarkProps, BookmarkState, BookmarkStore, CalculateFeeParams, ChainId, ChainPinned, ChainTokenSelected, ChainType, CoinKey, ContactSupport, CustomMode, DefaultFieldValues, DefaultUI, DefaultValues, DisabledUIConfig, ExpansionType, ExplorerUrl, ExtractValueType, FieldNames, FieldValues, FormActions, FormFieldArray, FormFieldChanged, FormFieldNames, FormFieldOptions, FormKeyHelper, FormProps, FormRef, FormRefProps, FormState, FormStoreStore, FormType, FormTypeProps, FormValueControl, FormValues, FormValuesState, GenericFormValue, HiddenUIConfig, InternalNavigationTabKey, InternalWidgetMode, ItemPrice, ItemPriceProps, App as LiFiWidget, LowAddressActivityConfirmed, ModeOptions, NFT, NFTBase, NFTBaseProps, NFTOwner, NFTProps, NavigationProps, NavigationTabKey, PoweredByType, RequiredUIConfig, ResetOptions, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteLabel, RouteLabelRule, RouteSelected, SetFieldValueFunction, SetOptions, SettingUpdated, SplitMode, SplitModeOptions, SplitNavigationTabKey, ToAddress, type TokenAmount, TokenSearch, TouchedFields, ValidationActions, ValidationProps, WidgetChains, WidgetConfig, WidgetConfigPartialProps, WidgetConfigProps, WidgetContractTool, type WidgetDrawer, WidgetDrawerProps, WidgetEvent, type WidgetEventEmitter, WidgetEvents, WidgetFeeConfig, WidgetLanguages, WidgetMode, WidgetProps, WidgetProvider, WidgetSDKConfig, WidgetSkeleton, WidgetTheme, WidgetThemeComponents, WidgetTokens, WidgetVariant, WidgetWalletConfig, azureLightTheme, compactNumberFormatter, createTheme, currencyExtendedFormatter, defaultMaxHeight, formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, getPriceImpact, jumperTheme, name, navigationRoutes, palette, paletteDark, paletteLight, percentFormatter, priceToTokenAmount, usdDecimals, useFieldActions, useFieldValues, useWidgetChains, useWidgetEvents, version, watermelonLightTheme, widgetEvents, windows95Theme, wrapLongWords };
@@ -1 +1 @@
1
- {"version":3,"file":"ActivitiesPage.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/ActivitiesPage.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { Box, List } from '@mui/material'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { type JSX, useCallback, useMemo, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { TransactionCardSkeleton } from '../../components/TransactionCard/TransactionCardSkeleton.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useListHeight } from '../../hooks/useListHeight.js'\nimport { useTransactionList } from '../../hooks/useTransactionList.js'\nimport { useRouteExecutionStore } from '../../stores/routes/RouteExecutionStore.js'\nimport { RouteExecutionStatus } from '../../stores/routes/types.js'\nimport { ActiveTransactionItem } from './ActiveTransactionItem.js'\nimport { ActivitiesPageMenuButton } from './ActivitiesPageMenuButton.js'\nimport { TransactionHistoryEmpty } from './TransactionHistoryEmpty.js'\nimport { TransactionHistoryItem } from './TransactionHistoryItem.js'\n\nconst SKELETON_COUNT = 2\n\nexport const ActivitiesPage = (): JSX.Element => {\n // Parent ref and useVirtualizer should be in one file to avoid blank page (0 virtual items) issue\n const parentRef = useRef<HTMLDivElement | null>(null)\n const { items, isLoading } = useTransactionList()\n\n const { t } = useTranslation()\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.map((account) => account.address),\n [accounts]\n )\n const hasFailedItems = useRouteExecutionStore(\n useCallback(\n (state) =>\n Object.values(state.routes).some(\n (r) =>\n r?.status === RouteExecutionStatus.Failed &&\n accountAddresses.includes(r.route.fromAddress)\n ),\n [accountAddresses]\n )\n )\n\n useHeader(\n t('header.activities'),\n hasFailedItems ? <ActivitiesPageMenuButton /> : null\n )\n\n const { listHeight } = useListHeight({\n listParentRef: parentRef,\n })\n\n const hasStoreItems = items.length > 0\n const skeletonCount = isLoading && hasStoreItems ? SKELETON_COUNT : 0\n const totalCount = items.length + skeletonCount\n\n const getItemKey = useCallback(\n (index: number) => {\n if (index >= items.length) {\n return `skeleton-${index}`\n }\n const item = items[index]\n if (item.type === 'active') {\n return `active-${item.routeId}`\n }\n return `${item.type}-${item.txHash || item.routeExecution.route.id}`\n },\n [items]\n )\n\n const { getVirtualItems, getTotalSize, measureElement } = useVirtualizer({\n count: hasStoreItems ? totalCount : 0,\n overscan: 3,\n paddingEnd: 12,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => (items[index]?.type === 'active' ? 218 : 196),\n getItemKey,\n })\n\n const isEmpty = !items.length && !isLoading\n\n return (\n <PageContainer disableGutters>\n <Box\n className=\"long-list\"\n ref={parentRef}\n style={{ height: listHeight }}\n sx={{ overflow: 'auto', paddingX: 3, paddingTop: 1.5 }}\n >\n {isEmpty ? (\n <TransactionHistoryEmpty />\n ) : isLoading && !hasStoreItems ? (\n <List\n disablePadding\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n marginBottom: 2,\n }}\n >\n {Array.from({ length: SKELETON_COUNT }).map((_, index) => (\n <TransactionCardSkeleton key={index} />\n ))}\n </List>\n ) : (\n <List\n style={{ height: getTotalSize(), position: 'relative' }}\n disablePadding\n >\n {getVirtualItems().map((item) => {\n const listItem =\n item.index < items.length ? items[item.index] : null\n return (\n <li\n key={item.key}\n ref={measureElement}\n data-index={item.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n paddingBottom: 16,\n transform: `translateY(${item.start}px)`,\n listStyle: 'none',\n }}\n >\n {!listItem ? (\n <TransactionCardSkeleton />\n ) : listItem.type === 'active' ? (\n <ActiveTransactionItem routeId={listItem.routeId} />\n ) : (\n <TransactionHistoryItem\n route={listItem.routeExecution.route}\n type={listItem.type}\n transactionHash={listItem.txHash}\n startedAt={listItem.startedAt}\n />\n )}\n </li>\n )\n })}\n </List>\n )}\n </Box>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAM,iBAAiB;AAEvB,MAAa,uBAAoC;CAE/C,MAAM,YAAY,OAA8B,IAAI;CACpD,MAAM,EAAE,OAAO,cAAc,mBAAmB;CAEhD,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,OAAO,GAC/C,CAAC,QAAQ,CACX;CACA,MAAM,iBAAiB,uBACrB,aACG,UACC,OAAO,OAAO,MAAM,MAAM,EAAE,MACzB,MACC,GAAG,WAAA,KACH,iBAAiB,SAAS,EAAE,MAAM,WAAW,CACjD,GACF,CAAC,gBAAgB,CACnB,CACF;CAEA,UACE,EAAE,mBAAmB,GACrB,iBAAiB,oBAAC,0BAAD,CAA2B,CAAA,IAAI,IAClD;CAEA,MAAM,EAAE,eAAe,cAAc,EACnC,eAAe,UACjB,CAAC;CAED,MAAM,gBAAgB,MAAM,SAAS;CACrC,MAAM,gBAAgB,aAAa,gBAAgB,iBAAiB;CACpE,MAAM,aAAa,MAAM,SAAS;CAElC,MAAM,aAAa,aAChB,UAAkB;EACjB,IAAI,SAAS,MAAM,QACjB,OAAO,YAAY;EAErB,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,SAAS,UAChB,OAAO,UAAU,KAAK;EAExB,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,UAAU,KAAK,eAAe,MAAM;CAClE,GACA,CAAC,KAAK,CACR;CAEA,MAAM,EAAE,iBAAiB,cAAc,mBAAmB,eAAe;EACvE,OAAO,gBAAgB,aAAa;EACpC,UAAU;EACV,YAAY;EACZ,wBAAwB,UAAU;EAClC,eAAe,UAAW,MAAM,QAAQ,SAAS,WAAW,MAAM;EAClE;CACF,CAAC;CAED,MAAM,UAAU,CAAC,MAAM,UAAU,CAAC;CAElC,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,KAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO,EAAE,QAAQ,WAAW;GAC5B,IAAI;IAAE,UAAU;IAAQ,UAAU;IAAG,YAAY;GAAI;aAEpD,UACC,oBAAC,yBAAD,CAA0B,CAAA,IACxB,aAAa,CAAC,gBAChB,oBAAC,MAAD;IACE,gBAAA;IACA,IAAI;KACF,SAAS;KACT,eAAe;KACf,KAAK;KACL,cAAc;IAChB;cAEC,MAAM,KAAK,EAAE,QAAQ,eAAe,CAAC,EAAE,KAAK,GAAG,UAC9C,oBAAC,yBAAD,CAAsC,GAAR,KAAQ,CACvC;GACG,CAAA,IAEN,oBAAC,MAAD;IACE,OAAO;KAAE,QAAQ,aAAa;KAAG,UAAU;IAAW;IACtD,gBAAA;cAEC,gBAAgB,EAAE,KAAK,SAAS;KAC/B,MAAM,WACJ,KAAK,QAAQ,MAAM,SAAS,MAAM,KAAK,SAAS;KAClD,OACE,oBAAC,MAAD;MAEE,KAAK;MACL,cAAY,KAAK;MACjB,OAAO;OACL,UAAU;OACV,KAAK;OACL,MAAM;OACN,OAAO;OACP,eAAe;OACf,WAAW,cAAc,KAAK,MAAM;OACpC,WAAW;MACb;gBAEC,CAAC,WACA,oBAAC,yBAAD,CAA0B,CAAA,IACxB,SAAS,SAAS,WACpB,oBAAC,uBAAD,EAAuB,SAAS,SAAS,QAAU,CAAA,IAEnD,oBAAC,wBAAD;OACE,OAAO,SAAS,eAAe;OAC/B,MAAM,SAAS;OACf,iBAAiB,SAAS;OAC1B,WAAW,SAAS;MACrB,CAAA;KAED,GAzBG,KAAK,GAyBR;IAER,CAAC;GACG,CAAA;EAEL,CAAA;CACQ,CAAA;AAEnB"}
1
+ {"version":3,"file":"ActivitiesPage.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/ActivitiesPage.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { Box, List } from '@mui/material'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { type JSX, useCallback, useMemo, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { TransactionCardSkeleton } from '../../components/TransactionCard/TransactionCardSkeleton.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useListHeight } from '../../hooks/useListHeight.js'\nimport { useTransactionList } from '../../hooks/useTransactionList.js'\nimport { useRouteExecutionStore } from '../../stores/routes/RouteExecutionStore.js'\nimport { RouteExecutionStatus } from '../../stores/routes/types.js'\nimport { ActiveTransactionItem } from './ActiveTransactionItem.js'\nimport { ActivitiesPageMenuButton } from './ActivitiesPageMenuButton.js'\nimport { TransactionHistoryEmpty } from './TransactionHistoryEmpty.js'\nimport { TransactionHistoryItem } from './TransactionHistoryItem.js'\n\nconst SKELETON_COUNT = 2\n\nexport const ActivitiesPage = (): JSX.Element => {\n // Parent ref and useVirtualizer should be in one file to avoid blank page (0 virtual items) issue\n const parentRef = useRef<HTMLDivElement | null>(null)\n const { items, isLoading } = useTransactionList()\n\n const { t } = useTranslation()\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.map((account) => account.address),\n [accounts]\n )\n const hasFailedItems = useRouteExecutionStore(\n useCallback(\n (state) =>\n Object.values(state.routes).some(\n (r) =>\n r?.status === RouteExecutionStatus.Failed &&\n accountAddresses.includes(r.route.fromAddress)\n ),\n [accountAddresses]\n )\n )\n\n useHeader(\n t('header.activities'),\n hasFailedItems ? <ActivitiesPageMenuButton /> : null\n )\n\n const { listHeight } = useListHeight({\n listParentRef: parentRef,\n })\n\n const hasStoreItems = items.length > 0\n const skeletonCount = isLoading && hasStoreItems ? SKELETON_COUNT : 0\n const totalCount = items.length + skeletonCount\n\n const getItemKey = useCallback(\n (index: number) => {\n if (index >= items.length) {\n return `skeleton-${index}`\n }\n const item = items[index]\n if (item.type === 'active') {\n return `active-${item.routeId}`\n }\n return `${item.type}-${item.txHash || item.routeExecution.route.id}`\n },\n [items]\n )\n\n const { getVirtualItems, getTotalSize, measureElement } = useVirtualizer({\n count: hasStoreItems ? totalCount : 0,\n overscan: 3,\n paddingEnd: 12,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => (items[index]?.type === 'active' ? 218 : 196),\n getItemKey,\n })\n\n const isEmpty = !items.length && !isLoading\n\n return (\n <PageContainer disableGutters>\n <Box\n className=\"long-list\"\n ref={parentRef}\n style={{ height: listHeight }}\n sx={{ overflow: 'auto', paddingX: 3, paddingTop: 1.5 }}\n >\n {isEmpty ? (\n <TransactionHistoryEmpty />\n ) : isLoading && !hasStoreItems ? (\n <List\n disablePadding\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n marginBottom: 2,\n }}\n >\n {Array.from({ length: SKELETON_COUNT }).map((_, index) => (\n <TransactionCardSkeleton key={index} />\n ))}\n </List>\n ) : (\n <List\n style={{ height: getTotalSize(), position: 'relative' }}\n disablePadding\n >\n {getVirtualItems().map((item) => {\n const listItem =\n item.index < items.length ? items[item.index] : null\n return (\n <li\n key={item.key}\n ref={measureElement}\n data-index={item.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n paddingBottom: 16,\n transform: `translateY(${item.start}px)`,\n listStyle: 'none',\n }}\n >\n {!listItem ? (\n <TransactionCardSkeleton />\n ) : listItem.type === 'active' ? (\n <ActiveTransactionItem routeId={listItem.routeId} />\n ) : (\n <TransactionHistoryItem\n route={listItem.routeExecution.route}\n type={listItem.type}\n transactionHash={listItem.txHash}\n startedAt={listItem.startedAt}\n />\n )}\n </li>\n )\n })}\n </List>\n )}\n </Box>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAM,iBAAiB;AAEvB,MAAa,uBAAoC;CAE/C,MAAM,YAAY,OAA8B,IAAI;CACpD,MAAM,EAAE,OAAO,cAAc,mBAAmB;CAEhD,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,OAAO,GAC/C,CAAC,QAAQ,CACX;CACA,MAAM,iBAAiB,uBACrB,aACG,UACC,OAAO,OAAO,MAAM,MAAM,CAAC,CAAC,MACzB,MACC,GAAG,WAAA,KACH,iBAAiB,SAAS,EAAE,MAAM,WAAW,CACjD,GACF,CAAC,gBAAgB,CACnB,CACF;CAEA,UACE,EAAE,mBAAmB,GACrB,iBAAiB,oBAAC,0BAAD,CAA2B,CAAA,IAAI,IAClD;CAEA,MAAM,EAAE,eAAe,cAAc,EACnC,eAAe,UACjB,CAAC;CAED,MAAM,gBAAgB,MAAM,SAAS;CACrC,MAAM,gBAAgB,aAAa,gBAAgB,iBAAiB;CACpE,MAAM,aAAa,MAAM,SAAS;CAElC,MAAM,aAAa,aAChB,UAAkB;EACjB,IAAI,SAAS,MAAM,QACjB,OAAO,YAAY;EAErB,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,SAAS,UAChB,OAAO,UAAU,KAAK;EAExB,OAAO,GAAG,KAAK,KAAK,GAAG,KAAK,UAAU,KAAK,eAAe,MAAM;CAClE,GACA,CAAC,KAAK,CACR;CAEA,MAAM,EAAE,iBAAiB,cAAc,mBAAmB,eAAe;EACvE,OAAO,gBAAgB,aAAa;EACpC,UAAU;EACV,YAAY;EACZ,wBAAwB,UAAU;EAClC,eAAe,UAAW,MAAM,MAAM,EAAE,SAAS,WAAW,MAAM;EAClE;CACF,CAAC;CAED,MAAM,UAAU,CAAC,MAAM,UAAU,CAAC;CAElC,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,KAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO,EAAE,QAAQ,WAAW;GAC5B,IAAI;IAAE,UAAU;IAAQ,UAAU;IAAG,YAAY;GAAI;aAEpD,UACC,oBAAC,yBAAD,CAA0B,CAAA,IACxB,aAAa,CAAC,gBAChB,oBAAC,MAAD;IACE,gBAAA;IACA,IAAI;KACF,SAAS;KACT,eAAe;KACf,KAAK;KACL,cAAc;IAChB;cAEC,MAAM,KAAK,EAAE,QAAQ,eAAe,CAAC,CAAC,CAAC,KAAK,GAAG,UAC9C,oBAAC,yBAAD,CAAsC,GAAR,KAAQ,CACvC;GACG,CAAA,IAEN,oBAAC,MAAD;IACE,OAAO;KAAE,QAAQ,aAAa;KAAG,UAAU;IAAW;IACtD,gBAAA;cAEC,gBAAgB,CAAC,CAAC,KAAK,SAAS;KAC/B,MAAM,WACJ,KAAK,QAAQ,MAAM,SAAS,MAAM,KAAK,SAAS;KAClD,OACE,oBAAC,MAAD;MAEE,KAAK;MACL,cAAY,KAAK;MACjB,OAAO;OACL,UAAU;OACV,KAAK;OACL,MAAM;OACN,OAAO;OACP,eAAe;OACf,WAAW,cAAc,KAAK,MAAM;OACpC,WAAW;MACb;gBAEC,CAAC,WACA,oBAAC,yBAAD,CAA0B,CAAA,IACxB,SAAS,SAAS,WACpB,oBAAC,uBAAD,EAAuB,SAAS,SAAS,QAAU,CAAA,IAEnD,oBAAC,wBAAD;OACE,OAAO,SAAS,eAAe;OAC/B,MAAM,SAAS;OACf,iBAAiB,SAAS;OAC1B,WAAW,SAAS;MACrB,CAAA;KAED,GAzBG,KAAK,GAyBR;IAER,CAAC;GACG,CAAA;EAEL,CAAA;CACQ,CAAA;AAEnB"}
@@ -2,7 +2,7 @@ import { useWidgetEvents } from "../../hooks/useWidgetEvents.js";
2
2
  import "../../types/events.js";
3
3
  import { useWidgetConfig } from "../../providers/WidgetProvider/WidgetProvider.js";
4
4
  import { navigationRoutes } from "../../utils/navigationRoutes.js";
5
- import { useSplitModeStore } from "../../stores/settings/useSplitModeStore.js";
5
+ import { useSplitMode } from "../../stores/navigationTabs/useNavigationTabsStore.js";
6
6
  import { useRoutes } from "../../hooks/useRoutes.js";
7
7
  import { useToAddressRequirements } from "../../hooks/useToAddressRequirements.js";
8
8
  import { BaseTransactionButton } from "../../components/BaseTransactionButton/BaseTransactionButton.js";
@@ -15,7 +15,7 @@ const ReviewButton = () => {
15
15
  const navigate = useNavigate();
16
16
  const emitter = useWidgetEvents();
17
17
  const { mode, modeOptions } = useWidgetConfig();
18
- const splitState = useSplitModeStore((state) => state.state);
18
+ const splitState = useSplitMode();
19
19
  const { toAddress, requiredToAddress } = useToAddressRequirements();
20
20
  const { routes, setReviewableRoute } = useRoutes();
21
21
  const currentRoute = routes?.[0];
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewButton.js","names":[],"sources":["../../../../src/pages/MainPage/ReviewButton.tsx"],"sourcesContent":["import { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { BaseTransactionButton } from '../../components/BaseTransactionButton/BaseTransactionButton.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSplitModeStore } from '../../stores/settings/useSplitModeStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const ReviewButton: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const { mode, modeOptions } = useWidgetConfig()\n const splitState = useSplitModeStore((state) => state.state)\n const { toAddress, requiredToAddress } = useToAddressRequirements()\n const { routes, setReviewableRoute } = useRoutes()\n\n const currentRoute = routes?.[0]\n\n const handleClick = async () => {\n if (!currentRoute) {\n return\n }\n\n setReviewableRoute(currentRoute)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: currentRoute.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route: currentRoute,\n routes: routes!,\n })\n }\n\n const getButtonText = (): string => {\n if (currentRoute) {\n switch (mode) {\n case 'custom':\n return t(`button.${modeOptions?.custom?.type ?? 'checkout'}Review`)\n case 'refuel':\n return t('button.getGas')\n default: {\n const transactionType =\n currentRoute.fromChainId === currentRoute.toChainId\n ? 'swap'\n : 'bridge'\n return t(`button.${transactionType}Review`)\n }\n }\n }\n switch (mode) {\n case 'custom':\n return modeOptions?.custom?.type === 'deposit'\n ? t('button.deposit')\n : t('button.buy')\n case 'refuel':\n return t('button.getGas')\n case 'split':\n if (splitState) {\n return t(`button.${splitState}`)\n }\n return t('button.exchange')\n default:\n return t('button.exchange')\n }\n }\n\n return (\n <BaseTransactionButton\n text={getButtonText()}\n onClick={handleClick}\n disabled={currentRoute && requiredToAddress && !toAddress}\n route={currentRoute}\n sx={{ flex: 1 }}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,qBAA+B;CAC1C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,EAAE,MAAM,gBAAgB,gBAAgB;CAC9C,MAAM,aAAa,mBAAmB,UAAU,MAAM,KAAK;CAC3D,MAAM,EAAE,WAAW,sBAAsB,yBAAyB;CAClE,MAAM,EAAE,QAAQ,uBAAuB,UAAU;CAEjD,MAAM,eAAe,SAAS;CAE9B,MAAM,cAAc,YAAY;EAC9B,IAAI,CAAC,cACH;EAGF,mBAAmB,YAAY;EAC/B,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,aAAa,GAAG;EACrC,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC,OAAO;GACC;EACV,CAAC;CACH;CAEA,MAAM,sBAA8B;EAClC,IAAI,cACF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,EAAE,UAAU,aAAa,QAAQ,QAAQ,WAAW,OAAO;GACpE,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,SAKE,OAAO,EAAE,UAHP,aAAa,gBAAgB,aAAa,YACtC,SACA,SAC6B,OAAO;EAE9C;EAEF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,aAAa,QAAQ,SAAS,YACjC,EAAE,gBAAgB,IAClB,EAAE,YAAY;GACpB,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,KAAK;IACH,IAAI,YACF,OAAO,EAAE,UAAU,YAAY;IAEjC,OAAO,EAAE,iBAAiB;GAC5B,SACE,OAAO,EAAE,iBAAiB;EAC9B;CACF;CAEA,OACE,oBAAC,uBAAD;EACE,MAAM,cAAc;EACpB,SAAS;EACT,UAAU,gBAAgB,qBAAqB,CAAC;EAChD,OAAO;EACP,IAAI,EAAE,MAAM,EAAE;CACf,CAAA;AAEL"}
1
+ {"version":3,"file":"ReviewButton.js","names":[],"sources":["../../../../src/pages/MainPage/ReviewButton.tsx"],"sourcesContent":["import { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { BaseTransactionButton } from '../../components/BaseTransactionButton/BaseTransactionButton.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSplitMode } from '../../stores/navigationTabs/useNavigationTabsStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const ReviewButton: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const { mode, modeOptions } = useWidgetConfig()\n const splitState = useSplitMode()\n const { toAddress, requiredToAddress } = useToAddressRequirements()\n const { routes, setReviewableRoute } = useRoutes()\n\n const currentRoute = routes?.[0]\n\n const handleClick = async () => {\n if (!currentRoute) {\n return\n }\n\n setReviewableRoute(currentRoute)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: currentRoute.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route: currentRoute,\n routes: routes!,\n })\n }\n\n const getButtonText = (): string => {\n if (currentRoute) {\n switch (mode) {\n case 'custom':\n return t(`button.${modeOptions?.custom?.type ?? 'checkout'}Review`)\n case 'refuel':\n return t('button.getGas')\n default: {\n const transactionType =\n currentRoute.fromChainId === currentRoute.toChainId\n ? 'swap'\n : 'bridge'\n return t(`button.${transactionType}Review`)\n }\n }\n }\n switch (mode) {\n case 'custom':\n return modeOptions?.custom?.type === 'deposit'\n ? t('button.deposit')\n : t('button.buy')\n case 'refuel':\n return t('button.getGas')\n case 'split':\n if (splitState) {\n return t(`button.${splitState}`)\n }\n return t('button.exchange')\n default:\n return t('button.exchange')\n }\n }\n\n return (\n <BaseTransactionButton\n text={getButtonText()}\n onClick={handleClick}\n disabled={currentRoute && requiredToAddress && !toAddress}\n route={currentRoute}\n sx={{ flex: 1 }}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,qBAA+B;CAC1C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,EAAE,MAAM,gBAAgB,gBAAgB;CAC9C,MAAM,aAAa,aAAa;CAChC,MAAM,EAAE,WAAW,sBAAsB,yBAAyB;CAClE,MAAM,EAAE,QAAQ,uBAAuB,UAAU;CAEjD,MAAM,eAAe,SAAS;CAE9B,MAAM,cAAc,YAAY;EAC9B,IAAI,CAAC,cACH;EAGF,mBAAmB,YAAY;EAC/B,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,aAAa,GAAG;EACrC,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC,OAAO;GACC;EACV,CAAC;CACH;CAEA,MAAM,sBAA8B;EAClC,IAAI,cACF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,EAAE,UAAU,aAAa,QAAQ,QAAQ,WAAW,OAAO;GACpE,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,SAKE,OAAO,EAAE,UAHP,aAAa,gBAAgB,aAAa,YACtC,SACA,SAC6B,OAAO;EAE9C;EAEF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,aAAa,QAAQ,SAAS,YACjC,EAAE,gBAAgB,IAClB,EAAE,YAAY;GACpB,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,KAAK;IACH,IAAI,YACF,OAAO,EAAE,UAAU,YAAY;IAEjC,OAAO,EAAE,iBAAiB;GAC5B,SACE,OAAO,EAAE,iBAAiB;EAC9B;CACF;CAEA,OACE,oBAAC,uBAAD;EACE,MAAM,cAAc;EACpB,SAAS;EACT,UAAU,gBAAgB,qBAAqB,CAAC;EAChD,OAAO;EACP,IAAI,EAAE,MAAM,EAAE;CACf,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"RoutesPage.js","names":[],"sources":["../../../../src/pages/RoutesPage/RoutesPage.tsx"],"sourcesContent":["import type { Route } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ProgressToNextUpdate } from '../../components/ProgressToNextUpdate.js'\nimport { RouteCard } from '../../components/RouteCard/RouteCard.js'\nimport { RouteCardSkeleton } from '../../components/RouteCard/RouteCardSkeleton.js'\nimport { RouteNotFoundCard } from '../../components/RouteCard/RouteNotFoundCard.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { Stack } from './RoutesPage.style.js'\n\nexport const RoutesPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const {\n routes,\n isLoading,\n isFetching,\n dataUpdatedAt,\n refetchTime,\n fromChain,\n refetch,\n setReviewableRoute,\n } = useRoutes()\n const { account } = useAccount({ chainType: fromChain?.chainType })\n const [toAddress] = useFieldValues('toAddress')\n const { requiredToAddress } = useToAddressRequirements()\n\n const headerAction = useMemo(\n () => (\n <ProgressToNextUpdate\n updatedAt={dataUpdatedAt || Date.now()}\n timeToUpdate={refetchTime}\n isLoading={isFetching}\n onClick={() => refetch()}\n sx={{ marginRight: -1 }}\n size=\"medium\"\n />\n ),\n [dataUpdatedAt, isFetching, refetch, refetchTime]\n )\n\n useHeader(t('header.receive'), headerAction)\n\n const handleRouteClick = (route: Route) => {\n setReviewableRoute(route)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: route.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route,\n routes: routes!,\n })\n }\n\n const routeNotFound = !routes?.length && !isLoading && !isFetching\n\n const toAddressUnsatisfied = routes?.[0] && requiredToAddress && !toAddress\n\n const allowInteraction = account.isConnected && !toAddressUnsatisfied\n\n return (\n <Stack\n className=\"long-list\"\n direction=\"column\"\n spacing={2}\n sx={{ flex: 1, pt: 1.5 }}\n >\n {routeNotFound ? (\n <RouteNotFoundCard />\n ) : isLoading && !routes?.length ? (\n Array.from({ length: 3 }).map((_, index) => (\n <RouteCardSkeleton key={index} />\n ))\n ) : (\n routes?.map((route: Route, index: number) => (\n <RouteCard\n key={index}\n route={route}\n onClick={\n allowInteraction ? () => handleRouteClick(route) : undefined\n }\n active={index === 0}\n expanded={routes?.length === 1}\n />\n ))\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAa,mBAAgC;CAC3C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,EACJ,QACA,WACA,YACA,eACA,aACA,WACA,SACA,uBACE,UAAU;CACd,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,WAAW,UAAU,CAAC;CAClE,MAAM,CAAC,aAAa,eAAe,WAAW;CAC9C,MAAM,EAAE,sBAAsB,yBAAyB;CAEvD,MAAM,eAAe,cAEjB,oBAAC,sBAAD;EACE,WAAW,iBAAiB,KAAK,IAAI;EACrC,cAAc;EACd,WAAW;EACX,eAAe,QAAQ;EACvB,IAAI,EAAE,aAAa,GAAG;EACtB,MAAK;CACN,CAAA,GAEH;EAAC;EAAe;EAAY;EAAS;CAAW,CAClD;CAEA,UAAU,EAAE,gBAAgB,GAAG,YAAY;CAE3C,MAAM,oBAAoB,UAAiB;EACzC,mBAAmB,KAAK;EACxB,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,MAAM,GAAG;EAC9B,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC;GACQ;EACV,CAAC;CACH;CAEA,MAAM,gBAAgB,CAAC,QAAQ,UAAU,CAAC,aAAa,CAAC;CAExD,MAAM,uBAAuB,SAAS,MAAM,qBAAqB,CAAC;CAElE,MAAM,mBAAmB,QAAQ,eAAe,CAAC;CAEjD,OACE,oBAAC,OAAD;EACE,WAAU;EACV,WAAU;EACV,SAAS;EACT,IAAI;GAAE,MAAM;GAAG,IAAI;EAAI;YAEtB,gBACC,oBAAC,mBAAD,CAAoB,CAAA,IAClB,aAAa,CAAC,QAAQ,SACxB,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,UAChC,oBAAC,mBAAD,CAAgC,GAAR,KAAQ,CACjC,IAED,QAAQ,KAAK,OAAc,UACzB,oBAAC,WAAD;GAES;GACP,SACE,yBAAyB,iBAAiB,KAAK,IAAI,KAAA;GAErD,QAAQ,UAAU;GAClB,UAAU,QAAQ,WAAW;EAC9B,GAPM,KAON,CACF;CAEE,CAAA;AAEX"}
1
+ {"version":3,"file":"RoutesPage.js","names":[],"sources":["../../../../src/pages/RoutesPage/RoutesPage.tsx"],"sourcesContent":["import type { Route } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ProgressToNextUpdate } from '../../components/ProgressToNextUpdate.js'\nimport { RouteCard } from '../../components/RouteCard/RouteCard.js'\nimport { RouteCardSkeleton } from '../../components/RouteCard/RouteCardSkeleton.js'\nimport { RouteNotFoundCard } from '../../components/RouteCard/RouteNotFoundCard.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { Stack } from './RoutesPage.style.js'\n\nexport const RoutesPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const {\n routes,\n isLoading,\n isFetching,\n dataUpdatedAt,\n refetchTime,\n fromChain,\n refetch,\n setReviewableRoute,\n } = useRoutes()\n const { account } = useAccount({ chainType: fromChain?.chainType })\n const [toAddress] = useFieldValues('toAddress')\n const { requiredToAddress } = useToAddressRequirements()\n\n const headerAction = useMemo(\n () => (\n <ProgressToNextUpdate\n updatedAt={dataUpdatedAt || Date.now()}\n timeToUpdate={refetchTime}\n isLoading={isFetching}\n onClick={() => refetch()}\n sx={{ marginRight: -1 }}\n size=\"medium\"\n />\n ),\n [dataUpdatedAt, isFetching, refetch, refetchTime]\n )\n\n useHeader(t('header.receive'), headerAction)\n\n const handleRouteClick = (route: Route) => {\n setReviewableRoute(route)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: route.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route,\n routes: routes!,\n })\n }\n\n const routeNotFound = !routes?.length && !isLoading && !isFetching\n\n const toAddressUnsatisfied = routes?.[0] && requiredToAddress && !toAddress\n\n const allowInteraction = account.isConnected && !toAddressUnsatisfied\n\n return (\n <Stack\n className=\"long-list\"\n direction=\"column\"\n spacing={2}\n sx={{ flex: 1, pt: 1.5 }}\n >\n {routeNotFound ? (\n <RouteNotFoundCard />\n ) : isLoading && !routes?.length ? (\n Array.from({ length: 3 }).map((_, index) => (\n <RouteCardSkeleton key={index} />\n ))\n ) : (\n routes?.map((route: Route, index: number) => (\n <RouteCard\n key={index}\n route={route}\n onClick={\n allowInteraction ? () => handleRouteClick(route) : undefined\n }\n active={index === 0}\n expanded={routes?.length === 1}\n />\n ))\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAa,mBAAgC;CAC3C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,EACJ,QACA,WACA,YACA,eACA,aACA,WACA,SACA,uBACE,UAAU;CACd,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,WAAW,UAAU,CAAC;CAClE,MAAM,CAAC,aAAa,eAAe,WAAW;CAC9C,MAAM,EAAE,sBAAsB,yBAAyB;CAEvD,MAAM,eAAe,cAEjB,oBAAC,sBAAD;EACE,WAAW,iBAAiB,KAAK,IAAI;EACrC,cAAc;EACd,WAAW;EACX,eAAe,QAAQ;EACvB,IAAI,EAAE,aAAa,GAAG;EACtB,MAAK;CACN,CAAA,GAEH;EAAC;EAAe;EAAY;EAAS;CAAW,CAClD;CAEA,UAAU,EAAE,gBAAgB,GAAG,YAAY;CAE3C,MAAM,oBAAoB,UAAiB;EACzC,mBAAmB,KAAK;EACxB,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,MAAM,GAAG;EAC9B,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC;GACQ;EACV,CAAC;CACH;CAEA,MAAM,gBAAgB,CAAC,QAAQ,UAAU,CAAC,aAAa,CAAC;CAExD,MAAM,uBAAuB,SAAS,MAAM,qBAAqB,CAAC;CAElE,MAAM,mBAAmB,QAAQ,eAAe,CAAC;CAEjD,OACE,oBAAC,OAAD;EACE,WAAU;EACV,WAAU;EACV,SAAS;EACT,IAAI;GAAE,MAAM;GAAG,IAAI;EAAI;YAEtB,gBACC,oBAAC,mBAAD,CAAoB,CAAA,IAClB,aAAa,CAAC,QAAQ,SACxB,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,UAChC,oBAAC,mBAAD,CAAgC,GAAR,KAAQ,CACjC,IAED,QAAQ,KAAK,OAAc,UACzB,oBAAC,WAAD;GAES;GACP,SACE,yBAAyB,iBAAiB,KAAK,IAAI,KAAA;GAErD,QAAQ,UAAU;GAClB,UAAU,QAAQ,WAAW;EAC9B,GAPM,KAON,CACF;CAEE,CAAA;AAEX"}
@@ -1 +1 @@
1
- {"version":3,"file":"RoutesPage.style.js","names":["Stack","MuiStack"],"sources":["../../../../src/pages/RoutesPage/RoutesPage.style.ts"],"sourcesContent":["import { Stack as MuiStack, styled } from '@mui/material'\nimport type React from 'react'\n\nexport const Stack: React.FC<React.ComponentProps<typeof MuiStack>> = styled(\n MuiStack\n)(({ theme }) => ({\n position: 'relative',\n padding: theme.spacing(0, 3, 3, 3),\n}))\n"],"mappings":";;AAGA,MAAaA,UAAyD,OACpEC,KACF,GAAG,EAAE,aAAa;CAChB,UAAU;CACV,SAAS,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC;AACnC,EAAE"}
1
+ {"version":3,"file":"RoutesPage.style.js","names":["Stack","MuiStack"],"sources":["../../../../src/pages/RoutesPage/RoutesPage.style.ts"],"sourcesContent":["import { Stack as MuiStack, styled } from '@mui/material'\nimport type React from 'react'\n\nexport const Stack: React.FC<React.ComponentProps<typeof MuiStack>> = styled(\n MuiStack\n)(({ theme }) => ({\n position: 'relative',\n padding: theme.spacing(0, 3, 3, 3),\n}))\n"],"mappings":";;AAGA,MAAaA,UAAyD,OACpEC,KACF,CAAC,EAAE,EAAE,aAAa;CAChB,UAAU;CACV,SAAS,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC;AACnC,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectEnabledToolsPage.js","names":[],"sources":["../../../src/pages/SelectEnabledToolsPage.tsx"],"sourcesContent":["import { Box, Checkbox, debounce, Tooltip } from '@mui/material'\nimport type { ChangeEvent, ChangeEventHandler } from 'react'\nimport { memo, useCallback, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SearchInput } from '../components/Search/SearchInput.js'\nimport { type ToolCollectionTypes, Tools } from '../components/Tools/Tools.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useListHeight } from '../hooks/useListHeight.js'\nimport { useTools } from '../hooks/useTools.js'\nimport { useSettingsStore } from '../stores/settings/SettingsStore.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\n\ninterface SelectAllCheckboxProps {\n allCheckboxesSelected: boolean\n onClick: (event: ChangeEvent<HTMLInputElement>, checked: boolean) => void\n anyCheckboxesSelected: boolean\n noCheckboxesAvailable: boolean\n}\n\nconst SelectAllCheckbox = memo<SelectAllCheckboxProps>(\n ({\n allCheckboxesSelected,\n anyCheckboxesSelected,\n noCheckboxesAvailable,\n onClick,\n }) => {\n const { t } = useTranslation()\n const tooltipTitle = noCheckboxesAvailable\n ? undefined\n : allCheckboxesSelected\n ? t('tooltip.deselectAll')\n : t('tooltip.selectAll')\n\n return (\n <Tooltip title={tooltipTitle}>\n <Checkbox\n id=\"select-all\"\n checked={allCheckboxesSelected}\n indeterminate={anyCheckboxesSelected && !allCheckboxesSelected}\n onChange={onClick}\n disabled={noCheckboxesAvailable}\n sx={{ mr: -1.5, height: 20 }}\n />\n </Tooltip>\n )\n }\n)\n\nexport const SelectEnabledToolsPage: React.FC<{\n type: 'Bridges' | 'Exchanges'\n}> = ({ type }) => {\n const typeKey = type.toLowerCase() as 'bridges' | 'exchanges'\n const { tools } = useTools()\n const { toggleToolKeys } = useSettingsActions()\n\n const disabledTools = useSettingsStore((state) => state[`disabled${type}`])\n\n const { t } = useTranslation()\n const headerRef = useRef<HTMLElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const [searchValue, setSearchValue] = useState('')\n\n const { listHeight } = useListHeight({\n listParentRef: listRef,\n headerRef,\n })\n\n const filteredTools = useMemo(() => {\n const toolsList = tools?.[typeKey] ?? []\n\n if (!searchValue) {\n return toolsList\n }\n\n const lowerSearchValue = searchValue.toLowerCase()\n return toolsList.filter((tool) =>\n tool.name.toLowerCase().includes(lowerSearchValue)\n ) as ToolCollectionTypes\n }, [tools, typeKey, searchValue])\n\n const handleSelectAll = useCallback(() => {\n toggleToolKeys(\n type,\n filteredTools.map((tool) => tool.key)\n )\n }, [toggleToolKeys, type, filteredTools])\n\n const headerAction = useMemo(\n () => (\n <SelectAllCheckbox\n allCheckboxesSelected={\n !!filteredTools.length &&\n filteredTools.every((tool) => !disabledTools.includes(tool.key))\n }\n anyCheckboxesSelected={\n !!filteredTools.length &&\n filteredTools.some((tool) => disabledTools.includes(tool.key))\n }\n noCheckboxesAvailable={!filteredTools.length}\n onClick={handleSelectAll}\n />\n ),\n [disabledTools, handleSelectAll, filteredTools]\n )\n\n useHeader(t(`settings.enabled${type}`), headerAction)\n\n const handleSearchInputChange: ChangeEventHandler<HTMLInputElement> =\n useCallback((e) => {\n setSearchValue(e.target.value)\n listRef.current?.scrollTo(0, 0)\n }, [])\n\n const debouncedSearchInputChange = debounce(handleSearchInputChange, 250)\n\n return (\n <PageContainer disableGutters>\n <Box ref={headerRef} sx={{ px: 3, pb: 2, pt: 1.5 }}>\n <SearchInput\n onChange={debouncedSearchInputChange}\n placeholder={t(`main.search${type}`)}\n autoFocus\n />\n </Box>\n <Box ref={listRef} style={{ height: listHeight, overflow: 'auto' }}>\n <Tools filteredTools={filteredTools} type={type} />\n </Box>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,MAAM,oBAAoB,MACvB,EACC,uBACA,uBACA,uBACA,cACI;CACJ,MAAM,EAAE,MAAM,eAAe;CAO7B,OACE,oBAAC,SAAD;EAAS,OAPU,wBACjB,KAAA,IACA,wBACE,EAAE,qBAAqB,IACvB,EAAE,mBAAmB;YAIvB,oBAAC,UAAD;GACE,IAAG;GACH,SAAS;GACT,eAAe,yBAAyB,CAAC;GACzC,UAAU;GACV,UAAU;GACV,IAAI;IAAE,IAAI;IAAM,QAAQ;GAAG;EAC5B,CAAA;CACM,CAAA;AAEb,CACF;AAEA,MAAa,0BAEP,EAAE,WAAW;CACjB,MAAM,UAAU,KAAK,YAAY;CACjC,MAAM,EAAE,UAAU,SAAS;CAC3B,MAAM,EAAE,mBAAmB,mBAAmB;CAE9C,MAAM,gBAAgB,kBAAkB,UAAU,MAAM,WAAW,OAAO;CAE1E,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,YAAY,OAAoB,IAAI;CAC1C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,aAAa,kBAAkB,SAAS,EAAE;CAEjD,MAAM,EAAE,eAAe,cAAc;EACnC,eAAe;EACf;CACF,CAAC;CAED,MAAM,gBAAgB,cAAc;EAClC,MAAM,YAAY,QAAQ,YAAY,CAAC;EAEvC,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,mBAAmB,YAAY,YAAY;EACjD,OAAO,UAAU,QAAQ,SACvB,KAAK,KAAK,YAAY,EAAE,SAAS,gBAAgB,CACnD;CACF,GAAG;EAAC;EAAO;EAAS;CAAW,CAAC;CAEhC,MAAM,kBAAkB,kBAAkB;EACxC,eACE,MACA,cAAc,KAAK,SAAS,KAAK,GAAG,CACtC;CACF,GAAG;EAAC;EAAgB;EAAM;CAAa,CAAC;CAExC,MAAM,eAAe,cAEjB,oBAAC,mBAAD;EACE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,OAAO,SAAS,CAAC,cAAc,SAAS,KAAK,GAAG,CAAC;EAEjE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,MAAM,SAAS,cAAc,SAAS,KAAK,GAAG,CAAC;EAE/D,uBAAuB,CAAC,cAAc;EACtC,SAAS;CACV,CAAA,GAEH;EAAC;EAAe;EAAiB;CAAa,CAChD;CAEA,UAAU,EAAE,mBAAmB,MAAM,GAAG,YAAY;CAUpD,OACE,qBAAC,eAAD;EAAe,gBAAA;YAAf,CACE,oBAAC,KAAD;GAAK,KAAK;GAAW,IAAI;IAAE,IAAI;IAAG,IAAI;IAAG,IAAI;GAAI;aAC/C,oBAAC,aAAD;IACE,UAN2B,SALjC,aAAa,MAAM;KACjB,eAAe,EAAE,OAAO,KAAK;KAC7B,QAAQ,SAAS,SAAS,GAAG,CAAC;IAChC,GAAG,CAAC,CAE4D,GAAG,GAM1B;IACnC,aAAa,EAAE,cAAc,MAAM;IACnC,WAAA;GACD,CAAA;EACE,CAAA,GACL,oBAAC,KAAD;GAAK,KAAK;GAAS,OAAO;IAAE,QAAQ;IAAY,UAAU;GAAO;aAC/D,oBAAC,OAAD;IAAsB;IAAqB;GAAO,CAAA;EAC/C,CAAA,CACQ;;AAEnB"}
1
+ {"version":3,"file":"SelectEnabledToolsPage.js","names":[],"sources":["../../../src/pages/SelectEnabledToolsPage.tsx"],"sourcesContent":["import { Box, Checkbox, debounce, Tooltip } from '@mui/material'\nimport type { ChangeEvent, ChangeEventHandler } from 'react'\nimport { memo, useCallback, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SearchInput } from '../components/Search/SearchInput.js'\nimport { type ToolCollectionTypes, Tools } from '../components/Tools/Tools.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useListHeight } from '../hooks/useListHeight.js'\nimport { useTools } from '../hooks/useTools.js'\nimport { useSettingsStore } from '../stores/settings/SettingsStore.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\n\ninterface SelectAllCheckboxProps {\n allCheckboxesSelected: boolean\n onClick: (event: ChangeEvent<HTMLInputElement>, checked: boolean) => void\n anyCheckboxesSelected: boolean\n noCheckboxesAvailable: boolean\n}\n\nconst SelectAllCheckbox = memo<SelectAllCheckboxProps>(\n ({\n allCheckboxesSelected,\n anyCheckboxesSelected,\n noCheckboxesAvailable,\n onClick,\n }) => {\n const { t } = useTranslation()\n const tooltipTitle = noCheckboxesAvailable\n ? undefined\n : allCheckboxesSelected\n ? t('tooltip.deselectAll')\n : t('tooltip.selectAll')\n\n return (\n <Tooltip title={tooltipTitle}>\n <Checkbox\n id=\"select-all\"\n checked={allCheckboxesSelected}\n indeterminate={anyCheckboxesSelected && !allCheckboxesSelected}\n onChange={onClick}\n disabled={noCheckboxesAvailable}\n sx={{ mr: -1.5, height: 20 }}\n />\n </Tooltip>\n )\n }\n)\n\nexport const SelectEnabledToolsPage: React.FC<{\n type: 'Bridges' | 'Exchanges'\n}> = ({ type }) => {\n const typeKey = type.toLowerCase() as 'bridges' | 'exchanges'\n const { tools } = useTools()\n const { toggleToolKeys } = useSettingsActions()\n\n const disabledTools = useSettingsStore((state) => state[`disabled${type}`])\n\n const { t } = useTranslation()\n const headerRef = useRef<HTMLElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const [searchValue, setSearchValue] = useState('')\n\n const { listHeight } = useListHeight({\n listParentRef: listRef,\n headerRef,\n })\n\n const filteredTools = useMemo(() => {\n const toolsList = tools?.[typeKey] ?? []\n\n if (!searchValue) {\n return toolsList\n }\n\n const lowerSearchValue = searchValue.toLowerCase()\n return toolsList.filter((tool) =>\n tool.name.toLowerCase().includes(lowerSearchValue)\n ) as ToolCollectionTypes\n }, [tools, typeKey, searchValue])\n\n const handleSelectAll = useCallback(() => {\n toggleToolKeys(\n type,\n filteredTools.map((tool) => tool.key)\n )\n }, [toggleToolKeys, type, filteredTools])\n\n const headerAction = useMemo(\n () => (\n <SelectAllCheckbox\n allCheckboxesSelected={\n !!filteredTools.length &&\n filteredTools.every((tool) => !disabledTools.includes(tool.key))\n }\n anyCheckboxesSelected={\n !!filteredTools.length &&\n filteredTools.some((tool) => disabledTools.includes(tool.key))\n }\n noCheckboxesAvailable={!filteredTools.length}\n onClick={handleSelectAll}\n />\n ),\n [disabledTools, handleSelectAll, filteredTools]\n )\n\n useHeader(t(`settings.enabled${type}`), headerAction)\n\n const handleSearchInputChange: ChangeEventHandler<HTMLInputElement> =\n useCallback((e) => {\n setSearchValue(e.target.value)\n listRef.current?.scrollTo(0, 0)\n }, [])\n\n const debouncedSearchInputChange = debounce(handleSearchInputChange, 250)\n\n return (\n <PageContainer disableGutters>\n <Box ref={headerRef} sx={{ px: 3, pb: 2, pt: 1.5 }}>\n <SearchInput\n onChange={debouncedSearchInputChange}\n placeholder={t(`main.search${type}`)}\n autoFocus\n />\n </Box>\n <Box ref={listRef} style={{ height: listHeight, overflow: 'auto' }}>\n <Tools filteredTools={filteredTools} type={type} />\n </Box>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,MAAM,oBAAoB,MACvB,EACC,uBACA,uBACA,uBACA,cACI;CACJ,MAAM,EAAE,MAAM,eAAe;CAO7B,OACE,oBAAC,SAAD;EAAS,OAPU,wBACjB,KAAA,IACA,wBACE,EAAE,qBAAqB,IACvB,EAAE,mBAAmB;YAIvB,oBAAC,UAAD;GACE,IAAG;GACH,SAAS;GACT,eAAe,yBAAyB,CAAC;GACzC,UAAU;GACV,UAAU;GACV,IAAI;IAAE,IAAI;IAAM,QAAQ;GAAG;EAC5B,CAAA;CACM,CAAA;AAEb,CACF;AAEA,MAAa,0BAEP,EAAE,WAAW;CACjB,MAAM,UAAU,KAAK,YAAY;CACjC,MAAM,EAAE,UAAU,SAAS;CAC3B,MAAM,EAAE,mBAAmB,mBAAmB;CAE9C,MAAM,gBAAgB,kBAAkB,UAAU,MAAM,WAAW,OAAO;CAE1E,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,YAAY,OAAoB,IAAI;CAC1C,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,CAAC,aAAa,kBAAkB,SAAS,EAAE;CAEjD,MAAM,EAAE,eAAe,cAAc;EACnC,eAAe;EACf;CACF,CAAC;CAED,MAAM,gBAAgB,cAAc;EAClC,MAAM,YAAY,QAAQ,YAAY,CAAC;EAEvC,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,mBAAmB,YAAY,YAAY;EACjD,OAAO,UAAU,QAAQ,SACvB,KAAK,KAAK,YAAY,CAAC,CAAC,SAAS,gBAAgB,CACnD;CACF,GAAG;EAAC;EAAO;EAAS;CAAW,CAAC;CAEhC,MAAM,kBAAkB,kBAAkB;EACxC,eACE,MACA,cAAc,KAAK,SAAS,KAAK,GAAG,CACtC;CACF,GAAG;EAAC;EAAgB;EAAM;CAAa,CAAC;CAExC,MAAM,eAAe,cAEjB,oBAAC,mBAAD;EACE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,OAAO,SAAS,CAAC,cAAc,SAAS,KAAK,GAAG,CAAC;EAEjE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,MAAM,SAAS,cAAc,SAAS,KAAK,GAAG,CAAC;EAE/D,uBAAuB,CAAC,cAAc;EACtC,SAAS;CACV,CAAA,GAEH;EAAC;EAAe;EAAiB;CAAa,CAChD;CAEA,UAAU,EAAE,mBAAmB,MAAM,GAAG,YAAY;CAUpD,OACE,qBAAC,eAAD;EAAe,gBAAA;YAAf,CACE,oBAAC,KAAD;GAAK,KAAK;GAAW,IAAI;IAAE,IAAI;IAAG,IAAI;IAAG,IAAI;GAAI;aAC/C,oBAAC,aAAD;IACE,UAN2B,SALjC,aAAa,MAAM;KACjB,eAAe,EAAE,OAAO,KAAK;KAC7B,QAAQ,SAAS,SAAS,GAAG,CAAC;IAChC,GAAG,CAAC,CAE4D,GAAG,GAM1B;IACnC,aAAa,EAAE,cAAc,MAAM;IACnC,WAAA;GACD,CAAA;EACE,CAAA,GACL,oBAAC,KAAD;GAAK,KAAK;GAAS,OAAO;IAAE,QAAQ;IAAY,UAAU;GAAO;aAC/D,oBAAC,OAAD;IAAsB;IAAqB;GAAO,CAAA;EAC/C,CAAA,CACQ;;AAEnB"}
@@ -4,7 +4,7 @@ import { useAddressValidation } from "../../hooks/useAddressValidation.js";
4
4
  import { AlertMessage } from "../../components/Messages/AlertMessage.js";
5
5
  import { BottomSheet } from "../../components/BottomSheet/BottomSheet.js";
6
6
  import { AddressInput, BookmarkInputFields, IconContainer, SendToWalletButtonRow, SendToWalletCard, SendToWalletSheetContainer, SheetAddressContainer, SheetTitle, ValidationAlert } from "./SendToWalletPage.style.js";
7
- import { forwardRef, useState } from "react";
7
+ import { useState } from "react";
8
8
  import { Button, Typography } from "@mui/material";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { useTranslation } from "react-i18next";
@@ -12,7 +12,7 @@ import WarningRounded from "@mui/icons-material/WarningRounded";
12
12
  import TurnedIn from "@mui/icons-material/TurnedIn";
13
13
  import ErrorIcon from "@mui/icons-material/Error";
14
14
  //#region src/pages/SendToWallet/BookmarkAddressSheet.tsx
15
- const BookmarkAddressSheet = forwardRef(({ validatedWallet, onAddBookmark }, ref) => {
15
+ const BookmarkAddressSheet = ({ validatedWallet, onAddBookmark, ref }) => {
16
16
  const { t } = useTranslation();
17
17
  const [name, setName] = useState("");
18
18
  const [address, setAddress] = useState("");
@@ -169,7 +169,7 @@ const BookmarkAddressSheet = forwardRef(({ validatedWallet, onAddBookmark }, ref
169
169
  })] })
170
170
  ] })
171
171
  });
172
- });
172
+ };
173
173
  //#endregion
174
174
  export { BookmarkAddressSheet };
175
175
 
@@ -1 +1 @@
1
- {"version":3,"file":"BookmarkAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/BookmarkAddressSheet.tsx"],"sourcesContent":["import ErrorIcon from '@mui/icons-material/Error'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ChangeEvent, RefObject } from 'react'\nimport {\n type ForwardRefExoticComponent,\n forwardRef,\n type RefAttributes,\n useState,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Input } from '../../components/Input.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport {\n AddressInput,\n BookmarkInputFields,\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\nimport type { BookmarkError } from './types.js'\n\ninterface BookmarkAddressProps {\n onAddBookmark: (bookmark: Bookmark) => void\n validatedWallet?: Bookmark\n}\n\nexport const BookmarkAddressSheet: ForwardRefExoticComponent<\n BookmarkAddressProps & RefAttributes<BottomSheetBase>\n> = forwardRef<BottomSheetBase, BookmarkAddressProps>(\n ({ validatedWallet, onAddBookmark }, ref) => {\n const { t } = useTranslation()\n const [name, setName] = useState('')\n const [address, setAddress] = useState('')\n const [error, setError] = useState<BookmarkError>()\n const { validateAddress, isValidating } = useAddressValidation()\n const { getBookmark } = useBookmarkActions()\n\n const nameValue = name.trim() || validatedWallet?.name || ''\n const addressValue = address || validatedWallet?.address || ''\n\n const handleCancel = () => {\n setError(undefined)\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n const validateWithAddressFromInput = async () => {\n const validationResult = await validateAddress({ value: address })\n if (!validationResult.isValid) {\n setError({ type: 'address', message: validationResult.error })\n return\n }\n\n return {\n name: nameValue,\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n }\n\n const validateWithValidatedWallet = (validatedWallet: Bookmark) => {\n if (error) {\n setError(undefined)\n }\n return {\n name: nameValue,\n address: validatedWallet.address,\n chainType: validatedWallet.chainType,\n }\n }\n\n const handleBookmark = async () => {\n if (isValidating) {\n return\n }\n if (!nameValue) {\n setError({\n type: 'name',\n message: t('error.title.bookmarkNameRequired'),\n })\n return\n }\n if (!addressValue) {\n setError({\n type: 'address',\n message: t('error.title.walletAddressRequired'),\n })\n return\n }\n\n // If the validatedWallet is supplied as a prop then we should assume\n // the address has already been validated\n const validatedBookmark = validatedWallet\n ? validateWithValidatedWallet(validatedWallet)\n : await validateWithAddressFromInput()\n\n if (validatedBookmark) {\n const existingBookmark = getBookmark(validatedBookmark.address)\n if (existingBookmark) {\n setError({\n type: 'address',\n message: t('error.title.bookmarkAlreadyExists', {\n name: existingBookmark.name,\n }),\n })\n return\n }\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n\n onAddBookmark({\n name: validatedBookmark.name,\n address: validatedBookmark.address,\n chainType: validatedBookmark.chainType,\n })\n }\n }\n\n const handleAddressInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setAddress((e.target as HTMLInputElement).value.trim())\n }\n\n const handleNameInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setName((e.target as HTMLInputElement).value)\n }\n\n const resetValues = () => {\n setName('')\n setAddress('')\n }\n\n return (\n <BottomSheet ref={ref} onClose={resetValues}>\n <SendToWalletSheetContainer>\n <IconContainer>\n <TurnedIn sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.bookmarkWallet')}</SheetTitle>\n {validatedWallet ? (\n <SheetAddressContainer>\n {validatedWallet?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedWallet?.name}\n </Typography>\n ) : null}\n <Typography>{validatedWallet?.address}</Typography>\n </SheetAddressContainer>\n ) : null}\n <BookmarkInputFields>\n <SendToWalletCard\n type={error?.type === 'name' ? 'error' : 'default'}\n >\n <Input\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleNameInputChange}\n value={name}\n placeholder={\n validatedWallet?.name || t('sendToWallet.enterName')\n }\n aria-label={\n validatedWallet?.name || t('sendToWallet.enterName')\n }\n inputProps={{ maxLength: 128 }}\n />\n </SendToWalletCard>\n {!validatedWallet && (\n <SendToWalletCard\n type={error?.type === 'address' ? 'error' : 'default'}\n >\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleAddressInputChange}\n value={address}\n placeholder={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n aria-label={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n </SendToWalletCard>\n )}\n {error ? (\n <ValidationAlert icon={<ErrorIcon />}>\n {error.message}\n </ValidationAlert>\n ) : null}\n </BookmarkInputFields>\n <AlertMessage\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={handleCancel} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleBookmark}\n loading={isValidating}\n loadingPosition=\"center\"\n fullWidth\n focusRipple\n >\n {t('button.bookmark')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n </BottomSheet>\n )\n }\n)\n"],"mappings":"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"}
1
+ {"version":3,"file":"BookmarkAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/BookmarkAddressSheet.tsx"],"sourcesContent":["import ErrorIcon from '@mui/icons-material/Error'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ChangeEvent, JSX, Ref, RefObject } from 'react'\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Input } from '../../components/Input.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport {\n AddressInput,\n BookmarkInputFields,\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\nimport type { BookmarkError } from './types.js'\n\ninterface BookmarkAddressProps {\n onAddBookmark: (bookmark: Bookmark) => void\n validatedWallet?: Bookmark\n}\n\nexport const BookmarkAddressSheet = ({\n validatedWallet,\n onAddBookmark,\n ref,\n}: BookmarkAddressProps & {\n ref?: Ref<BottomSheetBase>\n}): JSX.Element => {\n const { t } = useTranslation()\n const [name, setName] = useState('')\n const [address, setAddress] = useState('')\n const [error, setError] = useState<BookmarkError>()\n const { validateAddress, isValidating } = useAddressValidation()\n const { getBookmark } = useBookmarkActions()\n\n const nameValue = name.trim() || validatedWallet?.name || ''\n const addressValue = address || validatedWallet?.address || ''\n\n const handleCancel = () => {\n setError(undefined)\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n const validateWithAddressFromInput = async () => {\n const validationResult = await validateAddress({ value: address })\n if (!validationResult.isValid) {\n setError({ type: 'address', message: validationResult.error })\n return\n }\n\n return {\n name: nameValue,\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n }\n\n const validateWithValidatedWallet = (validatedWallet: Bookmark) => {\n if (error) {\n setError(undefined)\n }\n return {\n name: nameValue,\n address: validatedWallet.address,\n chainType: validatedWallet.chainType,\n }\n }\n\n const handleBookmark = async () => {\n if (isValidating) {\n return\n }\n if (!nameValue) {\n setError({\n type: 'name',\n message: t('error.title.bookmarkNameRequired'),\n })\n return\n }\n if (!addressValue) {\n setError({\n type: 'address',\n message: t('error.title.walletAddressRequired'),\n })\n return\n }\n\n // If the validatedWallet is supplied as a prop then we should assume\n // the address has already been validated\n const validatedBookmark = validatedWallet\n ? validateWithValidatedWallet(validatedWallet)\n : await validateWithAddressFromInput()\n\n if (validatedBookmark) {\n const existingBookmark = getBookmark(validatedBookmark.address)\n if (existingBookmark) {\n setError({\n type: 'address',\n message: t('error.title.bookmarkAlreadyExists', {\n name: existingBookmark.name,\n }),\n })\n return\n }\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n\n onAddBookmark({\n name: validatedBookmark.name,\n address: validatedBookmark.address,\n chainType: validatedBookmark.chainType,\n })\n }\n }\n\n const handleAddressInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setAddress((e.target as HTMLInputElement).value.trim())\n }\n\n const handleNameInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setName((e.target as HTMLInputElement).value)\n }\n\n const resetValues = () => {\n setName('')\n setAddress('')\n }\n\n return (\n <BottomSheet ref={ref} onClose={resetValues}>\n <SendToWalletSheetContainer>\n <IconContainer>\n <TurnedIn sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.bookmarkWallet')}</SheetTitle>\n {validatedWallet ? (\n <SheetAddressContainer>\n {validatedWallet?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedWallet?.name}\n </Typography>\n ) : null}\n <Typography>{validatedWallet?.address}</Typography>\n </SheetAddressContainer>\n ) : null}\n <BookmarkInputFields>\n <SendToWalletCard type={error?.type === 'name' ? 'error' : 'default'}>\n <Input\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleNameInputChange}\n value={name}\n placeholder={validatedWallet?.name || t('sendToWallet.enterName')}\n aria-label={validatedWallet?.name || t('sendToWallet.enterName')}\n inputProps={{ maxLength: 128 }}\n />\n </SendToWalletCard>\n {!validatedWallet && (\n <SendToWalletCard\n type={error?.type === 'address' ? 'error' : 'default'}\n >\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleAddressInputChange}\n value={address}\n placeholder={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n aria-label={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n </SendToWalletCard>\n )}\n {error ? (\n <ValidationAlert icon={<ErrorIcon />}>\n {error.message}\n </ValidationAlert>\n ) : null}\n </BookmarkInputFields>\n <AlertMessage\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={handleCancel} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleBookmark}\n loading={isValidating}\n loadingPosition=\"center\"\n fullWidth\n focusRipple\n >\n {t('button.bookmark')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n </BottomSheet>\n )\n}\n"],"mappings":"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"}
@@ -4,14 +4,14 @@ import { AlertMessage } from "../../components/Messages/AlertMessage.js";
4
4
  import { BottomSheet } from "../../components/BottomSheet/BottomSheet.js";
5
5
  import { IconContainer, SendToWalletButtonRow, SendToWalletSheetContainer, SheetAddressContainer, SheetTitle } from "./SendToWalletPage.style.js";
6
6
  import { useSetContentHeight } from "../../hooks/useSetContentHeight.js";
7
- import { forwardRef, useRef } from "react";
7
+ import { useRef } from "react";
8
8
  import { Button, Typography } from "@mui/material";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { useTranslation } from "react-i18next";
11
11
  import Wallet from "@mui/icons-material/Wallet";
12
12
  import WarningRounded from "@mui/icons-material/WarningRounded";
13
13
  //#region src/pages/SendToWallet/ConfirmAddressSheet.tsx
14
- const ConfirmAddressSheet = forwardRef((props, ref) => {
14
+ const ConfirmAddressSheet = ({ ref, ...props }) => {
15
15
  const handleClose = () => {
16
16
  ref.current?.close();
17
17
  };
@@ -22,7 +22,7 @@ const ConfirmAddressSheet = forwardRef((props, ref) => {
22
22
  onClose: handleClose
23
23
  })
24
24
  });
25
- });
25
+ };
26
26
  const ConfirmAddressSheetContent = ({ validatedBookmark, onConfirm, onClose }) => {
27
27
  const { t } = useTranslation();
28
28
  const navigateBack = useNavigateBack();