import React from 'react'; import PropTypes from 'prop-types'; import BigNumber from 'bignumber.js'; import Tooltip from '../../../components/ui/tooltip'; import UrlIcon from '../../../components/ui/url-icon'; import ExchangeRateDisplay from '../exchange-rate-display'; import { formatSwapsValueForDisplay } from '../swaps.util'; import { calcTokenAmount, toPrecisionWithoutTrailingZeros, } from '../../../../shared/lib/transactions-controller-utils'; function getFontSizesAndLineHeights(fontSizeScore) { if (fontSizeScore <= 9) { return [50, 48]; } if (fontSizeScore <= 13) { return [40, 32]; } return [26, 15]; } export default function MainQuoteSummary({ sourceValue, sourceSymbol, sourceDecimals, sourceIconUrl, destinationValue, destinationSymbol, destinationDecimals, destinationIconUrl, }) { const sourceAmount = toPrecisionWithoutTrailingZeros( calcTokenAmount(sourceValue, sourceDecimals).toString(10), 12, ); const destinationAmount = calcTokenAmount( destinationValue, destinationDecimals, ); const amountToDisplay = formatSwapsValueForDisplay(destinationAmount); const amountDigitLength = amountToDisplay.match(/\d+/gu).join('').length; const [numberFontSize, lineHeight] = getFontSizesAndLineHeights(amountDigitLength); let ellipsedAmountToDisplay = amountToDisplay; if (amountDigitLength > 20) { ellipsedAmountToDisplay = `${amountToDisplay.slice(0, 20)}...`; } return ( <div className="main-quote-summary"> <div className="main-quote-summary__details"> <div className="main-quote-summary__quote-details-top"> <div className="main-quote-summary__source-row" data-testid="main-quote-summary__source-row" > <span className="main-quote-summary__source-row-value" title={formatSwapsValueForDisplay(sourceAmount)} > {formatSwapsValueForDisplay(sourceAmount)} </span> <UrlIcon url={sourceIconUrl} className="main-quote-summary__icon" name={sourceSymbol} fallbackClassName="main-quote-summary__icon-fallback" /> <span className="main-quote-summary__source-row-symbol" title={sourceSymbol} > {sourceSymbol} </span> </div> <i className="fa fa-arrow-down main-quote-summary__down-arrow" /> <div className="main-quote-summary__destination-row"> <UrlIcon url={destinationIconUrl} className="main-quote-summary__icon" name={destinationSymbol} fallbackClassName="main-quote-summary__icon-fallback" /> <span className="main-quote-summary__destination-row-symbol"> {destinationSymbol} </span> </div> <div className="main-quote-summary__quote-large"> <Tooltip interactive position="bottom" html={amountToDisplay} disabled={ellipsedAmountToDisplay === amountToDisplay} > <span className="main-quote-summary__quote-large-number" style={{ fontSize: numberFontSize, lineHeight: `${lineHeight}px`, }} > {`${ellipsedAmountToDisplay}`} </span> </Tooltip> </div> </div> <div className="main-quote-summary__exchange-rate-container" data-testid="main-quote-summary__exchange-rate-container" > <ExchangeRateDisplay primaryTokenValue={sourceValue} primaryTokenDecimals={sourceDecimals} primaryTokenSymbol={sourceSymbol} secondaryTokenValue={destinationValue} secondaryTokenDecimals={destinationDecimals} secondaryTokenSymbol={destinationSymbol} arrowColor="var(--color-primary-default)" boldSymbols={false} className="main-quote-summary__exchange-rate-display" /> </div> </div> </div> ); } MainQuoteSummary.propTypes = { /** * The amount that will be sent in the smallest denomination. * For example, wei is the smallest denomination for ether. */ sourceValue: PropTypes.oneOfType([ PropTypes.string, PropTypes.instanceOf(BigNumber), ]).isRequired, /** * Maximum number of decimal places for the source token. */ sourceDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), /** * The ticker symbol for the source token. */ sourceSymbol: PropTypes.string.isRequired, /** * The amount that will be received in the smallest denomination. * For example, wei is the smallest denomination for ether. */ destinationValue: PropTypes.oneOfType([ PropTypes.string, PropTypes.instanceOf(BigNumber), ]).isRequired, /** * Maximum number of decimal places for the destination token. */ destinationDecimals: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, ]), /** * The ticker symbol for the destination token. */ destinationSymbol: PropTypes.string.isRequired, /** * The location of the source token icon file. */ sourceIconUrl: PropTypes.string, /** * The location of the destination token icon file. */ destinationIconUrl: PropTypes.string, };