Files
explore/ui/multichain/ecosystems/MultichainEcosystemsTable.tsx

68 lines
2.9 KiB
TypeScript

import React from 'react';
import type * as multichain from '@luxfi/multichain-aggregator-types';
import type { ChainMetricsSortingField, ChainMetricsSortingValue } from 'types/client/multichainAggregator';
import multichainConfig from 'configs/multichain';
import { MultichainProvider } from 'lib/contexts/multichain';
import { TableBody, TableColumnHeader, TableColumnHeaderSortable, TableHeaderSticky, TableRoot, TableRow } from '@luxfi/ui/table';
import getNextSortValue from 'ui/shared/sort/getNextSortValue';
import MultichainEcosystemsTableItem from './MultichainEcosystemsTableItem';
import { SORT_SEQUENCE } from './utils';
interface Props {
data: Array<multichain.ChainMetrics>;
sort: ChainMetricsSortingValue;
setSorting: ({ value }: { value: Array<string> }) => void;
isLoading?: boolean;
}
const MultichainEcosystemsTable = ({ data, isLoading, sort, setSorting }: Props) => {
const chains = multichainConfig()?.chains;
const onSortToggle = React.useCallback((field: ChainMetricsSortingField) => {
const value = getNextSortValue<ChainMetricsSortingField, ChainMetricsSortingValue>(SORT_SEQUENCE, field)(sort);
setSorting({ value: [ value ] });
}, [ sort, setSorting ]);
return (
<TableRoot minW="1000px">
<TableHeaderSticky>
<TableRow>
<TableColumnHeader width="30%">Chain name</TableColumnHeader>
<TableColumnHeaderSortable width="17.5%" sortField="active_accounts" sortValue={ sort } onSortToggle={ onSortToggle }>
Active addresses
<span className="text-[var(--color-text-secondary)] whitespace-pre"> 7D</span>
</TableColumnHeaderSortable>
<TableColumnHeaderSortable width="17.5%" sortField="new_addresses" sortValue={ sort } onSortToggle={ onSortToggle }>
New addresses
<span className="text-[var(--color-text-secondary)] whitespace-pre"> 7D</span>
</TableColumnHeaderSortable>
<TableColumnHeaderSortable width="17.5%" sortField="daily_transactions" sortValue={ sort } onSortToggle={ onSortToggle }>
Daily txs
<span className="text-[var(--color-text-secondary)] whitespace-pre"> 7D</span>
</TableColumnHeaderSortable>
<TableColumnHeaderSortable width="17.5%" sortField="tps" sortValue={ sort } onSortToggle={ onSortToggle }>
TPS
</TableColumnHeaderSortable>
</TableRow>
</TableHeaderSticky>
<TableBody>
{ data.map((item, index) => (
<MultichainProvider key={ item.chain_id + (isLoading ? `_${ index }` : '') } chainId={ item.chain_id }>
<MultichainEcosystemsTableItem
data={ item }
isLoading={ isLoading }
chainInfo={ chains?.find((chain) => chain.id === item.chain_id) }
/>
</MultichainProvider>
)) }
</TableBody>
</TableRoot>
);
};
export default React.memo(MultichainEcosystemsTable);