@lifi/widget 4.0.0-beta.18 → 4.0.0-beta.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.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.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/config/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchTokenInput.js","names":[],"sources":["../../../../src/pages/SelectTokenPage/SearchTokenInput.tsx"],"sourcesContent":["import { type JSX, useCallback, useEffect } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { SearchInput } from '../../components/Search/SearchInput.js'\nimport { useChainOrderStore } from '../../stores/chains/ChainOrderStore.js'\nimport type { FormType } from '../../stores/form/types.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\n\ninterface SearchTokenInputProps {\n formType: FormType\n}\n\nexport const SearchTokenInput = ({\n formType,\n}: SearchTokenInputProps): JSX.Element => {\n const { t } = useTranslation()\n const [value] = useFieldValues('tokenSearchFilter')\n const { setFieldValue, setAsTouched } = useFieldActions()\n const [fromChain, toChain] = useFieldValues('fromChain', 'toChain')\n const isAllNetworks = useChainOrderStore(\n (state) => state[`${formType}IsAllNetworks`]\n )\n\n const onChange = useCallback(\n (newValue: string | number | undefined) => {\n setFieldValue('tokenSearchFilter', newValue, {\n isDirty: true,\n isTouched: true,\n })\n },\n [setFieldValue]\n )\n\n const onBlur = useCallback(() => {\n setAsTouched('tokenSearchFilter')\n }, [setAsTouched])\n\n useEffect(\n () => () => {\n setFieldValue('tokenSearchFilter', '')\n },\n [setFieldValue]\n )\n\n return (\n <SearchInput\n // Reset the search input when a chain or the \"All Networks\" is changed\n key={`${fromChain}-${toChain}-${isAllNetworks}`}\n name=\"tokenSearchFilter\"\n placeholder={t('main.tokenSearch')}\n onChange={(e) => onChange((e.target as HTMLInputElement).value)}\n onBlur={onBlur}\n onClear={() => setFieldValue('tokenSearchFilter', '')}\n value={value as string | undefined}\n autoFocus\n />\n )\n}\n"],"mappings":";;;;;;;;AAYA,MAAa,oBAAoB,EAC/B,eACwC;CACxC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,eAAe,oBAAoB;CACnD,MAAM,EAAE,eAAe,iBAAiB,iBAAiB;CACzD,MAAM,CAAC,WAAW,WAAW,eAAe,aAAa,UAAU;CACnE,MAAM,gBAAgB,oBACnB,UAAU,MAAM,GAAG,SAAS,gBAC9B;CAED,MAAM,WAAW,aACd,aAA0C;
|
|
1
|
+
{"version":3,"file":"SearchTokenInput.js","names":[],"sources":["../../../../src/pages/SelectTokenPage/SearchTokenInput.tsx"],"sourcesContent":["import { type JSX, useCallback, useEffect } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { SearchInput } from '../../components/Search/SearchInput.js'\nimport { useChainOrderStore } from '../../stores/chains/ChainOrderStore.js'\nimport type { FormType } from '../../stores/form/types.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\n\ninterface SearchTokenInputProps {\n formType: FormType\n}\n\nexport const SearchTokenInput = ({\n formType,\n}: SearchTokenInputProps): JSX.Element => {\n const { t } = useTranslation()\n const [value] = useFieldValues('tokenSearchFilter')\n const { setFieldValue, setAsTouched } = useFieldActions()\n const [fromChain, toChain] = useFieldValues('fromChain', 'toChain')\n const isAllNetworks = useChainOrderStore(\n (state) => state[`${formType}IsAllNetworks`]\n )\n\n const onChange = useCallback(\n (newValue: string | number | undefined) => {\n setFieldValue('tokenSearchFilter', newValue, {\n isDirty: true,\n isTouched: true,\n })\n },\n [setFieldValue]\n )\n\n const onBlur = useCallback(() => {\n setAsTouched('tokenSearchFilter')\n }, [setAsTouched])\n\n useEffect(\n () => () => {\n setFieldValue('tokenSearchFilter', '')\n },\n [setFieldValue]\n )\n\n return (\n <SearchInput\n // Reset the search input when a chain or the \"All Networks\" is changed\n key={`${fromChain}-${toChain}-${isAllNetworks}`}\n name=\"tokenSearchFilter\"\n placeholder={t('main.tokenSearch')}\n onChange={(e) => onChange((e.target as HTMLInputElement).value)}\n onBlur={onBlur}\n onClear={() => setFieldValue('tokenSearchFilter', '')}\n value={value as string | undefined}\n autoFocus\n />\n )\n}\n"],"mappings":";;;;;;;;AAYA,MAAa,oBAAoB,EAC/B,eACwC;CACxC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,CAAC,SAAS,eAAe,oBAAoB;CACnD,MAAM,EAAE,eAAe,iBAAiB,iBAAiB;CACzD,MAAM,CAAC,WAAW,WAAW,eAAe,aAAa,UAAU;CACnE,MAAM,gBAAgB,oBACnB,UAAU,MAAM,GAAG,SAAS,gBAC9B;CAED,MAAM,WAAW,aACd,aAA0C;EACzC,cAAc,qBAAqB,UAAU;GAC3C,SAAS;GACT,WAAW;GACZ,CAAC;IAEJ,CAAC,cAAc,CAChB;CAED,MAAM,SAAS,kBAAkB;EAC/B,aAAa,oBAAoB;IAChC,CAAC,aAAa,CAAC;CAElB,sBACc;EACV,cAAc,qBAAqB,GAAG;IAExC,CAAC,cAAc,CAChB;CAED,OACE,oBAAC,aAAD;EAGE,MAAK;EACL,aAAa,EAAE,mBAAmB;EAClC,WAAW,MAAM,SAAU,EAAE,OAA4B,MAAM;EACvD;EACR,eAAe,cAAc,qBAAqB,GAAG;EAC9C;EACP,WAAA;EACA,EARK,GAAG,UAAU,GAAG,QAAQ,GAAG,gBAQhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectTokenPage.js","names":[],"sources":["../../../../src/pages/SelectTokenPage/SelectTokenPage.tsx"],"sourcesContent":["import { Box, type Theme, useMediaQuery } from '@mui/material'\nimport type { FC } from 'react'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ChainSelect } from '../../components/ChainSelect/ChainSelect.js'\nimport { FullPageContainer } from '../../components/FullPageContainer.js'\nimport { TokenList } from '../../components/TokenList/TokenList.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useScrollableOverflowHidden } from '../../hooks/useScrollableContainer.js'\nimport { useSwapOnly } from '../../hooks/useSwapOnly.js'\nimport { useWideVariant } from '../../hooks/useWideVariant.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormTypeProps } from '../../stores/form/types.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { SearchTokenInput } from './SearchTokenInput.js'\n\nexport const SelectTokenPage: FC<FormTypeProps> = ({ formType }) => {\n useScrollableOverflowHidden()\n\n const headerRef = useRef<HTMLElement>(null)\n\n const swapOnly = useSwapOnly()\n\n const { subvariant, hiddenUI, subvariantOptions } = useWidgetConfig()\n const wideVariant = useWideVariant()\n\n const { t } = useTranslation()\n const title =\n formType === 'from'\n ? subvariant === 'custom'\n ? t('header.payWith')\n : t('header.from')\n : t('header.to')\n\n useHeader(title)\n\n const hideChainSelect =\n (wideVariant && !subvariantOptions?.wide?.disableChainSidebar) ||\n (swapOnly && formType === 'to') ||\n hiddenUI?.includes(HiddenUI.ChainSelect)\n\n const isMobile = useMediaQuery((theme: Theme) =>\n theme.breakpoints.down(theme.breakpoints.values.xs)\n )\n const hideSearchTokenInput = hiddenUI?.includes(HiddenUI.SearchTokenInput)\n\n const hasHeader = !hideChainSelect || !hideSearchTokenInput\n\n return (\n <FullPageContainer disableGutters>\n <Box\n ref={headerRef}\n sx={{\n pb: hasHeader ? 2 : 0,\n px: 3,\n }}\n >\n {!hideChainSelect ? <ChainSelect formType={formType} /> : null}\n {!hideSearchTokenInput && (\n <Box\n sx={{\n mt: !hideChainSelect ? 2 : 0,\n }}\n >\n <SearchTokenInput formType={formType} />\n </Box>\n )}\n </Box>\n <TokenList\n // Rerender component if variant changes (since chains tiles change height)\n key={\n hideChainSelect\n ? 'without-offset'\n : isMobile\n ? 'with-offset-mobile'\n : 'with-offset'\n }\n headerRef={headerRef}\n formType={formType}\n />\n </FullPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,mBAAsC,EAAE,eAAe;
|
|
1
|
+
{"version":3,"file":"SelectTokenPage.js","names":[],"sources":["../../../../src/pages/SelectTokenPage/SelectTokenPage.tsx"],"sourcesContent":["import { Box, type Theme, useMediaQuery } from '@mui/material'\nimport type { FC } from 'react'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ChainSelect } from '../../components/ChainSelect/ChainSelect.js'\nimport { FullPageContainer } from '../../components/FullPageContainer.js'\nimport { TokenList } from '../../components/TokenList/TokenList.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useScrollableOverflowHidden } from '../../hooks/useScrollableContainer.js'\nimport { useSwapOnly } from '../../hooks/useSwapOnly.js'\nimport { useWideVariant } from '../../hooks/useWideVariant.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormTypeProps } from '../../stores/form/types.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { SearchTokenInput } from './SearchTokenInput.js'\n\nexport const SelectTokenPage: FC<FormTypeProps> = ({ formType }) => {\n useScrollableOverflowHidden()\n\n const headerRef = useRef<HTMLElement>(null)\n\n const swapOnly = useSwapOnly()\n\n const { subvariant, hiddenUI, subvariantOptions } = useWidgetConfig()\n const wideVariant = useWideVariant()\n\n const { t } = useTranslation()\n const title =\n formType === 'from'\n ? subvariant === 'custom'\n ? t('header.payWith')\n : t('header.from')\n : t('header.to')\n\n useHeader(title)\n\n const hideChainSelect =\n (wideVariant && !subvariantOptions?.wide?.disableChainSidebar) ||\n (swapOnly && formType === 'to') ||\n hiddenUI?.includes(HiddenUI.ChainSelect)\n\n const isMobile = useMediaQuery((theme: Theme) =>\n theme.breakpoints.down(theme.breakpoints.values.xs)\n )\n const hideSearchTokenInput = hiddenUI?.includes(HiddenUI.SearchTokenInput)\n\n const hasHeader = !hideChainSelect || !hideSearchTokenInput\n\n return (\n <FullPageContainer disableGutters>\n <Box\n ref={headerRef}\n sx={{\n pb: hasHeader ? 2 : 0,\n px: 3,\n }}\n >\n {!hideChainSelect ? <ChainSelect formType={formType} /> : null}\n {!hideSearchTokenInput && (\n <Box\n sx={{\n mt: !hideChainSelect ? 2 : 0,\n }}\n >\n <SearchTokenInput formType={formType} />\n </Box>\n )}\n </Box>\n <TokenList\n // Rerender component if variant changes (since chains tiles change height)\n key={\n hideChainSelect\n ? 'without-offset'\n : isMobile\n ? 'with-offset-mobile'\n : 'with-offset'\n }\n headerRef={headerRef}\n formType={formType}\n />\n </FullPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAa,mBAAsC,EAAE,eAAe;CAClE,6BAA6B;CAE7B,MAAM,YAAY,OAAoB,KAAK;CAE3C,MAAM,WAAW,aAAa;CAE9B,MAAM,EAAE,YAAY,UAAU,sBAAsB,iBAAiB;CACrE,MAAM,cAAc,gBAAgB;CAEpC,MAAM,EAAE,MAAM,gBAAgB;CAQ9B,UANE,aAAa,SACT,eAAe,WACb,EAAE,iBAAiB,GACnB,EAAE,cAAc,GAClB,EAAE,YAAY,CAEJ;CAEhB,MAAM,kBACH,eAAe,CAAC,mBAAmB,MAAM,uBACzC,YAAY,aAAa,QAC1B,UAAU,SAAA,cAA8B;CAE1C,MAAM,WAAW,eAAe,UAC9B,MAAM,YAAY,KAAK,MAAM,YAAY,OAAO,GAAG,CACpD;CACD,MAAM,uBAAuB,UAAU,SAAA,mBAAmC;CAI1E,OACE,qBAAC,mBAAD;EAAmB,gBAAA;YAAnB,CACE,qBAAC,KAAD;GACE,KAAK;GACL,IAAI;IACF,IAPU,CAAC,mBAAmB,CAAC,uBAOf,IAAI;IACpB,IAAI;IACL;aALH,CAOG,CAAC,kBAAkB,oBAAC,aAAD,EAAuB,UAAY,CAAA,GAAG,MACzD,CAAC,wBACA,oBAAC,KAAD;IACE,IAAI,EACF,IAAI,CAAC,kBAAkB,IAAI,GAC5B;cAED,oBAAC,kBAAD,EAA4B,UAAY,CAAA;IACpC,CAAA,CAEJ;MACN,oBAAC,WAAD;GASa;GACD;GACV,EARE,kBACI,mBACA,WACE,uBACA,cAIR,CACgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarkAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/BookmarkAddressSheet.tsx"],"sourcesContent":["import ErrorIcon from '@mui/icons-material/Error'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ChangeEvent, RefObject } from 'react'\nimport {\n type ForwardRefExoticComponent,\n forwardRef,\n type RefAttributes,\n useState,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Input } from '../../components/Input.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport {\n AddressInput,\n BookmarkInputFields,\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\nimport type { BookmarkError } from './types.js'\n\ninterface BookmarkAddressProps {\n onAddBookmark: (bookmark: Bookmark) => void\n validatedWallet?: Bookmark\n}\n\nexport const BookmarkAddressSheet: ForwardRefExoticComponent<\n BookmarkAddressProps & RefAttributes<BottomSheetBase>\n> = forwardRef<BottomSheetBase, BookmarkAddressProps>(\n ({ validatedWallet, onAddBookmark }, ref) => {\n const { t } = useTranslation()\n const [name, setName] = useState('')\n const [address, setAddress] = useState('')\n const [error, setError] = useState<BookmarkError>()\n const { validateAddress, isValidating } = useAddressValidation()\n const { getBookmark } = useBookmarkActions()\n\n const nameValue = name.trim() || validatedWallet?.name || ''\n const addressValue = address || validatedWallet?.address || ''\n\n const handleCancel = () => {\n setError(undefined)\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n const validateWithAddressFromInput = async () => {\n const validationResult = await validateAddress({ value: address })\n if (!validationResult.isValid) {\n setError({ type: 'address', message: validationResult.error })\n return\n }\n\n return {\n name: nameValue,\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n }\n\n const validateWithValidatedWallet = (validatedWallet: Bookmark) => {\n if (error) {\n setError(undefined)\n }\n return {\n name: nameValue,\n address: validatedWallet.address,\n chainType: validatedWallet.chainType,\n }\n }\n\n const handleBookmark = async () => {\n if (isValidating) {\n return\n }\n if (!nameValue) {\n setError({\n type: 'name',\n message: t('error.title.bookmarkNameRequired'),\n })\n return\n }\n if (!addressValue) {\n setError({\n type: 'address',\n message: t('error.title.walletAddressRequired'),\n })\n return\n }\n\n // If the validatedWallet is supplied as a prop then we should assume\n // the address has already been validated\n const validatedBookmark = validatedWallet\n ? validateWithValidatedWallet(validatedWallet)\n : await validateWithAddressFromInput()\n\n if (validatedBookmark) {\n const existingBookmark = getBookmark(validatedBookmark.address)\n if (existingBookmark) {\n setError({\n type: 'address',\n message: t('error.title.bookmarkAlreadyExists', {\n name: existingBookmark.name,\n }),\n })\n return\n }\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n\n onAddBookmark({\n name: validatedBookmark.name,\n address: validatedBookmark.address,\n chainType: validatedBookmark.chainType,\n })\n }\n }\n\n const handleAddressInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setAddress((e.target as HTMLInputElement).value.trim())\n }\n\n const handleNameInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setName((e.target as HTMLInputElement).value)\n }\n\n const resetValues = () => {\n setName('')\n setAddress('')\n }\n\n return (\n <BottomSheet ref={ref} onClose={resetValues}>\n <SendToWalletSheetContainer>\n <IconContainer>\n <TurnedIn sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.bookmarkWallet')}</SheetTitle>\n {validatedWallet ? (\n <SheetAddressContainer>\n {validatedWallet?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedWallet?.name}\n </Typography>\n ) : null}\n <Typography>{validatedWallet?.address}</Typography>\n </SheetAddressContainer>\n ) : null}\n <BookmarkInputFields>\n <SendToWalletCard\n type={error?.type === 'name' ? 'error' : 'default'}\n >\n <Input\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleNameInputChange}\n value={name}\n placeholder={\n validatedWallet?.name || t('sendToWallet.enterName')\n }\n aria-label={\n validatedWallet?.name || t('sendToWallet.enterName')\n }\n inputProps={{ maxLength: 128 }}\n />\n </SendToWalletCard>\n {!validatedWallet && (\n <SendToWalletCard\n type={error?.type === 'address' ? 'error' : 'default'}\n >\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleAddressInputChange}\n value={address}\n placeholder={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n aria-label={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n </SendToWalletCard>\n )}\n {error ? (\n <ValidationAlert icon={<ErrorIcon />}>\n {error.message}\n </ValidationAlert>\n ) : null}\n </BookmarkInputFields>\n <AlertMessage\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={handleCancel} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleBookmark}\n loading={isValidating}\n loadingPosition=\"center\"\n fullWidth\n focusRipple\n >\n {t('button.bookmark')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n </BottomSheet>\n )\n }\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BookmarkAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/BookmarkAddressSheet.tsx"],"sourcesContent":["import ErrorIcon from '@mui/icons-material/Error'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ChangeEvent, RefObject } from 'react'\nimport {\n type ForwardRefExoticComponent,\n forwardRef,\n type RefAttributes,\n useState,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Input } from '../../components/Input.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport {\n AddressInput,\n BookmarkInputFields,\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\nimport type { BookmarkError } from './types.js'\n\ninterface BookmarkAddressProps {\n onAddBookmark: (bookmark: Bookmark) => void\n validatedWallet?: Bookmark\n}\n\nexport const BookmarkAddressSheet: ForwardRefExoticComponent<\n BookmarkAddressProps & RefAttributes<BottomSheetBase>\n> = forwardRef<BottomSheetBase, BookmarkAddressProps>(\n ({ validatedWallet, onAddBookmark }, ref) => {\n const { t } = useTranslation()\n const [name, setName] = useState('')\n const [address, setAddress] = useState('')\n const [error, setError] = useState<BookmarkError>()\n const { validateAddress, isValidating } = useAddressValidation()\n const { getBookmark } = useBookmarkActions()\n\n const nameValue = name.trim() || validatedWallet?.name || ''\n const addressValue = address || validatedWallet?.address || ''\n\n const handleCancel = () => {\n setError(undefined)\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n const validateWithAddressFromInput = async () => {\n const validationResult = await validateAddress({ value: address })\n if (!validationResult.isValid) {\n setError({ type: 'address', message: validationResult.error })\n return\n }\n\n return {\n name: nameValue,\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n }\n\n const validateWithValidatedWallet = (validatedWallet: Bookmark) => {\n if (error) {\n setError(undefined)\n }\n return {\n name: nameValue,\n address: validatedWallet.address,\n chainType: validatedWallet.chainType,\n }\n }\n\n const handleBookmark = async () => {\n if (isValidating) {\n return\n }\n if (!nameValue) {\n setError({\n type: 'name',\n message: t('error.title.bookmarkNameRequired'),\n })\n return\n }\n if (!addressValue) {\n setError({\n type: 'address',\n message: t('error.title.walletAddressRequired'),\n })\n return\n }\n\n // If the validatedWallet is supplied as a prop then we should assume\n // the address has already been validated\n const validatedBookmark = validatedWallet\n ? validateWithValidatedWallet(validatedWallet)\n : await validateWithAddressFromInput()\n\n if (validatedBookmark) {\n const existingBookmark = getBookmark(validatedBookmark.address)\n if (existingBookmark) {\n setError({\n type: 'address',\n message: t('error.title.bookmarkAlreadyExists', {\n name: existingBookmark.name,\n }),\n })\n return\n }\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n\n onAddBookmark({\n name: validatedBookmark.name,\n address: validatedBookmark.address,\n chainType: validatedBookmark.chainType,\n })\n }\n }\n\n const handleAddressInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setAddress((e.target as HTMLInputElement).value.trim())\n }\n\n const handleNameInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setName((e.target as HTMLInputElement).value)\n }\n\n const resetValues = () => {\n setName('')\n setAddress('')\n }\n\n return (\n <BottomSheet ref={ref} onClose={resetValues}>\n <SendToWalletSheetContainer>\n <IconContainer>\n <TurnedIn sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.bookmarkWallet')}</SheetTitle>\n {validatedWallet ? (\n <SheetAddressContainer>\n {validatedWallet?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedWallet?.name}\n </Typography>\n ) : null}\n <Typography>{validatedWallet?.address}</Typography>\n </SheetAddressContainer>\n ) : null}\n <BookmarkInputFields>\n <SendToWalletCard\n type={error?.type === 'name' ? 'error' : 'default'}\n >\n <Input\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleNameInputChange}\n value={name}\n placeholder={\n validatedWallet?.name || t('sendToWallet.enterName')\n }\n aria-label={\n validatedWallet?.name || t('sendToWallet.enterName')\n }\n inputProps={{ maxLength: 128 }}\n />\n </SendToWalletCard>\n {!validatedWallet && (\n <SendToWalletCard\n type={error?.type === 'address' ? 'error' : 'default'}\n >\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleAddressInputChange}\n value={address}\n placeholder={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n aria-label={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n </SendToWalletCard>\n )}\n {error ? (\n <ValidationAlert icon={<ErrorIcon />}>\n {error.message}\n </ValidationAlert>\n ) : null}\n </BookmarkInputFields>\n <AlertMessage\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={handleCancel} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleBookmark}\n loading={isValidating}\n loadingPosition=\"center\"\n fullWidth\n focusRipple\n >\n {t('button.bookmark')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n </BottomSheet>\n )\n }\n)\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarksPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/BookmarksPage.tsx"],"sourcesContent":["import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport DeleteOutline from '@mui/icons-material/DeleteOutlined'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport { Button, ListItemAvatar, ListItemText } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem//ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { defaultChainIdsByType } from '../../utils/chainType.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport { BookmarkAddressSheet } from './BookmarkAddressSheet.js'\nimport { EmptyListIndicator } from './EmptyListIndicator.js'\nimport {\n BookmarkButtonContainer,\n BookmarksListContainer,\n FullHeightAdjustablePageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const BookmarksPage = (): JSX.Element => {\n const { t } = useTranslation()\n const bookmarkAddressSheetRef = useRef<BottomSheetBase>(null)\n const { bookmarks } = useBookmarks()\n const { requiredToChainType } = useToAddressRequirements()\n const { addBookmark, removeBookmark, setSelectedBookmark } =\n useBookmarkActions()\n const navigate = useNavigate()\n const { setFieldValue } = useFieldActions()\n const { variant } = useWidgetConfig()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('header.bookmarkedWallets'))\n\n const handleAddBookmark = () => {\n bookmarkAddressSheetRef.current?.open()\n }\n\n const handleBookmarkSelected = (bookmark: Bookmark) => {\n setFieldValue('toAddress', bookmark.address, {\n isTouched: true,\n isDirty: true,\n })\n setSelectedBookmark(bookmark)\n navigate({ to: navigationRoutes.home, replace: true })\n }\n\n return (\n <FullHeightAdjustablePageContainer\n disableGutters\n enableFullHeight={variant !== 'drawer'}\n >\n <BookmarksListContainer>\n {bookmarks.map((bookmark) => (\n <ListItem key={bookmark.address} sx={{ position: 'relative' }}>\n <ListItemButton\n onClick={() => handleBookmarkSelected(bookmark)}\n disabled={\n requiredToChainType &&\n requiredToChainType !== bookmark.chainType\n }\n >\n <ListItemAvatar>\n <AccountAvatar\n chainId={defaultChainIdsByType[bookmark.chainType]}\n />\n </ListItemAvatar>\n <ListItemText\n primary={bookmark.name}\n secondary={shortenAddress(bookmark.address)}\n />\n </ListItemButton>\n <ContextMenu\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== bookmark.chainType\n )\n }\n items={[\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () =>\n navigator.clipboard.writeText(bookmark.address),\n },\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () =>\n window.open(\n getAddressLink(\n bookmark.address,\n defaultChainIdsByType[bookmark.chainType]\n ),\n '_blank'\n ),\n },\n {\n icon: <DeleteOutline />,\n label: t('button.delete'),\n onClick: () => removeBookmark(bookmark.address),\n },\n ]}\n />\n </ListItem>\n ))}\n {!bookmarks.length && (\n <EmptyListIndicator icon={<TurnedIn sx={{ fontSize: 48 }} />}>\n {t('sendToWallet.noBookmarkedWallets')}\n </EmptyListIndicator>\n )}\n </BookmarksListContainer>\n <BookmarkButtonContainer>\n <Button variant=\"contained\" onClick={handleAddBookmark}>\n {t('sendToWallet.addBookmark')}\n </Button>\n </BookmarkButtonContainer>\n <BookmarkAddressSheet\n ref={bookmarkAddressSheetRef}\n onAddBookmark={addBookmark}\n />\n </FullHeightAdjustablePageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,sBAAmC;CAC9C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,0BAA0B,OAAwB,KAAK;CAC7D,MAAM,EAAE,cAAc,cAAc;CACpC,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,EAAE,aAAa,gBAAgB,wBACnC,oBAAoB;CACtB,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,YAAY,iBAAiB;CACrC,MAAM,EAAE,mBAAmB,aAAa;
|
|
1
|
+
{"version":3,"file":"BookmarksPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/BookmarksPage.tsx"],"sourcesContent":["import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport DeleteOutline from '@mui/icons-material/DeleteOutlined'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport { Button, ListItemAvatar, ListItemText } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem//ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { defaultChainIdsByType } from '../../utils/chainType.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport { BookmarkAddressSheet } from './BookmarkAddressSheet.js'\nimport { EmptyListIndicator } from './EmptyListIndicator.js'\nimport {\n BookmarkButtonContainer,\n BookmarksListContainer,\n FullHeightAdjustablePageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const BookmarksPage = (): JSX.Element => {\n const { t } = useTranslation()\n const bookmarkAddressSheetRef = useRef<BottomSheetBase>(null)\n const { bookmarks } = useBookmarks()\n const { requiredToChainType } = useToAddressRequirements()\n const { addBookmark, removeBookmark, setSelectedBookmark } =\n useBookmarkActions()\n const navigate = useNavigate()\n const { setFieldValue } = useFieldActions()\n const { variant } = useWidgetConfig()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('header.bookmarkedWallets'))\n\n const handleAddBookmark = () => {\n bookmarkAddressSheetRef.current?.open()\n }\n\n const handleBookmarkSelected = (bookmark: Bookmark) => {\n setFieldValue('toAddress', bookmark.address, {\n isTouched: true,\n isDirty: true,\n })\n setSelectedBookmark(bookmark)\n navigate({ to: navigationRoutes.home, replace: true })\n }\n\n return (\n <FullHeightAdjustablePageContainer\n disableGutters\n enableFullHeight={variant !== 'drawer'}\n >\n <BookmarksListContainer>\n {bookmarks.map((bookmark) => (\n <ListItem key={bookmark.address} sx={{ position: 'relative' }}>\n <ListItemButton\n onClick={() => handleBookmarkSelected(bookmark)}\n disabled={\n requiredToChainType &&\n requiredToChainType !== bookmark.chainType\n }\n >\n <ListItemAvatar>\n <AccountAvatar\n chainId={defaultChainIdsByType[bookmark.chainType]}\n />\n </ListItemAvatar>\n <ListItemText\n primary={bookmark.name}\n secondary={shortenAddress(bookmark.address)}\n />\n </ListItemButton>\n <ContextMenu\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== bookmark.chainType\n )\n }\n items={[\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () =>\n navigator.clipboard.writeText(bookmark.address),\n },\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () =>\n window.open(\n getAddressLink(\n bookmark.address,\n defaultChainIdsByType[bookmark.chainType]\n ),\n '_blank'\n ),\n },\n {\n icon: <DeleteOutline />,\n label: t('button.delete'),\n onClick: () => removeBookmark(bookmark.address),\n },\n ]}\n />\n </ListItem>\n ))}\n {!bookmarks.length && (\n <EmptyListIndicator icon={<TurnedIn sx={{ fontSize: 48 }} />}>\n {t('sendToWallet.noBookmarkedWallets')}\n </EmptyListIndicator>\n )}\n </BookmarksListContainer>\n <BookmarkButtonContainer>\n <Button variant=\"contained\" onClick={handleAddBookmark}>\n {t('sendToWallet.addBookmark')}\n </Button>\n </BookmarkButtonContainer>\n <BookmarkAddressSheet\n ref={bookmarkAddressSheetRef}\n onAddBookmark={addBookmark}\n />\n </FullHeightAdjustablePageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,sBAAmC;CAC9C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,0BAA0B,OAAwB,KAAK;CAC7D,MAAM,EAAE,cAAc,cAAc;CACpC,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,EAAE,aAAa,gBAAgB,wBACnC,oBAAoB;CACtB,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,YAAY,iBAAiB;CACrC,MAAM,EAAE,mBAAmB,aAAa;CAExC,UAAU,EAAE,2BAA2B,CAAC;CAExC,MAAM,0BAA0B;EAC9B,wBAAwB,SAAS,MAAM;;CAGzC,MAAM,0BAA0B,aAAuB;EACrD,cAAc,aAAa,SAAS,SAAS;GAC3C,WAAW;GACX,SAAS;GACV,CAAC;EACF,oBAAoB,SAAS;EAC7B,SAAS;GAAE,IAAI,iBAAiB;GAAM,SAAS;GAAM,CAAC;;CAGxD,OACE,qBAAC,mCAAD;EACE,gBAAA;EACA,kBAAkB,YAAY;YAFhC;GAIE,qBAAC,wBAAD,EAAA,UAAA,CACG,UAAU,KAAK,aACd,qBAACA,YAAD;IAAiC,IAAI,EAAE,UAAU,YAAY;cAA7D,CACE,qBAACC,kBAAD;KACE,eAAe,uBAAuB,SAAS;KAC/C,UACE,uBACA,wBAAwB,SAAS;eAJrC,CAOE,oBAAC,gBAAD,EAAA,UACE,oBAAC,eAAD,EACE,SAAS,sBAAsB,SAAS,YACxC,CAAA,EACa,CAAA,EACjB,oBAAC,cAAD;MACE,SAAS,SAAS;MAClB,WAAW,eAAe,SAAS,QAAQ;MAC3C,CAAA,CACa;QACjB,oBAAC,aAAD;KACE,UACE,CAAC,EACC,uBACA,wBAAwB,SAAS;KAGrC,OAAO;MACL;OACE,MAAM,oBAAC,oBAAD,EAAsB,CAAA;OAC5B,OAAO,EAAE,qBAAqB;OAC9B,eACE,UAAU,UAAU,UAAU,SAAS,QAAQ;OAClD;MACD;OACE,MAAM,oBAAC,kBAAD,EAAoB,CAAA;OAC1B,OAAO,EAAE,wBAAwB;OACjC,eACE,OAAO,KACL,eACE,SAAS,SACT,sBAAsB,SAAS,WAChC,EACD,SACD;OACJ;MACD;OACE,MAAM,oBAAC,eAAD,EAAiB,CAAA;OACvB,OAAO,EAAE,gBAAgB;OACzB,eAAe,eAAe,SAAS,QAAQ;OAChD;MACF;KACD,CAAA,CACO;MAnDI,SAAS,QAmDb,CACX,EACD,CAAC,UAAU,UACV,oBAAC,oBAAD;IAAoB,MAAM,oBAAC,UAAD,EAAU,IAAI,EAAE,UAAU,IAAI,EAAI,CAAA;cACzD,EAAE,mCAAmC;IACnB,CAAA,CAEA,EAAA,CAAA;GACzB,oBAAC,yBAAD,EAAA,UACE,oBAAC,QAAD;IAAQ,SAAQ;IAAY,SAAS;cAClC,EAAE,2BAA2B;IACvB,CAAA,EACe,CAAA;GAC1B,oBAAC,sBAAD;IACE,KAAK;IACL,eAAe;IACf,CAAA;GACgC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/ConfirmAddressSheet.tsx"],"sourcesContent":["import Wallet from '@mui/icons-material/Wallet'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ForwardRefExoticComponent, RefAttributes, RefObject } from 'react'\nimport { forwardRef, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport { useSetContentHeight } from '../../hooks/useSetContentHeight.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport {\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n} from './SendToWalletPage.style.js'\n\ninterface ConfirmAddressSheetProps {\n onConfirm: (wallet: Bookmark) => void\n validatedBookmark?: Bookmark\n}\n\ninterface ConfirmAddressSheetContentProps extends ConfirmAddressSheetProps {\n onClose: () => void\n}\n\nexport const ConfirmAddressSheet: ForwardRefExoticComponent<\n ConfirmAddressSheetProps & RefAttributes<BottomSheetBase>\n> = forwardRef<BottomSheetBase, ConfirmAddressSheetProps>((props, ref) => {\n const handleClose = () => {\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n return (\n <BottomSheet ref={ref}>\n <ConfirmAddressSheetContent {...props} onClose={handleClose} />\n </BottomSheet>\n )\n})\n\nconst ConfirmAddressSheetContent: React.FC<ConfirmAddressSheetContentProps> = ({\n validatedBookmark,\n onConfirm,\n onClose,\n}) => {\n const { t } = useTranslation()\n const navigateBack = useNavigateBack()\n const { setFieldValue } = useFieldActions()\n const containerRef = useRef<HTMLElement>(null)\n useSetContentHeight(containerRef)\n\n const handleConfirm = () => {\n if (validatedBookmark) {\n setFieldValue('toAddress', validatedBookmark.address, {\n isTouched: true,\n isDirty: true,\n })\n onConfirm?.(validatedBookmark)\n onClose()\n navigateBack()\n }\n }\n\n return (\n <SendToWalletSheetContainer ref={containerRef}>\n <IconContainer>\n <Wallet sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.confirmWalletAddress')}</SheetTitle>\n <SheetAddressContainer>\n {validatedBookmark?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedBookmark?.name}\n </Typography>\n ) : null}\n <Typography>{validatedBookmark?.address}</Typography>\n </SheetAddressContainer>\n <AlertMessage\n severity=\"warning\"\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n multiline\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={onClose} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button variant=\"contained\" onClick={handleConfirm} fullWidth>\n {t('button.confirm')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,MAAa,sBAET,YAAuD,OAAO,QAAQ;CACxE,MAAM,oBAAoB;
|
|
1
|
+
{"version":3,"file":"ConfirmAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/ConfirmAddressSheet.tsx"],"sourcesContent":["import Wallet from '@mui/icons-material/Wallet'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ForwardRefExoticComponent, RefAttributes, RefObject } from 'react'\nimport { forwardRef, useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport { useSetContentHeight } from '../../hooks/useSetContentHeight.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport {\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n} from './SendToWalletPage.style.js'\n\ninterface ConfirmAddressSheetProps {\n onConfirm: (wallet: Bookmark) => void\n validatedBookmark?: Bookmark\n}\n\ninterface ConfirmAddressSheetContentProps extends ConfirmAddressSheetProps {\n onClose: () => void\n}\n\nexport const ConfirmAddressSheet: ForwardRefExoticComponent<\n ConfirmAddressSheetProps & RefAttributes<BottomSheetBase>\n> = forwardRef<BottomSheetBase, ConfirmAddressSheetProps>((props, ref) => {\n const handleClose = () => {\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n return (\n <BottomSheet ref={ref}>\n <ConfirmAddressSheetContent {...props} onClose={handleClose} />\n </BottomSheet>\n )\n})\n\nconst ConfirmAddressSheetContent: React.FC<ConfirmAddressSheetContentProps> = ({\n validatedBookmark,\n onConfirm,\n onClose,\n}) => {\n const { t } = useTranslation()\n const navigateBack = useNavigateBack()\n const { setFieldValue } = useFieldActions()\n const containerRef = useRef<HTMLElement>(null)\n useSetContentHeight(containerRef)\n\n const handleConfirm = () => {\n if (validatedBookmark) {\n setFieldValue('toAddress', validatedBookmark.address, {\n isTouched: true,\n isDirty: true,\n })\n onConfirm?.(validatedBookmark)\n onClose()\n navigateBack()\n }\n }\n\n return (\n <SendToWalletSheetContainer ref={containerRef}>\n <IconContainer>\n <Wallet sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.confirmWalletAddress')}</SheetTitle>\n <SheetAddressContainer>\n {validatedBookmark?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedBookmark?.name}\n </Typography>\n ) : null}\n <Typography>{validatedBookmark?.address}</Typography>\n </SheetAddressContainer>\n <AlertMessage\n severity=\"warning\"\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n multiline\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={onClose} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button variant=\"contained\" onClick={handleConfirm} fullWidth>\n {t('button.confirm')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,MAAa,sBAET,YAAuD,OAAO,QAAQ;CACxE,MAAM,oBAAoB;EACvB,IAAoC,SAAS,OAAO;;CAGvD,OACE,oBAAC,aAAD;EAAkB;YAChB,oBAAC,4BAAD;GAA4B,GAAI;GAAO,SAAS;GAAe,CAAA;EACnD,CAAA;EAEhB;AAEF,MAAM,8BAAyE,EAC7E,mBACA,WACA,cACI;CACJ,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,eAAe,iBAAiB;CACtC,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,eAAe,OAAoB,KAAK;CAC9C,oBAAoB,aAAa;CAEjC,MAAM,sBAAsB;EAC1B,IAAI,mBAAmB;GACrB,cAAc,aAAa,kBAAkB,SAAS;IACpD,WAAW;IACX,SAAS;IACV,CAAC;GACF,YAAY,kBAAkB;GAC9B,SAAS;GACT,cAAc;;;CAIlB,OACE,qBAAC,4BAAD;EAA4B,KAAK;YAAjC;GACE,oBAAC,eAAD,EAAA,UACE,oBAAC,QAAD,EAAQ,IAAI,EAAE,UAAU,IAAI,EAAI,CAAA,EAClB,CAAA;GAChB,oBAAC,YAAD,EAAA,UAAa,EAAE,oCAAoC,EAAc,CAAA;GACjE,qBAAC,uBAAD,EAAA,UAAA,CACG,mBAAmB,OAClB,oBAAC,YAAD;IACE,IAAI;KACF,YAAY;KACZ,IAAI;KACL;cAEA,mBAAmB;IACT,CAAA,GACX,MACJ,oBAAC,YAAD,EAAA,UAAa,mBAAmB,SAAqB,CAAA,CAC/B,EAAA,CAAA;GACxB,oBAAC,cAAD;IACE,UAAS;IACT,OACE,oBAAC,YAAD;KAAY,SAAQ;KAAQ,IAAI,EAAE,OAAO,gBAAgB;eACtD,EAAE,sCAAsC;KAC9B,CAAA;IAEf,MAAM,oBAAC,gBAAD,EAAkB,CAAA;IACxB,WAAA;IACA,CAAA;GACF,qBAAC,uBAAD,EAAA,UAAA,CACE,oBAAC,QAAD;IAAQ,SAAQ;IAAO,SAAS;IAAS,WAAA;cACtC,EAAE,gBAAgB;IACZ,CAAA,EACT,oBAAC,QAAD;IAAQ,SAAQ;IAAY,SAAS;IAAe,WAAA;cACjD,EAAE,iBAAiB;IACb,CAAA,CACa,EAAA,CAAA;GACG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectedWalletsPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/ConnectedWalletsPage.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport type { Account } from '@lifi/widget-provider'\nimport ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport Wallet from '@mui/icons-material/Wallet'\nimport { ListItemAvatar, ListItemText } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport type { JSX } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem/ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport { EmptyListIndicator } from './EmptyListIndicator.js'\nimport {\n ListContainer,\n SendToWalletPageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const ConnectedWalletsPage = (): JSX.Element => {\n const { t } = useTranslation()\n const { accounts } = useAccount()\n const { setSelectedBookmark } = useBookmarkActions()\n const { requiredToChainType } = useToAddressRequirements()\n const navigate = useNavigate()\n const { setFieldValue } = useFieldActions()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('sendToWallet.connectedWallets'))\n\n const handleWalletSelected = (account: Account) => {\n setFieldValue('toAddress', account.address!, {\n isTouched: true,\n isDirty: true,\n })\n setSelectedBookmark({\n name: account.connector?.name,\n address: account.address!,\n chainType: account.chainType!,\n isConnectedAccount: true,\n })\n navigate({\n to: navigationRoutes.home,\n replace: true,\n })\n }\n\n return (\n <SendToWalletPageContainer disableGutters>\n <ListContainer>\n {accounts.map((account) => {\n const walletAddress = shortenAddress(account.address)\n const menuItems = [\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () => {\n if (account.address) {\n navigator.clipboard.writeText(account.address)\n }\n },\n },\n ...(account.chainId\n ? [\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () => {\n if (account.address) {\n window.open(\n getAddressLink(account.address, account.chainId),\n '_blank'\n )\n }\n },\n },\n ]\n : []),\n ]\n\n return (\n <ListItem key={account.address} sx={{ position: 'relative' }}>\n <ListItemButton\n onClick={() => handleWalletSelected(account)}\n disabled={\n requiredToChainType &&\n requiredToChainType !== account.chainType\n }\n >\n <ListItemAvatar>\n <AccountAvatar chainId={account.chainId} account={account} />\n </ListItemAvatar>\n <ListItemText\n primary={account.connector?.name}\n secondary={walletAddress}\n />\n </ListItemButton>\n <ContextMenu\n items={menuItems}\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== account.chainType\n )\n }\n />\n </ListItem>\n )\n })}\n {!accounts.length && (\n <EmptyListIndicator icon={<Wallet sx={{ fontSize: 48 }} />}>\n {t('sendToWallet.noConnectedWallets')}\n </EmptyListIndicator>\n )}\n </ListContainer>\n </SendToWalletPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAa,6BAA0C;CACrD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,wBAAwB,oBAAoB;CACpD,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,mBAAmB,aAAa;
|
|
1
|
+
{"version":3,"file":"ConnectedWalletsPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/ConnectedWalletsPage.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport type { Account } from '@lifi/widget-provider'\nimport ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport Wallet from '@mui/icons-material/Wallet'\nimport { ListItemAvatar, ListItemText } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport type { JSX } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem/ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport { EmptyListIndicator } from './EmptyListIndicator.js'\nimport {\n ListContainer,\n SendToWalletPageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const ConnectedWalletsPage = (): JSX.Element => {\n const { t } = useTranslation()\n const { accounts } = useAccount()\n const { setSelectedBookmark } = useBookmarkActions()\n const { requiredToChainType } = useToAddressRequirements()\n const navigate = useNavigate()\n const { setFieldValue } = useFieldActions()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('sendToWallet.connectedWallets'))\n\n const handleWalletSelected = (account: Account) => {\n setFieldValue('toAddress', account.address!, {\n isTouched: true,\n isDirty: true,\n })\n setSelectedBookmark({\n name: account.connector?.name,\n address: account.address!,\n chainType: account.chainType!,\n isConnectedAccount: true,\n })\n navigate({\n to: navigationRoutes.home,\n replace: true,\n })\n }\n\n return (\n <SendToWalletPageContainer disableGutters>\n <ListContainer>\n {accounts.map((account) => {\n const walletAddress = shortenAddress(account.address)\n const menuItems = [\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () => {\n if (account.address) {\n navigator.clipboard.writeText(account.address)\n }\n },\n },\n ...(account.chainId\n ? [\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () => {\n if (account.address) {\n window.open(\n getAddressLink(account.address, account.chainId),\n '_blank'\n )\n }\n },\n },\n ]\n : []),\n ]\n\n return (\n <ListItem key={account.address} sx={{ position: 'relative' }}>\n <ListItemButton\n onClick={() => handleWalletSelected(account)}\n disabled={\n requiredToChainType &&\n requiredToChainType !== account.chainType\n }\n >\n <ListItemAvatar>\n <AccountAvatar chainId={account.chainId} account={account} />\n </ListItemAvatar>\n <ListItemText\n primary={account.connector?.name}\n secondary={walletAddress}\n />\n </ListItemButton>\n <ContextMenu\n items={menuItems}\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== account.chainType\n )\n }\n />\n </ListItem>\n )\n })}\n {!accounts.length && (\n <EmptyListIndicator icon={<Wallet sx={{ fontSize: 48 }} />}>\n {t('sendToWallet.noConnectedWallets')}\n </EmptyListIndicator>\n )}\n </ListContainer>\n </SendToWalletPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAa,6BAA0C;CACrD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,EAAE,wBAAwB,oBAAoB;CACpD,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,mBAAmB,aAAa;CAExC,UAAU,EAAE,gCAAgC,CAAC;CAE7C,MAAM,wBAAwB,YAAqB;EACjD,cAAc,aAAa,QAAQ,SAAU;GAC3C,WAAW;GACX,SAAS;GACV,CAAC;EACF,oBAAoB;GAClB,MAAM,QAAQ,WAAW;GACzB,SAAS,QAAQ;GACjB,WAAW,QAAQ;GACnB,oBAAoB;GACrB,CAAC;EACF,SAAS;GACP,IAAI,iBAAiB;GACrB,SAAS;GACV,CAAC;;CAGJ,OACE,oBAAC,2BAAD;EAA2B,gBAAA;YACzB,qBAAC,eAAD,EAAA,UAAA,CACG,SAAS,KAAK,YAAY;GACzB,MAAM,gBAAgB,eAAe,QAAQ,QAAQ;GACrD,MAAM,YAAY,CAChB;IACE,MAAM,oBAAC,oBAAD,EAAsB,CAAA;IAC5B,OAAO,EAAE,qBAAqB;IAC9B,eAAe;KACb,IAAI,QAAQ,SACV,UAAU,UAAU,UAAU,QAAQ,QAAQ;;IAGnD,EACD,GAAI,QAAQ,UACR,CACE;IACE,MAAM,oBAAC,kBAAD,EAAoB,CAAA;IAC1B,OAAO,EAAE,wBAAwB;IACjC,eAAe;KACb,IAAI,QAAQ,SACV,OAAO,KACL,eAAe,QAAQ,SAAS,QAAQ,QAAQ,EAChD,SACD;;IAGN,CACF,GACD,EAAE,CACP;GAED,OACE,qBAACA,YAAD;IAAgC,IAAI,EAAE,UAAU,YAAY;cAA5D,CACE,qBAACC,kBAAD;KACE,eAAe,qBAAqB,QAAQ;KAC5C,UACE,uBACA,wBAAwB,QAAQ;eAJpC,CAOE,oBAAC,gBAAD,EAAA,UACE,oBAAC,eAAD;MAAe,SAAS,QAAQ;MAAkB;MAAW,CAAA,EAC9C,CAAA,EACjB,oBAAC,cAAD;MACE,SAAS,QAAQ,WAAW;MAC5B,WAAW;MACX,CAAA,CACa;QACjB,oBAAC,aAAD;KACE,OAAO;KACP,UACE,CAAC,EACC,uBACA,wBAAwB,QAAQ;KAGpC,CAAA,CACO;MAzBI,QAAQ,QAyBZ;IAEb,EACD,CAAC,SAAS,UACT,oBAAC,oBAAD;GAAoB,MAAM,oBAAC,QAAD,EAAQ,IAAI,EAAE,UAAU,IAAI,EAAI,CAAA;aACvD,EAAE,kCAAkC;GAClB,CAAA,CAET,EAAA,CAAA;EACU,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecentWalletsPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/RecentWalletsPage.tsx"],"sourcesContent":["import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport DeleteOutline from '@mui/icons-material/DeleteOutlined'\nimport History from '@mui/icons-material/History'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport TurnedInNot from '@mui/icons-material/TurnedInNot'\nimport { ListItemAvatar, ListItemText } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem/ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { defaultChainIdsByType } from '../../utils/chainType.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport { BookmarkAddressSheet } from './BookmarkAddressSheet.js'\nimport { EmptyListIndicator } from './EmptyListIndicator.js'\nimport {\n ListContainer,\n SendToWalletPageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const RecentWalletsPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const [bookmarkTarget, setBookmarkTarget] = useState<Bookmark>()\n const bookmarkAddressSheetRef = useRef<BottomSheetBase>(null)\n const { recentWallets } = useBookmarks()\n const { requiredToChainType } = useToAddressRequirements()\n const {\n removeRecentWallet,\n addBookmark,\n setSelectedBookmark,\n addRecentWallet,\n } = useBookmarkActions()\n const { setFieldValue } = useFieldActions()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('header.recentWallets'))\n\n const handleRecentSelected = (recentWallet: Bookmark) => {\n addRecentWallet(recentWallet)\n setFieldValue('toAddress', recentWallet.address, {\n isTouched: true,\n isDirty: true,\n })\n setSelectedBookmark(recentWallet)\n navigate({\n to: navigationRoutes.home,\n replace: true,\n })\n }\n\n const handleAddBookmark = (bookmark: Bookmark) => {\n addBookmark(bookmark)\n navigate({ to: navigationRoutes.bookmarks, replace: true })\n }\n\n return (\n <SendToWalletPageContainer disableGutters>\n <ListContainer>\n {recentWallets.map((recentWallet) => (\n <ListItem key={recentWallet.address} sx={{ position: 'relative' }}>\n <ListItemButton\n disabled={\n requiredToChainType &&\n requiredToChainType !== recentWallet.chainType\n }\n onClick={() => handleRecentSelected(recentWallet)}\n >\n <ListItemAvatar>\n <AccountAvatar\n chainId={defaultChainIdsByType[recentWallet.chainType]}\n />\n </ListItemAvatar>\n <ListItemText\n primary={\n recentWallet.name || shortenAddress(recentWallet.address)\n }\n secondary={\n recentWallet.name\n ? shortenAddress(recentWallet.address)\n : undefined\n }\n />\n </ListItemButton>\n <ContextMenu\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== recentWallet.chainType\n )\n }\n items={[\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () =>\n navigator.clipboard.writeText(recentWallet.address),\n },\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () =>\n window.open(\n getAddressLink(\n recentWallet.address,\n defaultChainIdsByType[recentWallet.chainType]\n ),\n '_blank'\n ),\n },\n {\n icon: <TurnedInNot />,\n label: t('button.bookmark'),\n onClick: () => {\n setBookmarkTarget(recentWallet)\n bookmarkAddressSheetRef.current?.open()\n },\n },\n {\n icon: <DeleteOutline />,\n label: t('button.delete'),\n onClick: () => removeRecentWallet(recentWallet.address),\n },\n ]}\n />\n </ListItem>\n ))}\n {!recentWallets.length && (\n <EmptyListIndicator icon={<History sx={{ fontSize: 48 }} />}>\n {t('sendToWallet.noRecentWallets')}\n </EmptyListIndicator>\n )}\n </ListContainer>\n <BookmarkAddressSheet\n ref={bookmarkAddressSheetRef}\n validatedWallet={bookmarkTarget}\n onAddBookmark={handleAddBookmark}\n />\n </SendToWalletPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,0BAAuC;CAClD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,CAAC,gBAAgB,qBAAqB,UAAoB;CAChE,MAAM,0BAA0B,OAAwB,KAAK;CAC7D,MAAM,EAAE,kBAAkB,cAAc;CACxC,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,EACJ,oBACA,aACA,qBACA,oBACE,oBAAoB;CACxB,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,mBAAmB,aAAa;
|
|
1
|
+
{"version":3,"file":"RecentWalletsPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/RecentWalletsPage.tsx"],"sourcesContent":["import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport DeleteOutline from '@mui/icons-material/DeleteOutlined'\nimport History from '@mui/icons-material/History'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport TurnedInNot from '@mui/icons-material/TurnedInNot'\nimport { ListItemAvatar, ListItemText } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { type JSX, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem/ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { defaultChainIdsByType } from '../../utils/chainType.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport { BookmarkAddressSheet } from './BookmarkAddressSheet.js'\nimport { EmptyListIndicator } from './EmptyListIndicator.js'\nimport {\n ListContainer,\n SendToWalletPageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const RecentWalletsPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const [bookmarkTarget, setBookmarkTarget] = useState<Bookmark>()\n const bookmarkAddressSheetRef = useRef<BottomSheetBase>(null)\n const { recentWallets } = useBookmarks()\n const { requiredToChainType } = useToAddressRequirements()\n const {\n removeRecentWallet,\n addBookmark,\n setSelectedBookmark,\n addRecentWallet,\n } = useBookmarkActions()\n const { setFieldValue } = useFieldActions()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('header.recentWallets'))\n\n const handleRecentSelected = (recentWallet: Bookmark) => {\n addRecentWallet(recentWallet)\n setFieldValue('toAddress', recentWallet.address, {\n isTouched: true,\n isDirty: true,\n })\n setSelectedBookmark(recentWallet)\n navigate({\n to: navigationRoutes.home,\n replace: true,\n })\n }\n\n const handleAddBookmark = (bookmark: Bookmark) => {\n addBookmark(bookmark)\n navigate({ to: navigationRoutes.bookmarks, replace: true })\n }\n\n return (\n <SendToWalletPageContainer disableGutters>\n <ListContainer>\n {recentWallets.map((recentWallet) => (\n <ListItem key={recentWallet.address} sx={{ position: 'relative' }}>\n <ListItemButton\n disabled={\n requiredToChainType &&\n requiredToChainType !== recentWallet.chainType\n }\n onClick={() => handleRecentSelected(recentWallet)}\n >\n <ListItemAvatar>\n <AccountAvatar\n chainId={defaultChainIdsByType[recentWallet.chainType]}\n />\n </ListItemAvatar>\n <ListItemText\n primary={\n recentWallet.name || shortenAddress(recentWallet.address)\n }\n secondary={\n recentWallet.name\n ? shortenAddress(recentWallet.address)\n : undefined\n }\n />\n </ListItemButton>\n <ContextMenu\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== recentWallet.chainType\n )\n }\n items={[\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () =>\n navigator.clipboard.writeText(recentWallet.address),\n },\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () =>\n window.open(\n getAddressLink(\n recentWallet.address,\n defaultChainIdsByType[recentWallet.chainType]\n ),\n '_blank'\n ),\n },\n {\n icon: <TurnedInNot />,\n label: t('button.bookmark'),\n onClick: () => {\n setBookmarkTarget(recentWallet)\n bookmarkAddressSheetRef.current?.open()\n },\n },\n {\n icon: <DeleteOutline />,\n label: t('button.delete'),\n onClick: () => removeRecentWallet(recentWallet.address),\n },\n ]}\n />\n </ListItem>\n ))}\n {!recentWallets.length && (\n <EmptyListIndicator icon={<History sx={{ fontSize: 48 }} />}>\n {t('sendToWallet.noRecentWallets')}\n </EmptyListIndicator>\n )}\n </ListContainer>\n <BookmarkAddressSheet\n ref={bookmarkAddressSheetRef}\n validatedWallet={bookmarkTarget}\n onAddBookmark={handleAddBookmark}\n />\n </SendToWalletPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,0BAAuC;CAClD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,CAAC,gBAAgB,qBAAqB,UAAoB;CAChE,MAAM,0BAA0B,OAAwB,KAAK;CAC7D,MAAM,EAAE,kBAAkB,cAAc;CACxC,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,EACJ,oBACA,aACA,qBACA,oBACE,oBAAoB;CACxB,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,mBAAmB,aAAa;CAExC,UAAU,EAAE,uBAAuB,CAAC;CAEpC,MAAM,wBAAwB,iBAA2B;EACvD,gBAAgB,aAAa;EAC7B,cAAc,aAAa,aAAa,SAAS;GAC/C,WAAW;GACX,SAAS;GACV,CAAC;EACF,oBAAoB,aAAa;EACjC,SAAS;GACP,IAAI,iBAAiB;GACrB,SAAS;GACV,CAAC;;CAGJ,MAAM,qBAAqB,aAAuB;EAChD,YAAY,SAAS;EACrB,SAAS;GAAE,IAAI,iBAAiB;GAAW,SAAS;GAAM,CAAC;;CAG7D,OACE,qBAAC,2BAAD;EAA2B,gBAAA;YAA3B,CACE,qBAAC,eAAD,EAAA,UAAA,CACG,cAAc,KAAK,iBAClB,qBAACA,YAAD;GAAqC,IAAI,EAAE,UAAU,YAAY;aAAjE,CACE,qBAACC,kBAAD;IACE,UACE,uBACA,wBAAwB,aAAa;IAEvC,eAAe,qBAAqB,aAAa;cALnD,CAOE,oBAAC,gBAAD,EAAA,UACE,oBAAC,eAAD,EACE,SAAS,sBAAsB,aAAa,YAC5C,CAAA,EACa,CAAA,EACjB,oBAAC,cAAD;KACE,SACE,aAAa,QAAQ,eAAe,aAAa,QAAQ;KAE3D,WACE,aAAa,OACT,eAAe,aAAa,QAAQ,GACpC,KAAA;KAEN,CAAA,CACa;OACjB,oBAAC,aAAD;IACE,UACE,CAAC,EACC,uBACA,wBAAwB,aAAa;IAGzC,OAAO;KACL;MACE,MAAM,oBAAC,oBAAD,EAAsB,CAAA;MAC5B,OAAO,EAAE,qBAAqB;MAC9B,eACE,UAAU,UAAU,UAAU,aAAa,QAAQ;MACtD;KACD;MACE,MAAM,oBAAC,kBAAD,EAAoB,CAAA;MAC1B,OAAO,EAAE,wBAAwB;MACjC,eACE,OAAO,KACL,eACE,aAAa,SACb,sBAAsB,aAAa,WACpC,EACD,SACD;MACJ;KACD;MACE,MAAM,oBAAC,aAAD,EAAe,CAAA;MACrB,OAAO,EAAE,kBAAkB;MAC3B,eAAe;OACb,kBAAkB,aAAa;OAC/B,wBAAwB,SAAS,MAAM;;MAE1C;KACD;MACE,MAAM,oBAAC,eAAD,EAAiB,CAAA;MACvB,OAAO,EAAE,gBAAgB;MACzB,eAAe,mBAAmB,aAAa,QAAQ;MACxD;KACF;IACD,CAAA,CACO;KAjEI,aAAa,QAiEjB,CACX,EACD,CAAC,cAAc,UACd,oBAAC,oBAAD;GAAoB,MAAM,oBAAC,SAAD,EAAS,IAAI,EAAE,UAAU,IAAI,EAAI,CAAA;aACxD,EAAE,+BAA+B;GACf,CAAA,CAET,EAAA,CAAA,EAChB,oBAAC,sBAAD;GACE,KAAK;GACL,iBAAiB;GACjB,eAAe;GACf,CAAA,CACwB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SendToConfiguredWalletPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/SendToConfiguredWalletPage.tsx"],"sourcesContent":["import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport { ListItemAvatar, ListItemText } from '@mui/material'\nimport type { JSX } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem/ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport type { ToAddress } from '../../types/widget.js'\nimport { defaultChainIdsByType } from '../../utils/chainType.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport {\n ListContainer,\n SendToWalletPageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const SendToConfiguredWalletPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigateBack = useNavigateBack()\n const { toAddresses } = useWidgetConfig()\n const { requiredToChainType } = useToAddressRequirements()\n const { setSelectedBookmark } = useBookmarkActions()\n const { setFieldValue } = useFieldActions()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('header.sendToWallet'))\n\n const handleCuratedSelected = (toAddress: ToAddress) => {\n setSelectedBookmark(toAddress)\n setFieldValue('toAddress', toAddress.address, {\n isTouched: true,\n isDirty: true,\n })\n navigateBack()\n }\n\n return (\n <SendToWalletPageContainer disableGutters>\n <ListContainer sx={{ minHeight: 418 }}>\n {toAddresses?.map((toAddress) => (\n <ListItem key={toAddress.address} sx={{ position: 'relative' }}>\n <ListItemButton\n disabled={\n requiredToChainType &&\n requiredToChainType !== toAddress.chainType\n }\n onClick={() => handleCuratedSelected(toAddress)}\n >\n <ListItemAvatar>\n <AccountAvatar\n chainId={defaultChainIdsByType[toAddress.chainType]}\n toAddress={toAddress}\n />\n </ListItemAvatar>\n <ListItemText\n primary={toAddress.name || shortenAddress(toAddress.address)}\n secondary={\n toAddress.name ? shortenAddress(toAddress.address) : undefined\n }\n />\n </ListItemButton>\n <ContextMenu\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== toAddress.chainType\n )\n }\n items={[\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () =>\n navigator.clipboard.writeText(toAddress.address),\n },\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () =>\n window.open(\n getAddressLink(\n toAddress.address,\n defaultChainIdsByType[toAddress.chainType]\n ),\n '_blank'\n ),\n },\n ]}\n />\n </ListItem>\n ))}\n </ListContainer>\n </SendToWalletPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,mCAAgD;CAC3D,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,eAAe,iBAAiB;CACtC,MAAM,EAAE,gBAAgB,iBAAiB;CACzC,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,EAAE,wBAAwB,oBAAoB;CACpD,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,mBAAmB,aAAa;
|
|
1
|
+
{"version":3,"file":"SendToConfiguredWalletPage.js","names":["ListItem","ListItemButton"],"sources":["../../../../src/pages/SendToWallet/SendToConfiguredWalletPage.tsx"],"sourcesContent":["import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded'\nimport OpenInNewRounded from '@mui/icons-material/OpenInNewRounded'\nimport { ListItemAvatar, ListItemText } from '@mui/material'\nimport type { JSX } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AccountAvatar } from '../../components/Avatar/AccountAvatar.js'\nimport { ContextMenu } from '../../components/ContextMenu.js'\nimport { ListItem } from '../../components/ListItem/ListItem.js'\nimport { ListItemButton } from '../../components/ListItem/ListItemButton.js'\nimport { useExplorer } from '../../hooks/useExplorer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport type { ToAddress } from '../../types/widget.js'\nimport { defaultChainIdsByType } from '../../utils/chainType.js'\nimport { shortenAddress } from '../../utils/wallet.js'\nimport {\n ListContainer,\n SendToWalletPageContainer,\n} from './SendToWalletPage.style.js'\n\nexport const SendToConfiguredWalletPage = (): JSX.Element => {\n const { t } = useTranslation()\n const navigateBack = useNavigateBack()\n const { toAddresses } = useWidgetConfig()\n const { requiredToChainType } = useToAddressRequirements()\n const { setSelectedBookmark } = useBookmarkActions()\n const { setFieldValue } = useFieldActions()\n const { getAddressLink } = useExplorer()\n\n useHeader(t('header.sendToWallet'))\n\n const handleCuratedSelected = (toAddress: ToAddress) => {\n setSelectedBookmark(toAddress)\n setFieldValue('toAddress', toAddress.address, {\n isTouched: true,\n isDirty: true,\n })\n navigateBack()\n }\n\n return (\n <SendToWalletPageContainer disableGutters>\n <ListContainer sx={{ minHeight: 418 }}>\n {toAddresses?.map((toAddress) => (\n <ListItem key={toAddress.address} sx={{ position: 'relative' }}>\n <ListItemButton\n disabled={\n requiredToChainType &&\n requiredToChainType !== toAddress.chainType\n }\n onClick={() => handleCuratedSelected(toAddress)}\n >\n <ListItemAvatar>\n <AccountAvatar\n chainId={defaultChainIdsByType[toAddress.chainType]}\n toAddress={toAddress}\n />\n </ListItemAvatar>\n <ListItemText\n primary={toAddress.name || shortenAddress(toAddress.address)}\n secondary={\n toAddress.name ? shortenAddress(toAddress.address) : undefined\n }\n />\n </ListItemButton>\n <ContextMenu\n disabled={\n !!(\n requiredToChainType &&\n requiredToChainType !== toAddress.chainType\n )\n }\n items={[\n {\n icon: <ContentCopyRounded />,\n label: t('button.copyAddress'),\n onClick: () =>\n navigator.clipboard.writeText(toAddress.address),\n },\n {\n icon: <OpenInNewRounded />,\n label: t('button.viewOnExplorer'),\n onClick: () =>\n window.open(\n getAddressLink(\n toAddress.address,\n defaultChainIdsByType[toAddress.chainType]\n ),\n '_blank'\n ),\n },\n ]}\n />\n </ListItem>\n ))}\n </ListContainer>\n </SendToWalletPageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,mCAAgD;CAC3D,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,eAAe,iBAAiB;CACtC,MAAM,EAAE,gBAAgB,iBAAiB;CACzC,MAAM,EAAE,wBAAwB,0BAA0B;CAC1D,MAAM,EAAE,wBAAwB,oBAAoB;CACpD,MAAM,EAAE,kBAAkB,iBAAiB;CAC3C,MAAM,EAAE,mBAAmB,aAAa;CAExC,UAAU,EAAE,sBAAsB,CAAC;CAEnC,MAAM,yBAAyB,cAAyB;EACtD,oBAAoB,UAAU;EAC9B,cAAc,aAAa,UAAU,SAAS;GAC5C,WAAW;GACX,SAAS;GACV,CAAC;EACF,cAAc;;CAGhB,OACE,oBAAC,2BAAD;EAA2B,gBAAA;YACzB,oBAAC,eAAD;GAAe,IAAI,EAAE,WAAW,KAAK;aAClC,aAAa,KAAK,cACjB,qBAACA,YAAD;IAAkC,IAAI,EAAE,UAAU,YAAY;cAA9D,CACE,qBAACC,kBAAD;KACE,UACE,uBACA,wBAAwB,UAAU;KAEpC,eAAe,sBAAsB,UAAU;eALjD,CAOE,oBAAC,gBAAD,EAAA,UACE,oBAAC,eAAD;MACE,SAAS,sBAAsB,UAAU;MAC9B;MACX,CAAA,EACa,CAAA,EACjB,oBAAC,cAAD;MACE,SAAS,UAAU,QAAQ,eAAe,UAAU,QAAQ;MAC5D,WACE,UAAU,OAAO,eAAe,UAAU,QAAQ,GAAG,KAAA;MAEvD,CAAA,CACa;QACjB,oBAAC,aAAD;KACE,UACE,CAAC,EACC,uBACA,wBAAwB,UAAU;KAGtC,OAAO,CACL;MACE,MAAM,oBAAC,oBAAD,EAAsB,CAAA;MAC5B,OAAO,EAAE,qBAAqB;MAC9B,eACE,UAAU,UAAU,UAAU,UAAU,QAAQ;MACnD,EACD;MACE,MAAM,oBAAC,kBAAD,EAAoB,CAAA;MAC1B,OAAO,EAAE,wBAAwB;MACjC,eACE,OAAO,KACL,eACE,UAAU,SACV,sBAAsB,UAAU,WACjC,EACD,SACD;MACJ,CACF;KACD,CAAA,CACO;MAjDI,UAAU,QAiDd,CACX;GACY,CAAA;EACU,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SendToWalletPage.js","names":[],"sources":["../../../../src/pages/SendToWallet/SendToWalletPage.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport ErrorIcon from '@mui/icons-material/Error'\nimport History from '@mui/icons-material/History'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport Wallet from '@mui/icons-material/Wallet'\nimport { Box, Tooltip, Typography } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport type { ChangeEvent } from 'react'\nimport { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { ButtonTertiary } from '../../components/ButtonTertiary.js'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { AccountDeployedMessage } from '../../components/Messages/AccountDeployedMessage.js'\nimport {\n AddressType,\n useAddressValidation,\n} from '../../hooks/useAddressValidation.js'\nimport { useChain } from '../../hooks/useChain.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { HiddenUI, RequiredUI } from '../../types/widget.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BookmarkAddressSheet } from './BookmarkAddressSheet.js'\nimport { ConfirmAddressSheet } from './ConfirmAddressSheet.js'\nimport {\n AddressInput,\n FullHeightAdjustablePageContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletIconButton,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\n\nexport const SendToWalletPage: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const bookmarkAddressSheetRef = useRef<BottomSheetBase>(null)\n const confirmAddressSheetRef = useRef<BottomSheetBase>(null)\n const { bookmarks, recentWallets } = useBookmarks()\n const {\n addBookmark,\n getBookmark,\n setSelectedBookmark,\n getSelectedBookmark,\n addRecentWallet,\n } = useBookmarkActions()\n const { setFieldValue } = useFieldActions()\n const [inputAddressValue, setInputAddressValue] = useState(\n () => getSelectedBookmark()?.address ?? ''\n )\n const [validatedWallet, setValidatedWallet] = useState<Bookmark>()\n const [errorMessage, setErrorMessage] = useState('')\n const { validateAddress, isValidating } = useAddressValidation()\n const { requiredToChainType } = useToAddressRequirements()\n const [toChainId] = useFieldValues('toChain')\n const { chain: toChain } = useChain(toChainId)\n const [isDoneButtonLoading, setIsDoneButtonLoading] = useState(false)\n const [isBookmarkButtonLoading, setIsBookmarkButtonLoading] = useState(false)\n const { variant, hiddenUI, requiredUI } = useWidgetConfig()\n\n const { accounts } = useAccount()\n const connectedWallets = accounts.filter((account) => account.isConnected)\n\n useHeader(t('header.sendToWallet'))\n\n const handleInputChange = (e: ChangeEvent) => {\n if (errorMessage) {\n setErrorMessage('')\n }\n if (getSelectedBookmark()) {\n setFieldValue('toAddress', '', { isTouched: true })\n setSelectedBookmark()\n }\n setInputAddressValue((e.target as HTMLInputElement).value.trim())\n }\n\n const handleDone = async () => {\n if (isValidating) {\n return\n }\n if (!inputAddressValue) {\n setErrorMessage(t('error.title.walletAddressRequired'))\n return\n }\n setIsDoneButtonLoading(true)\n const validationResult = await validateAddress({\n value: inputAddressValue,\n chainType: requiredToChainType,\n chain: toChain,\n })\n setIsDoneButtonLoading(false)\n if (!validationResult.isValid) {\n setErrorMessage(validationResult.error)\n return\n }\n\n if (\n requiredToChainType &&\n requiredToChainType !== validationResult.chainType\n ) {\n setErrorMessage(\n t('error.title.walletChainTypeInvalid', {\n chainName: toChain?.name,\n })\n )\n return\n }\n\n setValidatedWallet({\n name:\n validationResult.addressType === AddressType.NameService\n ? inputAddressValue\n : undefined,\n address: validationResult.address,\n chainType: validationResult.chainType,\n })\n confirmAddressSheetRef.current?.open()\n }\n\n const handleBookmarkAddress = async () => {\n if (isValidating) {\n return\n }\n if (!inputAddressValue) {\n setErrorMessage(t('error.title.walletAddressRequired'))\n return\n }\n\n const existingBookmarkWallet = getBookmark(inputAddressValue)\n if (existingBookmarkWallet) {\n setErrorMessage(\n t('error.title.bookmarkAlreadyExists', {\n name: existingBookmarkWallet.name,\n })\n )\n return\n }\n setIsBookmarkButtonLoading(true)\n const validationResult = await validateAddress({\n value: inputAddressValue,\n })\n setIsBookmarkButtonLoading(false)\n\n if (validationResult.isValid) {\n setValidatedWallet({\n name:\n validationResult.addressType === AddressType.NameService\n ? inputAddressValue\n : undefined,\n address: validationResult.address,\n chainType: validationResult.chainType,\n })\n bookmarkAddressSheetRef.current?.open()\n } else {\n setErrorMessage(validationResult.error)\n }\n }\n\n const handleRecentWalletsClick = () => {\n navigate({ to: navigationRoutes.recentWallets })\n }\n\n const handleConnectedWalletsClick = () => {\n navigate({ to: navigationRoutes.connectedWallets })\n }\n const handleBookmarkedWalletsClick = () => {\n navigate({ to: navigationRoutes.bookmarks })\n }\n\n const handleAddBookmark = (bookmark: Bookmark) => {\n addBookmark(bookmark)\n navigate({ to: navigationRoutes.bookmarks })\n }\n\n const handleOnConfirm = (confirmedWallet: Bookmark) => {\n setSelectedBookmark(confirmedWallet)\n addRecentWallet(confirmedWallet)\n }\n\n const placeholder = t('sendToWallet.enterAddress', {\n context: 'long',\n })\n\n return (\n <FullHeightAdjustablePageContainer\n bottomGutters\n enableFullHeight={variant !== 'drawer'}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n marginBottom: 6,\n }}\n >\n <SendToWalletCard type={errorMessage ? 'error' : 'default'}>\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleInputChange}\n value={inputAddressValue}\n placeholder={placeholder}\n aria-label={placeholder}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n {errorMessage ? (\n <ValidationAlert icon={<ErrorIcon />} sx={{ pb: 2, paddingX: 2 }}>\n {errorMessage}\n </ValidationAlert>\n ) : null}\n <SendToWalletButtonRow sx={{ paddingX: 2, paddingBottom: 2 }}>\n <ButtonTertiary\n variant=\"text\"\n onClick={handleDone}\n loading={isDoneButtonLoading}\n loadingPosition=\"center\"\n sx={{ flexGrow: 1 }}\n >\n {t('button.done')}\n </ButtonTertiary>\n <Tooltip title={t('button.bookmark')}>\n <SendToWalletIconButton\n onClick={handleBookmarkAddress}\n loading={isBookmarkButtonLoading}\n loadingPosition=\"center\"\n >\n <TurnedIn fontSize=\"small\" />\n </SendToWalletIconButton>\n </Tooltip>\n </SendToWalletButtonRow>\n <ConfirmAddressSheet\n ref={confirmAddressSheetRef}\n validatedBookmark={validatedWallet}\n onConfirm={handleOnConfirm}\n />\n <BookmarkAddressSheet\n ref={bookmarkAddressSheetRef}\n validatedWallet={validatedWallet}\n onAddBookmark={handleAddBookmark}\n />\n </SendToWalletCard>\n {requiredUI?.includes(RequiredUI.AccountDeployedMessage) && (\n <AccountDeployedMessage />\n )}\n </Box>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <CardButton\n title={t('header.recentWallets')}\n icon={<History />}\n onClick={handleRecentWalletsClick}\n >\n {!!recentWallets.length && (\n <Typography\n sx={{\n color: 'text.secondary',\n }}\n >\n {recentWallets.length}\n </Typography>\n )}\n </CardButton>\n {!hiddenUI?.includes(HiddenUI.AddressBookConnectedWallets) && (\n <CardButton\n title={t('sendToWallet.connectedWallets')}\n icon={<Wallet />}\n onClick={handleConnectedWalletsClick}\n >\n {!!connectedWallets.length && (\n <Typography\n sx={{\n color: 'text.secondary',\n }}\n >\n {connectedWallets.length}\n </Typography>\n )}\n </CardButton>\n )}\n <CardButton\n title={t('header.bookmarkedWallets')}\n icon={<TurnedIn />}\n onClick={handleBookmarkedWalletsClick}\n >\n {!!bookmarks.length && (\n <Typography\n sx={{\n color: 'text.secondary',\n }}\n >\n {bookmarks.length}\n </Typography>\n )}\n </CardButton>\n </Box>\n </FullHeightAdjustablePageContainer>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SendToWalletPage.js","names":[],"sources":["../../../../src/pages/SendToWallet/SendToWalletPage.tsx"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport ErrorIcon from '@mui/icons-material/Error'\nimport History from '@mui/icons-material/History'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport Wallet from '@mui/icons-material/Wallet'\nimport { Box, Tooltip, Typography } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport type { ChangeEvent } from 'react'\nimport { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { ButtonTertiary } from '../../components/ButtonTertiary.js'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { AccountDeployedMessage } from '../../components/Messages/AccountDeployedMessage.js'\nimport {\n AddressType,\n useAddressValidation,\n} from '../../hooks/useAddressValidation.js'\nimport { useChain } from '../../hooks/useChain.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { useBookmarks } from '../../stores/bookmarks/useBookmarks.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { HiddenUI, RequiredUI } from '../../types/widget.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BookmarkAddressSheet } from './BookmarkAddressSheet.js'\nimport { ConfirmAddressSheet } from './ConfirmAddressSheet.js'\nimport {\n AddressInput,\n FullHeightAdjustablePageContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletIconButton,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\n\nexport const SendToWalletPage: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const bookmarkAddressSheetRef = useRef<BottomSheetBase>(null)\n const confirmAddressSheetRef = useRef<BottomSheetBase>(null)\n const { bookmarks, recentWallets } = useBookmarks()\n const {\n addBookmark,\n getBookmark,\n setSelectedBookmark,\n getSelectedBookmark,\n addRecentWallet,\n } = useBookmarkActions()\n const { setFieldValue } = useFieldActions()\n const [inputAddressValue, setInputAddressValue] = useState(\n () => getSelectedBookmark()?.address ?? ''\n )\n const [validatedWallet, setValidatedWallet] = useState<Bookmark>()\n const [errorMessage, setErrorMessage] = useState('')\n const { validateAddress, isValidating } = useAddressValidation()\n const { requiredToChainType } = useToAddressRequirements()\n const [toChainId] = useFieldValues('toChain')\n const { chain: toChain } = useChain(toChainId)\n const [isDoneButtonLoading, setIsDoneButtonLoading] = useState(false)\n const [isBookmarkButtonLoading, setIsBookmarkButtonLoading] = useState(false)\n const { variant, hiddenUI, requiredUI } = useWidgetConfig()\n\n const { accounts } = useAccount()\n const connectedWallets = accounts.filter((account) => account.isConnected)\n\n useHeader(t('header.sendToWallet'))\n\n const handleInputChange = (e: ChangeEvent) => {\n if (errorMessage) {\n setErrorMessage('')\n }\n if (getSelectedBookmark()) {\n setFieldValue('toAddress', '', { isTouched: true })\n setSelectedBookmark()\n }\n setInputAddressValue((e.target as HTMLInputElement).value.trim())\n }\n\n const handleDone = async () => {\n if (isValidating) {\n return\n }\n if (!inputAddressValue) {\n setErrorMessage(t('error.title.walletAddressRequired'))\n return\n }\n setIsDoneButtonLoading(true)\n const validationResult = await validateAddress({\n value: inputAddressValue,\n chainType: requiredToChainType,\n chain: toChain,\n })\n setIsDoneButtonLoading(false)\n if (!validationResult.isValid) {\n setErrorMessage(validationResult.error)\n return\n }\n\n if (\n requiredToChainType &&\n requiredToChainType !== validationResult.chainType\n ) {\n setErrorMessage(\n t('error.title.walletChainTypeInvalid', {\n chainName: toChain?.name,\n })\n )\n return\n }\n\n setValidatedWallet({\n name:\n validationResult.addressType === AddressType.NameService\n ? inputAddressValue\n : undefined,\n address: validationResult.address,\n chainType: validationResult.chainType,\n })\n confirmAddressSheetRef.current?.open()\n }\n\n const handleBookmarkAddress = async () => {\n if (isValidating) {\n return\n }\n if (!inputAddressValue) {\n setErrorMessage(t('error.title.walletAddressRequired'))\n return\n }\n\n const existingBookmarkWallet = getBookmark(inputAddressValue)\n if (existingBookmarkWallet) {\n setErrorMessage(\n t('error.title.bookmarkAlreadyExists', {\n name: existingBookmarkWallet.name,\n })\n )\n return\n }\n setIsBookmarkButtonLoading(true)\n const validationResult = await validateAddress({\n value: inputAddressValue,\n })\n setIsBookmarkButtonLoading(false)\n\n if (validationResult.isValid) {\n setValidatedWallet({\n name:\n validationResult.addressType === AddressType.NameService\n ? inputAddressValue\n : undefined,\n address: validationResult.address,\n chainType: validationResult.chainType,\n })\n bookmarkAddressSheetRef.current?.open()\n } else {\n setErrorMessage(validationResult.error)\n }\n }\n\n const handleRecentWalletsClick = () => {\n navigate({ to: navigationRoutes.recentWallets })\n }\n\n const handleConnectedWalletsClick = () => {\n navigate({ to: navigationRoutes.connectedWallets })\n }\n const handleBookmarkedWalletsClick = () => {\n navigate({ to: navigationRoutes.bookmarks })\n }\n\n const handleAddBookmark = (bookmark: Bookmark) => {\n addBookmark(bookmark)\n navigate({ to: navigationRoutes.bookmarks })\n }\n\n const handleOnConfirm = (confirmedWallet: Bookmark) => {\n setSelectedBookmark(confirmedWallet)\n addRecentWallet(confirmedWallet)\n }\n\n const placeholder = t('sendToWallet.enterAddress', {\n context: 'long',\n })\n\n return (\n <FullHeightAdjustablePageContainer\n bottomGutters\n enableFullHeight={variant !== 'drawer'}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n marginBottom: 6,\n }}\n >\n <SendToWalletCard type={errorMessage ? 'error' : 'default'}>\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleInputChange}\n value={inputAddressValue}\n placeholder={placeholder}\n aria-label={placeholder}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n {errorMessage ? (\n <ValidationAlert icon={<ErrorIcon />} sx={{ pb: 2, paddingX: 2 }}>\n {errorMessage}\n </ValidationAlert>\n ) : null}\n <SendToWalletButtonRow sx={{ paddingX: 2, paddingBottom: 2 }}>\n <ButtonTertiary\n variant=\"text\"\n onClick={handleDone}\n loading={isDoneButtonLoading}\n loadingPosition=\"center\"\n sx={{ flexGrow: 1 }}\n >\n {t('button.done')}\n </ButtonTertiary>\n <Tooltip title={t('button.bookmark')}>\n <SendToWalletIconButton\n onClick={handleBookmarkAddress}\n loading={isBookmarkButtonLoading}\n loadingPosition=\"center\"\n >\n <TurnedIn fontSize=\"small\" />\n </SendToWalletIconButton>\n </Tooltip>\n </SendToWalletButtonRow>\n <ConfirmAddressSheet\n ref={confirmAddressSheetRef}\n validatedBookmark={validatedWallet}\n onConfirm={handleOnConfirm}\n />\n <BookmarkAddressSheet\n ref={bookmarkAddressSheetRef}\n validatedWallet={validatedWallet}\n onAddBookmark={handleAddBookmark}\n />\n </SendToWalletCard>\n {requiredUI?.includes(RequiredUI.AccountDeployedMessage) && (\n <AccountDeployedMessage />\n )}\n </Box>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <CardButton\n title={t('header.recentWallets')}\n icon={<History />}\n onClick={handleRecentWalletsClick}\n >\n {!!recentWallets.length && (\n <Typography\n sx={{\n color: 'text.secondary',\n }}\n >\n {recentWallets.length}\n </Typography>\n )}\n </CardButton>\n {!hiddenUI?.includes(HiddenUI.AddressBookConnectedWallets) && (\n <CardButton\n title={t('sendToWallet.connectedWallets')}\n icon={<Wallet />}\n onClick={handleConnectedWalletsClick}\n >\n {!!connectedWallets.length && (\n <Typography\n sx={{\n color: 'text.secondary',\n }}\n >\n {connectedWallets.length}\n </Typography>\n )}\n </CardButton>\n )}\n <CardButton\n title={t('header.bookmarkedWallets')}\n icon={<TurnedIn />}\n onClick={handleBookmarkedWalletsClick}\n >\n {!!bookmarks.length && (\n <Typography\n sx={{\n color: 'text.secondary',\n }}\n >\n {bookmarks.length}\n </Typography>\n )}\n </CardButton>\n </Box>\n </FullHeightAdjustablePageContainer>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BridgeAndExchangeSettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/BridgeAndExchangeSettings.tsx"],"sourcesContent":["import AirlineStops from '@mui/icons-material/AirlineStops'\nimport SwapHoriz from '@mui/icons-material/SwapHoriz'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStore } from '../../stores/settings/SettingsStore.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\n\nconst supportedIcons = {\n Bridges: AirlineStops,\n Exchanges: SwapHoriz,\n}\n\nexport const BridgeAndExchangeSettings: React.FC<{\n type: 'Bridges' | 'Exchanges'\n}> = ({ type }) => {\n const { isBridgesChanged, isExchangesChanged } = useSettingMonitor()\n const { t } = useTranslation()\n const navigate = useNavigate()\n const [enabledTools, tools] = useSettingsStore((state) => {\n const enabledTools = Object.values(state[`_enabled${type}`])\n return [enabledTools.filter(Boolean).length, enabledTools.length]\n })\n\n const { hiddenUI } = useWidgetConfig()\n\n if (type === 'Bridges' && hiddenUI?.includes(HiddenUI.BridgesSettings)) {\n return null\n }\n\n const customisationLookUp = {\n Bridges: isBridgesChanged,\n Exchanges: isExchangesChanged,\n }\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes[type.toLowerCase() as 'bridges' | 'exchanges'],\n })\n }\n\n const Icon = supportedIcons[type]\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Icon />}\n title={t(`settings.enabled${type}`)}\n >\n <BadgedValue\n badgeColor=\"info\"\n showBadge={customisationLookUp[type]}\n >{`${enabledTools}/${tools}`}</BadgedValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,iBAAiB;CACrB,SAAS;CACT,WAAW;CACZ;AAED,MAAa,6BAEP,EAAE,WAAW;CACjB,MAAM,EAAE,kBAAkB,uBAAuB,mBAAmB;CACpE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,CAAC,cAAc,SAAS,kBAAkB,UAAU;EACxD,MAAM,eAAe,OAAO,OAAO,MAAM,WAAW,QAAQ;
|
|
1
|
+
{"version":3,"file":"BridgeAndExchangeSettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/BridgeAndExchangeSettings.tsx"],"sourcesContent":["import AirlineStops from '@mui/icons-material/AirlineStops'\nimport SwapHoriz from '@mui/icons-material/SwapHoriz'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStore } from '../../stores/settings/SettingsStore.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\n\nconst supportedIcons = {\n Bridges: AirlineStops,\n Exchanges: SwapHoriz,\n}\n\nexport const BridgeAndExchangeSettings: React.FC<{\n type: 'Bridges' | 'Exchanges'\n}> = ({ type }) => {\n const { isBridgesChanged, isExchangesChanged } = useSettingMonitor()\n const { t } = useTranslation()\n const navigate = useNavigate()\n const [enabledTools, tools] = useSettingsStore((state) => {\n const enabledTools = Object.values(state[`_enabled${type}`])\n return [enabledTools.filter(Boolean).length, enabledTools.length]\n })\n\n const { hiddenUI } = useWidgetConfig()\n\n if (type === 'Bridges' && hiddenUI?.includes(HiddenUI.BridgesSettings)) {\n return null\n }\n\n const customisationLookUp = {\n Bridges: isBridgesChanged,\n Exchanges: isExchangesChanged,\n }\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes[type.toLowerCase() as 'bridges' | 'exchanges'],\n })\n }\n\n const Icon = supportedIcons[type]\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Icon />}\n title={t(`settings.enabled${type}`)}\n >\n <BadgedValue\n badgeColor=\"info\"\n showBadge={customisationLookUp[type]}\n >{`${enabledTools}/${tools}`}</BadgedValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,iBAAiB;CACrB,SAAS;CACT,WAAW;CACZ;AAED,MAAa,6BAEP,EAAE,WAAW;CACjB,MAAM,EAAE,kBAAkB,uBAAuB,mBAAmB;CACpE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,CAAC,cAAc,SAAS,kBAAkB,UAAU;EACxD,MAAM,eAAe,OAAO,OAAO,MAAM,WAAW,QAAQ;EAC5D,OAAO,CAAC,aAAa,OAAO,QAAQ,CAAC,QAAQ,aAAa,OAAO;GACjE;CAEF,MAAM,EAAE,aAAa,iBAAiB;CAEtC,IAAI,SAAS,aAAa,UAAU,SAAA,kBAAkC,EACpE,OAAO;CAGT,MAAM,sBAAsB;EAC1B,SAAS;EACT,WAAW;EACZ;CAED,MAAM,oBAAoB;EACxB,SAAS,EACP,IAAI,iBAAiB,KAAK,aAAa,GACxC,CAAC;;CAGJ,MAAM,OAAO,eAAe;CAE5B,OACE,oBAAC,YAAD;EACE,SAAS;EACT,MAAM,oBAAC,MAAD,EAAQ,CAAA;EACd,OAAO,EAAE,mBAAmB,OAAO;YAEnC,oBAAC,aAAD;GACE,YAAW;GACX,WAAW,oBAAoB;aAC/B,GAAG,aAAa,GAAG;GAAsB,CAAA;EAChC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GasPriceSettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/GasPriceSettings.tsx"],"sourcesContent":["import EvStation from '@mui/icons-material/EvStation'\nimport { useTranslation } from 'react-i18next'\nimport { CardTabs, Tab } from '../../components/Tabs/Tabs.style.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../stores/settings/useSettingsActions.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from './SettingsCard/SettingCardExpandable.js'\n\nexport const GasPriceSettings: React.FC = () => {\n const { t } = useTranslation()\n const { setValue } = useSettingsActions()\n const { isGasPriceChanged } = useSettingMonitor()\n const { gasPrice } = useSettings(['gasPrice'])\n\n const handleGasPriceChange = (_: React.SyntheticEvent, gasPrice: string) => {\n setValue('gasPrice', gasPrice)\n }\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor=\"info\" showBadge={isGasPriceChanged}>\n {t(`settings.gasPrice.${gasPrice}` as any)}\n </BadgedValue>\n }\n icon={<EvStation />}\n title={t('settings.gasPrice.title')}\n >\n <CardTabs\n value={gasPrice}\n aria-label=\"tabs\"\n indicatorColor=\"primary\"\n onChange={handleGasPriceChange}\n sx={{ mt: 1.5 }}\n >\n <Tab label={t('settings.gasPrice.slow')} value=\"slow\" disableRipple />\n <Tab\n label={t('settings.gasPrice.normal')}\n value=\"normal\"\n disableRipple\n />\n <Tab label={t('settings.gasPrice.fast')} value=\"fast\" disableRipple />\n </CardTabs>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,yBAAmC;CAC9C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,EAAE,sBAAsB,mBAAmB;CACjD,MAAM,EAAE,aAAa,YAAY,CAAC,WAAW,CAAC;CAE9C,MAAM,wBAAwB,GAAyB,aAAqB;
|
|
1
|
+
{"version":3,"file":"GasPriceSettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/GasPriceSettings.tsx"],"sourcesContent":["import EvStation from '@mui/icons-material/EvStation'\nimport { useTranslation } from 'react-i18next'\nimport { CardTabs, Tab } from '../../components/Tabs/Tabs.style.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../stores/settings/useSettingsActions.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from './SettingsCard/SettingCardExpandable.js'\n\nexport const GasPriceSettings: React.FC = () => {\n const { t } = useTranslation()\n const { setValue } = useSettingsActions()\n const { isGasPriceChanged } = useSettingMonitor()\n const { gasPrice } = useSettings(['gasPrice'])\n\n const handleGasPriceChange = (_: React.SyntheticEvent, gasPrice: string) => {\n setValue('gasPrice', gasPrice)\n }\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor=\"info\" showBadge={isGasPriceChanged}>\n {t(`settings.gasPrice.${gasPrice}` as any)}\n </BadgedValue>\n }\n icon={<EvStation />}\n title={t('settings.gasPrice.title')}\n >\n <CardTabs\n value={gasPrice}\n aria-label=\"tabs\"\n indicatorColor=\"primary\"\n onChange={handleGasPriceChange}\n sx={{ mt: 1.5 }}\n >\n <Tab label={t('settings.gasPrice.slow')} value=\"slow\" disableRipple />\n <Tab\n label={t('settings.gasPrice.normal')}\n value=\"normal\"\n disableRipple\n />\n <Tab label={t('settings.gasPrice.fast')} value=\"fast\" disableRipple />\n </CardTabs>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,yBAAmC;CAC9C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,EAAE,sBAAsB,mBAAmB;CACjD,MAAM,EAAE,aAAa,YAAY,CAAC,WAAW,CAAC;CAE9C,MAAM,wBAAwB,GAAyB,aAAqB;EAC1E,SAAS,YAAY,SAAS;;CAGhC,OACE,oBAAC,uBAAD;EACE,OACE,oBAAC,aAAD;GAAa,YAAW;GAAO,WAAW;aACvC,EAAE,qBAAqB,WAAkB;GAC9B,CAAA;EAEhB,MAAM,oBAAC,WAAD,EAAa,CAAA;EACnB,OAAO,EAAE,0BAA0B;YAEnC,qBAAC,UAAD;GACE,OAAO;GACP,cAAW;GACX,gBAAe;GACf,UAAU;GACV,IAAI,EAAE,IAAI,KAAK;aALjB;IAOE,oBAAC,KAAD;KAAK,OAAO,EAAE,yBAAyB;KAAE,OAAM;KAAO,eAAA;KAAgB,CAAA;IACtE,oBAAC,KAAD;KACE,OAAO,EAAE,2BAA2B;KACpC,OAAM;KACN,eAAA;KACA,CAAA;IACF,oBAAC,KAAD;KAAK,OAAO,EAAE,yBAAyB;KAAE,OAAM;KAAO,eAAA;KAAgB,CAAA;IAC7D;;EACW,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LanguageSetting.js","names":[],"sources":["../../../../src/pages/SettingsPage/LanguageSetting.tsx"],"sourcesContent":["import Language from '@mui/icons-material/Language'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { CardValue } from '../../components/Card/CardButton.style.js'\nimport { useLanguages } from '../../hooks/useLanguages.js'\nimport { languageNames } from '../../providers/I18nProvider/constants.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const LanguageSetting: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { hiddenUI } = useWidgetConfig()\n const { selectedLanguageCode } = useLanguages()\n\n if (hiddenUI?.includes(HiddenUI.Language)) {\n return null\n }\n\n const handleClick = () => {\n navigate({ to: navigationRoutes.languages })\n }\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Language />}\n title={t('language.title')}\n >\n <CardValue>\n {languageNames[selectedLanguageCode as keyof typeof languageNames] ||\n t('language.name', {\n lng: selectedLanguageCode,\n }) ||\n selectedLanguageCode}\n </CardValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,wBAAkC;CAC7C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,EAAE,yBAAyB,cAAc;
|
|
1
|
+
{"version":3,"file":"LanguageSetting.js","names":[],"sources":["../../../../src/pages/SettingsPage/LanguageSetting.tsx"],"sourcesContent":["import Language from '@mui/icons-material/Language'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { CardValue } from '../../components/Card/CardButton.style.js'\nimport { useLanguages } from '../../hooks/useLanguages.js'\nimport { languageNames } from '../../providers/I18nProvider/constants.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const LanguageSetting: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { hiddenUI } = useWidgetConfig()\n const { selectedLanguageCode } = useLanguages()\n\n if (hiddenUI?.includes(HiddenUI.Language)) {\n return null\n }\n\n const handleClick = () => {\n navigate({ to: navigationRoutes.languages })\n }\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Language />}\n title={t('language.title')}\n >\n <CardValue>\n {languageNames[selectedLanguageCode as keyof typeof languageNames] ||\n t('language.name', {\n lng: selectedLanguageCode,\n }) ||\n selectedLanguageCode}\n </CardValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,wBAAkC;CAC7C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,EAAE,yBAAyB,cAAc;CAE/C,IAAI,UAAU,SAAA,WAA2B,EACvC,OAAO;CAGT,MAAM,oBAAoB;EACxB,SAAS,EAAE,IAAI,iBAAiB,WAAW,CAAC;;CAG9C,OACE,oBAAC,YAAD;EACE,SAAS;EACT,MAAM,oBAAC,UAAD,EAAY,CAAA;EAClB,OAAO,EAAE,iBAAiB;YAE1B,oBAAC,WAAD,EAAA,UACG,cAAc,yBACb,EAAE,iBAAiB,EACjB,KAAK,sBACN,CAAC,IACF,sBACQ,CAAA;EACD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResetSettingsButton.js","names":["Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions"],"sources":["../../../../src/pages/SettingsPage/ResetSettingsButton.tsx"],"sourcesContent":["import InfoRounded from '@mui/icons-material/InfoRounded'\nimport { Box, Button } from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\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 { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { ResetButtonContainer } from './ResetSettingsButton.style.js'\n\nexport const ResetSettingsButton: React.FC = () => {\n const { t } = useTranslation()\n const { isCustomRouteSettings, reset } = useSettingMonitor()\n const [open, setOpen] = useState(false)\n\n const toggleDialog = useCallback(() => {\n setOpen((open) => !open)\n }, [])\n\n const handleReset = () => {\n reset()\n toggleDialog()\n }\n\n if (!isCustomRouteSettings) {\n return null\n }\n\n return (\n <Box\n sx={{\n mt: 2,\n }}\n >\n <ResetButtonContainer>\n <Box\n sx={{\n display: 'flex',\n marginBottom: '12px',\n }}\n >\n <InfoRounded\n sx={{\n marginRight: '8px',\n }}\n />\n <Box\n sx={{\n fontSize: 14,\n }}\n >\n {t('settings.resetSettings')}\n </Box>\n </Box>\n <Button onClick={toggleDialog} fullWidth>\n {t('button.resetSettings')}\n </Button>\n\n <Dialog open={open} onClose={toggleDialog}>\n <DialogContainer>\n <DialogTitle>{t('warning.title.resetSettings')}</DialogTitle>\n <DialogContent>\n <DialogContentText>\n {t('warning.message.resetSettings')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={toggleDialog}>{t('button.cancel')}</Button>\n <Button variant=\"contained\" onClick={handleReset} autoFocus>\n {t('button.reset')}\n </Button>\n </DialogActions>\n </DialogContainer>\n </Dialog>\n </ResetButtonContainer>\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;AAeA,MAAa,4BAAsC;CACjD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,uBAAuB,UAAU,mBAAmB;CAC5D,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CAEvC,MAAM,eAAe,kBAAkB;
|
|
1
|
+
{"version":3,"file":"ResetSettingsButton.js","names":["Dialog","DialogTitle","DialogContent","DialogContentText","DialogActions"],"sources":["../../../../src/pages/SettingsPage/ResetSettingsButton.tsx"],"sourcesContent":["import InfoRounded from '@mui/icons-material/InfoRounded'\nimport { Box, Button } from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\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 { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { ResetButtonContainer } from './ResetSettingsButton.style.js'\n\nexport const ResetSettingsButton: React.FC = () => {\n const { t } = useTranslation()\n const { isCustomRouteSettings, reset } = useSettingMonitor()\n const [open, setOpen] = useState(false)\n\n const toggleDialog = useCallback(() => {\n setOpen((open) => !open)\n }, [])\n\n const handleReset = () => {\n reset()\n toggleDialog()\n }\n\n if (!isCustomRouteSettings) {\n return null\n }\n\n return (\n <Box\n sx={{\n mt: 2,\n }}\n >\n <ResetButtonContainer>\n <Box\n sx={{\n display: 'flex',\n marginBottom: '12px',\n }}\n >\n <InfoRounded\n sx={{\n marginRight: '8px',\n }}\n />\n <Box\n sx={{\n fontSize: 14,\n }}\n >\n {t('settings.resetSettings')}\n </Box>\n </Box>\n <Button onClick={toggleDialog} fullWidth>\n {t('button.resetSettings')}\n </Button>\n\n <Dialog open={open} onClose={toggleDialog}>\n <DialogContainer>\n <DialogTitle>{t('warning.title.resetSettings')}</DialogTitle>\n <DialogContent>\n <DialogContentText>\n {t('warning.message.resetSettings')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <Button onClick={toggleDialog}>{t('button.cancel')}</Button>\n <Button variant=\"contained\" onClick={handleReset} autoFocus>\n {t('button.reset')}\n </Button>\n </DialogActions>\n </DialogContainer>\n </Dialog>\n </ResetButtonContainer>\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;AAeA,MAAa,4BAAsC;CACjD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,uBAAuB,UAAU,mBAAmB;CAC5D,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CAEvC,MAAM,eAAe,kBAAkB;EACrC,SAAS,SAAS,CAAC,KAAK;IACvB,EAAE,CAAC;CAEN,MAAM,oBAAoB;EACxB,OAAO;EACP,cAAc;;CAGhB,IAAI,CAAC,uBACH,OAAO;CAGT,OACE,oBAAC,KAAD;EACE,IAAI,EACF,IAAI,GACL;YAED,qBAAC,sBAAD,EAAA,UAAA;GACE,qBAAC,KAAD;IACE,IAAI;KACF,SAAS;KACT,cAAc;KACf;cAJH,CAME,oBAAC,aAAD,EACE,IAAI,EACF,aAAa,OACd,EACD,CAAA,EACF,oBAAC,KAAD;KACE,IAAI,EACF,UAAU,IACX;eAEA,EAAE,yBAAyB;KACxB,CAAA,CACF;;GACN,oBAAC,QAAD;IAAQ,SAAS;IAAc,WAAA;cAC5B,EAAE,uBAAuB;IACnB,CAAA;GAET,oBAACA,UAAD;IAAc;IAAM,SAAS;cAC3B,qBAAC,iBAAD,EAAA,UAAA;KACE,oBAACC,eAAD,EAAA,UAAc,EAAE,8BAA8B,EAAe,CAAA;KAC7D,oBAACC,iBAAD,EAAA,UACE,oBAACC,qBAAD,EAAA,UACG,EAAE,gCAAgC,EACjB,CAAA,EACN,CAAA;KAChB,qBAACC,iBAAD,EAAA,UAAA,CACE,oBAAC,QAAD;MAAQ,SAAS;gBAAe,EAAE,gBAAgB;MAAU,CAAA,EAC5D,oBAAC,QAAD;MAAQ,SAAQ;MAAY,SAAS;MAAa,WAAA;gBAC/C,EAAE,eAAe;MACX,CAAA,CACK,EAAA,CAAA;KACA,EAAA,CAAA;IACX,CAAA;GACY,EAAA,CAAA;EACnB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoutePrioritySettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/RoutePrioritySettings.tsx"],"sourcesContent":["import type { Order } from '@lifi/sdk'\nimport Route from '@mui/icons-material/Route'\nimport { useTranslation } from 'react-i18next'\nimport { CardTabs, Tab } from '../../components/Tabs/Tabs.style.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../stores/settings/useSettingsActions.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from './SettingsCard/SettingCardExpandable.js'\n\nconst Priorities: Order[] = ['CHEAPEST', 'FASTEST']\n\nexport const RoutePrioritySettings: React.FC = () => {\n const { t } = useTranslation()\n const { setValue } = useSettingsActions()\n const { isRoutePriorityChanged } = useSettingMonitor()\n const { routePriority } = useSettings(['routePriority'])\n const currentRoutePriority = routePriority ?? ''\n\n const handleRoutePriorityChange = (\n _: React.SyntheticEvent,\n routePriority: Order\n ) => {\n setValue('routePriority', routePriority)\n }\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor=\"info\" showBadge={isRoutePriorityChanged}>\n {t(`main.tags.${currentRoutePriority.toLowerCase()}` as any)}\n </BadgedValue>\n }\n icon={<Route />}\n title={t('settings.routePriority')}\n >\n <CardTabs\n value={currentRoutePriority}\n aria-label=\"tabs\"\n indicatorColor=\"primary\"\n onChange={handleRoutePriorityChange}\n sx={{ mt: 1.5 }}\n >\n {Priorities.map((priority) => {\n return (\n <Tab\n key={priority}\n label={t(`main.tags.${priority.toLowerCase()}` as any)}\n value={priority}\n disableRipple\n />\n )\n })}\n </CardTabs>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,aAAsB,CAAC,YAAY,UAAU;AAEnD,MAAa,8BAAwC;CACnD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,EAAE,2BAA2B,mBAAmB;CACtD,MAAM,EAAE,kBAAkB,YAAY,CAAC,gBAAgB,CAAC;CACxD,MAAM,uBAAuB,iBAAiB;CAE9C,MAAM,6BACJ,GACA,kBACG;
|
|
1
|
+
{"version":3,"file":"RoutePrioritySettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/RoutePrioritySettings.tsx"],"sourcesContent":["import type { Order } from '@lifi/sdk'\nimport Route from '@mui/icons-material/Route'\nimport { useTranslation } from 'react-i18next'\nimport { CardTabs, Tab } from '../../components/Tabs/Tabs.style.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../stores/settings/useSettingsActions.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from './SettingsCard/SettingCardExpandable.js'\n\nconst Priorities: Order[] = ['CHEAPEST', 'FASTEST']\n\nexport const RoutePrioritySettings: React.FC = () => {\n const { t } = useTranslation()\n const { setValue } = useSettingsActions()\n const { isRoutePriorityChanged } = useSettingMonitor()\n const { routePriority } = useSettings(['routePriority'])\n const currentRoutePriority = routePriority ?? ''\n\n const handleRoutePriorityChange = (\n _: React.SyntheticEvent,\n routePriority: Order\n ) => {\n setValue('routePriority', routePriority)\n }\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor=\"info\" showBadge={isRoutePriorityChanged}>\n {t(`main.tags.${currentRoutePriority.toLowerCase()}` as any)}\n </BadgedValue>\n }\n icon={<Route />}\n title={t('settings.routePriority')}\n >\n <CardTabs\n value={currentRoutePriority}\n aria-label=\"tabs\"\n indicatorColor=\"primary\"\n onChange={handleRoutePriorityChange}\n sx={{ mt: 1.5 }}\n >\n {Priorities.map((priority) => {\n return (\n <Tab\n key={priority}\n label={t(`main.tags.${priority.toLowerCase()}` as any)}\n value={priority}\n disableRipple\n />\n )\n })}\n </CardTabs>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,aAAsB,CAAC,YAAY,UAAU;AAEnD,MAAa,8BAAwC;CACnD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,EAAE,2BAA2B,mBAAmB;CACtD,MAAM,EAAE,kBAAkB,YAAY,CAAC,gBAAgB,CAAC;CACxD,MAAM,uBAAuB,iBAAiB;CAE9C,MAAM,6BACJ,GACA,kBACG;EACH,SAAS,iBAAiB,cAAc;;CAG1C,OACE,oBAAC,uBAAD;EACE,OACE,oBAAC,aAAD;GAAa,YAAW;GAAO,WAAW;aACvC,EAAE,aAAa,qBAAqB,aAAa,GAAU;GAChD,CAAA;EAEhB,MAAM,oBAAC,OAAD,EAAS,CAAA;EACf,OAAO,EAAE,yBAAyB;YAElC,oBAAC,UAAD;GACE,OAAO;GACP,cAAW;GACX,gBAAe;GACf,UAAU;GACV,IAAI,EAAE,IAAI,KAAK;aAEd,WAAW,KAAK,aAAa;IAC5B,OACE,oBAAC,KAAD;KAEE,OAAO,EAAE,aAAa,SAAS,aAAa,GAAU;KACtD,OAAO;KACP,eAAA;KACA,EAJK,SAIL;KAEJ;GACO,CAAA;EACW,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingCardExpandable.js","names":["Card"],"sources":["../../../../../src/pages/SettingsPage/SettingsCard/SettingCardExpandable.tsx"],"sourcesContent":["import { Collapse } from '@mui/material'\nimport type { PropsWithChildren, ReactNode } from 'react'\nimport {\n type ForwardRefExoticComponent,\n forwardRef,\n type RefAttributes,\n useId,\n useImperativeHandle,\n useRef,\n} from 'react'\nimport { Card } from '../../../components/Card/Card.js'\nimport {\n CardRowButton,\n CardTitleContainer,\n CardValue,\n} from '../../../components/Card/CardButton.style.js'\nimport { useSettingsCardExpandable } from './SettingsAccordian.js'\nimport type { SettingCardTitle } from './types.js'\n\ninterface SettingCardExpandableProps extends SettingCardTitle {\n value: ReactNode\n disabled?: boolean\n keepValueVisible?: boolean\n onEntered?: () => void\n}\n\nexport interface SettingCardExpandableRef {\n element: HTMLButtonElement | null\n isExpanded: boolean\n toggleExpanded: (forceExpanded?: boolean) => void\n}\n\nexport const SettingCardExpandable: ForwardRefExoticComponent<\n PropsWithChildren<SettingCardExpandableProps> &\n RefAttributes<SettingCardExpandableRef>\n> = forwardRef<\n SettingCardExpandableRef,\n PropsWithChildren<SettingCardExpandableProps>\n>(\n (\n { icon, title, value, children, disabled, keepValueVisible, onEntered },\n ref\n ) => {\n const { expanded, toggleExpanded } = useSettingsCardExpandable()\n const buttonId = useId()\n const collapseId = useId()\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n useImperativeHandle(\n ref,\n () => ({\n element: buttonRef.current,\n isExpanded: expanded,\n toggleExpanded,\n }),\n [expanded, toggleExpanded]\n )\n\n return (\n <Card sx={{ p: 1 }}>\n <CardRowButton\n ref={buttonRef}\n id={buttonId}\n aria-expanded={expanded}\n aria-controls={collapseId}\n onClick={disabled ? undefined : () => toggleExpanded()}\n disableRipple\n sx={{ p: 1, cursor: disabled ? 'default' : 'pointer' }}\n >\n <CardTitleContainer>\n {icon}\n <CardValue>{title}</CardValue>\n </CardTitleContainer>\n {(!expanded || keepValueVisible) && value}\n </CardRowButton>\n <Collapse\n id={collapseId}\n role=\"region\"\n aria-labelledby={buttonId}\n in={expanded}\n mountOnEnter\n unmountOnExit\n onEntered={onEntered}\n >\n {children}\n </Collapse>\n </Card>\n )\n }\n)\n"],"mappings":";;;;;;;AAgCA,MAAa,wBAGT,YAKA,EAAE,MAAM,OAAO,OAAO,UAAU,UAAU,kBAAkB,aAC5D,QACG;CACH,MAAM,EAAE,UAAU,mBAAmB,2BAA2B;CAChE,MAAM,WAAW,OAAO;CACxB,MAAM,aAAa,OAAO;CAC1B,MAAM,YAAY,OAA0B,KAAK;
|
|
1
|
+
{"version":3,"file":"SettingCardExpandable.js","names":["Card"],"sources":["../../../../../src/pages/SettingsPage/SettingsCard/SettingCardExpandable.tsx"],"sourcesContent":["import { Collapse } from '@mui/material'\nimport type { PropsWithChildren, ReactNode } from 'react'\nimport {\n type ForwardRefExoticComponent,\n forwardRef,\n type RefAttributes,\n useId,\n useImperativeHandle,\n useRef,\n} from 'react'\nimport { Card } from '../../../components/Card/Card.js'\nimport {\n CardRowButton,\n CardTitleContainer,\n CardValue,\n} from '../../../components/Card/CardButton.style.js'\nimport { useSettingsCardExpandable } from './SettingsAccordian.js'\nimport type { SettingCardTitle } from './types.js'\n\ninterface SettingCardExpandableProps extends SettingCardTitle {\n value: ReactNode\n disabled?: boolean\n keepValueVisible?: boolean\n onEntered?: () => void\n}\n\nexport interface SettingCardExpandableRef {\n element: HTMLButtonElement | null\n isExpanded: boolean\n toggleExpanded: (forceExpanded?: boolean) => void\n}\n\nexport const SettingCardExpandable: ForwardRefExoticComponent<\n PropsWithChildren<SettingCardExpandableProps> &\n RefAttributes<SettingCardExpandableRef>\n> = forwardRef<\n SettingCardExpandableRef,\n PropsWithChildren<SettingCardExpandableProps>\n>(\n (\n { icon, title, value, children, disabled, keepValueVisible, onEntered },\n ref\n ) => {\n const { expanded, toggleExpanded } = useSettingsCardExpandable()\n const buttonId = useId()\n const collapseId = useId()\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n useImperativeHandle(\n ref,\n () => ({\n element: buttonRef.current,\n isExpanded: expanded,\n toggleExpanded,\n }),\n [expanded, toggleExpanded]\n )\n\n return (\n <Card sx={{ p: 1 }}>\n <CardRowButton\n ref={buttonRef}\n id={buttonId}\n aria-expanded={expanded}\n aria-controls={collapseId}\n onClick={disabled ? undefined : () => toggleExpanded()}\n disableRipple\n sx={{ p: 1, cursor: disabled ? 'default' : 'pointer' }}\n >\n <CardTitleContainer>\n {icon}\n <CardValue>{title}</CardValue>\n </CardTitleContainer>\n {(!expanded || keepValueVisible) && value}\n </CardRowButton>\n <Collapse\n id={collapseId}\n role=\"region\"\n aria-labelledby={buttonId}\n in={expanded}\n mountOnEnter\n unmountOnExit\n onEntered={onEntered}\n >\n {children}\n </Collapse>\n </Card>\n )\n }\n)\n"],"mappings":";;;;;;;AAgCA,MAAa,wBAGT,YAKA,EAAE,MAAM,OAAO,OAAO,UAAU,UAAU,kBAAkB,aAC5D,QACG;CACH,MAAM,EAAE,UAAU,mBAAmB,2BAA2B;CAChE,MAAM,WAAW,OAAO;CACxB,MAAM,aAAa,OAAO;CAC1B,MAAM,YAAY,OAA0B,KAAK;CAEjD,oBACE,YACO;EACL,SAAS,UAAU;EACnB,YAAY;EACZ;EACD,GACD,CAAC,UAAU,eAAe,CAC3B;CAED,OACE,qBAACA,QAAD;EAAM,IAAI,EAAE,GAAG,GAAG;YAAlB,CACE,qBAAC,eAAD;GACE,KAAK;GACL,IAAI;GACJ,iBAAe;GACf,iBAAe;GACf,SAAS,WAAW,KAAA,UAAkB,gBAAgB;GACtD,eAAA;GACA,IAAI;IAAE,GAAG;IAAG,QAAQ,WAAW,YAAY;IAAW;aAPxD,CASE,qBAAC,oBAAD,EAAA,UAAA,CACG,MACD,oBAAC,WAAD,EAAA,UAAY,OAAkB,CAAA,CACX,EAAA,CAAA,GACnB,CAAC,YAAY,qBAAqB,MACtB;MAChB,oBAAC,UAAD;GACE,IAAI;GACJ,MAAK;GACL,mBAAiB;GACjB,IAAI;GACJ,cAAA;GACA,eAAA;GACW;GAEV;GACQ,CAAA,CACN;;EAGZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsAccordian.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SettingsCard/SettingsAccordian.tsx"],"sourcesContent":["import type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useId, useState } from 'react'\n\nconst SettingsAccordionContext = createContext({\n setOpenCard: (_id: string) => {},\n openCard: '',\n})\n\nexport const SettingsCardAccordion: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [openCard, setOpenCard] = useState('')\n\n return (\n <SettingsAccordionContext.Provider value={{ openCard, setOpenCard }}>\n {children}\n </SettingsAccordionContext.Provider>\n )\n}\n\nexport const useSettingsCardExpandable = (): {\n expanded: boolean\n toggleExpanded: (forceExpanded?: boolean) => void\n} => {\n const settingCardExpandableId = useId()\n const [expanded, setExpanded] = useState(false)\n const { openCard, setOpenCard } = useContext(SettingsAccordionContext)\n\n const toggleExpanded = (forceExpanded?: boolean) => {\n const newExpanded = forceExpanded ?? !expanded\n setExpanded(newExpanded)\n\n if (newExpanded && openCard !== settingCardExpandableId) {\n setOpenCard(settingCardExpandableId)\n }\n }\n\n useEffect(() => {\n if (openCard !== settingCardExpandableId) {\n setExpanded(false)\n }\n }, [settingCardExpandableId, openCard])\n\n return {\n expanded: expanded,\n toggleExpanded: toggleExpanded,\n }\n}\n"],"mappings":";;;AAGA,MAAM,2BAA2B,cAAc;CAC7C,cAAc,QAAgB;CAC9B,UAAU;CACX,CAAC;AAEF,MAAa,yBAAsD,EACjE,eACI;CACJ,MAAM,CAAC,UAAU,eAAe,SAAS,GAAG;
|
|
1
|
+
{"version":3,"file":"SettingsAccordian.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SettingsCard/SettingsAccordian.tsx"],"sourcesContent":["import type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useId, useState } from 'react'\n\nconst SettingsAccordionContext = createContext({\n setOpenCard: (_id: string) => {},\n openCard: '',\n})\n\nexport const SettingsCardAccordion: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [openCard, setOpenCard] = useState('')\n\n return (\n <SettingsAccordionContext.Provider value={{ openCard, setOpenCard }}>\n {children}\n </SettingsAccordionContext.Provider>\n )\n}\n\nexport const useSettingsCardExpandable = (): {\n expanded: boolean\n toggleExpanded: (forceExpanded?: boolean) => void\n} => {\n const settingCardExpandableId = useId()\n const [expanded, setExpanded] = useState(false)\n const { openCard, setOpenCard } = useContext(SettingsAccordionContext)\n\n const toggleExpanded = (forceExpanded?: boolean) => {\n const newExpanded = forceExpanded ?? !expanded\n setExpanded(newExpanded)\n\n if (newExpanded && openCard !== settingCardExpandableId) {\n setOpenCard(settingCardExpandableId)\n }\n }\n\n useEffect(() => {\n if (openCard !== settingCardExpandableId) {\n setExpanded(false)\n }\n }, [settingCardExpandableId, openCard])\n\n return {\n expanded: expanded,\n toggleExpanded: toggleExpanded,\n }\n}\n"],"mappings":";;;AAGA,MAAM,2BAA2B,cAAc;CAC7C,cAAc,QAAgB;CAC9B,UAAU;CACX,CAAC;AAEF,MAAa,yBAAsD,EACjE,eACI;CACJ,MAAM,CAAC,UAAU,eAAe,SAAS,GAAG;CAE5C,OACE,oBAAC,yBAAyB,UAA1B;EAAmC,OAAO;GAAE;GAAU;GAAa;EAChE;EACiC,CAAA;;AAIxC,MAAa,kCAGR;CACH,MAAM,0BAA0B,OAAO;CACvC,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAC/C,MAAM,EAAE,UAAU,gBAAgB,WAAW,yBAAyB;CAEtE,MAAM,kBAAkB,kBAA4B;EAClD,MAAM,cAAc,iBAAiB,CAAC;EACtC,YAAY,YAAY;EAExB,IAAI,eAAe,aAAa,yBAC9B,YAAY,wBAAwB;;CAIxC,gBAAgB;EACd,IAAI,aAAa,yBACf,YAAY,MAAM;IAEnB,CAAC,yBAAyB,SAAS,CAAC;CAEvC,OAAO;EACK;EACM;EACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../../src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["import type { JSX } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { BridgeAndExchangeSettings } from './BridgeAndExchangeSettings.js'\nimport { GasPriceSettings } from './GasPriceSettings.js'\nimport { LanguageSetting } from './LanguageSetting.js'\nimport { ResetSettingsButton } from './ResetSettingsButton.js'\nimport { RoutePrioritySettings } from './RoutePrioritySettings.js'\nimport { SettingsList } from './SettingsCard/SettingCard.style.js'\nimport { SettingsCardAccordion } from './SettingsCard/SettingsAccordian.js'\nimport { SlippageSettings } from './SlippageSettings/SlippageSettings.js'\nimport { SmallBalanceFilterSettings } from './SmallBalanceFilterSettings.js'\nimport { ThemeSettings } from './ThemeSettings.js'\n\nexport const SettingsPage = (): JSX.Element => {\n const { t } = useTranslation()\n const { hiddenUI } = useWidgetConfig()\n useHeader(t('header.settings'))\n\n return (\n <PageContainer bottomGutters>\n <SettingsList>\n <SettingsCardAccordion>\n <ThemeSettings />\n <LanguageSetting />\n <RoutePrioritySettings />\n <GasPriceSettings />\n <SlippageSettings />\n {!hiddenUI?.includes(HiddenUI.HideSmallBalances) && (\n <SmallBalanceFilterSettings />\n )}\n <BridgeAndExchangeSettings type=\"Bridges\" />\n <BridgeAndExchangeSettings type=\"Exchanges\" />\n </SettingsCardAccordion>\n </SettingsList>\n <ResetSettingsButton />\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAa,qBAAkC;CAC7C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,iBAAiB;
|
|
1
|
+
{"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../../src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["import type { JSX } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PageContainer } from '../../components/PageContainer.js'\nimport { useHeader } from '../../hooks/useHeader.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../../types/widget.js'\nimport { BridgeAndExchangeSettings } from './BridgeAndExchangeSettings.js'\nimport { GasPriceSettings } from './GasPriceSettings.js'\nimport { LanguageSetting } from './LanguageSetting.js'\nimport { ResetSettingsButton } from './ResetSettingsButton.js'\nimport { RoutePrioritySettings } from './RoutePrioritySettings.js'\nimport { SettingsList } from './SettingsCard/SettingCard.style.js'\nimport { SettingsCardAccordion } from './SettingsCard/SettingsAccordian.js'\nimport { SlippageSettings } from './SlippageSettings/SlippageSettings.js'\nimport { SmallBalanceFilterSettings } from './SmallBalanceFilterSettings.js'\nimport { ThemeSettings } from './ThemeSettings.js'\n\nexport const SettingsPage = (): JSX.Element => {\n const { t } = useTranslation()\n const { hiddenUI } = useWidgetConfig()\n useHeader(t('header.settings'))\n\n return (\n <PageContainer bottomGutters>\n <SettingsList>\n <SettingsCardAccordion>\n <ThemeSettings />\n <LanguageSetting />\n <RoutePrioritySettings />\n <GasPriceSettings />\n <SlippageSettings />\n {!hiddenUI?.includes(HiddenUI.HideSmallBalances) && (\n <SmallBalanceFilterSettings />\n )}\n <BridgeAndExchangeSettings type=\"Bridges\" />\n <BridgeAndExchangeSettings type=\"Exchanges\" />\n </SettingsCardAccordion>\n </SettingsList>\n <ResetSettingsButton />\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAa,qBAAkC;CAC7C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,aAAa,iBAAiB;CACtC,UAAU,EAAE,kBAAkB,CAAC;CAE/B,OACE,qBAAC,eAAD;EAAe,eAAA;YAAf,CACE,oBAAC,cAAD,EAAA,UACE,qBAAC,uBAAD,EAAA,UAAA;GACE,oBAAC,eAAD,EAAiB,CAAA;GACjB,oBAAC,iBAAD,EAAmB,CAAA;GACnB,oBAAC,uBAAD,EAAyB,CAAA;GACzB,oBAAC,kBAAD,EAAoB,CAAA;GACpB,oBAAC,kBAAD,EAAoB,CAAA;GACnB,CAAC,UAAU,SAAA,oBAAoC,IAC9C,oBAAC,4BAAD,EAA8B,CAAA;GAEhC,oBAAC,2BAAD,EAA2B,MAAK,WAAY,CAAA;GAC5C,oBAAC,2BAAD,EAA2B,MAAK,aAAc,CAAA;GACxB,EAAA,CAAA,EACX,CAAA,EACf,oBAAC,qBAAD,EAAuB,CAAA,CACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlippageSettings.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx"],"sourcesContent":["import Percent from '@mui/icons-material/Percent'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Box, Typography } from '@mui/material'\nimport type { ChangeEventHandler, FocusEventHandler } from 'react'\nimport { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useSettingMonitor } from '../../../hooks/useSettingMonitor.js'\nimport { defaultSlippage } from '../../../stores/settings/createSettingsStore.js'\nimport { useSettings } from '../../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../../stores/settings/useSettingsActions.js'\nimport { formatInputAmount, formatSlippage } from '../../../utils/format.js'\nimport { BadgedValue } from '../SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from '../SettingsCard/SettingCardExpandable.js'\nimport {\n SettingsCustomInput,\n SettingsDefaultButton,\n SettingsFieldSet,\n SlippageLimitsWarningContainer,\n} from './SlippageSettings.style.js'\n\nconst defaultSlippageInputValue = '0.5'\nconst maxFractionDigits = 5\n\nexport const SlippageSettings: React.FC = () => {\n const { t } = useTranslation()\n const {\n isSlippageNotRecommended,\n isSlippageUnderRecommendedLimits,\n isSlippageOutsideRecommendedLimits,\n isSlippageChanged,\n } = useSettingMonitor()\n const { slippage } = useSettings(['slippage'])\n const { setValue } = useSettingsActions()\n const defaultValue = useRef(slippage)\n const [focused, setFocused] = useState<'input' | 'button'>()\n\n const customInputValue =\n !slippage || slippage === defaultSlippage\n ? defaultSlippageInputValue\n : slippage\n\n const [inputValue, setInputValue] = useState(customInputValue)\n\n const handleDefaultClick = () => {\n setValue('slippage', defaultSlippage)\n }\n\n const formatAndSetSlippage = (value: string, returnInitial = false) => {\n const formattedSlippage = formatSlippage(\n value,\n defaultValue.current,\n returnInitial\n )\n const formattedValue =\n Number(formattedSlippage) === 0 && !returnInitial\n ? '0'\n : formatInputAmount(formattedSlippage, maxFractionDigits, returnInitial)\n const maxLength =\n Number(formattedValue) < 10\n ? maxFractionDigits + 2\n : maxFractionDigits + 3\n const slicedValue = formattedValue.slice(0, maxLength)\n setInputValue(slicedValue)\n setValue('slippage', slicedValue.length ? slicedValue : defaultSlippage)\n }\n\n const handleInputUpdate: ChangeEventHandler<HTMLInputElement> = (event) => {\n formatAndSetSlippage(event.target.value, true)\n }\n\n const handleInputFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused('input')\n formatAndSetSlippage(event.target.value)\n }\n\n const handleInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(undefined)\n formatAndSetSlippage(event.target.value)\n }\n\n const badgeColor = isSlippageNotRecommended\n ? 'warning'\n : isSlippageChanged\n ? 'info'\n : undefined\n\n const slippageWarningText = isSlippageOutsideRecommendedLimits\n ? t('warning.message.slippageOutsideRecommendedLimits')\n : isSlippageUnderRecommendedLimits\n ? t('warning.message.slippageUnderRecommendedLimits')\n : ''\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor={badgeColor} showBadge={!!badgeColor}>\n {slippage ? `${slippage}%` : t('button.auto')}\n </BadgedValue>\n }\n icon={<Percent />}\n title={t('settings.slippage')}\n >\n <Box\n sx={{\n mt: 1.5,\n }}\n >\n <SettingsFieldSet>\n <SettingsDefaultButton\n selected={defaultSlippage === slippage && focused !== 'input'}\n onFocus={() => {\n setFocused('button')\n }}\n onBlur={() => {\n setFocused(undefined)\n }}\n onClick={handleDefaultClick}\n disableRipple\n >\n {t('button.auto')}\n </SettingsDefaultButton>\n <SettingsCustomInput\n selected={defaultSlippage !== slippage && focused !== 'button'}\n placeholder={focused === 'input' ? '' : t('settings.custom')}\n inputProps={{\n inputMode: 'decimal',\n }}\n onChange={handleInputUpdate}\n onFocus={handleInputFocus}\n value={inputValue}\n autoComplete=\"off\"\n onBlur={handleInputBlur}\n />\n </SettingsFieldSet>\n {isSlippageNotRecommended && (\n <SlippageLimitsWarningContainer>\n <WarningRounded color=\"warning\" />\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 400,\n }}\n >\n {slippageWarningText}\n </Typography>\n </SlippageLimitsWarningContainer>\n )}\n </Box>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,4BAA4B;AAClC,MAAM,oBAAoB;AAE1B,MAAa,yBAAmC;CAC9C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EACJ,0BACA,kCACA,oCACA,sBACE,mBAAmB;CACvB,MAAM,EAAE,aAAa,YAAY,CAAC,WAAW,CAAC;CAC9C,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,eAAe,OAAO,SAAS;CACrC,MAAM,CAAC,SAAS,cAAc,UAA8B;CAO5D,MAAM,CAAC,YAAY,iBAAiB,SAJlC,CAAC,YAAY,aAAA,KAAA,IACT,4BACA,SAEwD;CAE9D,MAAM,2BAA2B;
|
|
1
|
+
{"version":3,"file":"SlippageSettings.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx"],"sourcesContent":["import Percent from '@mui/icons-material/Percent'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Box, Typography } from '@mui/material'\nimport type { ChangeEventHandler, FocusEventHandler } from 'react'\nimport { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useSettingMonitor } from '../../../hooks/useSettingMonitor.js'\nimport { defaultSlippage } from '../../../stores/settings/createSettingsStore.js'\nimport { useSettings } from '../../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../../stores/settings/useSettingsActions.js'\nimport { formatInputAmount, formatSlippage } from '../../../utils/format.js'\nimport { BadgedValue } from '../SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from '../SettingsCard/SettingCardExpandable.js'\nimport {\n SettingsCustomInput,\n SettingsDefaultButton,\n SettingsFieldSet,\n SlippageLimitsWarningContainer,\n} from './SlippageSettings.style.js'\n\nconst defaultSlippageInputValue = '0.5'\nconst maxFractionDigits = 5\n\nexport const SlippageSettings: React.FC = () => {\n const { t } = useTranslation()\n const {\n isSlippageNotRecommended,\n isSlippageUnderRecommendedLimits,\n isSlippageOutsideRecommendedLimits,\n isSlippageChanged,\n } = useSettingMonitor()\n const { slippage } = useSettings(['slippage'])\n const { setValue } = useSettingsActions()\n const defaultValue = useRef(slippage)\n const [focused, setFocused] = useState<'input' | 'button'>()\n\n const customInputValue =\n !slippage || slippage === defaultSlippage\n ? defaultSlippageInputValue\n : slippage\n\n const [inputValue, setInputValue] = useState(customInputValue)\n\n const handleDefaultClick = () => {\n setValue('slippage', defaultSlippage)\n }\n\n const formatAndSetSlippage = (value: string, returnInitial = false) => {\n const formattedSlippage = formatSlippage(\n value,\n defaultValue.current,\n returnInitial\n )\n const formattedValue =\n Number(formattedSlippage) === 0 && !returnInitial\n ? '0'\n : formatInputAmount(formattedSlippage, maxFractionDigits, returnInitial)\n const maxLength =\n Number(formattedValue) < 10\n ? maxFractionDigits + 2\n : maxFractionDigits + 3\n const slicedValue = formattedValue.slice(0, maxLength)\n setInputValue(slicedValue)\n setValue('slippage', slicedValue.length ? slicedValue : defaultSlippage)\n }\n\n const handleInputUpdate: ChangeEventHandler<HTMLInputElement> = (event) => {\n formatAndSetSlippage(event.target.value, true)\n }\n\n const handleInputFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused('input')\n formatAndSetSlippage(event.target.value)\n }\n\n const handleInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(undefined)\n formatAndSetSlippage(event.target.value)\n }\n\n const badgeColor = isSlippageNotRecommended\n ? 'warning'\n : isSlippageChanged\n ? 'info'\n : undefined\n\n const slippageWarningText = isSlippageOutsideRecommendedLimits\n ? t('warning.message.slippageOutsideRecommendedLimits')\n : isSlippageUnderRecommendedLimits\n ? t('warning.message.slippageUnderRecommendedLimits')\n : ''\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor={badgeColor} showBadge={!!badgeColor}>\n {slippage ? `${slippage}%` : t('button.auto')}\n </BadgedValue>\n }\n icon={<Percent />}\n title={t('settings.slippage')}\n >\n <Box\n sx={{\n mt: 1.5,\n }}\n >\n <SettingsFieldSet>\n <SettingsDefaultButton\n selected={defaultSlippage === slippage && focused !== 'input'}\n onFocus={() => {\n setFocused('button')\n }}\n onBlur={() => {\n setFocused(undefined)\n }}\n onClick={handleDefaultClick}\n disableRipple\n >\n {t('button.auto')}\n </SettingsDefaultButton>\n <SettingsCustomInput\n selected={defaultSlippage !== slippage && focused !== 'button'}\n placeholder={focused === 'input' ? '' : t('settings.custom')}\n inputProps={{\n inputMode: 'decimal',\n }}\n onChange={handleInputUpdate}\n onFocus={handleInputFocus}\n value={inputValue}\n autoComplete=\"off\"\n onBlur={handleInputBlur}\n />\n </SettingsFieldSet>\n {isSlippageNotRecommended && (\n <SlippageLimitsWarningContainer>\n <WarningRounded color=\"warning\" />\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 400,\n }}\n >\n {slippageWarningText}\n </Typography>\n </SlippageLimitsWarningContainer>\n )}\n </Box>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,4BAA4B;AAClC,MAAM,oBAAoB;AAE1B,MAAa,yBAAmC;CAC9C,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EACJ,0BACA,kCACA,oCACA,sBACE,mBAAmB;CACvB,MAAM,EAAE,aAAa,YAAY,CAAC,WAAW,CAAC;CAC9C,MAAM,EAAE,aAAa,oBAAoB;CACzC,MAAM,eAAe,OAAO,SAAS;CACrC,MAAM,CAAC,SAAS,cAAc,UAA8B;CAO5D,MAAM,CAAC,YAAY,iBAAiB,SAJlC,CAAC,YAAY,aAAA,KAAA,IACT,4BACA,SAEwD;CAE9D,MAAM,2BAA2B;EAC/B,SAAS,YAAA,KAAA,EAA4B;;CAGvC,MAAM,wBAAwB,OAAe,gBAAgB,UAAU;EACrE,MAAM,oBAAoB,eACxB,OACA,aAAa,SACb,cACD;EACD,MAAM,iBACJ,OAAO,kBAAkB,KAAK,KAAK,CAAC,gBAChC,MACA,kBAAkB,mBAAmB,mBAAmB,cAAc;EAC5E,MAAM,YACJ,OAAO,eAAe,GAAG,KACrB,oBAAoB,IACpB,oBAAoB;EAC1B,MAAM,cAAc,eAAe,MAAM,GAAG,UAAU;EACtD,cAAc,YAAY;EAC1B,SAAS,YAAY,YAAY,SAAS,cAAA,KAAA,EAA8B;;CAG1E,MAAM,qBAA2D,UAAU;EACzE,qBAAqB,MAAM,OAAO,OAAO,KAAK;;CAGhD,MAAM,oBAAyD,UAAU;EACvE,WAAW,QAAQ;EACnB,qBAAqB,MAAM,OAAO,MAAM;;CAG1C,MAAM,mBAAwD,UAAU;EACtE,WAAW,KAAA,EAAU;EACrB,qBAAqB,MAAM,OAAO,MAAM;;CAG1C,MAAM,aAAa,2BACf,YACA,oBACE,SACA,KAAA;CAEN,MAAM,sBAAsB,qCACxB,EAAE,mDAAmD,GACrD,mCACE,EAAE,iDAAiD,GACnD;CAEN,OACE,oBAAC,uBAAD;EACE,OACE,oBAAC,aAAD;GAAyB;GAAY,WAAW,CAAC,CAAC;aAC/C,WAAW,GAAG,SAAS,KAAK,EAAE,cAAc;GACjC,CAAA;EAEhB,MAAM,oBAAC,SAAD,EAAW,CAAA;EACjB,OAAO,EAAE,oBAAoB;YAE7B,qBAAC,KAAD;GACE,IAAI,EACF,IAAI,KACL;aAHH,CAKE,qBAAC,kBAAD,EAAA,UAAA,CACE,oBAAC,uBAAD;IACE,UAAA,KAAA,MAA8B,YAAY,YAAY;IACtD,eAAe;KACb,WAAW,SAAS;;IAEtB,cAAc;KACZ,WAAW,KAAA,EAAU;;IAEvB,SAAS;IACT,eAAA;cAEC,EAAE,cAAc;IACK,CAAA,EACxB,oBAAC,qBAAD;IACE,UAAA,KAAA,MAA8B,YAAY,YAAY;IACtD,aAAa,YAAY,UAAU,KAAK,EAAE,kBAAkB;IAC5D,YAAY,EACV,WAAW,WACZ;IACD,UAAU;IACV,SAAS;IACT,OAAO;IACP,cAAa;IACb,QAAQ;IACR,CAAA,CACe,EAAA,CAAA,EAClB,4BACC,qBAAC,gCAAD,EAAA,UAAA,CACE,oBAAC,gBAAD,EAAgB,OAAM,WAAY,CAAA,EAClC,oBAAC,YAAD;IACE,IAAI;KACF,UAAU;KACV,YAAY;KACb;cAEA;IACU,CAAA,CACkB,EAAA,CAAA,CAE/B;;EACgB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlippageSettings.style.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport {\n Box,\n ButtonBase,\n InputBase,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport type React from 'react'\n\nexport const SettingsFieldSet: React.FC<\n React.ComponentProps<typeof Box> & SettingsControlProps\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n borderRadius: theme.vars.shape.borderRadius,\n padding: theme.spacing(0.5),\n gap: theme.spacing(0.5),\n height: '3.5rem',\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 8%, transparent)`,\n }),\n}))\n\nconst settingsControlSelected = (theme: Theme) => ({\n backgroundColor: theme.vars.palette.background.paper,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.background} 56%, transparent)`,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.background} 4%, transparent)`,\n }),\n borderRadius: `calc(${theme.vars.shape.borderRadius} - 4px)`,\n})\n\ninterface SettingsControlProps {\n selected?: boolean\n}\n\nexport const SettingsDefaultButton: React.FC<\n React.ComponentProps<typeof ButtonBase> & SettingsControlProps\n> = styled(ButtonBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n fontSize: '1rem',\n fontWeight: 700,\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n }\n})\n\nexport const SettingsCustomInput: React.FC<\n React.ComponentProps<typeof InputBase> & SettingsControlProps\n> = styled(InputBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n [`.${inputBaseClasses.input}`]: {\n height: '100%',\n width: '100%',\n padding: 0,\n textAlign: 'center',\n '&::placeholder': {\n fontSize: '1rem',\n fontWeight: 700,\n opacity: 1,\n },\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n },\n }\n})\n\nexport const SlippageLimitsWarningContainer: React.FC<\n React.ComponentProps<typeof Box>\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1.25),\n marginTop: theme.spacing(1.5),\n}))\n"],"mappings":";;AAUA,MAAa,mBAET,OAAO,IAAI,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,cAAc,MAAM,KAAK,MAAM;CAC/B,SAAS,MAAM,QAAQ,GAAI;CAC3B,KAAK,MAAM,QAAQ,GAAI;CACvB,QAAQ;CACR,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa;CAC9E,GAAG,MAAM,YAAY,QAAQ,EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa,oBAC/E,CAAC;CACH,EAAE;AAEH,MAAM,2BAA2B,WAAkB;CACjD,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,aAAa;CACpF,GAAG,MAAM,YAAY,QAAQ;EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,WAAW;EAC5E,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,WAAW;EACnF,CAAC;CACF,cAAc,QAAQ,MAAM,KAAK,MAAM,aAAa;CACrD;AAMD,MAAa,wBAET,OAAO,WAAW,EAAwB,EAAE,OAAO,eAAe;CACpE,MAAM,gCAAgC,wBAAwB,MAAM;CACpE,MAAM,gBAAgB,WAClB,EACE,iBAAiB,EACf,GAAG,+BACJ,EACF,GACD,EAAE;
|
|
1
|
+
{"version":3,"file":"SlippageSettings.style.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport {\n Box,\n ButtonBase,\n InputBase,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport type React from 'react'\n\nexport const SettingsFieldSet: React.FC<\n React.ComponentProps<typeof Box> & SettingsControlProps\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n borderRadius: theme.vars.shape.borderRadius,\n padding: theme.spacing(0.5),\n gap: theme.spacing(0.5),\n height: '3.5rem',\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 8%, transparent)`,\n }),\n}))\n\nconst settingsControlSelected = (theme: Theme) => ({\n backgroundColor: theme.vars.palette.background.paper,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.background} 56%, transparent)`,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.background} 4%, transparent)`,\n }),\n borderRadius: `calc(${theme.vars.shape.borderRadius} - 4px)`,\n})\n\ninterface SettingsControlProps {\n selected?: boolean\n}\n\nexport const SettingsDefaultButton: React.FC<\n React.ComponentProps<typeof ButtonBase> & SettingsControlProps\n> = styled(ButtonBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n fontSize: '1rem',\n fontWeight: 700,\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n }\n})\n\nexport const SettingsCustomInput: React.FC<\n React.ComponentProps<typeof InputBase> & SettingsControlProps\n> = styled(InputBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n [`.${inputBaseClasses.input}`]: {\n height: '100%',\n width: '100%',\n padding: 0,\n textAlign: 'center',\n '&::placeholder': {\n fontSize: '1rem',\n fontWeight: 700,\n opacity: 1,\n },\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n },\n }\n})\n\nexport const SlippageLimitsWarningContainer: React.FC<\n React.ComponentProps<typeof Box>\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1.25),\n marginTop: theme.spacing(1.5),\n}))\n"],"mappings":";;AAUA,MAAa,mBAET,OAAO,IAAI,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,cAAc,MAAM,KAAK,MAAM;CAC/B,SAAS,MAAM,QAAQ,GAAI;CAC3B,KAAK,MAAM,QAAQ,GAAI;CACvB,QAAQ;CACR,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa;CAC9E,GAAG,MAAM,YAAY,QAAQ,EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa,oBAC/E,CAAC;CACH,EAAE;AAEH,MAAM,2BAA2B,WAAkB;CACjD,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,aAAa;CACpF,GAAG,MAAM,YAAY,QAAQ;EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,WAAW;EAC5E,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,WAAW;EACnF,CAAC;CACF,cAAc,QAAQ,MAAM,KAAK,MAAM,aAAa;CACrD;AAMD,MAAa,wBAET,OAAO,WAAW,EAAwB,EAAE,OAAO,eAAe;CACpE,MAAM,gCAAgC,wBAAwB,MAAM;CACpE,MAAM,gBAAgB,WAClB,EACE,iBAAiB,EACf,GAAG,+BACJ,EACF,GACD,EAAE;CAEN,OAAO;EACL,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,WAAW,EACT,GAAG,+BACJ;EACD,GAAG;EACJ;EACD;AAEF,MAAa,sBAET,OAAO,UAAU,EAAwB,EAAE,OAAO,eAAe;CACnE,MAAM,gCAAgC,wBAAwB,MAAM;CACpE,MAAM,gBAAgB,WAClB,EACE,iBAAiB,EACf,GAAG,+BACJ,EACF,GACD,EAAE;CAEN,OAAO;EACL,QAAQ;EACR,OAAO;GACN,IAAI,iBAAiB,UAAU;GAC9B,QAAQ;GACR,OAAO;GACP,SAAS;GACT,WAAW;GACX,kBAAkB;IAChB,UAAU;IACV,YAAY;IACZ,SAAS;IACV;GACD,WAAW,EACT,GAAG,+BACJ;GACD,GAAG;GACJ;EACF;EACD;AAEF,MAAa,iCAET,OAAO,IAAI,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,KAAK,MAAM,QAAQ,KAAK;CACxB,WAAW,MAAM,QAAQ,IAAI;CAC9B,EAAE"}
|