import React, { FC, useState } from "react"; type SortableTableProps = { data: any[]; }; // @ts-ignore const Table: FC = ({ data, children }) => { const [tableData, setTableData] = useState(data); const [ascending, setAscending] = useState(true); const [lastSortBy, setlastSortBy] = useState(0); // @ts-ignore const sortFunctions = React.Children.map(children, child => child.props.createComparator(child.props)); const mapDataToColumns = (row: any) => { return ( {React.Children.map(children, child => { // @ts-ignore return {React.cloneElement(child, { ...child.props, row })}; })} ); }; const sortDescending = (sortAscending: (a: any, b: any) => number) => { return (a: any, b: any) => { return sortAscending(a, b) * -1; }; }; const tableSort = (index: number) => { const sortableData = [...tableData]; let sortOrder = ascending; if (lastSortBy !== index) { setAscending(true); sortOrder = true; } const sortFunction = sortOrder ? sortFunctions[index] : sortDescending(sortFunctions[index]); sortableData.sort(sortFunction); setTableData(sortableData); setAscending(!sortOrder); setlastSortBy(index); }; return ( tableData.length > 0 && ( {React.Children.map(children, (child, index) => ( // @ts-ignore ))} {tableData.map(mapDataToColumns)}
tableSort(index)}>{child.props.header}
) ); }; export default Table;