import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import { useDispatch, useSelector } from 'react-redux'; import classnames from 'classnames'; import { useHistory, useLocation } from 'react-router-dom'; ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) import { getMmiPortfolioEnabled, getMmiPortfolioUrl, } from '../../../selectors/institutional/selectors'; ///: END:ONLY_INCLUDE_IN import { I18nContext } from '../../../contexts/i18n'; import { SEND_ROUTE, BUILD_QUOTE_ROUTE, } from '../../../helpers/constants/routes'; import Tooltip from '../../ui/tooltip'; import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display'; import { PRIMARY, SECONDARY } from '../../../helpers/constants/common'; import { isBalanceCached, getShouldShowFiat, getCurrentKeyring, getSwapsDefaultToken, getIsSwapsChain, getIsBridgeChain, getIsBuyableChain, getSelectedAccountCachedBalance, getCurrentChainId, getMetaMetricsId, } from '../../../selectors'; import { setSwapsFromToken } from '../../../ducks/swaps/swaps'; import IconButton from '../../ui/icon-button'; import { isHardwareKeyring } from '../../../helpers/utils/hardware'; import { MetaMetricsContext } from '../../../contexts/metametrics'; import { MetaMetricsEventCategory, MetaMetricsEventName, MetaMetricsSwapsEventSource, } from '../../../../shared/constants/metametrics'; import Spinner from '../../ui/spinner'; import { startNewDraftTransaction } from '../../../ducks/send'; import { AssetType } from '../../../../shared/constants/transaction'; import { Icon, IconName } from '../../component-library'; import { IconColor } from '../../../helpers/constants/design-system'; import useRamps from '../../../hooks/experiences/useRamps'; import { getPortfolioUrl } from '../../../helpers/utils/portfolio'; import WalletOverview from './wallet-overview'; const EthOverview = ({ className, showAddress }) => { const dispatch = useDispatch(); const t = useContext(I18nContext); const trackEvent = useContext(MetaMetricsContext); const history = useHistory(); const location = useLocation(); const keyring = useSelector(getCurrentKeyring); const usingHardwareWallet = isHardwareKeyring(keyring?.type); const balanceIsCached = useSelector(isBalanceCached); const showFiat = useSelector(getShouldShowFiat); const balance = useSelector(getSelectedAccountCachedBalance); const isSwapsChain = useSelector(getIsSwapsChain); const isBridgeChain = useSelector(getIsBridgeChain); const isBuyableChain = useSelector(getIsBuyableChain); const defaultSwapsToken = useSelector(getSwapsDefaultToken); const chainId = useSelector(getCurrentChainId); const metaMetricsId = useSelector(getMetaMetricsId); ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) const mmiPortfolioEnabled = useSelector(getMmiPortfolioEnabled); const mmiPortfolioUrl = useSelector(getMmiPortfolioUrl); const portfolioEvent = () => { trackEvent({ category: MetaMetricsEventCategory.Navigation, event: MetaMetricsEventName.MMIPortfolioButtonClicked, }); }; const stakingEvent = () => { trackEvent({ category: MetaMetricsEventCategory.Navigation, event: MetaMetricsEventName.MMIPortfolioButtonClicked, }); }; const renderInstitutionalButtons = () => { return ( <> } label={t('stake')} onClick={() => { stakingEvent(); global.platform.openTab({ url: 'https://metamask-institutional.io/staking', }); }} /> {mmiPortfolioEnabled && ( } label={t('portfolio')} onClick={() => { portfolioEvent(); window.open(mmiPortfolioUrl, '_blank'); }} /> )} ); }; ///: END:ONLY_INCLUDE_IN const { openBuyCryptoInPdapp } = useRamps(); return (
{balance ? ( ) : ( )} {balanceIsCached ? ( * ) : null}
{showFiat && balance && ( )}
} buttons={ <> { ///: BEGIN:ONLY_INCLUDE_IN(build-main,build-beta,build-flask) } disabled={!isBuyableChain} data-testid="eth-overview-buy" label={t('buy')} onClick={() => { openBuyCryptoInPdapp(); trackEvent({ event: MetaMetricsEventName.NavBuyButtonClicked, category: MetaMetricsEventCategory.Navigation, properties: { location: 'Home', text: 'Buy', chain_id: chainId, token_symbol: defaultSwapsToken, }, }); }} /> ///: END:ONLY_INCLUDE_IN } { ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) renderInstitutionalButtons() ///: END:ONLY_INCLUDE_IN } } label={t('send')} onClick={() => { trackEvent({ event: MetaMetricsEventName.NavSendButtonClicked, category: MetaMetricsEventCategory.Navigation, properties: { token_symbol: 'ETH', location: 'Home', text: 'Send', chain_id: chainId, }, }); dispatch( startNewDraftTransaction({ type: AssetType.native }), ).then(() => { history.push(SEND_ROUTE); }); }} /> } onClick={() => { if (isSwapsChain) { trackEvent({ event: MetaMetricsEventName.NavSwapButtonClicked, category: MetaMetricsEventCategory.Swaps, properties: { token_symbol: 'ETH', location: MetaMetricsSwapsEventSource.MainView, text: 'Swap', chain_id: chainId, }, }); dispatch(setSwapsFromToken(defaultSwapsToken)); if (usingHardwareWallet) { global.platform.openExtensionInBrowser(BUILD_QUOTE_ROUTE); } else { history.push(BUILD_QUOTE_ROUTE); } } }} label={t('swap')} data-testid="token-overview-button-swap" tooltipRender={ isSwapsChain ? null : (contents) => ( {contents} ) } /> { ///: BEGIN:ONLY_INCLUDE_IN(build-main,build-beta,build-flask) } label={t('bridge')} onClick={() => { if (isBridgeChain) { const portfolioUrl = getPortfolioUrl( 'bridge', 'ext_bridge_button', metaMetricsId, ); global.platform.openTab({ url: `${portfolioUrl}${ location.pathname.includes('asset') ? '&token=native' : '' }`, }); trackEvent({ category: MetaMetricsEventCategory.Navigation, event: MetaMetricsEventName.BridgeLinkClicked, properties: { location: 'Home', text: 'Bridge', chain_id: chainId, token_symbol: 'ETH', }, }); } }} tooltipRender={ isBridgeChain ? null : (contents) => ( {contents} ) } /> ///: END:ONLY_INCLUDE_IN } { ///: BEGIN:ONLY_INCLUDE_IN(build-main,build-beta,build-flask) } label={t('portfolio')} onClick={() => { const url = getPortfolioUrl( '', 'ext_portfolio_button', metaMetricsId, ); global.platform.openTab({ url }); trackEvent({ category: MetaMetricsEventCategory.Navigation, event: MetaMetricsEventName.PortfolioLinkClicked, properties: { location: 'Home', text: 'Portfolio', chain_id: chainId, token_symbol: 'ETH', }, }); }} /> ///: END:ONLY_INCLUDE_IN } } className={className} /> ); }; EthOverview.propTypes = { className: PropTypes.string, showAddress: PropTypes.bool, }; export default EthOverview;