Skip to content

Commit 309f8f3

Browse files
committed
feat(suite): display skeleton on token fiat values in account sidebar when fiat rates are loading
1 parent ebdab0c commit 309f8f3

File tree

5 files changed

+51
-25
lines changed

5 files changed

+51
-25
lines changed

packages/suite/src/components/wallet/WalletLayout/AccountsMenu/AccountItem/AccountItem.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ interface AccountItemProps {
4242
isGroup?: boolean;
4343
tokens?: Account['tokens'];
4444
dataTestKey?: string;
45+
isFiatLoading?: boolean;
4546
onClick?: () => void;
4647
}
4748

@@ -58,6 +59,7 @@ export const AccountItem = forwardRef(
5859
customFiatValue,
5960
isGroup,
6061
dataTestKey,
62+
isFiatLoading,
6163
onClick,
6264
}: AccountItemProps,
6365
ref: Ref<HTMLDivElement>,
@@ -90,6 +92,7 @@ export const AccountItem = forwardRef(
9092

9193
const content = (
9294
<AccountRow
95+
isFiatLoading={Boolean(isFiatLoading)}
9396
isSelected={isSelected}
9497
isGroup={isGroup}
9598
isGroupSelected={isGroupSelected}

packages/suite/src/components/wallet/WalletLayout/AccountsMenu/AccountItem/AccountItemContent.tsx

+12-6
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type ItemContentProps = {
4646
index?: number;
4747
formattedBalance: string;
4848
dataTestKey?: string;
49+
isFiatLoading?: boolean;
4950
};
5051

5152
const FiatValueRenderComponent = ({ value }: { value: JSX.Element | null }) => {
@@ -65,6 +66,7 @@ export const AccountItemContent = ({
6566
index,
6667
formattedBalance,
6768
dataTestKey,
69+
isFiatLoading,
6870
}: ItemContentProps) => {
6971
const { FiatAmountFormatter } = useFormatters();
7072
const localCurrency = useSelector(selectLocalCurrency);
@@ -91,12 +93,16 @@ export const AccountItemContent = ({
9193
</AccountLabelContainer>
9294
{customFiatValue && !isTestnet(symbol) ? (
9395
<HiddenPlaceholder>
94-
<FiatAmountFormatter
95-
value={customFiatValue}
96-
currency={localCurrency}
97-
minimumFractionDigits={0}
98-
maximumFractionDigits={0}
99-
/>
96+
{isFiatLoading ? (
97+
<SkeletonRectangle animate={shouldAnimate} />
98+
) : (
99+
<FiatAmountFormatter
100+
value={customFiatValue}
101+
currency={localCurrency}
102+
minimumFractionDigits={0}
103+
maximumFractionDigits={0}
104+
/>
105+
)}
100106
</HiddenPlaceholder>
101107
) : (
102108
<FiatValue

packages/suite/src/components/wallet/WalletLayout/AccountsMenu/AccountItem/AccountRow.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type AccountRowProps = {
2525
accountType: AccountType;
2626
index?: number;
2727
formattedBalance: string;
28+
isFiatLoading?: boolean;
2829
};
2930

3031
const Wrapper = styled(NavigationItemBase)<{
@@ -61,6 +62,7 @@ export const AccountRow = forwardRef<HTMLDivElement, AccountRowProps>(
6162
accountType,
6263
index,
6364
formattedBalance,
65+
isFiatLoading,
6466
},
6567
ref,
6668
) => (
@@ -86,6 +88,7 @@ export const AccountRow = forwardRef<HTMLDivElement, AccountRowProps>(
8688
index={index}
8789
formattedBalance={formattedBalance}
8890
dataTestKey={dataTestKey}
91+
isFiatLoading={Boolean(isFiatLoading)}
8992
/>
9093
</Wrapper>
9194
),

packages/suite/src/components/wallet/WalletLayout/AccountsMenu/AccountItemsGroup.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import styled from 'styled-components';
22

33
import { selectCurrentFiatRates } from '@suite-common/wallet-core';
44
import {
5+
areTokenFiatRatesLoading,
56
getAccountTokensFiatBalance,
67
getAccountTotalStakingBalance,
78
} from '@suite-common/wallet-utils';
@@ -61,7 +62,10 @@ export const AccountItemsGroup = ({
6162
const localCurrency = useSelector(selectLocalCurrency);
6263
const rates = useSelector(selectCurrentFiatRates);
6364

64-
const tokensFiatBalance = getAccountTokensFiatBalance(account, localCurrency, rates, tokens);
65+
const isFiatLoading = areTokenFiatRatesLoading(account, localCurrency, rates ?? {});
66+
const tokensFiatBalance = isFiatLoading
67+
? (0).toFixed()
68+
: getAccountTokensFiatBalance(account, localCurrency, rates, tokens);
6569

6670
const tokensRoutes = ['wallet-tokens', 'wallet-tokens-hidden'];
6771

@@ -104,6 +108,7 @@ export const AccountItemsGroup = ({
104108
customFiatValue={tokensFiatBalance}
105109
tokens={tokens}
106110
dataTestKey={`${dataTestKey}/tokens`}
111+
isFiatLoading={isFiatLoading}
107112
/>
108113
)}
109114
</Column>

suite-common/wallet-utils/src/accountUtils.ts

+27-18
Original file line numberDiff line numberDiff line change
@@ -577,33 +577,42 @@ export const enhanceHistory = ({
577577
txids,
578578
});
579579

580-
export const getAccountTokensFiatBalance = (
580+
export const areTokenFiatRatesLoading = (
581581
account: Account,
582582
localCurrency: string,
583-
rates?: RatesByKey,
584-
tokens?: Account['tokens'],
585-
) => {
586-
let totalBalance = new BigNumber(0);
587-
588-
// sum fiat value of all tokens
589-
tokens?.forEach(t => {
583+
rates: RatesByKey,
584+
) =>
585+
(account.tokens ?? []).some(token => {
590586
const tokenFiatRateKey = getFiatRateKey(
591587
account.symbol,
592588
localCurrency as FiatCurrencyCode,
593-
t.contract as TokenAddress,
589+
token.contract as TokenAddress,
594590
);
595591

596-
const tokenFiatRate = rates?.[tokenFiatRateKey];
597-
if (tokenFiatRate?.rate && t.balance) {
598-
const tokenBalance = toFiatCurrency(t.balance, tokenFiatRate.rate, 2);
599-
if (tokenBalance) {
600-
totalBalance = totalBalance.plus(tokenBalance);
601-
}
602-
}
592+
return rates?.[tokenFiatRateKey]?.isLoading;
603593
});
604594

605-
return totalBalance.toFixed();
606-
};
595+
export const getAccountTokensFiatBalance = (
596+
account: Account,
597+
localCurrency: string,
598+
rates?: RatesByKey,
599+
tokens?: Account['tokens'],
600+
) =>
601+
(tokens ?? [])
602+
.reduce((total, token) => {
603+
const tokenFiatRateKey = getFiatRateKey(
604+
account.symbol,
605+
localCurrency as FiatCurrencyCode,
606+
token.contract as TokenAddress,
607+
);
608+
609+
const tokenFiatRate = rates?.[tokenFiatRateKey];
610+
611+
return tokenFiatRate?.rate && token.balance
612+
? total.plus(toFiatCurrency(token.balance, tokenFiatRate.rate, 2) ?? 0)
613+
: total;
614+
}, new BigNumber(0))
615+
.toFixed();
607616

608617
export const getAssetTokensFiatBalance = (
609618
accounts: Account[],

0 commit comments

Comments
 (0)