@lifi/widget 4.0.0-beta.18 → 4.0.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/App.js.map +1 -1
- package/dist/esm/AppDefault.js.map +1 -1
- package/dist/esm/AppDrawer.js.map +1 -1
- package/dist/esm/AppLayout.js.map +1 -1
- package/dist/esm/AppProvider.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/AmountInputStartAdornment.js.map +1 -1
- package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
- package/dist/esm/components/AppContainer.js.map +1 -1
- package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
- package/dist/esm/components/Avatar/ChainBadgeContent.js.map +1 -1
- package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/TokenAvatar.js.map +1 -1
- package/dist/esm/components/Avatar/utils.js.map +1 -1
- package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
- package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/esm/components/Card/Card.js.map +1 -1
- package/dist/esm/components/Card/CardIconButton.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
- package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
- package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
- package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
- package/dist/esm/components/Chains/ChainList.js.map +1 -1
- package/dist/esm/components/Chains/ChainList.style.js.map +1 -1
- package/dist/esm/components/Chains/ChainListItem.js.map +1 -1
- package/dist/esm/components/Chains/ChainSearchInput.js.map +1 -1
- package/dist/esm/components/Chains/ChainsExpanded.js.map +1 -1
- package/dist/esm/components/Chains/PinChainButton.js.map +1 -1
- package/dist/esm/components/Chains/SelectChainContent.js.map +1 -1
- package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
- package/dist/esm/components/ContextMenu.js.map +1 -1
- package/dist/esm/components/ContractComponent/ContractComponent.js.map +1 -1
- package/dist/esm/components/ContractComponent/ItemPrice.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFT.js.map +1 -1
- package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/Expansion/Expansion.js.map +1 -1
- package/dist/esm/components/Expansion/ExpansionTransition.js.map +1 -1
- package/dist/esm/components/FeeBreakdownTooltip.js.map +1 -1
- package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
- package/dist/esm/components/Header/BackButton.js.map +1 -1
- package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
- package/dist/esm/components/Header/DisconnectIconButton.js.map +1 -1
- package/dist/esm/components/Header/Header.js.map +1 -1
- package/dist/esm/components/Header/Header.style.js.map +1 -1
- package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.js.map +1 -1
- package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
- package/dist/esm/components/Header/SplitNavigationTabs.js.map +1 -1
- package/dist/esm/components/Header/WalletHeader.js.map +1 -1
- package/dist/esm/components/Header/WalletMenu.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
- package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
- package/dist/esm/components/Initializer.js.map +1 -1
- package/dist/esm/components/ListItemButton.js.map +1 -1
- package/dist/esm/components/Messages/AccountDeployedMessage.js.map +1 -1
- package/dist/esm/components/Messages/AccountNotDeployedMessage.js.map +1 -1
- package/dist/esm/components/Messages/FundsSufficiencyMessage.js.map +1 -1
- package/dist/esm/components/Messages/GasRefuelMessage.js.map +1 -1
- package/dist/esm/components/Messages/GasSufficiencyMessage.js.map +1 -1
- package/dist/esm/components/Messages/MinFromAmountUSDMessage.js.map +1 -1
- package/dist/esm/components/Messages/MissingRouteRequiredAccountMessage.js.map +1 -1
- package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
- package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
- package/dist/esm/components/NotFound.js.map +1 -1
- package/dist/esm/components/PageEntered.js.map +1 -1
- package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
- package/dist/esm/components/ProgressToNextUpdate.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
- package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.style.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteCardSkeleton.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteNotFoundCard.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
- package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
- package/dist/esm/components/RouteCard/getMatchingLabels.js +1 -0
- package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
- package/dist/esm/components/Routes/Routes.js.map +1 -1
- package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
- package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
- package/dist/esm/components/Search/SearchInput.js.map +1 -1
- package/dist/esm/components/SelectChainAndToken.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.js.map +1 -1
- package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
- package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
- package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
- package/dist/esm/components/Step/CircularProgress.js.map +1 -1
- package/dist/esm/components/Step/CircularProgress.style.js.map +1 -1
- package/dist/esm/components/Step/DestinationWalletAddress.js.map +1 -1
- package/dist/esm/components/Step/Step.js.map +1 -1
- package/dist/esm/components/Step/StepAction.js.map +1 -1
- package/dist/esm/components/Step/StepActions.js.map +1 -1
- package/dist/esm/components/Step/StepList.js.map +1 -1
- package/dist/esm/components/StepActions/StepActions.js.map +1 -1
- package/dist/esm/components/StepDivider/StepDivider.js.map +1 -1
- package/dist/esm/components/TextFitter/TextFitter.js.map +1 -1
- package/dist/esm/components/Timer/StepTimer.js.map +1 -1
- package/dist/esm/components/Timer/TimerContent.js.map +1 -1
- package/dist/esm/components/Token/Token.js.map +1 -1
- package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
- package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
- package/dist/esm/components/TokenList/TokenList.js.map +1 -1
- package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
- package/dist/esm/components/TokenList/TokenNotFound.js.map +1 -1
- package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
- package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
- package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
- package/dist/esm/components/Tools/ToolItem.js.map +1 -1
- package/dist/esm/components/Tools/Tools.js.map +1 -1
- package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCard.js.map +1 -1
- package/dist/esm/components/TransactionCard/TransactionCardSkeleton.js.map +1 -1
- package/dist/esm/components/TransactionDetails.js.map +1 -1
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/config/version.js.map +1 -1
- package/dist/esm/hooks/timer/time.js.map +1 -1
- package/dist/esm/hooks/timer/useExecutionTimer.js.map +1 -1
- package/dist/esm/hooks/timer/useInterval.js.map +1 -1
- package/dist/esm/hooks/timer/useTimer.js.map +1 -1
- package/dist/esm/hooks/timer/validate.js.map +1 -1
- package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
- package/dist/esm/hooks/useActionMessage.js.map +1 -1
- package/dist/esm/hooks/useAddressActivity.js.map +1 -1
- package/dist/esm/hooks/useAddressValidation.js.map +1 -1
- package/dist/esm/hooks/useAvailableChains.js.map +1 -1
- package/dist/esm/hooks/useChain.js.map +1 -1
- package/dist/esm/hooks/useChains.js.map +1 -1
- package/dist/esm/hooks/useContactSupport.js.map +1 -1
- package/dist/esm/hooks/useDebouncedWatch.js.map +1 -1
- package/dist/esm/hooks/useDefaultElementId.js.map +1 -1
- package/dist/esm/hooks/useExplorer.js.map +1 -1
- package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useFromAmountThreshold.js.map +1 -1
- package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
- package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
- package/dist/esm/hooks/useGasRefuel.js.map +1 -1
- package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
- package/dist/esm/hooks/useHasChainExpansion.js.map +1 -1
- package/dist/esm/hooks/useHeader.js.map +1 -1
- package/dist/esm/hooks/useInitializeSDKProviders.js.map +1 -1
- package/dist/esm/hooks/useInitializer.js.map +1 -1
- package/dist/esm/hooks/useIsBatchingSupported.js.map +1 -1
- package/dist/esm/hooks/useIsContractAddress.js.map +1 -1
- package/dist/esm/hooks/useLanguages.js.map +1 -1
- package/dist/esm/hooks/useListHeight.js.map +1 -1
- package/dist/esm/hooks/useLongPress.js.map +1 -1
- package/dist/esm/hooks/useNavigateBack.js.map +1 -1
- package/dist/esm/hooks/useRouteExecution.js.map +1 -1
- package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useScrollableContainer.js.map +1 -1
- package/dist/esm/hooks/useSetContentHeight.js.map +1 -1
- package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
- package/dist/esm/hooks/useSwapOnly.js.map +1 -1
- package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
- package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
- package/dist/esm/hooks/useToAddressReset.js.map +1 -1
- package/dist/esm/hooks/useToken.js.map +1 -1
- package/dist/esm/hooks/useTokenAddressBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalance.js.map +1 -1
- package/dist/esm/hooks/useTokenBalances.js.map +1 -1
- package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
- package/dist/esm/hooks/useTokenRateText.js.map +1 -1
- package/dist/esm/hooks/useTokenSearch.js.map +1 -1
- package/dist/esm/hooks/useTokens.js.map +1 -1
- package/dist/esm/hooks/useTools.js.map +1 -1
- package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
- package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
- package/dist/esm/hooks/useTransactionList.js.map +1 -1
- package/dist/esm/hooks/useWideVariant.js.map +1 -1
- package/dist/esm/hooks/useWidgetChains.js.map +1 -1
- package/dist/esm/hooks/useWidgetEvents.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActiveTransactionItem.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/TransactionHistoryEmpty.js.map +1 -1
- package/dist/esm/pages/ActivitiesPage/TransactionHistoryItem.js.map +1 -1
- package/dist/esm/pages/LanguagesPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
- package/dist/esm/pages/MainPage/MainWarningMessages.js.map +1 -1
- package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
- package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
- package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
- package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SearchTokenInput.js.map +1 -1
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
- package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
- package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/GasPriceSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ResetSettingsButton.js.map +1 -1
- package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
- package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ActionRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/SentToWalletRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionRow.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/StepActionsList.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
- package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
- package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
- package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
- package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
- package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
- package/dist/esm/providers/QueryClientProvider.js.map +1 -1
- package/dist/esm/providers/SDKClientProvider.js.map +1 -1
- package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
- package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
- package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
- package/dist/esm/stores/StoreProvider.js.map +1 -1
- package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarkActions.js.map +1 -1
- package/dist/esm/stores/bookmarks/useBookmarks.js.map +1 -1
- package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
- package/dist/esm/stores/chains/useChainOrder.js.map +1 -1
- package/dist/esm/stores/form/FormStore.js.map +1 -1
- package/dist/esm/stores/form/FormUpdater.js.map +1 -1
- package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
- package/dist/esm/stores/form/createFormStore.js.map +1 -1
- package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
- package/dist/esm/stores/form/useFieldActions.js.map +1 -1
- package/dist/esm/stores/form/useFieldValues.js.map +1 -1
- package/dist/esm/stores/form/useFormRef.js.map +1 -1
- package/dist/esm/stores/form/useFormStore.js.map +1 -1
- package/dist/esm/stores/form/useTouchedFields.js.map +1 -1
- package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
- package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
- package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
- package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
- package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
- package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
- package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
- package/dist/esm/stores/routes/useSetExecutableRoute.js.map +1 -1
- package/dist/esm/stores/routes/utils.js.map +1 -1
- package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
- package/dist/esm/stores/settings/useSettings.js.map +1 -1
- package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
- package/dist/esm/stores/settings/useSplitSubvariantStore.js.map +1 -1
- package/dist/esm/themes/createTheme.js.map +1 -1
- package/dist/esm/themes/utils.js.map +1 -1
- package/dist/esm/types/events.js.map +1 -1
- package/dist/esm/types/widget.d.ts +9 -1
- package/dist/esm/types/widget.d.ts.map +1 -1
- package/dist/esm/types/widget.js.map +1 -1
- package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
- package/dist/esm/utils/converters.js.map +1 -1
- package/dist/esm/utils/currencyExtendedFormatter.js.map +1 -1
- package/dist/esm/utils/deepEqual.js.map +1 -1
- package/dist/esm/utils/deepMerge.js.map +1 -1
- package/dist/esm/utils/fees.js.map +1 -1
- package/dist/esm/utils/format.js.map +1 -1
- package/dist/esm/utils/getActionMessage.js.map +1 -1
- package/dist/esm/utils/getErrorMessage.js.map +1 -1
- package/dist/esm/utils/getPriceImpact.js.map +1 -1
- package/dist/esm/utils/input.js.map +1 -1
- package/dist/esm/utils/item.js.map +1 -1
- package/dist/esm/utils/percentFormatter.js.map +1 -1
- package/dist/esm/utils/prepareActions.js.map +1 -1
- package/dist/esm/utils/timer.js.map +1 -1
- package/dist/esm/utils/token.js.map +1 -1
- package/dist/esm/utils/tokenList.js.map +1 -1
- package/dist/esm/utils/variant.js.map +1 -1
- package/dist/esm/utils/widgetSize.js.map +1 -1
- package/package.json +11 -11
- package/src/components/RouteCard/getMatchingLabels.ts +5 -0
- package/src/config/version.ts +1 -1
- package/src/types/widget.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenBalance.js","names":[],"sources":["../../../src/hooks/useTokenBalance.ts"],"sourcesContent":["import {\n getTokenBalances,\n type SDKClient,\n type Token,\n type TokenAmount,\n} from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCallback, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nconst defaultRefetchInterval = 30_000\n\nexport const useTokenBalance = (\n accountAddress?: string,\n token?: Token\n): {\n token: TokenAmount | undefined\n isLoading: boolean\n refetch: () => void\n refetchNewBalance: () => void\n getTokenBalancesWithRetry: typeof getTokenBalancesWithRetry\n} => {\n const queryClient = useQueryClient()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const tokenBalanceQueryKey = useMemo(\n () =>\n [\n getQueryKey('token-balance', keyPrefix),\n accountAddress,\n token?.chainId,\n token?.address,\n ] as const,\n [token?.address, token?.chainId, accountAddress, keyPrefix]\n )\n\n const { data, isLoading, refetch } = useQuery({\n queryKey: tokenBalanceQueryKey,\n queryFn: async ({\n queryKey: [, accountAddress, tokenChainId, tokenAddress],\n }) => {\n const tokenBalances = await getTokenBalancesWithRetry(\n sdkClient,\n accountAddress as string,\n [token!]\n )\n\n if (!tokenBalances?.length) {\n throw new Error('Could not get tokens balance.')\n }\n\n const cachedTokenAmount =\n queryClient.getQueryData<TokenAmount>(tokenBalanceQueryKey)\n\n const tokenAmount = tokenBalances[0].amount\n\n if (cachedTokenAmount?.amount !== tokenAmount) {\n queryClient.setQueryDefaults(tokenBalanceQueryKey, {\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n })\n }\n\n queryClient.setQueriesData<TokenAmount[]>(\n {\n queryKey: [\n getQueryKey('token-balances', keyPrefix),\n accountAddress,\n tokenChainId,\n ],\n },\n (data) => {\n if (data) {\n const clonedData = [...data]\n const index = clonedData.findIndex(\n (dataToken) => dataToken.address === tokenAddress\n )\n clonedData[index] = {\n ...clonedData[index],\n amount: tokenAmount,\n }\n return clonedData\n }\n }\n )\n\n return {\n ...tokenBalances[0],\n amount: tokenAmount,\n } as TokenAmount\n },\n\n enabled: Boolean(accountAddress && token),\n refetchInterval: defaultRefetchInterval,\n staleTime: defaultRefetchInterval,\n })\n\n const refetchNewBalance = useCallback(() => {\n queryClient.setQueryDefaults(tokenBalanceQueryKey, {\n refetchInterval: 250,\n staleTime: 250,\n })\n }, [queryClient, tokenBalanceQueryKey])\n\n return {\n token: data,\n isLoading,\n refetch,\n refetchNewBalance,\n getTokenBalancesWithRetry,\n }\n}\n\nexport const getTokenBalancesWithRetry = async (\n sdkClient: SDKClient,\n accountAddress: string,\n tokens: Token[],\n depth = 0\n): Promise<TokenAmount[] | undefined> => {\n try {\n const tokenBalances = await getTokenBalances(\n sdkClient,\n accountAddress as string,\n tokens\n )\n if (!tokenBalances.every((token) => token.blockNumber)) {\n if (depth > 10) {\n console.warn('Token balance backoff depth exceeded.')\n return undefined\n }\n await new Promise((resolve) => {\n setTimeout(resolve, 1.5 ** depth * 100)\n })\n return getTokenBalancesWithRetry(\n sdkClient,\n accountAddress,\n tokens,\n depth + 1\n )\n }\n return tokenBalances\n } catch (_error) {\n console.warn(_error)\n }\n}\n"],"mappings":";;;;;;;AAYA,MAAM,yBAAyB;AAE/B,MAAa,mBACX,gBACA,UAOG;CACH,MAAM,cAAc,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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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"}
|