Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: ETH 'token' now only appears once in the swaps to and from dropdowns #10650

Merged
merged 1 commit into from
Mar 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 14 additions & 24 deletions ui/app/hooks/useTokensToSearch.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,7 @@ export function getRenderableTokenData(
};
}

export function useTokensToSearch({
providedTokens,
usersTokens = [],
topTokens = {},
onlyEth,
singleToken,
}) {
export function useTokensToSearch({ usersTokens = [], topTokens = {} }) {
const tokenConversionRates = useSelector(getTokenExchangeRates, isEqual);
const conversionRate = useSelector(getConversionRate);
const currentCurrency = useSelector(getCurrentCurrency);
Expand All @@ -93,18 +87,16 @@ export function useTokensToSearch({
const memoizedEthToken = useEqualityCheck(ethToken);

const swapsTokens = useSelector(getSwapsTokens) || [];
let tokensToSearch;
if (onlyEth) {
tokensToSearch = [memoizedEthToken];
} else if (singleToken) {
tokensToSearch = providedTokens;
} else if (providedTokens) {
tokensToSearch = [memoizedEthToken, ...providedTokens];
} else if (swapsTokens.length) {
tokensToSearch = [memoizedEthToken, ...swapsTokens];
} else {
tokensToSearch = [memoizedEthToken, ...tokenList];
}

const tokensToSearch = swapsTokens.length
? swapsTokens
: [
memoizedEthToken,
...tokenList.filter(
(token) => token.symbol !== memoizedEthToken.symbol,
),
];

const memoizedTokensToSearch = useEqualityCheck(tokensToSearch);
return useMemo(() => {
const usersTokensAddressMap = memoizedUsersToken.reduce(
Expand All @@ -113,7 +105,7 @@ export function useTokensToSearch({
);

const tokensToSearchBuckets = {
owned: singleToken ? [] : [memoizedEthToken],
owned: [],
top: [],
others: [],
};
Expand All @@ -126,8 +118,8 @@ export function useTokensToSearch({
currentCurrency,
);
if (
usersTokensAddressMap[token.address] &&
(renderableDataToken.symbol === 'ETH' ||
renderableDataToken.symbol === 'ETH' ||
(usersTokensAddressMap[token.address] &&
Number(renderableDataToken.balance ?? 0) !== 0)
) {
tokensToSearchBuckets.owned.push(renderableDataToken);
Expand Down Expand Up @@ -158,7 +150,5 @@ export function useTokensToSearch({
conversionRate,
currentCurrency,
memoizedTopTokens,
memoizedEthToken,
singleToken,
]);
}
33 changes: 21 additions & 12 deletions ui/app/pages/swaps/build-quote/build-quote.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ import React, { useContext, useEffect, useState, useCallback } from 'react';
import PropTypes from 'prop-types';
import { useDispatch, useSelector } from 'react-redux';
import classnames from 'classnames';
import { uniqBy } from 'lodash';
import { uniqBy, isEqual } from 'lodash';
import { useHistory } from 'react-router-dom';
import { MetaMetricsContext } from '../../../contexts/metametrics.new';
import { useTokensToSearch } from '../../../hooks/useTokensToSearch';
import {
useTokensToSearch,
getRenderableTokenData,
} from '../../../hooks/useTokensToSearch';
import { useEqualityCheck } from '../../../hooks/useEqualityCheck';
import { I18nContext } from '../../../contexts/i18n';
import DropdownInputPair from '../dropdown-input-pair';
Expand All @@ -25,7 +28,12 @@ import {
getTopAssets,
getFetchParams,
} from '../../../ducks/swaps/swaps';
import { getSwapsEthToken } from '../../../selectors';
import {
getSwapsEthToken,
getTokenExchangeRates,
getConversionRate,
getCurrentCurrency,
} from '../../../selectors';
import {
getValueFromWeiHex,
hexToDecimal,
Expand Down Expand Up @@ -80,6 +88,10 @@ export default function BuildQuote({
const fetchParamsFromToken =
sourceTokenInfo?.symbol === 'ETH' ? swapsEthToken : sourceTokenInfo;

const tokenConversionRates = useSelector(getTokenExchangeRates, isEqual);
const conversionRate = useSelector(getConversionRate);
const currentCurrency = useSelector(getCurrentCurrency);

const { loading, tokensWithBalances } = useTokenTracker(tokens);

// If the fromToken was set in a call to `onFromSelect` (see below), and that from token has a balance
Expand All @@ -93,15 +105,12 @@ export default function BuildQuote({
);
const memoizedUsersTokens = useEqualityCheck(usersTokens);

const selectedFromToken = useTokensToSearch({
providedTokens:
fromToken || fetchParamsFromToken
? [fromToken || fetchParamsFromToken]
: [],
usersTokens: memoizedUsersTokens,
onlyEth: (fromToken || fetchParamsFromToken)?.symbol === 'ETH',
singleToken: true,
})[0];
const selectedFromToken = getRenderableTokenData(
fromToken || fetchParamsFromToken,
tokenConversionRates,
conversionRate,
currentCurrency,
);

const tokensToSearch = useTokensToSearch({
usersTokens: memoizedUsersTokens,
Expand Down
7 changes: 5 additions & 2 deletions ui/app/pages/swaps/swaps-util-test-constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const AGGREGATOR_METADATA_BASE_PROD_URL =
export const TOP_ASSET_BASE_PROD_URL =
'https://api.metaswap.codefi.network/topAssets';

export const TOKENS = [
const BASE_TOKENS = [
{
erc20: true,
symbol: 'META',
Expand Down Expand Up @@ -82,9 +82,12 @@ export const TOKENS = [
decimals: 8,
address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
},
ETH_SWAPS_TOKEN_OBJECT,
];

export const TOKENS = [...BASE_TOKENS, ETH_SWAPS_TOKEN_OBJECT];

export const EXPECTED_TOKENS_RESULT = [ETH_SWAPS_TOKEN_OBJECT, ...BASE_TOKENS];

export const MOCK_TRADE_RESPONSE_1 = [
{
trade: {
Expand Down
19 changes: 12 additions & 7 deletions ui/app/pages/swaps/swaps.util.js
Original file line number Diff line number Diff line change
Expand Up @@ -279,13 +279,18 @@ export async function fetchTokens() {
{ method: 'GET' },
{ cacheRefreshTime: CACHE_REFRESH_ONE_HOUR },
);
const filteredTokens = tokens.filter((token) => {
return (
validateData(TOKEN_VALIDATORS, token, tokenUrl) &&
token.address !== ETH_SWAPS_TOKEN_OBJECT.address
);
});
filteredTokens.push(ETH_SWAPS_TOKEN_OBJECT);
const filteredTokens = [
ETH_SWAPS_TOKEN_OBJECT,
...tokens.filter((token) => {
return (
validateData(TOKEN_VALIDATORS, token, tokenUrl) &&
!(
token.symbol === ETH_SWAPS_TOKEN_OBJECT.symbol ||
token.address === ETH_SWAPS_TOKEN_OBJECT.address
)
);
}),
];
return filteredTokens;
}

Expand Down
5 changes: 3 additions & 2 deletions ui/app/pages/swaps/swaps.util.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
AGGREGATOR_METADATA_BASE_PROD_URL,
TOP_ASSET_BASE_PROD_URL,
TOKENS,
EXPECTED_TOKENS_RESULT,
MOCK_TRADE_RESPONSE_2,
AGGREGATOR_METADATA,
TOP_ASSETS,
Expand Down Expand Up @@ -107,12 +108,12 @@ describe('Swaps Util', function () {
describe('fetchTokens', function () {
it('should fetch tokens', async function () {
const result = await fetchTokens(true);
assert.deepStrictEqual(result, TOKENS);
assert.deepStrictEqual(result, EXPECTED_TOKENS_RESULT);
});

it('should fetch tokens on prod', async function () {
const result = await fetchTokens(false);
assert.deepStrictEqual(result, TOKENS);
assert.deepStrictEqual(result, EXPECTED_TOKENS_RESULT);
});
});

Expand Down