@lifi/widget 4.0.0-beta.18 → 4.0.0-beta.19

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 (298) hide show
  1. package/dist/esm/App.js.map +1 -1
  2. package/dist/esm/AppDefault.js.map +1 -1
  3. package/dist/esm/AppDrawer.js.map +1 -1
  4. package/dist/esm/AppLayout.js.map +1 -1
  5. package/dist/esm/AppProvider.js.map +1 -1
  6. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  7. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  8. package/dist/esm/components/AmountInput/AmountInputStartAdornment.js.map +1 -1
  9. package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
  10. package/dist/esm/components/AppContainer.js.map +1 -1
  11. package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
  12. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  13. package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
  14. package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -1
  15. package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
  16. package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
  17. package/dist/esm/components/Avatar/utils.js.map +1 -1
  18. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
  19. package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
  20. package/dist/esm/components/Card/Card.js.map +1 -1
  21. package/dist/esm/components/Card/CardIconButton.js.map +1 -1
  22. package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
  23. package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
  24. package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
  25. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  26. package/dist/esm/components/Chains/ChainList.js.map +1 -1
  27. package/dist/esm/components/Chains/ChainList.style.js.map +1 -1
  28. package/dist/esm/components/Chains/ChainListItem.js.map +1 -1
  29. package/dist/esm/components/Chains/ChainSearchInput.js.map +1 -1
  30. package/dist/esm/components/Chains/ChainsExpanded.js.map +1 -1
  31. package/dist/esm/components/Chains/PinChainButton.js.map +1 -1
  32. package/dist/esm/components/Chains/SelectChainContent.js.map +1 -1
  33. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  34. package/dist/esm/components/ContextMenu.js.map +1 -1
  35. package/dist/esm/components/ContractComponent/ContractComponent.js.map +1 -1
  36. package/dist/esm/components/ContractComponent/ItemPrice.js.map +1 -1
  37. package/dist/esm/components/ContractComponent/NFT/NFT.js.map +1 -1
  38. package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
  39. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  40. package/dist/esm/components/Expansion/Expansion.js.map +1 -1
  41. package/dist/esm/components/Expansion/ExpansionTransition.js.map +1 -1
  42. package/dist/esm/components/FeeBreakdownTooltip.js.map +1 -1
  43. package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
  44. package/dist/esm/components/Header/BackButton.js.map +1 -1
  45. package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
  46. package/dist/esm/components/Header/DisconnectIconButton.js.map +1 -1
  47. package/dist/esm/components/Header/Header.js.map +1 -1
  48. package/dist/esm/components/Header/Header.style.js.map +1 -1
  49. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  50. package/dist/esm/components/Header/SettingsButton.js.map +1 -1
  51. package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
  52. package/dist/esm/components/Header/SplitNavigationTabs.js.map +1 -1
  53. package/dist/esm/components/Header/WalletHeader.js.map +1 -1
  54. package/dist/esm/components/Header/WalletMenu.js.map +1 -1
  55. package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
  56. package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
  57. package/dist/esm/components/Initializer.js.map +1 -1
  58. package/dist/esm/components/ListItemButton.js.map +1 -1
  59. package/dist/esm/components/Messages/AccountDeployedMessage.js.map +1 -1
  60. package/dist/esm/components/Messages/AccountNotDeployedMessage.js.map +1 -1
  61. package/dist/esm/components/Messages/FundsSufficiencyMessage.js.map +1 -1
  62. package/dist/esm/components/Messages/GasRefuelMessage.js.map +1 -1
  63. package/dist/esm/components/Messages/GasSufficiencyMessage.js.map +1 -1
  64. package/dist/esm/components/Messages/MinFromAmountUSDMessage.js.map +1 -1
  65. package/dist/esm/components/Messages/MissingRouteRequiredAccountMessage.js.map +1 -1
  66. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  67. package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
  68. package/dist/esm/components/NotFound.js.map +1 -1
  69. package/dist/esm/components/PageEntered.js.map +1 -1
  70. package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
  71. package/dist/esm/components/ProgressToNextUpdate.js.map +1 -1
  72. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
  73. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.style.js.map +1 -1
  74. package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
  75. package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
  76. package/dist/esm/components/RouteCard/RouteCardSkeleton.js.map +1 -1
  77. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  78. package/dist/esm/components/RouteCard/RouteNotFoundCard.js.map +1 -1
  79. package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
  80. package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
  81. package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
  82. package/dist/esm/components/Routes/Routes.js.map +1 -1
  83. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  84. package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
  85. package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
  86. package/dist/esm/components/Search/SearchInput.js.map +1 -1
  87. package/dist/esm/components/SelectChainAndToken.js.map +1 -1
  88. package/dist/esm/components/SelectTokenButton/SelectTokenButton.js.map +1 -1
  89. package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
  90. package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
  91. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
  92. package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
  93. package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
  94. package/dist/esm/components/Step/CircularProgress.js.map +1 -1
  95. package/dist/esm/components/Step/CircularProgress.style.js.map +1 -1
  96. package/dist/esm/components/Step/DestinationWalletAddress.js.map +1 -1
  97. package/dist/esm/components/Step/Step.js.map +1 -1
  98. package/dist/esm/components/Step/StepAction.js.map +1 -1
  99. package/dist/esm/components/Step/StepActions.js.map +1 -1
  100. package/dist/esm/components/Step/StepList.js.map +1 -1
  101. package/dist/esm/components/StepActions/StepActions.js.map +1 -1
  102. package/dist/esm/components/StepDivider/StepDivider.js.map +1 -1
  103. package/dist/esm/components/TextFitter/TextFitter.js.map +1 -1
  104. package/dist/esm/components/Timer/StepTimer.js.map +1 -1
  105. package/dist/esm/components/Timer/TimerContent.js.map +1 -1
  106. package/dist/esm/components/Token/Token.js.map +1 -1
  107. package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
  108. package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
  109. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
  110. package/dist/esm/components/TokenList/TokenList.js.map +1 -1
  111. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  112. package/dist/esm/components/TokenList/TokenNotFound.js.map +1 -1
  113. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  114. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  115. package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
  116. package/dist/esm/components/Tools/ToolItem.js.map +1 -1
  117. package/dist/esm/components/Tools/Tools.js.map +1 -1
  118. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  119. package/dist/esm/components/TransactionCard/TransactionCard.js.map +1 -1
  120. package/dist/esm/components/TransactionCard/TransactionCardSkeleton.js.map +1 -1
  121. package/dist/esm/components/TransactionDetails.js.map +1 -1
  122. package/dist/esm/config/version.d.ts +1 -1
  123. package/dist/esm/config/version.js +1 -1
  124. package/dist/esm/config/version.js.map +1 -1
  125. package/dist/esm/hooks/timer/time.js.map +1 -1
  126. package/dist/esm/hooks/timer/useExecutionTimer.js.map +1 -1
  127. package/dist/esm/hooks/timer/useInterval.js.map +1 -1
  128. package/dist/esm/hooks/timer/useTimer.js.map +1 -1
  129. package/dist/esm/hooks/timer/validate.js.map +1 -1
  130. package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
  131. package/dist/esm/hooks/useActionMessage.js.map +1 -1
  132. package/dist/esm/hooks/useAddressActivity.js.map +1 -1
  133. package/dist/esm/hooks/useAddressValidation.js.map +1 -1
  134. package/dist/esm/hooks/useAvailableChains.js.map +1 -1
  135. package/dist/esm/hooks/useChain.js.map +1 -1
  136. package/dist/esm/hooks/useChains.js.map +1 -1
  137. package/dist/esm/hooks/useContactSupport.js.map +1 -1
  138. package/dist/esm/hooks/useDebouncedWatch.js.map +1 -1
  139. package/dist/esm/hooks/useDefaultElementId.js.map +1 -1
  140. package/dist/esm/hooks/useExplorer.js.map +1 -1
  141. package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
  142. package/dist/esm/hooks/useFromAmountThreshold.js.map +1 -1
  143. package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
  144. package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
  145. package/dist/esm/hooks/useGasRefuel.js.map +1 -1
  146. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  147. package/dist/esm/hooks/useHasChainExpansion.js.map +1 -1
  148. package/dist/esm/hooks/useHeader.js.map +1 -1
  149. package/dist/esm/hooks/useInitializeSDKProviders.js.map +1 -1
  150. package/dist/esm/hooks/useInitializer.js.map +1 -1
  151. package/dist/esm/hooks/useIsBatchingSupported.js.map +1 -1
  152. package/dist/esm/hooks/useIsContractAddress.js.map +1 -1
  153. package/dist/esm/hooks/useLanguages.js.map +1 -1
  154. package/dist/esm/hooks/useListHeight.js.map +1 -1
  155. package/dist/esm/hooks/useLongPress.js.map +1 -1
  156. package/dist/esm/hooks/useNavigateBack.js.map +1 -1
  157. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  158. package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
  159. package/dist/esm/hooks/useRoutes.js.map +1 -1
  160. package/dist/esm/hooks/useScrollableContainer.js.map +1 -1
  161. package/dist/esm/hooks/useSetContentHeight.js.map +1 -1
  162. package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
  163. package/dist/esm/hooks/useSwapOnly.js.map +1 -1
  164. package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
  165. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  166. package/dist/esm/hooks/useToAddressReset.js.map +1 -1
  167. package/dist/esm/hooks/useToken.js.map +1 -1
  168. package/dist/esm/hooks/useTokenAddressBalance.js.map +1 -1
  169. package/dist/esm/hooks/useTokenBalance.js.map +1 -1
  170. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  171. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  172. package/dist/esm/hooks/useTokenRateText.js.map +1 -1
  173. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  174. package/dist/esm/hooks/useTokens.js.map +1 -1
  175. package/dist/esm/hooks/useTools.js.map +1 -1
  176. package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
  177. package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
  178. package/dist/esm/hooks/useTransactionList.js.map +1 -1
  179. package/dist/esm/hooks/useWideVariant.js.map +1 -1
  180. package/dist/esm/hooks/useWidgetChains.js.map +1 -1
  181. package/dist/esm/hooks/useWidgetEvents.js.map +1 -1
  182. package/dist/esm/pages/ActivitiesPage/ActiveTransactionItem.js.map +1 -1
  183. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
  184. package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
  185. package/dist/esm/pages/ActivitiesPage/TransactionHistoryEmpty.js.map +1 -1
  186. package/dist/esm/pages/ActivitiesPage/TransactionHistoryItem.js.map +1 -1
  187. package/dist/esm/pages/LanguagesPage.js.map +1 -1
  188. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  189. package/dist/esm/pages/MainPage/MainWarningMessages.js.map +1 -1
  190. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  191. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  192. package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
  193. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  194. package/dist/esm/pages/SelectTokenPage/SearchTokenInput.js.map +1 -1
  195. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
  196. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
  197. package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
  198. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
  199. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
  200. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
  201. package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
  202. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  203. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  204. package/dist/esm/pages/SettingsPage/GasPriceSettings.js.map +1 -1
  205. package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
  206. package/dist/esm/pages/SettingsPage/ResetSettingsButton.js.map +1 -1
  207. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
  208. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
  209. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
  210. package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
  211. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
  212. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  213. package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
  214. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  215. package/dist/esm/pages/TransactionDetailsPage/ActionRow.js.map +1 -1
  216. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
  217. package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.js.map +1 -1
  218. package/dist/esm/pages/TransactionDetailsPage/SentToWalletRow.js.map +1 -1
  219. package/dist/esm/pages/TransactionDetailsPage/StepActionRow.js.map +1 -1
  220. package/dist/esm/pages/TransactionDetailsPage/StepActionsList.js.map +1 -1
  221. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  222. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
  223. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
  224. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
  225. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
  226. package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
  227. package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
  228. package/dist/esm/pages/TransactionPage/StatusBottomSheet.js.map +1 -1
  229. package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js.map +1 -1
  230. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  231. package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
  232. package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
  233. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  234. package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
  235. package/dist/esm/providers/QueryClientProvider.js.map +1 -1
  236. package/dist/esm/providers/SDKClientProvider.js.map +1 -1
  237. package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
  238. package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
  239. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
  240. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  241. package/dist/esm/stores/StoreProvider.js.map +1 -1
  242. package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
  243. package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
  244. package/dist/esm/stores/bookmarks/useBookmarkActions.js.map +1 -1
  245. package/dist/esm/stores/bookmarks/useBookmarks.js.map +1 -1
  246. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  247. package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
  248. package/dist/esm/stores/chains/useChainOrder.js.map +1 -1
  249. package/dist/esm/stores/form/FormStore.js.map +1 -1
  250. package/dist/esm/stores/form/FormUpdater.js.map +1 -1
  251. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  252. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  253. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  254. package/dist/esm/stores/form/useFieldActions.js.map +1 -1
  255. package/dist/esm/stores/form/useFieldValues.js.map +1 -1
  256. package/dist/esm/stores/form/useFormRef.js.map +1 -1
  257. package/dist/esm/stores/form/useFormStore.js.map +1 -1
  258. package/dist/esm/stores/form/useTouchedFields.js.map +1 -1
  259. package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
  260. package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
  261. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
  262. package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
  263. package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
  264. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  265. package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
  266. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  267. package/dist/esm/stores/routes/useSetExecutableRoute.js.map +1 -1
  268. package/dist/esm/stores/routes/utils.js.map +1 -1
  269. package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
  270. package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
  271. package/dist/esm/stores/settings/useSettings.js.map +1 -1
  272. package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
  273. package/dist/esm/stores/settings/useSplitSubvariantStore.js.map +1 -1
  274. package/dist/esm/themes/createTheme.js.map +1 -1
  275. package/dist/esm/themes/utils.js.map +1 -1
  276. package/dist/esm/types/events.js.map +1 -1
  277. package/dist/esm/types/widget.js.map +1 -1
  278. package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
  279. package/dist/esm/utils/converters.js.map +1 -1
  280. package/dist/esm/utils/currencyExtendedFormatter.js.map +1 -1
  281. package/dist/esm/utils/deepEqual.js.map +1 -1
  282. package/dist/esm/utils/deepMerge.js.map +1 -1
  283. package/dist/esm/utils/fees.js.map +1 -1
  284. package/dist/esm/utils/format.js.map +1 -1
  285. package/dist/esm/utils/getActionMessage.js.map +1 -1
  286. package/dist/esm/utils/getErrorMessage.js.map +1 -1
  287. package/dist/esm/utils/getPriceImpact.js.map +1 -1
  288. package/dist/esm/utils/input.js.map +1 -1
  289. package/dist/esm/utils/item.js.map +1 -1
  290. package/dist/esm/utils/percentFormatter.js.map +1 -1
  291. package/dist/esm/utils/prepareActions.js.map +1 -1
  292. package/dist/esm/utils/timer.js.map +1 -1
  293. package/dist/esm/utils/token.js.map +1 -1
  294. package/dist/esm/utils/tokenList.js.map +1 -1
  295. package/dist/esm/utils/variant.js.map +1 -1
  296. package/dist/esm/utils/widgetSize.js.map +1 -1
  297. package/package.json +11 -11
  298. package/src/config/version.ts +1 -1
