mirror of
https://github.com/hanzonet/explore.git
synced 2026-10-30 18:16:57 +00:00
158 lines
6.3 KiB
TypeScript
158 lines
6.3 KiB
TypeScript
import { Box } from '@chakra-ui/react';
|
|
import React from 'react';
|
|
|
|
import config from 'configs/app';
|
|
import useApiQuery from 'lib/api/useApiQuery';
|
|
import getCurrencyValue from 'lib/getCurrencyValue';
|
|
import { HOMEPAGE_STATS } from 'stubs/stats';
|
|
import { TXS_STATS, TXS_STATS_MICROSERVICE } from 'stubs/tx';
|
|
import { thinsp } from 'toolkit/utils/htmlEntities';
|
|
import StatsWidget from 'ui/shared/stats/StatsWidget';
|
|
|
|
const isStatsFeatureEnabled = config.features.stats.isEnabled;
|
|
const rollupFeature = config.features.rollup;
|
|
const isOptimisticRollup = rollupFeature.isEnabled && rollupFeature.type === 'optimistic';
|
|
const isArbitrumRollup = rollupFeature.isEnabled && rollupFeature.type === 'arbitrum';
|
|
|
|
const TxsStats = () => {
|
|
const txsStatsQuery = useApiQuery('stats:pages_transactions', {
|
|
queryOptions: {
|
|
enabled: isStatsFeatureEnabled,
|
|
placeholderData: isStatsFeatureEnabled ? TXS_STATS_MICROSERVICE : undefined,
|
|
},
|
|
});
|
|
|
|
const txsStatsApiQuery = useApiQuery('general:txs_stats', {
|
|
queryOptions: {
|
|
enabled: !isStatsFeatureEnabled,
|
|
placeholderData: !isStatsFeatureEnabled ? TXS_STATS : undefined,
|
|
},
|
|
});
|
|
|
|
const statsQuery = useApiQuery('general:stats', {
|
|
queryOptions: {
|
|
placeholderData: HOMEPAGE_STATS,
|
|
},
|
|
});
|
|
|
|
if ((isStatsFeatureEnabled && !txsStatsQuery.data) || (!isStatsFeatureEnabled && !txsStatsApiQuery.data)) {
|
|
return null;
|
|
}
|
|
|
|
const isLoading = isStatsFeatureEnabled ? txsStatsQuery.isPlaceholderData : txsStatsApiQuery.isPlaceholderData;
|
|
|
|
const txCount24h = isStatsFeatureEnabled ? txsStatsQuery.data?.transactions_24h?.value : txsStatsApiQuery.data?.transactions_count_24h;
|
|
const operationalTxns24hArbitrum = isArbitrumRollup && isStatsFeatureEnabled ? txsStatsQuery.data?.operational_transactions_24h?.value : null;
|
|
const operationalTxns24hOptimistic = isOptimisticRollup && isStatsFeatureEnabled ? txsStatsQuery.data?.op_stack_operational_transactions_24h?.value : null;
|
|
|
|
const pendingTxns = isStatsFeatureEnabled ? txsStatsQuery.data?.pending_transactions_30m?.value : txsStatsApiQuery.data?.pending_transactions_count;
|
|
|
|
// in microservice data, fee values are already divided by 10^decimals
|
|
const txFeeSum24h = isStatsFeatureEnabled ?
|
|
Number(txsStatsQuery.data?.transactions_fee_24h?.value) :
|
|
Number(txsStatsApiQuery.data?.transaction_fees_sum_24h) / (10 ** config.chain.currency.decimals);
|
|
|
|
const avgFee = isStatsFeatureEnabled ? txsStatsQuery.data?.average_transactions_fee_24h?.value : txsStatsApiQuery.data?.transaction_fees_avg_24h;
|
|
|
|
const txFeeAvg = avgFee ? getCurrencyValue({
|
|
value: avgFee,
|
|
exchangeRate: statsQuery.data?.coin_price,
|
|
// in microservice data, fee values are already divided by 10^decimals
|
|
decimals: isStatsFeatureEnabled ? '0' : String(config.chain.currency.decimals),
|
|
accuracyUsd: 2,
|
|
}) : null;
|
|
|
|
const itemsCount = [
|
|
txCount24h,
|
|
operationalTxns24hArbitrum,
|
|
operationalTxns24hOptimistic,
|
|
pendingTxns,
|
|
txFeeSum24h,
|
|
txFeeAvg,
|
|
].filter(Boolean).length;
|
|
|
|
return (
|
|
<Box
|
|
display="grid"
|
|
gridTemplateColumns={{ base: '1fr', lg: `repeat(${ itemsCount }, calc(${ 100 / itemsCount }% - 9px))` }}
|
|
rowGap={ 3 }
|
|
columnGap={ 3 }
|
|
mb={ 6 }
|
|
>
|
|
{ txCount24h && (
|
|
<StatsWidget
|
|
label={ txsStatsQuery.data?.transactions_24h?.title ?
|
|
getLabelFromTitle(txsStatsQuery.data?.transactions_24h?.title) :
|
|
'Transactions' }
|
|
value={ Number(txCount24h).toLocaleString() }
|
|
period="24h"
|
|
isLoading={ isLoading }
|
|
href={ config.features.stats.isEnabled ? { pathname: '/stats/[id]', query: { id: 'newTxns' } } : undefined }
|
|
/>
|
|
) }
|
|
{ operationalTxns24hArbitrum && (
|
|
<StatsWidget
|
|
label={ txsStatsQuery.data?.operational_transactions_24h?.title ?
|
|
getLabelFromTitle(txsStatsQuery.data?.operational_transactions_24h?.title) :
|
|
'Daily op txns' }
|
|
value={ Number(operationalTxns24hArbitrum).toLocaleString() }
|
|
period="24h"
|
|
isLoading={ isLoading }
|
|
/>
|
|
) }
|
|
{ operationalTxns24hOptimistic && (
|
|
<StatsWidget
|
|
label={ txsStatsQuery.data?.op_stack_operational_transactions_24h?.title ?
|
|
getLabelFromTitle(txsStatsQuery.data?.op_stack_operational_transactions_24h?.title) :
|
|
'Daily op txns' }
|
|
value={ Number(operationalTxns24hOptimistic).toLocaleString() }
|
|
period="24h"
|
|
isLoading={ isLoading }
|
|
/>
|
|
) }
|
|
{ pendingTxns && (
|
|
<StatsWidget
|
|
label={ txsStatsQuery.data?.pending_transactions_30m?.title ?
|
|
getLabelFromTitle(txsStatsQuery.data?.pending_transactions_30m?.title) :
|
|
'Pending transactions' }
|
|
value={ Number(pendingTxns).toLocaleString() }
|
|
period={ isStatsFeatureEnabled ? '30min' : '1h' }
|
|
isLoading={ isLoading }
|
|
/>
|
|
) }
|
|
{ txFeeSum24h != null && (
|
|
<StatsWidget
|
|
label={ txsStatsQuery.data?.transactions_fee_24h?.title ?
|
|
getLabelFromTitle(txsStatsQuery.data?.transactions_fee_24h?.title) :
|
|
'Transactions fees' }
|
|
value={ txFeeSum24h.toLocaleString(undefined, { maximumFractionDigits: 2 }) }
|
|
valuePostfix={ thinsp + config.chain.currency.symbol }
|
|
period="24h"
|
|
isLoading={ isLoading }
|
|
href={ config.features.stats.isEnabled ? { pathname: '/stats/[id]', query: { id: 'txnsFee' } } : undefined }
|
|
/>
|
|
) }
|
|
{ txFeeAvg && (
|
|
<StatsWidget
|
|
label={ txsStatsQuery.data?.average_transactions_fee_24h?.title ?
|
|
getLabelFromTitle(txsStatsQuery.data?.average_transactions_fee_24h?.title) :
|
|
'Avg. transaction fee' }
|
|
value={ txFeeAvg.usd ? txFeeAvg.usd : txFeeAvg.valueStr }
|
|
valuePrefix={ txFeeAvg.usd ? '$' : undefined }
|
|
valuePostfix={ txFeeAvg.usd ? undefined : thinsp + config.chain.currency.symbol }
|
|
period="24h"
|
|
isLoading={ isLoading }
|
|
href={ config.features.stats.isEnabled ? { pathname: '/stats/[id]', query: { id: 'averageTxnFee' } } : undefined }
|
|
/>
|
|
) }
|
|
</Box>
|
|
);
|
|
};
|
|
|
|
// remove period from title
|
|
function getLabelFromTitle(title: string) {
|
|
return title.replace(/\s*\([^)]*\)\s*$/, '');
|
|
}
|
|
|
|
export default React.memo(TxsStats);
|