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(frontend): fix hide zeros filter #4200

Open
wants to merge 29 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
4bc4e35
fixes token filter
BonomoAlessandro Jan 13, 2025
77f19ae
restructures code
BonomoAlessandro Jan 13, 2025
cfd98f6
simplifies filter logic
BonomoAlessandro Jan 13, 2025
1567896
reformat code
BonomoAlessandro Jan 13, 2025
a8cd382
resolves lint issue
BonomoAlessandro Jan 13, 2025
2d6c680
resolves lint issue
BonomoAlessandro Jan 13, 2025
4994511
resolves lint issue
BonomoAlessandro Jan 13, 2025
9d3d370
resolves lint issue
BonomoAlessandro Jan 13, 2025
9cfe7c8
resolves lint issue
BonomoAlessandro Jan 13, 2025
b9c687f
resolves lint issue
BonomoAlessandro Jan 13, 2025
1a64616
🤖 Apply formatting changes
github-actions[bot] Jan 13, 2025
d6a3c86
🤖 Apply formatting changes
github-actions[bot] Jan 13, 2025
30c392d
Merge branch 'main' into fix(frontend)/fix-hide-zeros-filter
BonomoAlessandro Jan 13, 2025
04027b6
resolves lint issue
BonomoAlessandro Jan 13, 2025
cac86a4
resolves lint issue
BonomoAlessandro Jan 13, 2025
9e53308
🤖 Apply formatting changes
github-actions[bot] Jan 13, 2025
25f97c3
Merge branch 'main' into fix(frontend)/fix-hide-zeros-filter
BonomoAlessandro Jan 13, 2025
e35e8c1
Merge branch 'main' into fix(frontend)/fix-hide-zeros-filter
BonomoAlessandro Jan 13, 2025
8dad9b5
Merge branch 'main' into fix(frontend)/fix-hide-zeros-filter
BonomoAlessandro Jan 13, 2025
40b9d93
resolves lint issue
BonomoAlessandro Jan 21, 2025
91af2e4
Merge branch 'main' into fix(frontend)/fix-hide-zeros-filter
BonomoAlessandro Jan 21, 2025
6bc3966
moves filter logic into token-group.utils.ts
BonomoAlessandro Jan 28, 2025
ddebe0a
implements some filterTokenGroups tests
BonomoAlessandro Jan 28, 2025
38e58da
🤖 Apply formatting changes
github-actions[bot] Jan 28, 2025
3038981
reformat comments
BonomoAlessandro Jan 28, 2025
1394434
resolves lint issues
BonomoAlessandro Jan 28, 2025
239bf34
resolves lint issues
BonomoAlessandro Jan 28, 2025
3a23005
resolves lint issues
BonomoAlessandro Jan 28, 2025
97737bf
Merge branch 'main' into fix(frontend)/fix-hide-zeros-filter
BonomoAlessandro Jan 28, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@
import { debounce } from '@dfinity/utils';
import { combinedDerivedSortedNetworkTokensUi } from '$lib/derived/network-tokens.derived';
import { showZeroBalances } from '$lib/derived/settings.derived';
import type { TokenUi } from '$lib/types/token';
import type { TokenUiOrGroupUi } from '$lib/types/token-group';
import { groupTokensByTwin } from '$lib/utils/token-group.utils';
import { filterTokenGroups, groupTokensByTwin } from '$lib/utils/token-group.utils';

// We start it as undefined to avoid showing an empty list before the first update.
export let tokens: TokenUiOrGroupUi[] | undefined = undefined;

let sortedTokens: TokenUi[];
$: sortedTokens = $combinedDerivedSortedNetworkTokensUi.filter(
({ balance, usdBalance }) => Number(balance ?? 0n) || (usdBalance ?? 0) || $showZeroBalances
);

let groupedTokens: TokenUiOrGroupUi[];
$: groupedTokens = groupTokensByTwin(sortedTokens);
$: groupedTokens = groupTokensByTwin($combinedDerivedSortedNetworkTokensUi);

let sortedTokensOrGroups: TokenUiOrGroupUi[];
$: sortedTokensOrGroups = filterTokenGroups({
groupedTokens,
showZeroBalances: $showZeroBalances
});

const updateTokensToDisplay = () => (tokens = [...groupedTokens]);
const updateTokensToDisplay = () => (tokens = [...sortedTokensOrGroups]);

const debounceUpdateTokensToDisplay = debounce(updateTokensToDisplay, 500);

