Commit 6ef6e39d authored by tom goriunov's avatar tom goriunov Committed by GitHub

Stats Update: secondary token icon (#2206)

Fixes #1849
parent e9e0b8cc
...@@ -72,6 +72,7 @@ export const withoutGasInfo: HomeStats = { ...@@ -72,6 +72,7 @@ export const withoutGasInfo: HomeStats = {
export const withSecondaryCoin: HomeStats = { export const withSecondaryCoin: HomeStats = {
...base, ...base,
secondary_coin_price: '3.398', secondary_coin_price: '3.398',
secondary_coin_image: 'http://localhost:3100/secondary_utia.jpg',
}; };
export const noChartData: HomeStats = { export const noChartData: HomeStats = {
......
...@@ -19,6 +19,7 @@ export type HomeStats = { ...@@ -19,6 +19,7 @@ export type HomeStats = {
rootstock_locked_btc?: string | null; rootstock_locked_btc?: string | null;
last_output_root_size?: string | null; last_output_root_size?: string | null;
secondary_coin_price?: string | null; secondary_coin_price?: string | null;
secondary_coin_image?: string | null;
celo?: { celo?: {
epoch_number: number; epoch_number: number;
}; };
......
...@@ -21,6 +21,7 @@ test.describe('daily txs chart', () => { ...@@ -21,6 +21,7 @@ test.describe('daily txs chart', () => {
await mockApiResponse('stats', statsMock.withSecondaryCoin); await mockApiResponse('stats', statsMock.withSecondaryCoin);
await mockApiResponse('stats_charts_txs', dailyTxsMock.base); await mockApiResponse('stats_charts_txs', dailyTxsMock.base);
await mockAssetResponse(statsMock.withSecondaryCoin.coin_image as string, './playwright/mocks/image_svg.svg'); await mockAssetResponse(statsMock.withSecondaryCoin.coin_image as string, './playwright/mocks/image_svg.svg');
await mockAssetResponse(statsMock.withSecondaryCoin.secondary_coin_image as string, './playwright/mocks/image_s.jpg');
component = await render(<ChainIndicators/>); component = await render(<ChainIndicators/>);
await page.waitForFunction(() => { await page.waitForFunction(() => {
return document.querySelector('path[data-name="gradient-chart-area"]')?.getAttribute('opacity') === '1'; return document.querySelector('path[data-name="gradient-chart-area"]')?.getAttribute('opacity') === '1';
......
...@@ -7,7 +7,6 @@ import config from 'configs/app'; ...@@ -7,7 +7,6 @@ import config from 'configs/app';
import { sortByDateDesc } from 'ui/shared/chart/utils/sorts'; import { sortByDateDesc } from 'ui/shared/chart/utils/sorts';
import IconSvg from 'ui/shared/IconSvg'; import IconSvg from 'ui/shared/IconSvg';
import NativeTokenIcon from 'ui/shared/NativeTokenIcon'; import NativeTokenIcon from 'ui/shared/NativeTokenIcon';
import TokenLogoPlaceholder from 'ui/shared/TokenLogoPlaceholder';
const nonNullTailReducer = (result: Array<TimeChartItemRaw>, item: TimeChartItemRaw) => { const nonNullTailReducer = (result: Array<TimeChartItemRaw>, item: TimeChartItemRaw) => {
if (item.value === null && result.length === 0) { if (item.value === null && result.length === 0) {
...@@ -71,7 +70,7 @@ const secondaryCoinPriceIndicator: TChainIndicator<'stats_charts_secondary_coin_ ...@@ -71,7 +70,7 @@ const secondaryCoinPriceIndicator: TChainIndicator<'stats_charts_secondary_coin_
'$N/A' : '$N/A' :
'$' + Number(stats.secondary_coin_price).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 6 }), '$' + Number(stats.secondary_coin_price).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 6 }),
valueDiff: () => null, valueDiff: () => null,
icon: <TokenLogoPlaceholder boxSize={ 6 }/>, icon: <NativeTokenIcon boxSize={ 6 } type="secondary"/>,
hint: `${ config.chain.secondaryCoin.symbol } token daily price in USD.`, hint: `${ config.chain.secondaryCoin.symbol } token daily price in USD.`,
api: { api: {
resourceName: 'stats_charts_secondary_coin_price', resourceName: 'stats_charts_secondary_coin_price',
......
...@@ -10,9 +10,10 @@ import TokenLogoPlaceholder from './TokenLogoPlaceholder'; ...@@ -10,9 +10,10 @@ import TokenLogoPlaceholder from './TokenLogoPlaceholder';
type Props = { type Props = {
isLoading?: boolean; isLoading?: boolean;
className?: string; className?: string;
type?: 'primary' | 'secondary';
} }
const NativeTokenIcon = (props: Props) => { const NativeTokenIcon = ({ isLoading, className, type }: Props) => {
const statsQueryResult = useApiQuery('stats', { const statsQueryResult = useApiQuery('stats', {
queryOptions: { queryOptions: {
refetchOnMount: false, refetchOnMount: false,
...@@ -20,18 +21,20 @@ const NativeTokenIcon = (props: Props) => { ...@@ -20,18 +21,20 @@ const NativeTokenIcon = (props: Props) => {
}, },
}); });
if (props.isLoading || statsQueryResult.isPlaceholderData) { if (isLoading || statsQueryResult.isPlaceholderData) {
return <Skeleton borderRadius="base" className={ props.className }/>; return <Skeleton borderRadius="base" className={ className }/>;
} }
const src = type === 'secondary' ? statsQueryResult.data?.secondary_coin_image : statsQueryResult.data?.coin_image;
return ( return (
<Image <Image
borderRadius="base" borderRadius="base"
className={ props.className } className={ className }
src={ statsQueryResult.data?.coin_image || '' } src={ src || '' }
alt={ `${ config.chain.currency.symbol } logo` } alt={ `${ config.chain.currency.symbol } logo` }
fallback={ <TokenLogoPlaceholder borderRadius="base" className={ props.className }/> } fallback={ <TokenLogoPlaceholder borderRadius="base" className={ className }/> }
fallbackStrategy={ statsQueryResult.data?.coin_image ? 'onError' : 'beforeLoadOrError' } fallbackStrategy={ src ? 'onError' : 'beforeLoadOrError' }
/> />
); );
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment