import { type FC, Fragment, type Key, memo, type ReactNode, useCallback, useMemo, useState } from 'react'; import { Table } from './Table'; import styles from './Table.module.css'; export interface DataTableColumn { key: Key, label: ReactNode, value: (row: T) => ReactNode, small?: boolean, sort?: (a: T, b: T) => number, } export interface DataTableProps { rows: T[], } /** @deprecated Use DataTable instead */ export function useDataTable(columns: DataTableColumn[], rowKey: (row: T) => Key, groups?: (row: T) => { value: string, label: ReactNode }): FC> { return memo(useMemo( () => function DataTable({ rows }: DataTableProps) { const [sortBy, setSortBy] = useState<{ column: DataTableColumn, reverse: boolean }>(); const sortedRows = useMemo( () => (sortBy?.column?.sort !== undefined) ? rows.slice().sort((a, b) => sortBy.reverse ? sortBy.column.sort!(a, b) : sortBy.column.sort!(b, a)) : rows, [rows, sortBy] ); const handleSort = useCallback((column: DataTableColumn) => { setSortBy((sortBy) => sortBy?.column !== column || !sortBy.reverse ? { column, reverse: !sortBy?.reverse && sortBy?.column === column } : undefined); }, []); let lastGroup: string | undefined = undefined; return ( {columns.map((column) => ())} {sortedRows.map((row) => { const group = groups && groups(row); const showGroup = sortBy === undefined && group && group.value !== lastGroup; if(showGroup) { lastGroup = group.value; } return ( {showGroup && ( )} {columns.map((column) => )} ); })}
{group.label}
{column.value(row)}
); }, [columns, rowKey, groups] )); } // eslint-disable-next-line @typescript-eslint/no-explicit-any interface ColumnHeaderProps { column: DataTableColumn, onSort: (column: DataTableColumn) => void, sortBy: { column: DataTableColumn, reverse: boolean } | undefined, } const ColumnHeader: FC = ({ column, onSort, sortBy }) => { const handleSort = useCallback(() => { onSort(column); }, [onSort, column]); const isActiveSort = sortBy?.column === column; return ( {column.label} ); };