$: sortedTokens, debounceUpdateTokensToDisplay();
$: sortedTokensOrGroups, debounceUpdateTokensToDisplay();
</script>

<slot />
30 changes: 30 additions & 0 deletions src/frontend/src/lib/utils/token-group.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,36 @@ export const groupTokensByTwin = (tokens: TokenUi[]): TokenUiOrGroupUi[] => {
);
};

const hasBalance = ({
token,
showZeroBalances
}: {
token: TokenUiOrGroupUi;
showZeroBalances: boolean;
}) => Number(token.balance ?? 0n) || Number(token.usdBalance ?? 0n) || showZeroBalances;

/**
* Function to create a list of TokenUiOrGroupUi, filtering out all groups that do not have at least
* one token with a balance if showZeroBalance is false.
*
* @param groupedTokens - The list of TokenUiOrGroupUi to filter. Groups without balance are filtered out.
* @param showZeroBalances - A boolean that indicates if zero balances should be shown.
*
* @returns A new list where all groups that do not have at least one token with a balance are removed if showZeroBalances is false.
*/
export const filterTokenGroups = ({
groupedTokens,
showZeroBalances
}: {
groupedTokens: TokenUiOrGroupUi[];
showZeroBalances: boolean;
}) =>
groupedTokens.filter((t: TokenUiOrGroupUi) =>
isTokenUiGroup(t)
? t.tokens.some((tok: TokenUi) => hasBalance({ token: tok, showZeroBalances }))
: hasBalance({ token: t, showZeroBalances })
);

const mapNewTokenGroup = (token: TokenUi): TokenUiGroup => ({
id: token.id,
nativeToken: token,
Expand Down
53 changes: 53 additions & 0 deletions src/frontend/src/tests/lib/utils/token-group.utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { ZERO } from '$lib/constants/app.constants';
import type { TokenUi } from '$lib/types/token';
import type { TokenUiGroup } from '$lib/types/token-group';
import {
filterTokenGroups,
groupMainToken,
groupSecondaryToken,
groupTokens,
Expand Down Expand Up @@ -243,6 +244,58 @@ describe('token-group.utils', () => {
});
});

describe('filterTokenGroups', () => {
const reorderedTokens = [
{ ...tokens[0], balance: ZERO, usdBalance: 0 }, // BTC
{ ...tokens[4], balance: ZERO, usdBalance: 0 }, // ICP
{ ...tokens[1], balance: ZERO, usdBalance: 0 } // ckBTC
];

it('should give me all token groups', () => {
const groupedTokens = groupTokensByTwin(reorderedTokens as TokenUi[]);

const filteredTokenGroups = filterTokenGroups({ groupedTokens, showZeroBalances: true });

expect(filteredTokenGroups).toEqual(groupedTokens);
});

it('should give me only token groups where at least one token has a balance', () => {
const customReorderedTokens = [
...reorderedTokens,
{ ...tokens[2], balance: bn2, usdBalance: 0 }, // ETH
{ ...tokens[3], balance: ZERO, usdBalance: 0 } // ckETH
];
const groupedTokens = groupTokensByTwin(customReorderedTokens as TokenUi[]);

const filteredTokenGroups = filterTokenGroups({ groupedTokens, showZeroBalances: false });

expect(filteredTokenGroups).toHaveLength(1);

expect(filteredTokenGroups[0]).toHaveProperty('tokens', [
customReorderedTokens[3],
customReorderedTokens[4]
]);
});

it('should give me only token groups where at least one token has a usd balance', () => {
const customReorderedTokens = [
...reorderedTokens,
{ ...tokens[2], balance: ZERO, usdBalance: 0 }, // ETH
{ ...tokens[3], balance: ZERO, usdBalance: 1 } // ckETH
];
const groupedTokens = groupTokensByTwin(customReorderedTokens as TokenUi[]);

const filteredTokenGroups = filterTokenGroups({ groupedTokens, showZeroBalances: false });

expect(filteredTokenGroups).toHaveLength(1);

expect(filteredTokenGroups[0]).toHaveProperty('tokens', [
customReorderedTokens[3],
customReorderedTokens[4]
]);
});
});

describe('updateTokenGroup', () => {
const token = { ...ICP_TOKEN, balance: bn1, usdBalance: 100 };
const anotherToken = { ...SEPOLIA_TOKEN, balance: bn2, usdBalance: 200 };
Expand Down
Loading