Files
tom goriunovandGitHub 25a4c2a97e Replace OP Superchain feature with generic Multichain explorer (#3299)
* rename feature

* rename evn preset

* types, mocks and stubs renaming

* rename UI components
2026-02-25 18:02:52 +01:00

114 lines
3.6 KiB
TypeScript

import React from 'react';
import type { TokenInfo } from 'types/api/token';
import type { TokensSortingField, TokensSortingValue } from 'types/api/tokens';
import type { AggregatedTokenInfo } from 'types/client/multichainAggregator';
import { TableBody, TableColumnHeader, TableColumnHeaderSortable, TableHeaderSticky, TableRoot, TableRow } from 'toolkit/chakra/table';
import { ACTION_BAR_HEIGHT_DESKTOP } from 'ui/shared/ActionBar';
import { default as getNextSortValueShared } from 'ui/shared/sort/getNextSortValue';
import TokensTableItem from './TokensTableItem';
const SORT_SEQUENCE: Record<TokensSortingField, Array<TokensSortingValue>> = {
fiat_value: [ 'fiat_value-desc', 'fiat_value-asc', 'default' ],
holders_count: [ 'holders_count-desc', 'holders_count-asc', 'default' ],
circulating_market_cap: [ 'circulating_market_cap-desc', 'circulating_market_cap-asc', 'default' ],
};
const getNextSortValue = (getNextSortValueShared<TokensSortingField, TokensSortingValue>).bind(undefined, SORT_SEQUENCE);
type Props = {
items: Array<TokenInfo> | Array<AggregatedTokenInfo>;
page: number;
sorting?: TokensSortingValue;
setSorting?: (value: TokensSortingValue) => void;
isLoading?: boolean;
top?: number;
};
const TokensTable = ({ items, page, isLoading, sorting, setSorting, top }: Props) => {
const hasSorting = setSorting && sorting;
const sort = React.useCallback((field: TokensSortingField) => {
if (!hasSorting) {
return;
}
const value = getNextSortValue(field)(sorting);
setSorting(value);
}, [ sorting, setSorting, hasSorting ]);
return (
<TableRoot>
<TableHeaderSticky top={ top ?? ACTION_BAR_HEIGHT_DESKTOP }>
<TableRow>
<TableColumnHeader w="50%">Token</TableColumnHeader>
{ hasSorting ? (
<TableColumnHeaderSortable
isNumeric
w="15%"
sortField="fiat_value"
sortValue={ sorting }
onSortToggle={ sort }
>
Price
</TableColumnHeaderSortable>
) : (
<TableColumnHeader isNumeric width="15%">
Price
</TableColumnHeader>
) }
{ hasSorting ? (
<TableColumnHeaderSortable
isNumeric
w="20%"
sortField="circulating_market_cap"
sortValue={ sorting }
onSortToggle={ sort }
>
On-chain market cap
</TableColumnHeaderSortable>
) : (
<TableColumnHeader isNumeric width="20%">
On-chain market cap
</TableColumnHeader>
) }
{ hasSorting ? (
<TableColumnHeaderSortable
isNumeric
w="15%"
sortField="holders_count"
sortValue={ sorting }
onSortToggle={ sort }
>
Holders
</TableColumnHeaderSortable>
) : (
<TableColumnHeader isNumeric width="15%">
Holders
</TableColumnHeader>
) }
</TableRow>
</TableHeaderSticky>
<TableBody>
{ items.map((item, index) => {
const chainIds = 'chain_infos' in item ? Object.keys(item.chain_infos).join(',') : undefined;
return (
<TokensTableItem
key={ item.address_hash + (isLoading ? index : '') + (chainIds ? chainIds : '') }
token={ item }
index={ index }
page={ page }
isLoading={ isLoading }
/>
);
}) }
</TableBody>
</TableRoot>
);
};
export default TokensTable;