import { RefObject, useMemo } from 'react'; import { useTheme, TableBody, TableRow } from '@mui/material'; import { SortableTableHeader } from 'component/common/Table/SortableTableHeader/SortableTableHeader'; import { TableCell } from 'component/common/Table/TableCell/TableCell'; import { Table } from 'component/common/Table/Table/Table'; import { useVirtualizedRange } from 'hooks/useVirtualizedRange'; import { HeaderGroup, Row } from 'react-table'; /** * READ BEFORE USE * * Virtualized tables require some setup. * With this component all but one columns are fixed width, and one fills remaining space. * Add `maxWidth` to columns that will be static in width, and `minWidth` to the one that should grow. * * Remember to add `useFlexLayout` to `useTable` * (more at: https://react-table-v7.tanstack.com/docs/api/useFlexLayout) */ export const VirtualizedTable = ({ rowHeight: rowHeightOverride, headerGroups, rows, prepareRow, parentRef, }: { rowHeight?: number; headerGroups: HeaderGroup[]; rows: Row[]; prepareRow: (row: Row) => void; parentRef?: RefObject; }) => { const theme = useTheme(); const rowHeight = useMemo( () => rowHeightOverride || theme.shape.tableRowHeight, [rowHeightOverride, theme.shape.tableRowHeight] ); const [firstRenderedIndex, lastRenderedIndex] = useVirtualizedRange( rowHeight, 40, 5, parentRef?.current ); const tableHeight = useMemo( () => rowHeight * rows.length + theme.shape.tableRowHeightCompact, [rowHeight, rows.length, theme.shape.tableRowHeightCompact] ); return ( *': { flexGrow: 1, }, }, }} > {rows.map((row, index) => { const top = index * rowHeight + theme.shape.tableRowHeightCompact; const isVirtual = index < firstRenderedIndex || index > lastRenderedIndex; if (isVirtual) { return null; } prepareRow(row); return ( {row.cells.map(cell => ( {cell.render('Cell')} ))} ); })}
); };