@@ -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,gBAAgB;CACpC,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAEhC,MAAM,uBAAuB,cAEzB;EACE,YAAY,iBAAiB,UAAU;EACvC;EACA,OAAO;EACP,OAAO;EACR,EACH;EAAC,OAAO;EAAS,OAAO;EAAS;EAAgB;EAAU,CAC5D;CAED,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,MAAO,CACT;AAED,OAAI,CAAC,eAAe,OAClB,OAAM,IAAI,MAAM,gCAAgC;GAGlD,MAAM,oBACJ,YAAY,aAA0B,qBAAqB;GAE7D,MAAM,cAAc,cAAc,GAAG;AAErC,OAAI,mBAAmB,WAAW,YAChC,aAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;IACZ,CAAC;AAGJ,eAAY,eACV,EACE,UAAU;IACR,YAAY,kBAAkB,UAAU;IACxC;IACA;IACD,EACF,GACA,SAAS;AACR,QAAI,MAAM;KACR,MAAM,aAAa,CAAC,GAAG,KAAK;KAC5B,MAAM,QAAQ,WAAW,WACtB,cAAc,UAAU,YAAY,aACtC;AACD,gBAAW,SAAS;MAClB,GAAG,WAAW;MACd,QAAQ;MACT;AACD,YAAO;;KAGZ;AAED,UAAO;IACL,GAAG,cAAc;IACjB,QAAQ;IACT;;EAGH,SAAS,QAAQ,kBAAkB,MAAM;EACzC,iBAAiB;EACjB,WAAW;EACZ,CAAC;AASF,QAAO;EACL,OAAO;EACP;EACA;EACA,mBAXwB,kBAAkB;AAC1C,eAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;IACZ,CAAC;KACD,CAAC,aAAa,qBAAqB,CAMnB;EACjB;EACD;;AAGH,MAAa,4BAA4B,OACvC,WACA,gBACA,QACA,QAAQ,MAC+B;AACvC,KAAI;EACF,MAAM,gBAAgB,MAAM,iBAC1B,WACA,gBACA,OACD;AACD,MAAI,CAAC,cAAc,OAAO,UAAU,MAAM,YAAY,EAAE;AACtD,OAAI,QAAQ,IAAI;AACd,YAAQ,KAAK,wCAAwC;AACrD;;AAEF,SAAM,IAAI,SAAS,YAAY;AAC7B,eAAW,SAAS,OAAO,QAAQ,IAAI;KACvC;AACF,UAAO,0BACL,WACA,gBACA,QACA,QAAQ,EACT;;AAEH,SAAO;UACA,QAAQ;AACf,UAAQ,KAAK,OAAO"}
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,gBAAgB;CACpC,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAEhC,MAAM,uBAAuB,cAEzB;EACE,YAAY,iBAAiB,UAAU;EACvC;EACA,OAAO;EACP,OAAO;EACR,EACH;EAAC,OAAO;EAAS,OAAO;EAAS;EAAgB;EAAU,CAC5D;CAED,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,MAAO,CACT;GAED,IAAI,CAAC,eAAe,QAClB,MAAM,IAAI,MAAM,gCAAgC;GAGlD,MAAM,oBACJ,YAAY,aAA0B,qBAAqB;GAE7D,MAAM,cAAc,cAAc,GAAG;GAErC,IAAI,mBAAmB,WAAW,aAChC,YAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;IACZ,CAAC;GAGJ,YAAY,eACV,EACE,UAAU;IACR,YAAY,kBAAkB,UAAU;IACxC;IACA;IACD,EACF,GACA,SAAS;IACR,IAAI,MAAM;KACR,MAAM,aAAa,CAAC,GAAG,KAAK;KAC5B,MAAM,QAAQ,WAAW,WACtB,cAAc,UAAU,YAAY,aACtC;KACD,WAAW,SAAS;MAClB,GAAG,WAAW;MACd,QAAQ;MACT;KACD,OAAO;;KAGZ;GAED,OAAO;IACL,GAAG,cAAc;IACjB,QAAQ;IACT;;EAGH,SAAS,QAAQ,kBAAkB,MAAM;EACzC,iBAAiB;EACjB,WAAW;EACZ,CAAC;CASF,OAAO;EACL,OAAO;EACP;EACA;EACA,mBAXwB,kBAAkB;GAC1C,YAAY,iBAAiB,sBAAsB;IACjD,iBAAiB;IACjB,WAAW;IACZ,CAAC;KACD,CAAC,aAAa,qBAAqB,CAMnB;EACjB;EACD;;AAGH,MAAa,4BAA4B,OACvC,WACA,gBACA,QACA,QAAQ,MAC+B;CACvC,IAAI;EACF,MAAM,gBAAgB,MAAM,iBAC1B,WACA,gBACA,OACD;EACD,IAAI,CAAC,cAAc,OAAO,UAAU,MAAM,YAAY,EAAE;GACtD,IAAI,QAAQ,IAAI;IACd,QAAQ,KAAK,wCAAwC;IACrD;;GAEF,MAAM,IAAI,SAAS,YAAY;IAC7B,WAAW,SAAS,OAAO,QAAQ,IAAI;KACvC;GACF,OAAO,0BACL,WACA,gBACA,QACA,QAAQ,EACT;;EAEH,OAAO;UACA,QAAQ;EACf,QAAQ,KAAK,OAAO"}
@@ -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 { HiddenUI } from '../types/widget.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?.includes(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":";;;;;;;;;;;AAaA,MAAa,oBACX,iBACA,UACA,eACA,WAQG;CACH,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,EACJ,WACA,WAAW,iBACX,oBACE,UAAU,UAAU,QAAQ,gBAAgB,KAAA,IAAY,gBAAgB;CAE5E,MAAM,EAAE,MAAM,uBAAuB,WAAW,sBAC9C,wBAAwB,iBAAiB,UAAU,eAAe,UAAU;CAK9E,MAAM,EAAE,MAAM,uBAAuB,WAAW,4BAC9C,wBAAwB,uBAHxB,QAAQ,sBAAsB,IAAI,CAAC,kBAGoC;CAEzE,MAAM,EAAE,QAAQ,iBAAiB,iBAAiB;CAClD,MAAM,EAAE,0BAA0B,YAAY,CAAC,wBAAwB,CAAC;CAExE,MAAM,eAAe,sBAAsB,UAAU,MAAM,aAAa;CAExE,MAAM,oBACH,2BAA2B,sBAC5B,CAAC,uBAAuB;CAG1B,MAAM,gBAAgB,cAAc;AAClC,MAAI,eAAe;GAEjB,MAAM,YAA8D,EAAE;AACtE,UAAO,QAAQ,aAAa,CAAC,SAAS,CAAC,YAAY,eAAe;IAChE,MAAM,UAAU,OAAO,SAAS,YAAY,GAAG;AAC/C,cAAU,SAAS,YAAY;AAC7B,eAAU,KAAK;MAAE;MAAS,cAAc;MAAS,CAAC;MAClD;KACF;GACF,MAAM,YAAY,IAAI,IACpB,UAAU,KAAK,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,aAAa,aAAa,GAAG,CACrE;AACD,WAAQ,SAAiB,iBAAyB;IAChD,MAAM,MAAM,GAAG,QAAQ,GAAG,aAAa,aAAa;AACpD,WAAO,UAAU,IAAI,IAAI;;aAElB,iBAAiB;GAE1B,MAAM,oBAAoB,aAAa,oBAAoB,EAAE;GAC7D,MAAM,YAAY,IAAI,IACpB,kBAAkB,KAAK,SAAS,KAAK,aAAa,CAAC,CACpD;AACD,WAAQ,SAAiB,iBAAyB;AAChD,WACE,YAAY,mBACZ,UAAU,IAAI,aAAa,aAAa,CAAC;;;IAK9C;EAAC;EAAe;EAAiB;EAAa,CAAC;CAElD,MAAM,sBAAsB,cAAc;AAMxC,UALsB,gBAClB,OAAO,OAAO,aAAa,EAAE,CAAC,CAAC,MAAM,GACrC,kBACE,YAAY,mBACZ,KAAA,IACgB,QAAQ,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;IAClE;EAAC;EAAW;EAAe;EAAiB;EAAO,CAAC;CAEvD,MAAM,8BAA8B,cAAc;EAChD,MAAM,kBAAkB,gBACpB,wBACA,kBACE,uBAAuB,QAAQ,MAAM,EAAE,YAAY,gBAAgB,GACnE,KAAA;EACN,MAAM,qBAAqB,IAAI,IAC7B,qBAAqB,KAClB,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,aAAa,GAC/C,IAAI,EAAE,CACR;EAED,MAAM,oBACJ,CAAC,CAAC,yBAAyB,CAAC,UAAU,SAAA,oBAAoC;EAC5E,MAAM,YAAY,oBACd,OAAO,WAAW,sBAAsB,GACxC,KAAA;AAEJ,MAAI,CAAC,gBACH;AAGF,SAAO,gBAAgB,QAAgC,KAAK,UAAU;GACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,aAAa;GAEhE,MAAM,oBAAoB,mBAAmB,IAAI,SAAS,IAAI,MAAM;GAEpE,MAAM,gBAAgB,cAAc,OAAO,OAAO;AAGlD,OAAI,CAAC,qBAAqB,CAAC,cACzB,QAAO;GAIT,IAAI,iBAAiB;AACrB,OACE,qBACA,cAAc,KAAA,KACd,aAAa,KACb,MAAM;QAEa,iBACjB,MAAM,QACN,MAAM,UACN,MAAM,SAEM,GAAG,UACf,kBAAiB;KACf,GAAG;KACH,QAAQ;KACT;;AAIL,OAAI,KAAK,eAAe;AACxB,UAAO;KACN,EAAE,CAAC;IACL;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,iBAAiB,gBAAgB,qBAAqB,cAAc;AAC1E,SAAO,qBACL,kBACA,iBAAiB,CAAC,CAAC,QACnB,cACA,iBACA,qBACA,6BACA,cACD;IACA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QAAO;EACL,QAAQ,mBAAmB,EAAE;EAC7B;EACA;EACA;EACA;EACA;EACD"}
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 { HiddenUI } from '../types/widget.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?.includes(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":";;;;;;;;;;;AAaA,MAAa,oBACX,iBACA,UACA,eACA,WAQG;CACH,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,EACJ,WACA,WAAW,iBACX,oBACE,UAAU,UAAU,QAAQ,gBAAgB,KAAA,IAAY,gBAAgB;CAE5E,MAAM,EAAE,MAAM,uBAAuB,WAAW,sBAC9C,wBAAwB,iBAAiB,UAAU,eAAe,UAAU;CAK9E,MAAM,EAAE,MAAM,uBAAuB,WAAW,4BAC9C,wBAAwB,uBAHxB,QAAQ,sBAAsB,IAAI,CAAC,kBAGoC;CAEzE,MAAM,EAAE,QAAQ,iBAAiB,iBAAiB;CAClD,MAAM,EAAE,0BAA0B,YAAY,CAAC,wBAAwB,CAAC;CAExE,MAAM,eAAe,sBAAsB,UAAU,MAAM,aAAa;CAExE,MAAM,oBACH,2BAA2B,sBAC5B,CAAC,uBAAuB;CAG1B,MAAM,gBAAgB,cAAc;EAClC,IAAI,eAAe;GAEjB,MAAM,YAA8D,EAAE;GACtE,OAAO,QAAQ,aAAa,CAAC,SAAS,CAAC,YAAY,eAAe;IAChE,MAAM,UAAU,OAAO,SAAS,YAAY,GAAG;IAC/C,UAAU,SAAS,YAAY;KAC7B,UAAU,KAAK;MAAE;MAAS,cAAc;MAAS,CAAC;MAClD;KACF;GACF,MAAM,YAAY,IAAI,IACpB,UAAU,KAAK,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,aAAa,aAAa,GAAG,CACrE;GACD,QAAQ,SAAiB,iBAAyB;IAChD,MAAM,MAAM,GAAG,QAAQ,GAAG,aAAa,aAAa;IACpD,OAAO,UAAU,IAAI,IAAI;;SAEtB,IAAI,iBAAiB;GAE1B,MAAM,oBAAoB,aAAa,oBAAoB,EAAE;GAC7D,MAAM,YAAY,IAAI,IACpB,kBAAkB,KAAK,SAAS,KAAK,aAAa,CAAC,CACpD;GACD,QAAQ,SAAiB,iBAAyB;IAChD,OACE,YAAY,mBACZ,UAAU,IAAI,aAAa,aAAa,CAAC;;;IAK9C;EAAC;EAAe;EAAiB;EAAa,CAAC;CAElD,MAAM,sBAAsB,cAAc;EAMxC,QALsB,gBAClB,OAAO,OAAO,aAAa,EAAE,CAAC,CAAC,MAAM,GACrC,kBACE,YAAY,mBACZ,KAAA,IACgB,QAAQ,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;IAClE;EAAC;EAAW;EAAe;EAAiB;EAAO,CAAC;CAEvD,MAAM,8BAA8B,cAAc;EAChD,MAAM,kBAAkB,gBACpB,wBACA,kBACE,uBAAuB,QAAQ,MAAM,EAAE,YAAY,gBAAgB,GACnE,KAAA;EACN,MAAM,qBAAqB,IAAI,IAC7B,qBAAqB,KAClB,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,aAAa,GAC/C,IAAI,EAAE,CACR;EAED,MAAM,oBACJ,CAAC,CAAC,yBAAyB,CAAC,UAAU,SAAA,oBAAoC;EAC5E,MAAM,YAAY,oBACd,OAAO,WAAW,sBAAsB,GACxC,KAAA;EAEJ,IAAI,CAAC,iBACH;EAGF,OAAO,gBAAgB,QAAgC,KAAK,UAAU;GACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,aAAa;GAEhE,MAAM,oBAAoB,mBAAmB,IAAI,SAAS,IAAI,MAAM;GAEpE,MAAM,gBAAgB,cAAc,OAAO,OAAO;GAGlD,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,SAEM,GAAG,WACf,iBAAiB;KACf,GAAG;KACH,QAAQ;KACT;;GAIL,IAAI,KAAK,eAAe;GACxB,OAAO;KACN,EAAE,CAAC;IACL;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,iBAAiB,gBAAgB,qBAAqB,cAAc;EAC1E,OAAO,qBACL,kBACA,iBAAiB,CAAC,CAAC,QACnB,cACA,iBACA,qBACA,6BACA,cACD;IACA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,OAAO;EACL,QAAQ,mBAAmB,EAAE;EAC7B;EACA;EACA;EACA;EACA;EACD"}
@@ -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,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAChC,MAAM,oBAAoB,OAAsB,KAAK;AA8ErD,QA9Ce,WAAW;EACxB,SA/BkB,cAAc;AAChC,OAAI,CAAC,mBACH,QAAO,EAAE;AAEX,UAAO,OAAO,QAAQ,mBAAmB,CAAC,SACvC,CAAC,gBAAgB,iBAChB,OAAO,QAAQ,YAAY,CAAC,KAAK,CAAC,YAAY,YAAY;IACxD,MAAM,UAAU,OAAO,WAAW;AAClC,WAAO;KACL,UAAU;MACR,YAAY,kBAAkB,UAAU;MACxC;MACA;MACA,OAAO;MACR;KACD,SAAS,YAA4C;AACnD,UAAI,CAAC,kBAAkB,CAAC,OACtB,QAAO,EAAE;AAEX,aAAO,MAAM,iBAAiB,WAAW,gBAAgB,OAAO;;KAElE,SAAS;KACT,iBAAiB;KACjB,WAAW;KACX,kBAAkB;KACnB;KACD,CACL;KACA;GAAC;GAAoB;GAAyB;GAAW;GAAU,CAGhD;EACpB,UAAU,YAAY;GACpB,MAAM,MAAM,KAAK,KAAK;AAGtB,OAD0B,QAAQ,MAAM,WAAW,OAAO,UACrC,IAAI,kBAAkB,YAAY,KACrD,mBAAkB,UAAU;GAG9B,MAAM,cAAc,QAAQ,OACzB,WAAW,OAAO,aAAa,OAAO,QACxC;AAGD,OAAI,YACF,mBAAkB,UAAU;GAI9B,MAAM,iBAAiB,kBAAkB,UACrC,MAAM,kBAAkB,UACxB;AAKJ,OAF4B,eAAe,kBAAkB,IAM3D,QAAO;IACL,MAJ0B,QACzB,SAAS,WAAW,OAAO,QAAQ,EAAE,CAAC,CACtC,QAAQ,UAAU,MAAM,OAErB;IACJ,WAAW,CAAC;IACZ,SAAS,QAAQ,MAAM,WAAW,OAAO,QAAQ;IAClD;AAGH,UAAO;IACL,MAAM,KAAA;IACN,WAAW;IACX,SAAS;IACV;;EAEJ,CAEY"}
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,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAChC,MAAM,oBAAoB,OAAsB,KAAK;CA8ErD,OA9Ce,WAAW;EACxB,SA/BkB,cAAc;GAChC,IAAI,CAAC,oBACH,OAAO,EAAE;GAEX,OAAO,OAAO,QAAQ,mBAAmB,CAAC,SACvC,CAAC,gBAAgB,iBAChB,OAAO,QAAQ,YAAY,CAAC,KAAK,CAAC,YAAY,YAAY;IACxD,MAAM,UAAU,OAAO,WAAW;IAClC,OAAO;KACL,UAAU;MACR,YAAY,kBAAkB,UAAU;MACxC;MACA;MACA,OAAO;MACR;KACD,SAAS,YAA4C;MACnD,IAAI,CAAC,kBAAkB,CAAC,QACtB,OAAO,EAAE;MAEX,OAAO,MAAM,iBAAiB,WAAW,gBAAgB,OAAO;;KAElE,SAAS;KACT,iBAAiB;KACjB,WAAW;KACX,kBAAkB;KACnB;KACD,CACL;KACA;GAAC;GAAoB;GAAyB;GAAW;GAAU,CAGhD;EACpB,UAAU,YAAY;GACpB,MAAM,MAAM,KAAK,KAAK;GAGtB,IAD0B,QAAQ,MAAM,WAAW,OAAO,UACrC,IAAI,kBAAkB,YAAY,MACrD,kBAAkB,UAAU;GAG9B,MAAM,cAAc,QAAQ,OACzB,WAAW,OAAO,aAAa,OAAO,QACxC;GAGD,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,EAAE,CAAC,CACtC,QAAQ,UAAU,MAAM,OAErB;IACJ,WAAW,CAAC;IACZ,SAAS,QAAQ,MAAM,WAAW,OAAO,QAAQ;IAClD;GAGH,OAAO;IACL,MAAM,KAAA;IACN,WAAW;IACX,SAAS;IACV;;EAEJ,CAEY"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenRateText.js","names":[],"sources":["../../../src/hooks/useTokenRateText.ts"],"sourcesContent":["import { formatUnits, type RouteExtended } from '@lifi/sdk'\nimport type { MouseEventHandler } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { create } from 'zustand'\n\ninterface TokenRateState {\n isForward: boolean\n toggleIsForward(): void\n}\n\nconst useTokenRateStore = create<TokenRateState>((set) => ({\n isForward: true,\n toggleIsForward: () => set((state) => ({ isForward: !state.isForward })),\n}))\n\nexport function useTokenRateText(route: RouteExtended): {\n rateText: string\n toggleRate: MouseEventHandler\n} {\n const { t } = useTranslation()\n const { isForward, toggleIsForward } = useTokenRateStore()\n\n const lastStep = route.steps.at(-1)\n\n const fromToken = {\n ...route.fromToken,\n amount: BigInt(route.fromAmount),\n }\n const toToken = {\n ...(lastStep?.execution?.toToken ??\n lastStep?.action.toToken ??\n route.toToken),\n amount: lastStep?.execution?.toAmount\n ? BigInt(lastStep.execution.toAmount)\n : BigInt(route.toAmount),\n }\n\n const fromToRate =\n Number.parseFloat(formatUnits(toToken.amount!, toToken.decimals)) /\n Number.parseFloat(formatUnits(fromToken.amount!, fromToken.decimals))\n const toFromRate =\n Number.parseFloat(formatUnits(fromToken.amount!, fromToken.decimals)) /\n Number.parseFloat(formatUnits(toToken.amount!, toToken.decimals))\n\n const rateText = isForward\n ? `1 ${fromToken.symbol} ≈ ${t('format.tokenAmount', { value: fromToRate })} ${toToken.symbol}`\n : `1 ${toToken.symbol} ≈ ${t('format.tokenAmount', { value: toFromRate })} ${fromToken.symbol}`\n\n const toggleRate: MouseEventHandler = (e) => {\n e.stopPropagation()\n toggleIsForward()\n }\n\n return { rateText: rateText, toggleRate: toggleRate }\n}\n"],"mappings":";;;;AAUA,MAAM,oBAAoB,QAAwB,SAAS;CACzD,WAAW;CACX,uBAAuB,KAAK,WAAW,EAAE,WAAW,CAAC,MAAM,WAAW,EAAE;CACzE,EAAE;AAEH,SAAgB,iBAAiB,OAG/B;CACA,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,WAAW,oBAAoB,mBAAmB;CAE1D,MAAM,WAAW,MAAM,MAAM,GAAG,GAAG;CAEnC,MAAM,YAAY;EAChB,GAAG,MAAM;EACT,QAAQ,OAAO,MAAM,WAAW;EACjC;CACD,MAAM,UAAU;EACd,GAAI,UAAU,WAAW,WACvB,UAAU,OAAO,WACjB,MAAM;EACR,QAAQ,UAAU,WAAW,WACzB,OAAO,SAAS,UAAU,SAAS,GACnC,OAAO,MAAM,SAAS;EAC3B;CAED,MAAM,aACJ,OAAO,WAAW,YAAY,QAAQ,QAAS,QAAQ,SAAS,CAAC,GACjE,OAAO,WAAW,YAAY,UAAU,QAAS,UAAU,SAAS,CAAC;CACvE,MAAM,aACJ,OAAO,WAAW,YAAY,UAAU,QAAS,UAAU,SAAS,CAAC,GACrE,OAAO,WAAW,YAAY,QAAQ,QAAS,QAAQ,SAAS,CAAC;CAEnE,MAAM,WAAW,YACb,KAAK,UAAU,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,YAAY,CAAC,CAAC,GAAG,QAAQ,WACrF,KAAK,QAAQ,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,YAAY,CAAC,CAAC,GAAG,UAAU;CAEzF,MAAM,cAAiC,MAAM;AAC3C,IAAE,iBAAiB;AACnB,mBAAiB;;AAGnB,QAAO;EAAY;EAAsB;EAAY"}
1
+ {"version":3,"file":"useTokenRateText.js","names":[],"sources":["../../../src/hooks/useTokenRateText.ts"],"sourcesContent":["import { formatUnits, type RouteExtended } from '@lifi/sdk'\nimport type { MouseEventHandler } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { create } from 'zustand'\n\ninterface TokenRateState {\n isForward: boolean\n toggleIsForward(): void\n}\n\nconst useTokenRateStore = create<TokenRateState>((set) => ({\n isForward: true,\n toggleIsForward: () => set((state) => ({ isForward: !state.isForward })),\n}))\n\nexport function useTokenRateText(route: RouteExtended): {\n rateText: string\n toggleRate: MouseEventHandler\n} {\n const { t } = useTranslation()\n const { isForward, toggleIsForward } = useTokenRateStore()\n\n const lastStep = route.steps.at(-1)\n\n const fromToken = {\n ...route.fromToken,\n amount: BigInt(route.fromAmount),\n }\n const toToken = {\n ...(lastStep?.execution?.toToken ??\n lastStep?.action.toToken ??\n route.toToken),\n amount: lastStep?.execution?.toAmount\n ? BigInt(lastStep.execution.toAmount)\n : BigInt(route.toAmount),\n }\n\n const fromToRate =\n Number.parseFloat(formatUnits(toToken.amount!, toToken.decimals)) /\n Number.parseFloat(formatUnits(fromToken.amount!, fromToken.decimals))\n const toFromRate =\n Number.parseFloat(formatUnits(fromToken.amount!, fromToken.decimals)) /\n Number.parseFloat(formatUnits(toToken.amount!, toToken.decimals))\n\n const rateText = isForward\n ? `1 ${fromToken.symbol} ≈ ${t('format.tokenAmount', { value: fromToRate })} ${toToken.symbol}`\n : `1 ${toToken.symbol} ≈ ${t('format.tokenAmount', { value: toFromRate })} ${fromToken.symbol}`\n\n const toggleRate: MouseEventHandler = (e) => {\n e.stopPropagation()\n toggleIsForward()\n }\n\n return { rateText: rateText, toggleRate: toggleRate }\n}\n"],"mappings":";;;;AAUA,MAAM,oBAAoB,QAAwB,SAAS;CACzD,WAAW;CACX,uBAAuB,KAAK,WAAW,EAAE,WAAW,CAAC,MAAM,WAAW,EAAE;CACzE,EAAE;AAEH,SAAgB,iBAAiB,OAG/B;CACA,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,WAAW,oBAAoB,mBAAmB;CAE1D,MAAM,WAAW,MAAM,MAAM,GAAG,GAAG;CAEnC,MAAM,YAAY;EAChB,GAAG,MAAM;EACT,QAAQ,OAAO,MAAM,WAAW;EACjC;CACD,MAAM,UAAU;EACd,GAAI,UAAU,WAAW,WACvB,UAAU,OAAO,WACjB,MAAM;EACR,QAAQ,UAAU,WAAW,WACzB,OAAO,SAAS,UAAU,SAAS,GACnC,OAAO,MAAM,SAAS;EAC3B;CAED,MAAM,aACJ,OAAO,WAAW,YAAY,QAAQ,QAAS,QAAQ,SAAS,CAAC,GACjE,OAAO,WAAW,YAAY,UAAU,QAAS,UAAU,SAAS,CAAC;CACvE,MAAM,aACJ,OAAO,WAAW,YAAY,UAAU,QAAS,UAAU,SAAS,CAAC,GACrE,OAAO,WAAW,YAAY,QAAQ,QAAS,QAAQ,SAAS,CAAC;CAEnE,MAAM,WAAW,YACb,KAAK,UAAU,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,YAAY,CAAC,CAAC,GAAG,QAAQ,WACrF,KAAK,QAAQ,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,YAAY,CAAC,CAAC,GAAG,UAAU;CAEzF,MAAM,cAAiC,MAAM;EAC3C,EAAE,iBAAiB;EACnB,iBAAiB;;CAGnB,OAAO;EAAY;EAAsB;EAAY"}
@@ -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,gBAAgB;CACpC,MAAM,EAAE,QAAQ,cAAc,cAAc,iBAAiB;CAC7D,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,UAAU;GAAE;GAAS;GAAW;EACvE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,QACD,CACF;AAED,OAAI,OAAO;AAcT,QACE,CAAC,kBAAkB,OAbQ,kBAC3B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,EAAE,YAAY,MAAM,QAAQ,CAC1C,KAAK,MAAM,EAAE,QAAQ,aAAa,CAAC,CACvC,EACH,SAK8C,EAAE,WAAW,MACzD,EAAE,QAAQ,aAAa,CACxB,CAED,QAAO;AAIT,gBAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,UAAU,CAAC,EAAE,GAC/C,SAAS;AACR,SAAI,CAAC,KACH,QAAO;KAET,MAAM,cAAc,KAAK;AACzB,SACE,aAAa,MACV,MAAM,EAAE,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,CAC/D,CAED,QAAO;AAGT,YAAO;MACL,GAAG;OACF,UAAoB,CACnB,GAAI,eAAe,EAAE,EACrB;OAAE,GAAG;OAAO,UAAU;OAAO,CAC9B;MACF;MAEJ;;AAEH,UAAO;;EAGT,SAAS,QAAQ,WAAW,cAAc,QAAQ;EAClD,OAAO;EACR,CAAC;AACF,QAAO;EACL,OAAO,QAAQ,KAAA;EACf;EACD"}
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,gBAAgB;CACpC,MAAM,EAAE,QAAQ,cAAc,cAAc,iBAAiB;CAC7D,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,UAAU;GAAE;GAAS;GAAW;EACvE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,QACD,CACF;GAED,IAAI,OAAO;IAcT,IACE,CAAC,kBAAkB,OAbQ,kBAC3B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,EAAE,YAAY,MAAM,QAAQ,CAC1C,KAAK,MAAM,EAAE,QAAQ,aAAa,CAAC,CACvC,EACH,SAK8C,EAAE,WAAW,MACzD,EAAE,QAAQ,aAAa,CACxB,EAED,OAAO;IAIT,YAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,UAAU,CAAC,EAAE,GAC/C,SAAS;KACR,IAAI,CAAC,MACH,OAAO;KAET,MAAM,cAAc,KAAK;KACzB,IACE,aAAa,MACV,MAAM,EAAE,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,CAC/D,EAED,OAAO;KAGT,OAAO;MACL,GAAG;OACF,UAAoB,CACnB,GAAI,eAAe,EAAE,EACrB;OAAE,GAAG;OAAO,UAAU;OAAO,CAC9B;MACF;MAEJ;;GAEH,OAAO;;EAGT,SAAS,QAAQ,WAAW,cAAc,QAAQ;EAClD,OAAO;EACR,CAAC;CACF,OAAO;EACL,OAAO,QAAQ,KAAA;EACf;EACD"}
@@ -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,iBAAiB;CACrB,MAAM,YAAY,cAAc;CAChC,MAAM,EAAE,4BAA4B,yBAAyB;CAG7D,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,UAAU,CAAC;EAC5C,SAAS,OAAO,EAAE,aAAa;GAS7B,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE,YAXe;KACjB,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACX,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,MAAM,CAKvD;IACV,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;IACd,EACD,EAAE,QAAQ,CACX;AAUD,UAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,OAAO,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;IAAM,EAAE,CACtD,CAAC,CAGS;;EAEf;EACA,WAAW;EACZ,CAAC;CAGF,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GAAC,YAAY,iBAAiB,UAAU;GAAE;GAAQ;GAAQ;EACpE,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;KACX,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,MAAM,CAKvD;IACV,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;IACd,EACD,EAAE,QAAQ,CACX;GAGD,IAAI,WAAW;AACf,OAAI,CAAC,UAAU;IACb,MAAM,YAAY,wBAAwB,YAAY;AACtD,QAAI,aAAa,aAAa,sBAC5B,YAAW,sBAAsB;;AAMrC,OAAI,YAAY;QAEV,EADmB,eAAe,OAAO,aAAa,EAAE,EACxC,QAAQ;KAC1B,MAAM,QAAQ,MAAM,SAAS,WAAW,UAAU,aAAa,EAC7D,QACD,CAAC;AACF,SAAI,MACF,gBAAe,OAAO,YAAY,CAAC,MAAM;;;AAa/C,UAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,OAAO,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;IAAO,EAAE,CACvD,CAAC,CAGS;;EAEf,SAAS,CAAC,CAAC;EACX;EACA,WAAW;EACZ,CAAC;AAQF,QAAO;EACL,WANgB,cAAc;AAE9B,UAAO,oBADQ,8BAA8B,gBAAgB,aAC5B,EAAE,cAAc,cAAc,SAAS;KACvE;GAAC;GAAgB;GAAc;GAAc;GAAc;GAAS,CAG5D;EACT;EACA;EACD"}
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,iBAAiB;CACrB,MAAM,YAAY,cAAc;CAChC,MAAM,EAAE,4BAA4B,yBAAyB;CAG7D,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,UAAU,CAAC;EAC5C,SAAS,OAAO,EAAE,aAAa;GAS7B,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE,YAXe;KACjB,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACV,UAAU;KACX,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,MAAM,CAKvD;IACV,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;IACd,EACD,EAAE,QAAQ,CACX;GAUD,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,OAAO,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;IAAM,EAAE,CACtD,CAAC,CAGS;;EAEf;EACA,WAAW;EACZ,CAAC;CAGF,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GAAC,YAAY,iBAAiB,UAAU;GAAE;GAAQ;GAAQ;EACpE,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;KACX,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,MAAM,CAKvD;IACV,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;IACd,EACD,EAAE,QAAQ,CACX;GAGD,IAAI,WAAW;GACf,IAAI,CAAC,UAAU;IACb,MAAM,YAAY,wBAAwB,YAAY;IACtD,IAAI,aAAa,aAAa,uBAC5B,WAAW,sBAAsB;;GAMrC,IAAI,YAAY;QAEV,EADmB,eAAe,OAAO,aAAa,EAAE,EACxC,QAAQ;KAC1B,MAAM,QAAQ,MAAM,SAAS,WAAW,UAAU,aAAa,EAC7D,QACD,CAAC;KACF,IAAI,OACF,eAAe,OAAO,YAAY,CAAC,MAAM;;;GAa/C,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,OAAO,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,UAAU;IAAO,EAAE,CACvD,CAAC,CAGS;;EAEf,SAAS,CAAC,CAAC;EACX;EACA,WAAW;EACZ,CAAC;CAQF,OAAO;EACL,WANgB,cAAc;GAE9B,OAAO,oBADQ,8BAA8B,gBAAgB,aAC5B,EAAE,cAAc,cAAc,SAAS;KACvE;GAAC;GAAgB;GAAc;GAAc;GAAc;GAAS,CAG5D;EACT;EACA;EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTools.js","names":[],"sources":["../../../src/hooks/useTools.ts"],"sourcesContent":["import { getTools, type ToolsResponse } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStoreContext } from '../stores/settings/SettingsStore.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTools = (): { tools: ToolsResponse | undefined } => {\n const { bridges, exchanges, keyPrefix } = useWidgetConfig()\n const settingsStore = useSettingsStoreContext()\n const sdkClient = useSDKClient()\n\n const { data } = useQuery({\n queryKey: [\n getQueryKey('tools', keyPrefix),\n bridges?.allow,\n bridges?.deny,\n exchanges?.allow,\n exchanges?.deny,\n ],\n queryFn: async (): Promise<ToolsResponse> => {\n const tools = await getTools(sdkClient)\n const bridgesConfigSets = getConfigItemSets(\n bridges,\n (bridges) => new Set(bridges)\n )\n const exchangesConfigSets = getConfigItemSets(\n exchanges,\n (exchanges) => new Set(exchanges)\n )\n const result = {\n bridges: tools.bridges.filter((bridge) =>\n isItemAllowedForSets(bridge.key, bridgesConfigSets)\n ),\n exchanges: tools.exchanges.filter((exchange) =>\n isItemAllowedForSets(exchange.key, exchangesConfigSets)\n ),\n }\n const { initializeTools } = settingsStore.getState()\n initializeTools(\n 'Bridges',\n result.bridges.map((bridge) => bridge.key)\n )\n initializeTools(\n 'Exchanges',\n result.exchanges.map((exchange) => exchange.key)\n )\n return result\n },\n refetchInterval: 180_000,\n staleTime: 180_000,\n })\n\n return { tools: data }\n}\n"],"mappings":";;;;;;;;AAQA,MAAa,iBAAuD;CAClE,MAAM,EAAE,SAAS,WAAW,cAAc,iBAAiB;CAC3D,MAAM,gBAAgB,yBAAyB;CAC/C,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,SAAS,SAAS;EACxB,UAAU;GACR,YAAY,SAAS,UAAU;GAC/B,SAAS;GACT,SAAS;GACT,WAAW;GACX,WAAW;GACZ;EACD,SAAS,YAAoC;GAC3C,MAAM,QAAQ,MAAM,SAAS,UAAU;GACvC,MAAM,oBAAoB,kBACxB,UACC,YAAY,IAAI,IAAI,QAAQ,CAC9B;GACD,MAAM,sBAAsB,kBAC1B,YACC,cAAc,IAAI,IAAI,UAAU,CAClC;GACD,MAAM,SAAS;IACb,SAAS,MAAM,QAAQ,QAAQ,WAC7B,qBAAqB,OAAO,KAAK,kBAAkB,CACpD;IACD,WAAW,MAAM,UAAU,QAAQ,aACjC,qBAAqB,SAAS,KAAK,oBAAoB,CACxD;IACF;GACD,MAAM,EAAE,oBAAoB,cAAc,UAAU;AACpD,mBACE,WACA,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI,CAC3C;AACD,mBACE,aACA,OAAO,UAAU,KAAK,aAAa,SAAS,IAAI,CACjD;AACD,UAAO;;EAET,iBAAiB;EACjB,WAAW;EACZ,CAAC;AAEF,QAAO,EAAE,OAAO,MAAM"}
1
+ {"version":3,"file":"useTools.js","names":[],"sources":["../../../src/hooks/useTools.ts"],"sourcesContent":["import { getTools, type ToolsResponse } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStoreContext } from '../stores/settings/SettingsStore.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTools = (): { tools: ToolsResponse | undefined } => {\n const { bridges, exchanges, keyPrefix } = useWidgetConfig()\n const settingsStore = useSettingsStoreContext()\n const sdkClient = useSDKClient()\n\n const { data } = useQuery({\n queryKey: [\n getQueryKey('tools', keyPrefix),\n bridges?.allow,\n bridges?.deny,\n exchanges?.allow,\n exchanges?.deny,\n ],\n queryFn: async (): Promise<ToolsResponse> => {\n const tools = await getTools(sdkClient)\n const bridgesConfigSets = getConfigItemSets(\n bridges,\n (bridges) => new Set(bridges)\n )\n const exchangesConfigSets = getConfigItemSets(\n exchanges,\n (exchanges) => new Set(exchanges)\n )\n const result = {\n bridges: tools.bridges.filter((bridge) =>\n isItemAllowedForSets(bridge.key, bridgesConfigSets)\n ),\n exchanges: tools.exchanges.filter((exchange) =>\n isItemAllowedForSets(exchange.key, exchangesConfigSets)\n ),\n }\n const { initializeTools } = settingsStore.getState()\n initializeTools(\n 'Bridges',\n result.bridges.map((bridge) => bridge.key)\n )\n initializeTools(\n 'Exchanges',\n result.exchanges.map((exchange) => exchange.key)\n )\n return result\n },\n refetchInterval: 180_000,\n staleTime: 180_000,\n })\n\n return { tools: data }\n}\n"],"mappings":";;;;;;;;AAQA,MAAa,iBAAuD;CAClE,MAAM,EAAE,SAAS,WAAW,cAAc,iBAAiB;CAC3D,MAAM,gBAAgB,yBAAyB;CAC/C,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,SAAS,SAAS;EACxB,UAAU;GACR,YAAY,SAAS,UAAU;GAC/B,SAAS;GACT,SAAS;GACT,WAAW;GACX,WAAW;GACZ;EACD,SAAS,YAAoC;GAC3C,MAAM,QAAQ,MAAM,SAAS,UAAU;GACvC,MAAM,oBAAoB,kBACxB,UACC,YAAY,IAAI,IAAI,QAAQ,CAC9B;GACD,MAAM,sBAAsB,kBAC1B,YACC,cAAc,IAAI,IAAI,UAAU,CAClC;GACD,MAAM,SAAS;IACb,SAAS,MAAM,QAAQ,QAAQ,WAC7B,qBAAqB,OAAO,KAAK,kBAAkB,CACpD;IACD,WAAW,MAAM,UAAU,QAAQ,aACjC,qBAAqB,SAAS,KAAK,oBAAoB,CACxD;IACF;GACD,MAAM,EAAE,oBAAoB,cAAc,UAAU;GACpD,gBACE,WACA,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI,CAC3C;GACD,gBACE,aACA,OAAO,UAAU,KAAK,aAAa,SAAS,IAAI,CACjD;GACD,OAAO;;EAET,iBAAiB;EACjB,WAAW;EACZ,CAAC;CAEF,OAAO,EAAE,OAAO,MAAM"}
@@ -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,YAAY;CAC1C,MAAM,cAAc,gBAAgB;CACpC,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAEhC,MAAM,6BAA6B,cAC3B,YAAY,uBAAuB,UAAU,EACnD,CAAC,UAAU,CACZ;CAED,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU,CAAC,4BAA4B,gBAAgB;EACvD,SAAS,OAAO,EAAE,UAAU,GAAG,kBAAkB,aAAa;AAC5D,OAAI,iBAAiB;AACnB,SAAK,MAAM,WAAW,UAAU;KAM9B,MAAM,cALgB,YAAY,aAA+B,CAC/D,4BACA,QAAQ,QACT,CAEgC,EAAE,MAChC,MAAM,EAAE,QAAQ,WAAW,gBAC7B;AAED,SAAI,YACF,QAAO;;IAIX,MAAM,cAAc,MAAM,UACxB,WACA,EACE,QAAQ,iBACT,EACD,EAAE,QAAQ,CACX;IAED,MAAM,cAAe,aAAgC;AAErD,QAAI,YACF,aAAY,aACV,CAAC,4BAA4B,YAAY,GACxC,SAAS;AACR,YAAO,CAAC,GAAG,MAAO,YAAa;MAElC;AAGH,WAAO;;;EAGX,iBAAiB;EACjB,SAAS,QAAQ,eAAe,QAAQ,gBAAgB;EACxD,mBAAmB;AACjB,QAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,cAAc,YACjB,aAA+B,CAC9B,4BACA,QAAQ,QACT,CAAC,EACA,MAAM,MAAM,EAAE,QAAQ,WAAW,gBAAgB;AACrD,QAAI,YACF,QAAO;;;EAIb,iBAAiB;EAClB,CAAC;AAEF,QAAO;EACL,aAAa;EACb;EACD"}
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,YAAY;CAC1C,MAAM,cAAc,gBAAgB;CACpC,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAEhC,MAAM,6BAA6B,cAC3B,YAAY,uBAAuB,UAAU,EACnD,CAAC,UAAU,CACZ;CAED,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU,CAAC,4BAA4B,gBAAgB;EACvD,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,QACT,CAEgC,EAAE,MAChC,MAAM,EAAE,QAAQ,WAAW,gBAC7B;KAED,IAAI,aACF,OAAO;;IAIX,MAAM,cAAc,MAAM,UACxB,WACA,EACE,QAAQ,iBACT,EACD,EAAE,QAAQ,CACX;IAED,MAAM,cAAe,aAAgC;IAErD,IAAI,aACF,YAAY,aACV,CAAC,4BAA4B,YAAY,GACxC,SAAS;KACR,OAAO,CAAC,GAAG,MAAO,YAAa;MAElC;IAGH,OAAO;;;EAGX,iBAAiB;EACjB,SAAS,QAAQ,eAAe,QAAQ,gBAAgB;EACxD,mBAAmB;GACjB,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,cAAc,YACjB,aAA+B,CAC9B,4BACA,QAAQ,QACT,CAAC,EACA,MAAM,MAAM,EAAE,QAAQ,WAAW,gBAAgB;IACrD,IAAI,aACF,OAAO;;;EAIb,iBAAiB;EAClB,CAAC;CAEF,OAAO;EACL,aAAa;EACb;EACD"}
@@ -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,+BAA+B;CAC7C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAChC,MAAM,EAAE,UAAU,UAAU;CAE5B,MAAM,EAAE,MAAM,iBAAiB,cAAc,WAAW;EACtD,SAAS,SAAS,KAAK,aAAa;GAClC,UAAU,CACR,YAAY,uBAAuB,UAAU,EAC7C,QAAQ,QACT;GACD,UAAU,OAAO,EAAE,UAAU,GAAG,iBAAiB,aAAa;AAC5D,QAAI,CAAC,eACH,QAAO,EAAE;IAEX,MAAM,uBAAO,IAAI,MAAM;AACvB,SAAK,YAAY,KAAK,aAAa,GAAG,GAAG;AAYzC,YAAO,MAVgB,sBACrB,WACA;KACE,QAAQ;KACR,eAAe,KAAK,MAAM,KAAK,SAAS,GAAG,IAAK;KAChD,aAAa,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;KAC3C,EACD,EAAE,QAAQ,CACX,EAEe;;GAElB,iBAAiB;GACjB,SAAS,QAAQ,QAAQ,QAAQ;GAClC,EAAE;EACH,UAAU,YAAY;GACpB,MAAM,qCAAqB,IAAI,KAA6B;AAC5D,WAAQ,SAAS,WAAW;AAC1B,QAAI,OAAO,KACT,QAAO,KAAK,SAAS,gBAAgB;AACnC,SACG,aAAgC,iBAChC,aAAgC,WAAW,WAC5C,aAAa,QAAQ,QAErB,oBAAmB,IAChB,YAA+B,eAChC,YACD;MAEH;KAEJ;AAWF,UAAO;IACL,MAVW,MAAM,KAAK,mBAAmB,QAAQ,CAAC,CAAC,SAClD,gBAAgB;KACf,MAAM,iBAAiB,wBACrB,aACA,MACD;AACD,YAAO,iBAAiB,CAAC,eAAe,GAAG,EAAE;MAI3C;IACJ,WAAW,QAAQ,MAAM,WAAW,OAAO,UAAU;IACtD;;EAEJ,CAAC;CAGF,MAAM,cAAc,cACZ,IAAI,IAAI,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,MAAM,CAAC,CAAC,EACnE,CAAC,gBAAgB,CAClB;AAKD,iBAAgB;AACd,MAAI,CAAC,YAAY,KACf;EAEF,MAAM,EAAE,QAAQ,gBAAgB,MAAM,UAAU;AAChD,OAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,OAAO,EAAE;GACzD,MAAM,SAAS,gBACZ,gBAA+C,MACjD;AACD,OAAI,UAAU,YAAY,IAAI,OAAO,CACnC,aAAY,GAAG;;IAGlB,CAAC,aAAa,MAAM,CAAC;AAExB,QAAO;EACL,MAAM;EACN;EACD"}
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,+BAA+B;CAC7C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,cAAc,iBAAiB;CACvC,MAAM,YAAY,cAAc;CAChC,MAAM,EAAE,UAAU,UAAU;CAE5B,MAAM,EAAE,MAAM,iBAAiB,cAAc,WAAW;EACtD,SAAS,SAAS,KAAK,aAAa;GAClC,UAAU,CACR,YAAY,uBAAuB,UAAU,EAC7C,QAAQ,QACT;GACD,UAAU,OAAO,EAAE,UAAU,GAAG,iBAAiB,aAAa;IAC5D,IAAI,CAAC,gBACH,OAAO,EAAE;IAEX,MAAM,uBAAO,IAAI,MAAM;IACvB,KAAK,YAAY,KAAK,aAAa,GAAG,GAAG;IAYzC,QAAO,MAVgB,sBACrB,WACA;KACE,QAAQ;KACR,eAAe,KAAK,MAAM,KAAK,SAAS,GAAG,IAAK;KAChD,aAAa,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;KAC3C,EACD,EAAE,QAAQ,CACX,EAEe;;GAElB,iBAAiB;GACjB,SAAS,QAAQ,QAAQ,QAAQ;GAClC,EAAE;EACH,UAAU,YAAY;GACpB,MAAM,qCAAqB,IAAI,KAA6B;GAC5D,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,YACD;MAEH;KAEJ;GAWF,OAAO;IACL,MAVW,MAAM,KAAK,mBAAmB,QAAQ,CAAC,CAAC,SAClD,gBAAgB;KACf,MAAM,iBAAiB,wBACrB,aACA,MACD;KACD,OAAO,iBAAiB,CAAC,eAAe,GAAG,EAAE;MAI3C;IACJ,WAAW,QAAQ,MAAM,WAAW,OAAO,UAAU;IACtD;;EAEJ,CAAC;CAGF,MAAM,cAAc,cACZ,IAAI,IAAI,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,MAAM,CAAC,CAAC,EACnE,CAAC,gBAAgB,CAClB;CAKD,gBAAgB;EACd,IAAI,CAAC,YAAY,MACf;EAEF,MAAM,EAAE,QAAQ,gBAAgB,MAAM,UAAU;EAChD,KAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,OAAO,EAAE;GACzD,MAAM,SAAS,gBACZ,gBAA+C,MACjD;GACD,IAAI,UAAU,YAAY,IAAI,OAAO,EACnC,YAAY,GAAG;;IAGlB,CAAC,aAAa,MAAM,CAAC;CAExB,OAAO;EACL,MAAM;EACN;EACD"}
@@ -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,YAAY;CACjC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,QAAQ,EAChD,CAAC,SAAS,CACX;CAED,MAAM,EAAE,MAAM,oBAAoB,cAAc,uBAAuB;CACvE,MAAM,SAAS,uBAAuB,eAAe;AAkDrD,QAAO;EAAE,OAhDK,cAAqC;GACjD,MAAM,cAAc,IAAI,IACtB,mBAAmB,KAAK,MAAM,gBAAgB,EAAE,MAAM,CAAC,CACxD;GAED,MAAM,cAA4B,EAAE;GACpC,MAAM,aAA0B,EAAE;AAElC,QAAK,MAAM,KAAK,OAAO,OAAO,OAAO,EAAsB;AACzD,QAAI,CAAC,iBAAiB,SAAS,EAAE,MAAM,YAAY,CACjD;AAIF,QAAI,YAAY,IAAI,gBAAgB,EAAE,MAAM,CAAC,CAC3C;IAEF,MAAM,YAAY,EAAE,MAAM,MAAM,IAAI,WAAW,aAAa;AAC5D,QACE,EAAE,WAAA,KACF,EAAE,WAAA,EAEF,aAAY,KAAK;KAAE,MAAM;KAAU,SAAS,EAAE,MAAM;KAAI;KAAW,CAAC;aAC3D,YAAY,EAAE,QAAA,EAAkC,CACzD,YAAW,KAAK;KACd,MAAM;KACN,gBAAgB;KAChB,QAAQ,gBAAgB,EAAE,MAAM,IAAI;KAEpC;KACD,CAAC;;GAIN,MAAM,eAA8B,mBAAmB,KACpD,oBAAoB;IACnB,MAAM;IACN;IACA,QAAQ,gBAAgB,eAAe,MAAM,IAAI;IACjD,WAAW,eAAe,MAAM,MAAM,IAAI,WAAW,aAAa;IACnE,EACF;AAED,UAAO;IAAC,GAAG;IAAa,GAAG;IAAY,GAAG;IAAa,CAAC,MACrD,GAAG,MAAM,EAAE,YAAY,EAAE,UAC3B;KACA;GAAC;GAAkB;GAAoB;GAAO,CAEnC;EAAE;EAAW"}
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,YAAY;CACjC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,QAAQ,EAChD,CAAC,SAAS,CACX;CAED,MAAM,EAAE,MAAM,oBAAoB,cAAc,uBAAuB;CACvE,MAAM,SAAS,uBAAuB,eAAe;CAkDrD,OAAO;EAAE,OAhDK,cAAqC;GACjD,MAAM,cAAc,IAAI,IACtB,mBAAmB,KAAK,MAAM,gBAAgB,EAAE,MAAM,CAAC,CACxD;GAED,MAAM,cAA4B,EAAE;GACpC,MAAM,aAA0B,EAAE;GAElC,KAAK,MAAM,KAAK,OAAO,OAAO,OAAO,EAAsB;IACzD,IAAI,CAAC,iBAAiB,SAAS,EAAE,MAAM,YAAY,EACjD;IAIF,IAAI,YAAY,IAAI,gBAAgB,EAAE,MAAM,CAAC,EAC3C;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;KAAW,CAAC;SAC/D,IAAI,YAAY,EAAE,QAAA,EAAkC,EACzD,WAAW,KAAK;KACd,MAAM;KACN,gBAAgB;KAChB,QAAQ,gBAAgB,EAAE,MAAM,IAAI;KAEpC;KACD,CAAC;;GAIN,MAAM,eAA8B,mBAAmB,KACpD,oBAAoB;IACnB,MAAM;IACN;IACA,QAAQ,gBAAgB,eAAe,MAAM,IAAI;IACjD,WAAW,eAAe,MAAM,MAAM,IAAI,WAAW,aAAa;IACnE,EACF;GAED,OAAO;IAAC,GAAG;IAAa,GAAG;IAAY,GAAG;IAAa,CAAC,MACrD,GAAG,MAAM,EAAE,YAAY,EAAE,UAC3B;KACA;GAAC;GAAkB;GAAoB;GAAO,CAEnC;EAAE;EAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"useWideVariant.js","names":[],"sources":["../../../src/hooks/useWideVariant.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport { useMediaQuery } from '@mui/material'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\n\nconst defaultExpandableWidth = 852\n\nexport const useWideVariant = (): boolean => {\n const { variant, useRecommendedRoute } = useWidgetConfig()\n const expandableAllowed = useMediaQuery((theme: Theme) =>\n theme.breakpoints.up(defaultExpandableWidth)\n )\n return variant === 'wide' && expandableAllowed && !useRecommendedRoute\n}\n"],"mappings":";;;AAIA,MAAM,yBAAyB;AAE/B,MAAa,uBAAgC;CAC3C,MAAM,EAAE,SAAS,wBAAwB,iBAAiB;CAC1D,MAAM,oBAAoB,eAAe,UACvC,MAAM,YAAY,GAAG,uBAAuB,CAC7C;AACD,QAAO,YAAY,UAAU,qBAAqB,CAAC"}
1
+ {"version":3,"file":"useWideVariant.js","names":[],"sources":["../../../src/hooks/useWideVariant.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport { useMediaQuery } from '@mui/material'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\n\nconst defaultExpandableWidth = 852\n\nexport const useWideVariant = (): boolean => {\n const { variant, useRecommendedRoute } = useWidgetConfig()\n const expandableAllowed = useMediaQuery((theme: Theme) =>\n theme.breakpoints.up(defaultExpandableWidth)\n )\n return variant === 'wide' && expandableAllowed && !useRecommendedRoute\n}\n"],"mappings":";;;AAIA,MAAM,yBAAyB;AAE/B,MAAa,uBAAgC;CAC3C,MAAM,EAAE,SAAS,wBAAwB,iBAAiB;CAC1D,MAAM,oBAAoB,eAAe,UACvC,MAAM,YAAY,GAAG,uBAAuB,CAC7C;CACD,OAAO,YAAY,UAAU,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetChains.js","names":[],"sources":["../../../src/hooks/useWidgetChains.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport type { WidgetConfig } from '../types/widget.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nexport const useWidgetChains = (\n widgetConfig: WidgetConfig\n): {\n chains: ExtendedChain[] | undefined\n getChainById: (\n chainId?: number,\n chains?: ExtendedChain[]\n ) => ExtendedChain | undefined\n isLoading: boolean\n} => {\n return useAvailableChains(undefined, widgetConfig)\n}\n"],"mappings":";;AAIA,MAAa,mBACX,iBAQG;AACH,QAAO,mBAAmB,KAAA,GAAW,aAAa"}
1
+ {"version":3,"file":"useWidgetChains.js","names":[],"sources":["../../../src/hooks/useWidgetChains.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport type { WidgetConfig } from '../types/widget.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nexport const useWidgetChains = (\n widgetConfig: WidgetConfig\n): {\n chains: ExtendedChain[] | undefined\n getChainById: (\n chainId?: number,\n chains?: ExtendedChain[]\n ) => ExtendedChain | undefined\n isLoading: boolean\n} => {\n return useAvailableChains(undefined, widgetConfig)\n}\n"],"mappings":";;AAIA,MAAa,mBACX,iBAQG;CACH,OAAO,mBAAmB,KAAA,GAAW,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetEvents.js","names":[],"sources":["../../../src/hooks/useWidgetEvents.ts"],"sourcesContent":["import _mitt, { type Emitter, type EventHandlerMap, type EventType } from 'mitt'\nimport type { WidgetEvents } from '../types/events.js'\n\n// https://github.com/developit/mitt/issues/191\nconst mitt = _mitt as unknown as <Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>\n) => Emitter<Events>\n\nexport const widgetEvents: Emitter<WidgetEvents> = mitt<WidgetEvents>()\n\nexport const useWidgetEvents = (): Emitter<WidgetEvents> => {\n return widgetEvents\n}\n"],"mappings":";AAQA,MAAa,eAAsC,OAAoB;AAEvE,MAAa,wBAA+C;AAC1D,QAAO"}
1
+ {"version":3,"file":"useWidgetEvents.js","names":[],"sources":["../../../src/hooks/useWidgetEvents.ts"],"sourcesContent":["import _mitt, { type Emitter, type EventHandlerMap, type EventType } from 'mitt'\nimport type { WidgetEvents } from '../types/events.js'\n\n// https://github.com/developit/mitt/issues/191\nconst mitt = _mitt as unknown as <Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>\n) => Emitter<Events>\n\nexport const widgetEvents: Emitter<WidgetEvents> = mitt<WidgetEvents>()\n\nexport const useWidgetEvents = (): Emitter<WidgetEvents> => {\n return widgetEvents\n}\n"],"mappings":";AAQA,MAAa,eAAsC,OAAoB;AAEvE,MAAa,wBAA+C;CAC1D,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveTransactionItem.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/ActiveTransactionItem.tsx"],"sourcesContent":["import { useNavigate } from '@tanstack/react-router'\nimport type { MouseEvent } from 'react'\nimport { ActiveTransactionCard } from '../../components/TransactionCard/ActiveTransactionCard.js'\nimport { TransactionCardSkeleton } from '../../components/TransactionCard/TransactionCardSkeleton.js'\nimport { useRouteExecution } from '../../hooks/useRouteExecution.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const ActiveTransactionItem: React.FC<{ routeId: string }> = ({\n routeId,\n}) => {\n const navigate = useNavigate()\n const { route, status, deleteRoute } = useRouteExecution({\n routeId,\n executeInBackground: true,\n })\n\n const lastActiveStep = route?.steps.findLast((step) => step.execution)\n\n if (!route || !lastActiveStep) {\n return <TransactionCardSkeleton active />\n }\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId },\n })\n }\n\n const handleDelete = (e: MouseEvent) => {\n e.stopPropagation()\n deleteRoute()\n }\n\n return (\n <ActiveTransactionCard\n route={route}\n status={status}\n onClick={handleClick}\n onDelete={handleDelete}\n />\n )\n}\n"],"mappings":";;;;;;;AAOA,MAAa,yBAAwD,EACnE,cACI;CACJ,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,OAAO,QAAQ,gBAAgB,kBAAkB;EACvD;EACA,qBAAqB;EACtB,CAAC;CAEF,MAAM,iBAAiB,OAAO,MAAM,UAAU,SAAS,KAAK,UAAU;AAEtE,KAAI,CAAC,SAAS,CAAC,eACb,QAAO,oBAAC,yBAAD,EAAyB,QAAA,MAAS,CAAA;CAG3C,MAAM,oBAAoB;AACxB,WAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS;GACpB,CAAC;;CAGJ,MAAM,gBAAgB,MAAkB;AACtC,IAAE,iBAAiB;AACnB,eAAa;;AAGf,QACE,oBAAC,uBAAD;EACS;EACC;EACR,SAAS;EACT,UAAU;EACV,CAAA"}
1
+ {"version":3,"file":"ActiveTransactionItem.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/ActiveTransactionItem.tsx"],"sourcesContent":["import { useNavigate } from '@tanstack/react-router'\nimport type { MouseEvent } from 'react'\nimport { ActiveTransactionCard } from '../../components/TransactionCard/ActiveTransactionCard.js'\nimport { TransactionCardSkeleton } from '../../components/TransactionCard/TransactionCardSkeleton.js'\nimport { useRouteExecution } from '../../hooks/useRouteExecution.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const ActiveTransactionItem: React.FC<{ routeId: string }> = ({\n routeId,\n}) => {\n const navigate = useNavigate()\n const { route, status, deleteRoute } = useRouteExecution({\n routeId,\n executeInBackground: true,\n })\n\n const lastActiveStep = route?.steps.findLast((step) => step.execution)\n\n if (!route || !lastActiveStep) {\n return <TransactionCardSkeleton active />\n }\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId },\n })\n }\n\n const handleDelete = (e: MouseEvent) => {\n e.stopPropagation()\n deleteRoute()\n }\n\n return (\n <ActiveTransactionCard\n route={route}\n status={status}\n onClick={handleClick}\n onDelete={handleDelete}\n />\n )\n}\n"],"mappings":";;;;;;;AAOA,MAAa,yBAAwD,EACnE,cACI;CACJ,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,OAAO,QAAQ,gBAAgB,kBAAkB;EACvD;EACA,qBAAqB;EACtB,CAAC;CAEF,MAAM,iBAAiB,OAAO,MAAM,UAAU,SAAS,KAAK,UAAU;CAEtE,IAAI,CAAC,SAAS,CAAC,gBACb,OAAO,oBAAC,yBAAD,EAAyB,QAAA,MAAS,CAAA;CAG3C,MAAM,oBAAoB;EACxB,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS;GACpB,CAAC;;CAGJ,MAAM,gBAAgB,MAAkB;EACtC,EAAE,iBAAiB;EACnB,aAAa;;CAGf,OACE,oBAAC,uBAAD;EACS;EACC;EACR,SAAS;EACT,UAAU;EACV,CAAA"}
@@ -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 = 3\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 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 if (!items.length && !isLoading) {\n return <TransactionHistoryEmpty />\n }\n\n return (\n <PageContainer disableGutters style={{ minHeight: 544 }}>\n <Box\n ref={parentRef}\n style={{ height: listHeight }}\n sx={{ overflow: 'auto', paddingX: 3 }}\n >\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 className=\"long-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,KAAK;CACrD,MAAM,EAAE,OAAO,cAAc,oBAAoB;CACjD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,QAAQ,EAChD,CAAC,SAAS,CACX;CACD,MAAM,iBAAiB,uBACrB,aACG,UACC,OAAO,OAAO,MAAM,OAAO,CAAC,MACzB,MACC,GAAG,WAAA,KACH,iBAAiB,SAAS,EAAE,MAAM,YAAY,CACjD,EACH,CAAC,iBAAiB,CACnB,CACF;AAED,WACE,EAAE,oBAAoB,EACtB,iBAAiB,oBAAC,0BAAD,EAA4B,CAAA,GAAG,KACjD;CAED,MAAM,EAAE,eAAe,cAAc,EACnC,eAAe,WAChB,CAAC;CAEF,MAAM,gBAAgB,MAAM,SAAS;CACrC,MAAM,gBAAgB,aAAa,gBAAgB,iBAAiB;CACpE,MAAM,aAAa,MAAM,SAAS;CAElC,MAAM,aAAa,aAChB,UAAkB;AACjB,MAAI,SAAS,MAAM,OACjB,QAAO,YAAY;EAErB,MAAM,OAAO,MAAM;AACnB,MAAI,KAAK,SAAS,SAChB,QAAO,UAAU,KAAK;AAExB,SAAO,GAAG,KAAK,KAAK,GAAG,KAAK,UAAU,KAAK,eAAe,MAAM;IAElE,CAAC,MAAM,CACR;CAED,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;EACD,CAAC;AAEF,KAAI,CAAC,MAAM,UAAU,CAAC,UACpB,QAAO,oBAAC,yBAAD,EAA2B,CAAA;AAGpC,QACE,oBAAC,eAAD;EAAe,gBAAA;EAAe,OAAO,EAAE,WAAW,KAAK;YACrD,oBAAC,KAAD;GACE,KAAK;GACL,OAAO,EAAE,QAAQ,YAAY;GAC7B,IAAI;IAAE,UAAU;IAAQ,UAAU;IAAG;aAEpC,aAAa,CAAC,gBACb,oBAAC,MAAD;IACE,gBAAA;IACA,IAAI;KACF,SAAS;KACT,eAAe;KACf,KAAK;KACL,cAAc;KACf;cAEA,MAAM,KAAK,EAAE,QAAQ,gBAAgB,CAAC,CAAC,KAAK,GAAG,UAC9C,oBAAC,yBAAD,EAAuC,EAAT,MAAS,CACvC;IACG,CAAA,GAEP,oBAAC,MAAD;IACE,WAAU;IACV,OAAO;KAAE,QAAQ,cAAc;KAAE,UAAU;KAAY;IACvD,gBAAA;cAEC,iBAAiB,CAAC,KAAK,SAAS;KAC/B,MAAM,WACJ,KAAK,QAAQ,MAAM,SAAS,MAAM,KAAK,SAAS;AAClD,YACE,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;OACZ;gBAEA,CAAC,WACA,oBAAC,yBAAD,EAA2B,CAAA,GACzB,SAAS,SAAS,WACpB,oBAAC,uBAAD,EAAuB,SAAS,SAAS,SAAW,CAAA,GAEpD,oBAAC,wBAAD;OACE,OAAO,SAAS,eAAe;OAC/B,MAAM,SAAS;OACf,iBAAiB,SAAS;OAC1B,WAAW,SAAS;OACpB,CAAA;MAED,EAzBE,KAAK,IAyBP;MAEP;IACG,CAAA;GAEL,CAAA;EACQ,CAAA"}
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 = 3\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 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 if (!items.length && !isLoading) {\n return <TransactionHistoryEmpty />\n }\n\n return (\n <PageContainer disableGutters style={{ minHeight: 544 }}>\n <Box\n ref={parentRef}\n style={{ height: listHeight }}\n sx={{ overflow: 'auto', paddingX: 3 }}\n >\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 className=\"long-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,KAAK;CACrD,MAAM,EAAE,OAAO,cAAc,oBAAoB;CACjD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,QAAQ,EAChD,CAAC,SAAS,CACX;CACD,MAAM,iBAAiB,uBACrB,aACG,UACC,OAAO,OAAO,MAAM,OAAO,CAAC,MACzB,MACC,GAAG,WAAA,KACH,iBAAiB,SAAS,EAAE,MAAM,YAAY,CACjD,EACH,CAAC,iBAAiB,CACnB,CACF;CAED,UACE,EAAE,oBAAoB,EACtB,iBAAiB,oBAAC,0BAAD,EAA4B,CAAA,GAAG,KACjD;CAED,MAAM,EAAE,eAAe,cAAc,EACnC,eAAe,WAChB,CAAC;CAEF,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;IAElE,CAAC,MAAM,CACR;CAED,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;EACD,CAAC;CAEF,IAAI,CAAC,MAAM,UAAU,CAAC,WACpB,OAAO,oBAAC,yBAAD,EAA2B,CAAA;CAGpC,OACE,oBAAC,eAAD;EAAe,gBAAA;EAAe,OAAO,EAAE,WAAW,KAAK;YACrD,oBAAC,KAAD;GACE,KAAK;GACL,OAAO,EAAE,QAAQ,YAAY;GAC7B,IAAI;IAAE,UAAU;IAAQ,UAAU;IAAG;aAEpC,aAAa,CAAC,gBACb,oBAAC,MAAD;IACE,gBAAA;IACA,IAAI;KACF,SAAS;KACT,eAAe;KACf,KAAK;KACL,cAAc;KACf;cAEA,MAAM,KAAK,EAAE,QAAQ,gBAAgB,CAAC,CAAC,KAAK,GAAG,UAC9C,oBAAC,yBAAD,EAAuC,EAAT,MAAS,CACvC;IACG,CAAA,GAEP,oBAAC,MAAD;IACE,WAAU;IACV,OAAO;KAAE,QAAQ,cAAc;KAAE,UAAU;KAAY;IACvD,gBAAA;cAEC,iBAAiB,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;OACZ;gBAEA,CAAC,WACA,oBAAC,yBAAD,EAA2B,CAAA,GACzB,SAAS,SAAS,WACpB,oBAAC,uBAAD,EAAuB,SAAS,SAAS,SAAW,CAAA,GAEpD,oBAAC,wBAAD;OACE,OAAO,SAAS,eAAe;OAC/B,MAAM,SAAS;OACf,iBAAiB,SAAS;OAC1B,WAAW,SAAS;OACpB,CAAA;MAED,EAzBE,KAAK,IAyBP;MAEP;IACG,CAAA;GAEL,CAAA;EACQ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActivitiesPageMenuButton.js","names":["DeleteOutlineIcon","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions"],"sources":["../../../../src/pages/ActivitiesPage/ActivitiesPageMenuButton.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport DeleteOutlineIcon from '@mui/icons-material/DeleteOutlined'\nimport { Button } from '@mui/material'\nimport { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { Dialog } from '../../components/Dialog/Dialog.js'\nimport {\n DialogActions,\n DialogContainer,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from '../../components/Dialog/Dialog.style.js'\nimport { useRouteExecutionStore } from '../../stores/routes/RouteExecutionStore.js'\n\nexport const ActivitiesPageMenuButton: React.FC = () => {\n const { t } = useTranslation()\n const [dialogOpen, setDialogOpen] = useState(false)\n const deleteRoutes = useRouteExecutionStore((store) => store.deleteRoutes)\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.flatMap((account) => account.address ?? []),\n [accounts]\n )\n\n const handleDialogOpen = () => setDialogOpen(true)\n const handleDialogClose = () => setDialogOpen(false)\n\n const handleRemoveAllFailed = () => {\n deleteRoutes('failed', accountAddresses)\n handleDialogClose()\n }\n\n return (\n <>\n <ContextMenu\n buttonSx={{ position: 'static', marginRight: -1.5 }}\n items={[\n {\n icon: <DeleteOutlineIcon />,\n label: t('button.clearAllFailed'),\n onClick: handleDialogOpen,\n },\n ]}\n />\n <Dialog open={dialogOpen} onClose={handleDialogClose}>\n <DialogContainer>\n <DialogTitle>\n {t('warning.title.clearFailedTransactions')}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n {t('warning.message.clearFailedTransactions')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleDialogClose}>{t('button.cancel')}</Button>\n <Button\n variant=\"contained\"\n onClick={handleRemoveAllFailed}\n autoFocus\n >\n {t('button.delete')}\n </Button>\n </DialogActions>\n </DialogContainer>\n </Dialog>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAgBA,MAAa,iCAA2C;CACtD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,eAAe,wBAAwB,UAAU,MAAM,aAAa;CAC1E,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,mBAAmB,cACjB,SAAS,SAAS,YAAY,QAAQ,WAAW,EAAE,CAAC,EAC1D,CAAC,SAAS,CACX;CAED,MAAM,yBAAyB,cAAc,KAAK;CAClD,MAAM,0BAA0B,cAAc,MAAM;CAEpD,MAAM,8BAA8B;AAClC,eAAa,UAAU,iBAAiB;AACxC,qBAAmB;;AAGrB,QACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,aAAD;EACE,UAAU;GAAE,UAAU;GAAU,aAAa;GAAM;EACnD,OAAO,CACL;GACE,MAAM,oBAACA,eAAD,EAAqB,CAAA;GAC3B,OAAO,EAAE,wBAAwB;GACjC,SAAS;GACV,CACF;EACD,CAAA,EACF,oBAACC,UAAD;EAAQ,MAAM;EAAY,SAAS;YACjC,qBAAC,iBAAD,EAAA,UAAA;GACE,oBAACC,eAAD,EAAA,UACG,EAAE,wCAAwC,EAC/B,CAAA;GACd,oBAACC,iBAAD,EAAA,UACE,oBAACC,qBAAD,EAAA,UACG,EAAE,0CAA0C,EAC3B,CAAA,EACN,CAAA;GAChB,qBAACC,iBAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IAAQ,SAAS;cAAoB,EAAE,gBAAgB;IAAU,CAAA,EACjE,oBAAC,QAAD;IACE,SAAQ;IACR,SAAS;IACT,WAAA;cAEC,EAAE,gBAAgB;IACZ,CAAA,CACK,EAAA,CAAA;GACA,EAAA,CAAA;EACX,CAAA,CACR,EAAA,CAAA"}
1
+ {"version":3,"file":"ActivitiesPageMenuButton.js","names":["DeleteOutlineIcon","Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions"],"sources":["../../../../src/pages/ActivitiesPage/ActivitiesPageMenuButton.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport DeleteOutlineIcon from '@mui/icons-material/DeleteOutlined'\nimport { Button } from '@mui/material'\nimport { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { Dialog } from '../../components/Dialog/Dialog.js'\nimport {\n DialogActions,\n DialogContainer,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from '../../components/Dialog/Dialog.style.js'\nimport { useRouteExecutionStore } from '../../stores/routes/RouteExecutionStore.js'\n\nexport const ActivitiesPageMenuButton: React.FC = () => {\n const { t } = useTranslation()\n const [dialogOpen, setDialogOpen] = useState(false)\n const deleteRoutes = useRouteExecutionStore((store) => store.deleteRoutes)\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.flatMap((account) => account.address ?? []),\n [accounts]\n )\n\n const handleDialogOpen = () => setDialogOpen(true)\n const handleDialogClose = () => setDialogOpen(false)\n\n const handleRemoveAllFailed = () => {\n deleteRoutes('failed', accountAddresses)\n handleDialogClose()\n }\n\n return (\n <>\n <ContextMenu\n buttonSx={{ position: 'static', marginRight: -1.5 }}\n items={[\n {\n icon: <DeleteOutlineIcon />,\n label: t('button.clearAllFailed'),\n onClick: handleDialogOpen,\n },\n ]}\n />\n <Dialog open={dialogOpen} onClose={handleDialogClose}>\n <DialogContainer>\n <DialogTitle>\n {t('warning.title.clearFailedTransactions')}\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n {t('warning.message.clearFailedTransactions')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleDialogClose}>{t('button.cancel')}</Button>\n <Button\n variant=\"contained\"\n onClick={handleRemoveAllFailed}\n autoFocus\n >\n {t('button.delete')}\n </Button>\n </DialogActions>\n </DialogContainer>\n </Dialog>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAgBA,MAAa,iCAA2C;CACtD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,eAAe,wBAAwB,UAAU,MAAM,aAAa;CAC1E,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,mBAAmB,cACjB,SAAS,SAAS,YAAY,QAAQ,WAAW,EAAE,CAAC,EAC1D,CAAC,SAAS,CACX;CAED,MAAM,yBAAyB,cAAc,KAAK;CAClD,MAAM,0BAA0B,cAAc,MAAM;CAEpD,MAAM,8BAA8B;EAClC,aAAa,UAAU,iBAAiB;EACxC,mBAAmB;;CAGrB,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,aAAD;EACE,UAAU;GAAE,UAAU;GAAU,aAAa;GAAM;EACnD,OAAO,CACL;GACE,MAAM,oBAACA,eAAD,EAAqB,CAAA;GAC3B,OAAO,EAAE,wBAAwB;GACjC,SAAS;GACV,CACF;EACD,CAAA,EACF,oBAACC,UAAD;EAAQ,MAAM;EAAY,SAAS;YACjC,qBAAC,iBAAD,EAAA,UAAA;GACE,oBAACC,eAAD,EAAA,UACG,EAAE,wCAAwC,EAC/B,CAAA;GACd,oBAACC,iBAAD,EAAA,UACE,oBAACC,qBAAD,EAAA,UACG,EAAE,0CAA0C,EAC3B,CAAA,EACN,CAAA;GAChB,qBAACC,iBAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IAAQ,SAAS;cAAoB,EAAE,gBAAgB;IAAU,CAAA,EACjE,oBAAC,QAAD;IACE,SAAQ;IACR,SAAS;IACT,WAAA;cAEC,EAAE,gBAAgB;IACZ,CAAA,CACK,EAAA,CAAA;GACA,EAAA,CAAA;EACX,CAAA,CACR,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionHistoryEmpty.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/TransactionHistoryEmpty.tsx"],"sourcesContent":["import ReceiptLongRounded from '@mui/icons-material/ReceiptLongRounded'\nimport { Container, Typography } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\n\nexport const TransactionHistoryEmpty: React.FC = () => {\n const { t } = useTranslation()\n return (\n <Container\n sx={{\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n paddingY: 12,\n }}\n >\n <Typography\n sx={{\n fontSize: 48,\n }}\n >\n <ReceiptLongRounded fontSize=\"inherit\" />\n </Typography>\n <Typography\n sx={{\n fontSize: 18,\n fontWeight: 700,\n }}\n >\n {t('info.title.emptyTransactionHistory')}\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n color: 'text.secondary',\n textAlign: 'center',\n mt: 2,\n }}\n >\n {t('info.message.emptyTransactionHistory')}\n </Typography>\n </Container>\n )\n}\n"],"mappings":";;;;;AAIA,MAAa,gCAA0C;CACrD,MAAM,EAAE,MAAM,gBAAgB;AAC9B,QACE,qBAAC,WAAD;EACE,IAAI;GACF,SAAS;GACT,MAAM;GACN,eAAe;GACf,YAAY;GACZ,gBAAgB;GAChB,UAAU;GACX;YARH;GAUE,oBAAC,YAAD;IACE,IAAI,EACF,UAAU,IACX;cAED,oBAAC,oBAAD,EAAoB,UAAS,WAAY,CAAA;IAC9B,CAAA;GACb,oBAAC,YAAD;IACE,IAAI;KACF,UAAU;KACV,YAAY;KACb;cAEA,EAAE,qCAAqC;IAC7B,CAAA;GACb,oBAAC,YAAD;IACE,IAAI;KACF,UAAU;KACV,OAAO;KACP,WAAW;KACX,IAAI;KACL;cAEA,EAAE,uCAAuC;IAC/B,CAAA;GACH"}
1
+ {"version":3,"file":"TransactionHistoryEmpty.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/TransactionHistoryEmpty.tsx"],"sourcesContent":["import ReceiptLongRounded from '@mui/icons-material/ReceiptLongRounded'\nimport { Container, Typography } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\n\nexport const TransactionHistoryEmpty: React.FC = () => {\n const { t } = useTranslation()\n return (\n <Container\n sx={{\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n paddingY: 12,\n }}\n >\n <Typography\n sx={{\n fontSize: 48,\n }}\n >\n <ReceiptLongRounded fontSize=\"inherit\" />\n </Typography>\n <Typography\n sx={{\n fontSize: 18,\n fontWeight: 700,\n }}\n >\n {t('info.title.emptyTransactionHistory')}\n </Typography>\n <Typography\n sx={{\n fontSize: 14,\n color: 'text.secondary',\n textAlign: 'center',\n mt: 2,\n }}\n >\n {t('info.message.emptyTransactionHistory')}\n </Typography>\n </Container>\n )\n}\n"],"mappings":";;;;;AAIA,MAAa,gCAA0C;CACrD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,OACE,qBAAC,WAAD;EACE,IAAI;GACF,SAAS;GACT,MAAM;GACN,eAAe;GACf,YAAY;GACZ,gBAAgB;GAChB,UAAU;GACX;YARH;GAUE,oBAAC,YAAD;IACE,IAAI,EACF,UAAU,IACX;cAED,oBAAC,oBAAD,EAAoB,UAAS,WAAY,CAAA;IAC9B,CAAA;GACb,oBAAC,YAAD;IACE,IAAI;KACF,UAAU;KACV,YAAY;KACb;cAEA,EAAE,qCAAqC;IAC7B,CAAA;GACb,oBAAC,YAAD;IACE,IAAI;KACF,UAAU;KACV,OAAO;KACP,WAAW;KACX,IAAI;KACL;cAEA,EAAE,uCAAuC;IAC/B,CAAA;GACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionHistoryItem.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/TransactionHistoryItem.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { useNavigate } from '@tanstack/react-router'\nimport { memo } from 'react'\nimport { TransactionCard } from '../../components/TransactionCard/TransactionCard.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const TransactionHistoryItem: React.FC<{\n route: RouteExtended\n type: 'local' | 'history'\n transactionHash: string\n // startedAt in ms\n startedAt: number\n}> = memo(({ route, type, transactionHash, startedAt }) => {\n const navigate = useNavigate()\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes.transactionDetails,\n search: type === 'history' ? { transactionHash } : { routeId: route.id },\n })\n }\n\n return (\n <TransactionCard\n route={route}\n date={new Date(startedAt)}\n onClick={handleClick}\n />\n )\n})\n"],"mappings":";;;;;;AAMA,MAAa,yBAMR,MAAM,EAAE,OAAO,MAAM,iBAAiB,gBAAgB;CACzD,MAAM,WAAW,aAAa;CAE9B,MAAM,oBAAoB;AACxB,WAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,SAAS,YAAY,EAAE,iBAAiB,GAAG,EAAE,SAAS,MAAM,IAAI;GACzE,CAAC;;AAGJ,QACE,oBAAC,iBAAD;EACS;EACP,MAAM,IAAI,KAAK,UAAU;EACzB,SAAS;EACT,CAAA;EAEJ"}
1
+ {"version":3,"file":"TransactionHistoryItem.js","names":[],"sources":["../../../../src/pages/ActivitiesPage/TransactionHistoryItem.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { useNavigate } from '@tanstack/react-router'\nimport { memo } from 'react'\nimport { TransactionCard } from '../../components/TransactionCard/TransactionCard.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const TransactionHistoryItem: React.FC<{\n route: RouteExtended\n type: 'local' | 'history'\n transactionHash: string\n // startedAt in ms\n startedAt: number\n}> = memo(({ route, type, transactionHash, startedAt }) => {\n const navigate = useNavigate()\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes.transactionDetails,\n search: type === 'history' ? { transactionHash } : { routeId: route.id },\n })\n }\n\n return (\n <TransactionCard\n route={route}\n date={new Date(startedAt)}\n onClick={handleClick}\n />\n )\n})\n"],"mappings":";;;;;;AAMA,MAAa,yBAMR,MAAM,EAAE,OAAO,MAAM,iBAAiB,gBAAgB;CACzD,MAAM,WAAW,aAAa;CAE9B,MAAM,oBAAoB;EACxB,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,SAAS,YAAY,EAAE,iBAAiB,GAAG,EAAE,SAAS,MAAM,IAAI;GACzE,CAAC;;CAGJ,OACE,oBAAC,iBAAD;EACS;EACP,MAAM,IAAI,KAAK,UAAU;EACzB,SAAS;EACT,CAAA;EAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"LanguagesPage.js","names":["ListItemText"],"sources":["../../../src/pages/LanguagesPage.tsx"],"sourcesContent":["import Check from '@mui/icons-material/Check'\nimport { List } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\nimport { ListItemText } from '../components/ListItemText.js'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SettingsListItemButton } from '../components/SettingsListItemButton.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useLanguages } from '../hooks/useLanguages.js'\nimport { languageNames } from '../providers/I18nProvider/constants.js'\n\nexport const LanguagesPage: React.FC = () => {\n const { t } = useTranslation()\n const { selectedLanguageCode, availableLanguages, setLanguageWithCode } =\n useLanguages()\n\n useHeader(t('language.title'))\n\n if (availableLanguages.length < 1) {\n return null\n }\n\n return (\n <PageContainer disableGutters>\n <List\n sx={{\n paddingTop: 0,\n paddingLeft: 1.5,\n paddingRight: 1.5,\n paddingBottom: 1.5,\n }}\n >\n {availableLanguages.map((language) => (\n <SettingsListItemButton\n key={language}\n onClick={() => setLanguageWithCode(language)}\n >\n <ListItemText\n primary={\n languageNames[language as keyof typeof languageNames] ||\n t('language.name', {\n lng: language,\n }) ||\n language\n }\n />\n {selectedLanguageCode === language && <Check color=\"primary\" />}\n </SettingsListItemButton>\n ))}\n </List>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,sBAAgC;CAC3C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,sBAAsB,oBAAoB,wBAChD,cAAc;AAEhB,WAAU,EAAE,iBAAiB,CAAC;AAE9B,KAAI,mBAAmB,SAAS,EAC9B,QAAO;AAGT,QACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,MAAD;GACE,IAAI;IACF,YAAY;IACZ,aAAa;IACb,cAAc;IACd,eAAe;IAChB;aAEA,mBAAmB,KAAK,aACvB,qBAAC,wBAAD;IAEE,eAAe,oBAAoB,SAAS;cAF9C,CAIE,oBAACA,gBAAD,EACE,SACE,cAAc,aACd,EAAE,iBAAiB,EACjB,KAAK,UACN,CAAC,IACF,UAEF,CAAA,EACD,yBAAyB,YAAY,oBAAC,OAAD,EAAO,OAAM,WAAY,CAAA,CACxC;MAblB,SAakB,CACzB;GACG,CAAA;EACO,CAAA"}
1
+ {"version":3,"file":"LanguagesPage.js","names":["ListItemText"],"sources":["../../../src/pages/LanguagesPage.tsx"],"sourcesContent":["import Check from '@mui/icons-material/Check'\nimport { List } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\nimport { ListItemText } from '../components/ListItemText.js'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SettingsListItemButton } from '../components/SettingsListItemButton.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useLanguages } from '../hooks/useLanguages.js'\nimport { languageNames } from '../providers/I18nProvider/constants.js'\n\nexport const LanguagesPage: React.FC = () => {\n const { t } = useTranslation()\n const { selectedLanguageCode, availableLanguages, setLanguageWithCode } =\n useLanguages()\n\n useHeader(t('language.title'))\n\n if (availableLanguages.length < 1) {\n return null\n }\n\n return (\n <PageContainer disableGutters>\n <List\n sx={{\n paddingTop: 0,\n paddingLeft: 1.5,\n paddingRight: 1.5,\n paddingBottom: 1.5,\n }}\n >\n {availableLanguages.map((language) => (\n <SettingsListItemButton\n key={language}\n onClick={() => setLanguageWithCode(language)}\n >\n <ListItemText\n primary={\n languageNames[language as keyof typeof languageNames] ||\n t('language.name', {\n lng: language,\n }) ||\n language\n }\n />\n {selectedLanguageCode === language && <Check color=\"primary\" />}\n </SettingsListItemButton>\n ))}\n </List>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,sBAAgC;CAC3C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,sBAAsB,oBAAoB,wBAChD,cAAc;CAEhB,UAAU,EAAE,iBAAiB,CAAC;CAE9B,IAAI,mBAAmB,SAAS,GAC9B,OAAO;CAGT,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,MAAD;GACE,IAAI;IACF,YAAY;IACZ,aAAa;IACb,cAAc;IACd,eAAe;IAChB;aAEA,mBAAmB,KAAK,aACvB,qBAAC,wBAAD;IAEE,eAAe,oBAAoB,SAAS;cAF9C,CAIE,oBAACA,gBAAD,EACE,SACE,cAAc,aACd,EAAE,iBAAiB,EACjB,KAAK,UACN,CAAC,IACF,UAEF,CAAA,EACD,yBAAyB,YAAY,oBAAC,OAAD,EAAO,OAAM,WAAY,CAAA,CACxC;MAblB,SAakB,CACzB;GACG,CAAA;EACO,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"MainPage.js","names":[],"sources":["../../../../src/pages/MainPage/MainPage.tsx"],"sourcesContent":["import { Box } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\nimport { AmountInput } from '../../components/AmountInput/AmountInput.js'\nimport { ContractComponent } from '../../components/ContractComponent/ContractComponent.js'\nimport { GasRefuelMessage } from '../../components/Messages/GasRefuelMessage.js'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { PoweredBy } from '../../components/PoweredBy/PoweredBy.js'\nimport { Routes } from '../../components/Routes/Routes.js'\nimport { SelectChainAndToken } from '../../components/SelectChainAndToken.js'\nimport { SendToWalletButton } from '../../components/SendToWallet/SendToWalletButton.js'\nimport { SendToWalletExpandButton } from '../../components/SendToWallet/SendToWalletExpandButton.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useWideVariant } from '../../hooks/useWideVariant.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { MainWarningMessages } from './MainWarningMessages.js'\nimport { ReviewButton } from './ReviewButton.js'\n\nexport const MainPage: React.FC = () => {\n const { t } = useTranslation()\n const wideVariant = useWideVariant()\n const { subvariant, subvariantOptions, contractComponent, hiddenUI } =\n useWidgetConfig()\n const custom = subvariant === 'custom'\n const showPoweredBy = !hiddenUI?.includes(HiddenUI.PoweredBy)\n const showGasRefuelMessage = !hiddenUI?.includes(HiddenUI.GasRefuelMessage)\n\n const splitTitle =\n subvariantOptions?.split === 'bridge'\n ? t('header.bridge')\n : subvariantOptions?.split === 'swap'\n ? t('header.swap')\n : undefined\n const title =\n subvariant === 'custom'\n ? t(`header.${subvariantOptions?.custom ?? 'checkout'}`)\n : subvariant === 'refuel'\n ? t('header.gas')\n : subvariant === 'split' && splitTitle\n ? splitTitle\n : t('header.exchange')\n\n useHeader(title)\n\n const marginSx = { marginBottom: 2 }\n\n return (\n <PageContainer>\n {custom ? (\n <ContractComponent sx={marginSx}>{contractComponent}</ContractComponent>\n ) : null}\n <SelectChainAndToken sx={marginSx} />\n {!custom || subvariantOptions?.custom === 'deposit' ? (\n <AmountInput formType=\"from\" sx={marginSx} />\n ) : null}\n {!wideVariant ? <Routes sx={marginSx} /> : null}\n <SendToWalletButton sx={marginSx} />\n {showGasRefuelMessage ? <GasRefuelMessage sx={marginSx} /> : null}\n <MainWarningMessages sx={marginSx} />\n <Box\n sx={{\n display: 'flex',\n mb: showPoweredBy ? 1 : 3,\n }}\n >\n <ReviewButton />\n <SendToWalletExpandButton />\n </Box>\n {showPoweredBy ? <PoweredBy /> : null}\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,MAAa,iBAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,cAAc,gBAAgB;CACpC,MAAM,EAAE,YAAY,mBAAmB,mBAAmB,aACxD,iBAAiB;CACnB,MAAM,SAAS,eAAe;CAC9B,MAAM,gBAAgB,CAAC,UAAU,SAAA,YAA4B;CAC7D,MAAM,uBAAuB,CAAC,UAAU,SAAA,mBAAmC;CAE3E,MAAM,aACJ,mBAAmB,UAAU,WACzB,EAAE,gBAAgB,GAClB,mBAAmB,UAAU,SAC3B,EAAE,cAAc,GAChB,KAAA;AAUR,WARE,eAAe,WACX,EAAE,UAAU,mBAAmB,UAAU,aAAa,GACtD,eAAe,WACb,EAAE,aAAa,GACf,eAAe,WAAW,aACxB,aACA,EAAE,kBAAkB,CAEd;CAEhB,MAAM,WAAW,EAAE,cAAc,GAAG;AAEpC,QACE,qBAAC,eAAD,EAAA,UAAA;EACG,SACC,oBAAC,mBAAD;GAAmB,IAAI;aAAW;GAAsC,CAAA,GACtE;EACJ,oBAAC,qBAAD,EAAqB,IAAI,UAAY,CAAA;EACpC,CAAC,UAAU,mBAAmB,WAAW,YACxC,oBAAC,aAAD;GAAa,UAAS;GAAO,IAAI;GAAY,CAAA,GAC3C;EACH,CAAC,cAAc,oBAAC,QAAD,EAAQ,IAAI,UAAY,CAAA,GAAG;EAC3C,oBAAC,oBAAD,EAAoB,IAAI,UAAY,CAAA;EACnC,uBAAuB,oBAAC,kBAAD,EAAkB,IAAI,UAAY,CAAA,GAAG;EAC7D,oBAAC,qBAAD,EAAqB,IAAI,UAAY,CAAA;EACrC,qBAAC,KAAD;GACE,IAAI;IACF,SAAS;IACT,IAAI,gBAAgB,IAAI;IACzB;aAJH,CAME,oBAAC,cAAD,EAAgB,CAAA,EAChB,oBAAC,0BAAD,EAA4B,CAAA,CACxB;;EACL,gBAAgB,oBAAC,WAAD,EAAa,CAAA,GAAG;EACnB,EAAA,CAAA"}
1
+ {"version":3,"file":"MainPage.js","names":[],"sources":["../../../../src/pages/MainPage/MainPage.tsx"],"sourcesContent":["import { Box } from '@mui/material'\nimport { useTranslation } from 'react-i18next'\nimport { AmountInput } from '../../components/AmountInput/AmountInput.js'\nimport { ContractComponent } from '../../components/ContractComponent/ContractComponent.js'\nimport { GasRefuelMessage } from '../../components/Messages/GasRefuelMessage.js'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { PoweredBy } from '../../components/PoweredBy/PoweredBy.js'\nimport { Routes } from '../../components/Routes/Routes.js'\nimport { SelectChainAndToken } from '../../components/SelectChainAndToken.js'\nimport { SendToWalletButton } from '../../components/SendToWallet/SendToWalletButton.js'\nimport { SendToWalletExpandButton } from '../../components/SendToWallet/SendToWalletExpandButton.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useWideVariant } from '../../hooks/useWideVariant.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { MainWarningMessages } from './MainWarningMessages.js'\nimport { ReviewButton } from './ReviewButton.js'\n\nexport const MainPage: React.FC = () => {\n const { t } = useTranslation()\n const wideVariant = useWideVariant()\n const { subvariant, subvariantOptions, contractComponent, hiddenUI } =\n useWidgetConfig()\n const custom = subvariant === 'custom'\n const showPoweredBy = !hiddenUI?.includes(HiddenUI.PoweredBy)\n const showGasRefuelMessage = !hiddenUI?.includes(HiddenUI.GasRefuelMessage)\n\n const splitTitle =\n subvariantOptions?.split === 'bridge'\n ? t('header.bridge')\n : subvariantOptions?.split === 'swap'\n ? t('header.swap')\n : undefined\n const title =\n subvariant === 'custom'\n ? t(`header.${subvariantOptions?.custom ?? 'checkout'}`)\n : subvariant === 'refuel'\n ? t('header.gas')\n : subvariant === 'split' && splitTitle\n ? splitTitle\n : t('header.exchange')\n\n useHeader(title)\n\n const marginSx = { marginBottom: 2 }\n\n return (\n <PageContainer>\n {custom ? (\n <ContractComponent sx={marginSx}>{contractComponent}</ContractComponent>\n ) : null}\n <SelectChainAndToken sx={marginSx} />\n {!custom || subvariantOptions?.custom === 'deposit' ? (\n <AmountInput formType=\"from\" sx={marginSx} />\n ) : null}\n {!wideVariant ? <Routes sx={marginSx} /> : null}\n <SendToWalletButton sx={marginSx} />\n {showGasRefuelMessage ? <GasRefuelMessage sx={marginSx} /> : null}\n <MainWarningMessages sx={marginSx} />\n <Box\n sx={{\n display: 'flex',\n mb: showPoweredBy ? 1 : 3,\n }}\n >\n <ReviewButton />\n <SendToWalletExpandButton />\n </Box>\n {showPoweredBy ? <PoweredBy /> : null}\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,MAAa,iBAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,cAAc,gBAAgB;CACpC,MAAM,EAAE,YAAY,mBAAmB,mBAAmB,aACxD,iBAAiB;CACnB,MAAM,SAAS,eAAe;CAC9B,MAAM,gBAAgB,CAAC,UAAU,SAAA,YAA4B;CAC7D,MAAM,uBAAuB,CAAC,UAAU,SAAA,mBAAmC;CAE3E,MAAM,aACJ,mBAAmB,UAAU,WACzB,EAAE,gBAAgB,GAClB,mBAAmB,UAAU,SAC3B,EAAE,cAAc,GAChB,KAAA;CAUR,UARE,eAAe,WACX,EAAE,UAAU,mBAAmB,UAAU,aAAa,GACtD,eAAe,WACb,EAAE,aAAa,GACf,eAAe,WAAW,aACxB,aACA,EAAE,kBAAkB,CAEd;CAEhB,MAAM,WAAW,EAAE,cAAc,GAAG;CAEpC,OACE,qBAAC,eAAD,EAAA,UAAA;EACG,SACC,oBAAC,mBAAD;GAAmB,IAAI;aAAW;GAAsC,CAAA,GACtE;EACJ,oBAAC,qBAAD,EAAqB,IAAI,UAAY,CAAA;EACpC,CAAC,UAAU,mBAAmB,WAAW,YACxC,oBAAC,aAAD;GAAa,UAAS;GAAO,IAAI;GAAY,CAAA,GAC3C;EACH,CAAC,cAAc,oBAAC,QAAD,EAAQ,IAAI,UAAY,CAAA,GAAG;EAC3C,oBAAC,oBAAD,EAAoB,IAAI,UAAY,CAAA;EACnC,uBAAuB,oBAAC,kBAAD,EAAkB,IAAI,UAAY,CAAA,GAAG;EAC7D,oBAAC,qBAAD,EAAqB,IAAI,UAAY,CAAA;EACrC,qBAAC,KAAD;GACE,IAAI;IACF,SAAS;IACT,IAAI,gBAAgB,IAAI;IACzB;aAJH,CAME,oBAAC,cAAD,EAAgB,CAAA,EAChB,oBAAC,0BAAD,EAA4B,CAAA,CACxB;;EACL,gBAAgB,oBAAC,WAAD,EAAa,CAAA,GAAG;EACnB,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"MainWarningMessages.js","names":[],"sources":["../../../../src/pages/MainPage/MainWarningMessages.tsx"],"sourcesContent":["import type { Route } from '@lifi/sdk'\nimport type { BoxProps } from '@mui/material'\nimport { WarningMessages } from '../../components/Messages/WarningMessages.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\n\ninterface MainWarningMessagesProps extends BoxProps {\n route?: Route\n}\n\nexport const MainWarningMessages: React.FC<MainWarningMessagesProps> = (\n props\n) => {\n const { routes } = useRoutes()\n const currentRoute = routes?.[0]\n\n return <WarningMessages route={currentRoute} {...props} />\n}\n"],"mappings":";;;;AASA,MAAa,uBACX,UACG;CACH,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,eAAe,SAAS;AAE9B,QAAO,oBAAC,iBAAD;EAAiB,OAAO;EAAc,GAAI;EAAS,CAAA"}
1
+ {"version":3,"file":"MainWarningMessages.js","names":[],"sources":["../../../../src/pages/MainPage/MainWarningMessages.tsx"],"sourcesContent":["import type { Route } from '@lifi/sdk'\nimport type { BoxProps } from '@mui/material'\nimport { WarningMessages } from '../../components/Messages/WarningMessages.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\n\ninterface MainWarningMessagesProps extends BoxProps {\n route?: Route\n}\n\nexport const MainWarningMessages: React.FC<MainWarningMessagesProps> = (\n props\n) => {\n const { routes } = useRoutes()\n const currentRoute = routes?.[0]\n\n return <WarningMessages route={currentRoute} {...props} />\n}\n"],"mappings":";;;;AASA,MAAa,uBACX,UACG;CACH,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,eAAe,SAAS;CAE9B,OAAO,oBAAC,iBAAD;EAAiB,OAAO;EAAc,GAAI;EAAS,CAAA"}
@@ -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 { useSplitSubvariantStore } from '../../stores/settings/useSplitSubvariantStore.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 { subvariant, subvariantOptions } = useWidgetConfig()\n const splitState = useSplitSubvariantStore((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 (subvariant) {\n case 'custom':\n return t(`button.${subvariantOptions?.custom ?? '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 (subvariant) {\n case 'custom':\n return subvariantOptions?.custom === '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,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,iBAAiB;CACjC,MAAM,EAAE,YAAY,sBAAsB,iBAAiB;CAC3D,MAAM,aAAa,yBAAyB,UAAU,MAAM,MAAM;CAClE,MAAM,EAAE,WAAW,sBAAsB,0BAA0B;CACnE,MAAM,EAAE,QAAQ,uBAAuB,WAAW;CAElD,MAAM,eAAe,SAAS;CAE9B,MAAM,cAAc,YAAY;AAC9B,MAAI,CAAC,aACH;AAGF,qBAAmB,aAAa;AAChC,WAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,aAAa,IAAI;GACrC,CAAC;AACF,UAAQ,KAAA,iBAAgC;GACtC,OAAO;GACC;GACT,CAAC;;CAGJ,MAAM,sBAA8B;AAClC,MAAI,aACF,SAAQ,YAAR;GACE,KAAK,SACH,QAAO,EAAE,UAAU,mBAAmB,UAAU,WAAW,QAAQ;GACrE,KAAK,SACH,QAAO,EAAE,gBAAgB;GAC3B,QAKE,QAAO,EAAE,UAHP,aAAa,gBAAgB,aAAa,YACtC,SACA,SAC6B,QAAQ;;AAIjD,UAAQ,YAAR;GACE,KAAK,SACH,QAAO,mBAAmB,WAAW,YACjC,EAAE,iBAAiB,GACnB,EAAE,aAAa;GACrB,KAAK,SACH,QAAO,EAAE,gBAAgB;GAC3B,KAAK;AACH,QAAI,WACF,QAAO,EAAE,UAAU,aAAa;AAElC,WAAO,EAAE,kBAAkB;GAC7B,QACE,QAAO,EAAE,kBAAkB;;;AAIjC,QACE,oBAAC,uBAAD;EACE,MAAM,eAAe;EACrB,SAAS;EACT,UAAU,gBAAgB,qBAAqB,CAAC;EAChD,OAAO;EACP,IAAI,EAAE,MAAM,GAAG;EACf,CAAA"}
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 { useSplitSubvariantStore } from '../../stores/settings/useSplitSubvariantStore.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 { subvariant, subvariantOptions } = useWidgetConfig()\n const splitState = useSplitSubvariantStore((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 (subvariant) {\n case 'custom':\n return t(`button.${subvariantOptions?.custom ?? '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 (subvariant) {\n case 'custom':\n return subvariantOptions?.custom === '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,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,iBAAiB;CACjC,MAAM,EAAE,YAAY,sBAAsB,iBAAiB;CAC3D,MAAM,aAAa,yBAAyB,UAAU,MAAM,MAAM;CAClE,MAAM,EAAE,WAAW,sBAAsB,0BAA0B;CACnE,MAAM,EAAE,QAAQ,uBAAuB,WAAW;CAElD,MAAM,eAAe,SAAS;CAE9B,MAAM,cAAc,YAAY;EAC9B,IAAI,CAAC,cACH;EAGF,mBAAmB,aAAa;EAChC,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,aAAa,IAAI;GACrC,CAAC;EACF,QAAQ,KAAA,iBAAgC;GACtC,OAAO;GACC;GACT,CAAC;;CAGJ,MAAM,sBAA8B;EAClC,IAAI,cACF,QAAQ,YAAR;GACE,KAAK,UACH,OAAO,EAAE,UAAU,mBAAmB,UAAU,WAAW,QAAQ;GACrE,KAAK,UACH,OAAO,EAAE,gBAAgB;GAC3B,SAKE,OAAO,EAAE,UAHP,aAAa,gBAAgB,aAAa,YACtC,SACA,SAC6B,QAAQ;;EAIjD,QAAQ,YAAR;GACE,KAAK,UACH,OAAO,mBAAmB,WAAW,YACjC,EAAE,iBAAiB,GACnB,EAAE,aAAa;GACrB,KAAK,UACH,OAAO,EAAE,gBAAgB;GAC3B,KAAK;IACH,IAAI,YACF,OAAO,EAAE,UAAU,aAAa;IAElC,OAAO,EAAE,kBAAkB;GAC7B,SACE,OAAO,EAAE,kBAAkB;;;CAIjC,OACE,oBAAC,uBAAD;EACE,MAAM,eAAe;EACrB,SAAS;EACT,UAAU,gBAAgB,qBAAqB,CAAC;EAChD,OAAO;EACP,IAAI,EAAE,MAAM,GAAG;EACf,CAAA"}
@@ -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 }}\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,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,iBAAiB;CACjC,MAAM,EACJ,QACA,WACA,YACA,eACA,aACA,WACA,SACA,uBACE,WAAW;CACf,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,WAAW,WAAW,CAAC;CACnE,MAAM,CAAC,aAAa,eAAe,YAAY;CAC/C,MAAM,EAAE,sBAAsB,0BAA0B;CAExD,MAAM,eAAe,cAEjB,oBAAC,sBAAD;EACE,WAAW,iBAAiB,KAAK,KAAK;EACtC,cAAc;EACd,WAAW;EACX,eAAe,SAAS;EACxB,IAAI,EAAE,aAAa,IAAI;EACvB,MAAK;EACL,CAAA,EAEJ;EAAC;EAAe;EAAY;EAAS;EAAY,CAClD;AAED,WAAU,EAAE,iBAAiB,EAAE,aAAa;CAE5C,MAAM,oBAAoB,UAAiB;AACzC,qBAAmB,MAAM;AACzB,WAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,MAAM,IAAI;GAC9B,CAAC;AACF,UAAQ,KAAA,iBAAgC;GACtC;GACQ;GACT,CAAC;;CAGJ,MAAM,gBAAgB,CAAC,QAAQ,UAAU,CAAC,aAAa,CAAC;CAExD,MAAM,uBAAuB,SAAS,MAAM,qBAAqB,CAAC;CAElE,MAAM,mBAAmB,QAAQ,eAAe,CAAC;AAEjD,QACE,oBAAC,OAAD;EACE,WAAU;EACV,WAAU;EACV,SAAS;EACT,IAAI,EAAE,MAAM,GAAG;YAEd,gBACC,oBAAC,mBAAD,EAAqB,CAAA,GACnB,aAAa,CAAC,QAAQ,SACxB,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,UAChC,oBAAC,mBAAD,EAAiC,EAAT,MAAS,CACjC,GAEF,QAAQ,KAAK,OAAc,UACzB,oBAAC,WAAD;GAES;GACP,SACE,yBAAyB,iBAAiB,MAAM,GAAG,KAAA;GAErD,QAAQ,UAAU;GAClB,UAAU,QAAQ,WAAW;GAC7B,EAPK,MAOL,CACF;EAEE,CAAA"}
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 }}\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,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,UAAU,iBAAiB;CACjC,MAAM,EACJ,QACA,WACA,YACA,eACA,aACA,WACA,SACA,uBACE,WAAW;CACf,MAAM,EAAE,YAAY,WAAW,EAAE,WAAW,WAAW,WAAW,CAAC;CACnE,MAAM,CAAC,aAAa,eAAe,YAAY;CAC/C,MAAM,EAAE,sBAAsB,0BAA0B;CAExD,MAAM,eAAe,cAEjB,oBAAC,sBAAD;EACE,WAAW,iBAAiB,KAAK,KAAK;EACtC,cAAc;EACd,WAAW;EACX,eAAe,SAAS;EACxB,IAAI,EAAE,aAAa,IAAI;EACvB,MAAK;EACL,CAAA,EAEJ;EAAC;EAAe;EAAY;EAAS;EAAY,CAClD;CAED,UAAU,EAAE,iBAAiB,EAAE,aAAa;CAE5C,MAAM,oBAAoB,UAAiB;EACzC,mBAAmB,MAAM;EACzB,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,MAAM,IAAI;GAC9B,CAAC;EACF,QAAQ,KAAA,iBAAgC;GACtC;GACQ;GACT,CAAC;;CAGJ,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,EAAE,MAAM,GAAG;YAEd,gBACC,oBAAC,mBAAD,EAAqB,CAAA,GACnB,aAAa,CAAC,QAAQ,SACxB,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,UAChC,oBAAC,mBAAD,EAAiC,EAAT,MAAS,CACjC,GAEF,QAAQ,KAAK,OAAc,UACzB,oBAAC,WAAD;GAES;GACP,SACE,yBAAyB,iBAAiB,MAAM,GAAG,KAAA;GAErD,QAAQ,UAAU;GAClB,UAAU,QAAQ,WAAW;GAC7B,EAPK,MAOL,CACF;EAEE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectChainPage.js","names":[],"sources":["../../../../src/pages/SelectChainPage/SelectChainPage.tsx"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useCallback } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useChainSelect } from '../../components/ChainSelect/useChainSelect.js'\nimport { SelectChainContent } from '../../components/Chains/SelectChainContent.js'\nimport { useTokenSelect } from '../../components/TokenList/useTokenSelect.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport type { SelectChainPageProps } from './types.js'\n\nexport const SelectChainPage: React.FC<SelectChainPageProps> = ({\n formType,\n selectNativeToken,\n}) => {\n const navigateBack = useNavigateBack()\n const { setCurrentChain } = useChainSelect(formType)\n const selectToken = useTokenSelect(formType, navigateBack)\n\n const { t } = useTranslation()\n\n useHeader(t('header.selectChain'))\n\n const handleClick = useCallback(\n async (chain: ExtendedChain) => {\n if (selectNativeToken) {\n selectToken(chain.nativeToken.address, chain.id)\n } else {\n setCurrentChain(chain.id)\n navigateBack()\n }\n },\n [navigateBack, selectNativeToken, selectToken, setCurrentChain]\n )\n\n return (\n <SelectChainContent\n inExpansion={false}\n formType={formType}\n onSelect={handleClick}\n />\n )\n}\n"],"mappings":";;;;;;;;;AAUA,MAAa,mBAAmD,EAC9D,UACA,wBACI;CACJ,MAAM,eAAe,iBAAiB;CACtC,MAAM,EAAE,oBAAoB,eAAe,SAAS;CACpD,MAAM,cAAc,eAAe,UAAU,aAAa;CAE1D,MAAM,EAAE,MAAM,gBAAgB;AAE9B,WAAU,EAAE,qBAAqB,CAAC;AAclC,QACE,oBAAC,oBAAD;EACE,aAAa;EACH;EACV,UAhBgB,YAClB,OAAO,UAAyB;AAC9B,OAAI,kBACF,aAAY,MAAM,YAAY,SAAS,MAAM,GAAG;QAC3C;AACL,oBAAgB,MAAM,GAAG;AACzB,kBAAc;;KAGlB;GAAC;GAAc;GAAmB;GAAa;GAAgB,CAOxC;EACrB,CAAA"}
1
+ {"version":3,"file":"SelectChainPage.js","names":[],"sources":["../../../../src/pages/SelectChainPage/SelectChainPage.tsx"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useCallback } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useChainSelect } from '../../components/ChainSelect/useChainSelect.js'\nimport { SelectChainContent } from '../../components/Chains/SelectChainContent.js'\nimport { useTokenSelect } from '../../components/TokenList/useTokenSelect.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport type { SelectChainPageProps } from './types.js'\n\nexport const SelectChainPage: React.FC<SelectChainPageProps> = ({\n formType,\n selectNativeToken,\n}) => {\n const navigateBack = useNavigateBack()\n const { setCurrentChain } = useChainSelect(formType)\n const selectToken = useTokenSelect(formType, navigateBack)\n\n const { t } = useTranslation()\n\n useHeader(t('header.selectChain'))\n\n const handleClick = useCallback(\n async (chain: ExtendedChain) => {\n if (selectNativeToken) {\n selectToken(chain.nativeToken.address, chain.id)\n } else {\n setCurrentChain(chain.id)\n navigateBack()\n }\n },\n [navigateBack, selectNativeToken, selectToken, setCurrentChain]\n )\n\n return (\n <SelectChainContent\n inExpansion={false}\n formType={formType}\n onSelect={handleClick}\n />\n )\n}\n"],"mappings":";;;;;;;;;AAUA,MAAa,mBAAmD,EAC9D,UACA,wBACI;CACJ,MAAM,eAAe,iBAAiB;CACtC,MAAM,EAAE,oBAAoB,eAAe,SAAS;CACpD,MAAM,cAAc,eAAe,UAAU,aAAa;CAE1D,MAAM,EAAE,MAAM,gBAAgB;CAE9B,UAAU,EAAE,qBAAqB,CAAC;CAclC,OACE,oBAAC,oBAAD;EACE,aAAa;EACH;EACV,UAhBgB,YAClB,OAAO,UAAyB;GAC9B,IAAI,mBACF,YAAY,MAAM,YAAY,SAAS,MAAM,GAAG;QAC3C;IACL,gBAAgB,MAAM,GAAG;IACzB,cAAc;;KAGlB;GAAC;GAAc;GAAmB;GAAa;GAAgB,CAOxC;EACrB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectEnabledToolsPage.js","names":[],"sources":["../../../src/pages/SelectEnabledToolsPage.tsx"],"sourcesContent":["import { Checkbox, debounce, Tooltip } from '@mui/material'\nimport type { ChangeEvent } from 'react'\nimport {\n type FormEventHandler,\n memo,\n useCallback,\n useMemo,\n useState,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { FullPageContainer } from '../components/FullPageContainer.js'\nimport { StickySearchInput } from '../components/Search/SearchInput.js'\nimport { type ToolCollectionTypes, Tools } from '../components/Tools/Tools.js'\nimport { useDefaultElementId } from '../hooks/useDefaultElementId.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useScrollableContainer } from '../hooks/useScrollableContainer.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 }}\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 elementId = useDefaultElementId()\n const scrollableContainer = useScrollableContainer(elementId ?? '')\n const [searchValue, setSearchValue] = useState('')\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: FormEventHandler<HTMLInputElement> =\n useCallback(\n (e) => {\n const value = (e.target as HTMLInputElement).value\n setSearchValue(value)\n\n if (scrollableContainer) {\n scrollableContainer.scrollTop = 0\n }\n },\n [scrollableContainer]\n )\n\n const debouncedSearchInputChange = debounce(handleSearchInputChange, 250)\n\n return (\n <FullPageContainer disableGutters>\n <StickySearchInput\n onChange={debouncedSearchInputChange}\n placeholder={t(`main.search${type}`)}\n />\n <Tools filteredTools={filteredTools} type={type} />\n </FullPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,MAAM,oBAAoB,MACvB,EACC,uBACA,uBACA,uBACA,cACI;CACJ,MAAM,EAAE,MAAM,gBAAgB;AAO9B,QACE,oBAAC,SAAD;EAAS,OAPU,wBACjB,KAAA,IACA,wBACE,EAAE,sBAAsB,GACxB,EAAE,oBAAoB;YAIxB,oBAAC,UAAD;GACE,IAAG;GACH,SAAS;GACT,eAAe,yBAAyB,CAAC;GACzC,UAAU;GACV,UAAU;GACV,IAAI,EAAE,IAAI,MAAM;GAChB,CAAA;EACM,CAAA;EAGf;AAED,MAAa,0BAEP,EAAE,WAAW;CACjB,MAAM,UAAU,KAAK,aAAa;CAClC,MAAM,EAAE,UAAU,UAAU;CAC5B,MAAM,EAAE,mBAAmB,oBAAoB;CAE/C,MAAM,gBAAgB,kBAAkB,UAAU,MAAM,WAAW,QAAQ;CAE3E,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,sBAAsB,uBADV,qBAC0C,IAAI,GAAG;CACnE,MAAM,CAAC,aAAa,kBAAkB,SAAS,GAAG;CAElD,MAAM,gBAAgB,cAAc;EAClC,MAAM,YAAY,QAAQ,YAAY,EAAE;AAExC,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,mBAAmB,YAAY,aAAa;AAClD,SAAO,UAAU,QAAQ,SACvB,KAAK,KAAK,aAAa,CAAC,SAAS,iBAAiB,CACnD;IACA;EAAC;EAAO;EAAS;EAAY,CAAC;CAEjC,MAAM,kBAAkB,kBAAkB;AACxC,iBACE,MACA,cAAc,KAAK,SAAS,KAAK,IAAI,CACtC;IACA;EAAC;EAAgB;EAAM;EAAc,CAAC;CAEzC,MAAM,eAAe,cAEjB,oBAAC,mBAAD;EACE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,OAAO,SAAS,CAAC,cAAc,SAAS,KAAK,IAAI,CAAC;EAElE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,MAAM,SAAS,cAAc,SAAS,KAAK,IAAI,CAAC;EAEhE,uBAAuB,CAAC,cAAc;EACtC,SAAS;EACT,CAAA,EAEJ;EAAC;EAAe;EAAiB;EAAc,CAChD;AAED,WAAU,EAAE,mBAAmB,OAAO,EAAE,aAAa;AAiBrD,QACE,qBAAC,mBAAD;EAAmB,gBAAA;YAAnB,CACE,oBAAC,mBAAD;GACE,UAL6B,SAZjC,aACG,MAAM;IACL,MAAM,QAAS,EAAE,OAA4B;AAC7C,mBAAe,MAAM;AAErB,QAAI,oBACF,qBAAoB,YAAY;MAGpC,CAAC,oBAAoB,CAG0C,EAAE,IAK3B;GACpC,aAAa,EAAE,cAAc,OAAO;GACpC,CAAA,EACF,oBAAC,OAAD;GAAsB;GAAqB;GAAQ,CAAA,CACjC"}
1
+ {"version":3,"file":"SelectEnabledToolsPage.js","names":[],"sources":["../../../src/pages/SelectEnabledToolsPage.tsx"],"sourcesContent":["import { Checkbox, debounce, Tooltip } from '@mui/material'\nimport type { ChangeEvent } from 'react'\nimport {\n type FormEventHandler,\n memo,\n useCallback,\n useMemo,\n useState,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { FullPageContainer } from '../components/FullPageContainer.js'\nimport { StickySearchInput } from '../components/Search/SearchInput.js'\nimport { type ToolCollectionTypes, Tools } from '../components/Tools/Tools.js'\nimport { useDefaultElementId } from '../hooks/useDefaultElementId.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useScrollableContainer } from '../hooks/useScrollableContainer.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 }}\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 elementId = useDefaultElementId()\n const scrollableContainer = useScrollableContainer(elementId ?? '')\n const [searchValue, setSearchValue] = useState('')\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: FormEventHandler<HTMLInputElement> =\n useCallback(\n (e) => {\n const value = (e.target as HTMLInputElement).value\n setSearchValue(value)\n\n if (scrollableContainer) {\n scrollableContainer.scrollTop = 0\n }\n },\n [scrollableContainer]\n )\n\n const debouncedSearchInputChange = debounce(handleSearchInputChange, 250)\n\n return (\n <FullPageContainer disableGutters>\n <StickySearchInput\n onChange={debouncedSearchInputChange}\n placeholder={t(`main.search${type}`)}\n />\n <Tools filteredTools={filteredTools} type={type} />\n </FullPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AA2BA,MAAM,oBAAoB,MACvB,EACC,uBACA,uBACA,uBACA,cACI;CACJ,MAAM,EAAE,MAAM,gBAAgB;CAO9B,OACE,oBAAC,SAAD;EAAS,OAPU,wBACjB,KAAA,IACA,wBACE,EAAE,sBAAsB,GACxB,EAAE,oBAAoB;YAIxB,oBAAC,UAAD;GACE,IAAG;GACH,SAAS;GACT,eAAe,yBAAyB,CAAC;GACzC,UAAU;GACV,UAAU;GACV,IAAI,EAAE,IAAI,MAAM;GAChB,CAAA;EACM,CAAA;EAGf;AAED,MAAa,0BAEP,EAAE,WAAW;CACjB,MAAM,UAAU,KAAK,aAAa;CAClC,MAAM,EAAE,UAAU,UAAU;CAC5B,MAAM,EAAE,mBAAmB,oBAAoB;CAE/C,MAAM,gBAAgB,kBAAkB,UAAU,MAAM,WAAW,QAAQ;CAE3E,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,sBAAsB,uBADV,qBAC0C,IAAI,GAAG;CACnE,MAAM,CAAC,aAAa,kBAAkB,SAAS,GAAG;CAElD,MAAM,gBAAgB,cAAc;EAClC,MAAM,YAAY,QAAQ,YAAY,EAAE;EAExC,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,mBAAmB,YAAY,aAAa;EAClD,OAAO,UAAU,QAAQ,SACvB,KAAK,KAAK,aAAa,CAAC,SAAS,iBAAiB,CACnD;IACA;EAAC;EAAO;EAAS;EAAY,CAAC;CAEjC,MAAM,kBAAkB,kBAAkB;EACxC,eACE,MACA,cAAc,KAAK,SAAS,KAAK,IAAI,CACtC;IACA;EAAC;EAAgB;EAAM;EAAc,CAAC;CAEzC,MAAM,eAAe,cAEjB,oBAAC,mBAAD;EACE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,OAAO,SAAS,CAAC,cAAc,SAAS,KAAK,IAAI,CAAC;EAElE,uBACE,CAAC,CAAC,cAAc,UAChB,cAAc,MAAM,SAAS,cAAc,SAAS,KAAK,IAAI,CAAC;EAEhE,uBAAuB,CAAC,cAAc;EACtC,SAAS;EACT,CAAA,EAEJ;EAAC;EAAe;EAAiB;EAAc,CAChD;CAED,UAAU,EAAE,mBAAmB,OAAO,EAAE,aAAa;CAiBrD,OACE,qBAAC,mBAAD;EAAmB,gBAAA;YAAnB,CACE,oBAAC,mBAAD;GACE,UAL6B,SAZjC,aACG,MAAM;IACL,MAAM,QAAS,EAAE,OAA4B;IAC7C,eAAe,MAAM;IAErB,IAAI,qBACF,oBAAoB,YAAY;MAGpC,CAAC,oBAAoB,CAG0C,EAAE,IAK3B;GACpC,aAAa,EAAE,cAAc,OAAO;GACpC,CAAA,EACF,oBAAC,OAAD;GAAsB;GAAqB;GAAQ,CAAA,CACjC"}