Skip to content

Commit 2d2d74d

Browse files
committed
[CCDWA-167] EURO conversion on CCD token detail screen
1 parent 47b08d1 commit 2d2d74d

File tree

4 files changed

+39
-18
lines changed

4 files changed

+39
-18
lines changed

packages/browser-wallet/src/popup/popupX/pages/MainPage/MainPage.tsx

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { useFlattenedAccountTokens } from '@popup/pages/Account/Tokens/utils';
1111
import { getMetadataUnique } from '@shared/utils/token-helpers';
1212
import { contractBalancesFamily } from '@popup/store/token';
1313
import { useBlockChainParameters } from '@popup/shared/BlockChainParametersProvider';
14-
import { formatTokenAmount } from '@popup/popupX/shared/utils/helpers';
14+
import { displayCcdAsEur, formatTokenAmount } from '@popup/popupX/shared/utils/helpers';
1515
import Page from '@popup/popupX/shared/Page';
1616
import Text from '@popup/popupX/shared/Text';
1717
import Button from '@popup/popupX/shared/Button';
@@ -46,21 +46,6 @@ function AccountTokenBalance({ decimals, tokenId, contractAddress, accountAddres
4646
return <span>{balance}</span>;
4747
}
4848

49-
/** Convert and display an amount of CCD to EUR using an exchange rate. */
50-
function displayCcdAsEur(microCcdPerEur: Ratio, microCcd: bigint, decimals: number, eurPostfix?: boolean) {
51-
const eur = Number(microCcdPerEur.denominator * microCcd) / Number(microCcdPerEur.numerator);
52-
const eurFormatter = new Intl.NumberFormat(undefined, {
53-
style: eurPostfix ? undefined : 'currency',
54-
currency: 'EUR',
55-
maximumFractionDigits: decimals,
56-
});
57-
if (eurPostfix) {
58-
return `${eurFormatter.format(eur)} EUR`;
59-
}
60-
61-
return eurFormatter.format(eur);
62-
}
63-
6449
function mainPageCcdDisplay(microCcdAmount: bigint) {
6550
return formatTokenAmount(microCcdAmount, 6, 2, 2);
6651
}

packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetails.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
font-family: $t-font-family-ibm;
44
}
55

6+
.token-balance__exchange-rate {
7+
margin-top: rem(4px);
8+
}
9+
610
&__stake {
711
display: flex;
812
flex-direction: column;

packages/browser-wallet/src/popup/popupX/pages/TokenDetails/TokenDetailsCcd.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useEffect, useMemo, useState } from 'react';
22
import { useNavigate } from 'react-router-dom';
33
import { useTranslation } from 'react-i18next';
4-
import { AccountAddress } from '@concordium/web-sdk';
4+
import { AccountAddress, Ratio } from '@concordium/web-sdk';
55
import { absoluteRoutes, sendFundsRoute } from '@popup/popupX/constants/routes';
66
import Page from '@popup/popupX/shared/Page';
77
import Text from '@popup/popupX/shared/Text';
@@ -16,6 +16,8 @@ import Clock from '@assets/svgX/clock.svg';
1616
import Percent from '@assets/svgX/percent.svg';
1717
import ConcordiumLogo from '@assets/svgX/concordium-logo.svg';
1818
import { TokenPickerVariant } from '@popup/popupX/shared/Form/TokenAmount/View';
19+
import { displayCcdAsEur } from '@popup/popupX/shared/utils/helpers';
20+
import { useBlockChainParameters } from '@popup/shared/BlockChainParametersProvider';
1921

2022
const zeroBalance: Omit<PublicAccountAmounts, 'scheduled'> = {
2123
total: 0n,
@@ -43,6 +45,7 @@ function useCcdInfo(credential: WalletCredential) {
4345
atDisposal: displayAsCcd(balances.atDisposal, false, true),
4446
staked: displayAsCcd(balances.staked, false, true),
4547
cooldown: displayAsCcd(balances.cooldown, false, true),
48+
microCcdAmount: balances.total,
4649
};
4750
}
4851
return { total: null, atDisposal: null };
@@ -51,11 +54,24 @@ function useCcdInfo(credential: WalletCredential) {
5154
return tokenDetails;
5255
}
5356

57+
function TokenExchange({ microCcdPerEur, balanceBase }: { microCcdPerEur?: Ratio; balanceBase?: bigint }) {
58+
const isNoExchange = microCcdPerEur === undefined || balanceBase === undefined;
59+
60+
return isNoExchange ? null : (
61+
<div className="token-balance__exchange-rate">
62+
<Text.Capture>{displayCcdAsEur(microCcdPerEur, balanceBase, 2)}</Text.Capture>
63+
</div>
64+
);
65+
}
66+
5467
function TokenDetailsCcd({ credential }: { credential: WalletCredential }) {
5568
const { t } = useTranslation('x', { keyPrefix: 'tokenDetails' });
5669

5770
const tokenDetails = useCcdInfo(credential);
5871

72+
const chainParameters = useBlockChainParameters();
73+
const microCcdPerEur = chainParameters?.microGTUPerEuro;
74+
5975
const nav = useNavigate();
6076
const navToSend = () =>
6177
nav(sendFundsRoute(AccountAddress.fromBase58(credential.address)), {
@@ -72,6 +88,7 @@ function TokenDetailsCcd({ credential }: { credential: WalletCredential }) {
7288
<Text.DynamicSize baseFontSize={32} baseTextLength={17} className="heading_big">
7389
{tokenDetails.total}
7490
</Text.DynamicSize>
91+
<TokenExchange microCcdPerEur={microCcdPerEur} balanceBase={tokenDetails.microCcdAmount} />
7592
<div className="token-details-x__stake">
7693
<div className="token-details-x__stake_group">
7794
<Text.Capture>{t('earning')}</Text.Capture>

packages/browser-wallet/src/popup/popupX/shared/utils/helpers.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CcdAmount } from '@concordium/web-sdk';
1+
import { CcdAmount, Ratio } from '@concordium/web-sdk';
22
import { CCD_METADATA } from '@shared/constants/token-metadata';
33
import { useLocation } from 'react-router-dom';
44
import { displayUrl } from '@popup/shared/utils/string-helpers';
@@ -60,3 +60,18 @@ export function useUrlDisplay() {
6060
}
6161
return [displayUrl(url), url];
6262
}
63+
64+
/** Convert and display an amount of CCD to EUR using an exchange rate. */
65+
export function displayCcdAsEur(microCcdPerEur: Ratio, microCcd: bigint, decimals: number, eurPostfix?: boolean) {
66+
const eur = Number(microCcdPerEur.denominator * microCcd) / Number(microCcdPerEur.numerator);
67+
const eurFormatter = new Intl.NumberFormat(undefined, {
68+
style: eurPostfix ? undefined : 'currency',
69+
currency: 'EUR',
70+
maximumFractionDigits: decimals,
71+
});
72+
if (eurPostfix) {
73+
return `${eurFormatter.format(eur)} EUR`;
74+
}
75+
76+
return eurFormatter.format(eur);
77+
}

0 commit comments

Comments
 (0)