import { flexRender, getCoreRowModel, getSortedRowModel, RowSelectionState, SortingState, useReactTable, } from '@tanstack/react-table' import classNames from 'classnames' import { useEffect, useMemo, useState } from 'react' import { SortAsc, SortDesc, SortNone } from 'components/Icons' import useAssetTableColumns from 'components/Modals/AssetsSelect/useAssetTableColumns' import Text from 'components/Text' import useMarketAssets from 'hooks/useMarketAssets' import useStore from 'store' import { byDenom } from 'utils/array' interface Props { assets: Asset[] | BorrowAsset[] selectedDenoms: string[] onChangeSelected: (denoms: string[]) => void isBorrow: boolean } export default function AssetSelectTable(props: Props) { const { data: markets } = useMarketAssets() const defaultSelected = useMemo(() => { const assets = props.assets as BorrowAsset[] return assets.reduce( (acc, asset, index) => { if (props.selectedDenoms?.includes(asset.denom)) { acc[index] = true } return acc }, {} as { [key: number]: boolean }, ) }, [props.selectedDenoms, props.assets]) const [sorting, setSorting] = useState([{ id: 'symbol', desc: false }]) const [selected, setSelected] = useState(defaultSelected) const balances = useStore((s) => s.balances) const columns = useAssetTableColumns(props.isBorrow) const tableData: AssetTableRow[] = useMemo(() => { return props.assets.map((asset) => { const balancesForAsset = balances.find(byDenom(asset.denom)) return { asset, balance: balancesForAsset?.amount ?? '0', market: markets.find((market) => market.denom === asset.denom), } }) }, [balances, props.assets, markets]) const table = useReactTable({ data: tableData, columns, state: { sorting, rowSelection: selected, }, onRowSelectionChange: setSelected, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }) useEffect(() => { const newSelectedDenoms = props.assets .filter((_, index) => selected[index]) .map((asset) => asset.denom) if ( props.selectedDenoms.length === newSelectedDenoms.length && newSelectedDenoms.every((denom) => props.selectedDenoms.includes(denom)) ) return props.onChangeSelected(newSelectedDenoms) }, [selected, props]) return ( {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( ) })} ))} {table.getRowModel().rows.map((row) => { return ( row.toggleSelected()} > {row.getVisibleCells().map((cell) => { return ( ) })} ) })}
{header.column.getCanSort() ? { asc: , desc: , false: , }[header.column.getIsSorted() as string] ?? null : null} {flexRender(header.column.columnDef.header, header.getContext())}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
) }