diff --git a/app/components/UI/Swaps/index.js b/app/components/UI/Swaps/index.js index b4c87602a6e..f559404f5f1 100644 --- a/app/components/UI/Swaps/index.js +++ b/app/components/UI/Swaps/index.js @@ -12,8 +12,14 @@ import Engine from '../../../core/Engine'; import handleInput from '../../Base/Keypad/rules/native'; import useModalHandler from '../../Base/hooks/useModalHandler'; import Device from '../../../util/Device'; +import { + fromTokenMinimalUnit, + renderFromTokenMinimalUnit, + renderFromWei, + toTokenMinimalUnit +} from '../../../util/number'; import { setQuotesNavigationsParams } from './utils'; -import { renderFromTokenMinimalUnit, renderFromWei, toTokenMinimalUnit } from '../../../util/number'; + import { strings } from '../../../../locales/i18n'; import { colors } from '../../../styles/common'; @@ -56,6 +62,9 @@ const styles = StyleSheet.create({ amountInvalid: { color: colors.red }, + linkText: { + color: colors.blue + }, horizontalRuleContainer: { flexDirection: 'row', paddingHorizontal: 30, @@ -160,6 +169,13 @@ function SwapsAmountView({ tokens, accounts, selectedAddress, balances }) { return tokenAddress in balances ? renderFromTokenMinimalUnit(balances[tokenAddress], sourceToken.decimals) : 0; }, [accounts, balances, selectedAddress, sourceToken]); + const hasBalance = useMemo(() => { + if (!balance || !sourceToken || sourceToken.symbol === 'ETH') { + return false; + } + + return new BigNumber(balance).gt(0); + }, [balance, sourceToken]); const hasEnoughBalance = useMemo(() => amountBigNumber.lte(new BigNumber(balance)), [amountBigNumber, balance]); /* Navigation handler */ @@ -217,6 +233,10 @@ function SwapsAmountView({ tokens, accounts, selectedAddress, balances }) { [toggleDestinationModal] ); + const handleUseMax = useCallback(() => { + setAmount(fromTokenMinimalUnit(balances[toChecksumAddress(sourceToken.address)], sourceToken.decimals)); + }, [balances, sourceToken.address, sourceToken.decimals]); + return ( @@ -256,10 +276,18 @@ function SwapsAmountView({ tokens, accounts, selectedAddress, balances }) { })} ) : ( - - {sourceToken && balance !== null - ? strings('swaps.available_to_swap', { asset: `${balance} ${sourceToken.symbol}` }) - : ''} + + {sourceToken && + balance !== null && + strings('swaps.available_to_swap', { + asset: `${balance} ${sourceToken.symbol}` + })} + {hasBalance && ( + + {' '} + {strings('swaps.use_max')} + + )} )} diff --git a/locales/en.json b/locales/en.json index dc64517ce5f..39c214d1521 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1379,7 +1379,8 @@ "select_a_token": "Select a token", "search_token": "Search for a token", "no_tokens_result": "No tokens match “{{searchString}}”", - "available_to_swap": "{{asset}} available to swap", + "available_to_swap": "{{asset}} available to swap.", + "use_max": "Use max", "not_enough": "Not enough {{symbol}} to complete this swap", "max_slippage": "Max slippage {{slippage}}", "allows_up_to_decimals": "{{symbol}} allows up to {{decimals}} decimals", diff --git a/locales/es.json b/locales/es.json index 91e5538237a..ed521933ee8 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1253,7 +1253,8 @@ "select_a_token": "Selecciona un token", "search_token": "Buscar un token", "no_tokens_result": "No se encontraron tokens para “{{searchString}}”", - "available_to_swap": "{{asset}} disponible para convertir", + "available_to_swap": "{{asset}} disponible para convertir.", + "use_max": "Usar máximo", "not_enough": "Insuficiente {{symbol}} para esta conversión", "max_slippage": "Deslizamiento máx. {{slippage}}", "allows_up_to_decimals": "{{symbol}} soporta hasta {{decimals}} decimales",