Spaces:
Running
Running
import React, { useMemo } from "react"; | |
import { | |
TableBody, | |
TableCell, | |
TableHead, | |
TableHeader, | |
TableRow, | |
} from "~/components/ui/table"; | |
interface TableProps { | |
data: Record<string, unknown>[]; | |
} | |
export const Table: React.FC<TableProps> = ({ data }) => { | |
const headers = useMemo( | |
() => | |
data.length > 0 && typeof data[0] === "object" | |
? Object.keys(data[0]) | |
: [], | |
[data] | |
); | |
if (data.length === 0) | |
return <div className="text-center p-8 font-mono">no data for query</div>; | |
return ( | |
<table className="text-xs"> | |
<TableHeader> | |
<TableRow> | |
{headers.map((header) => ( | |
<TableHead key={header}>{header}</TableHead> | |
))} | |
</TableRow> | |
</TableHeader> | |
<TableBody> | |
{data.map((row, rowIndex) => ( | |
<TableRow key={rowIndex}> | |
{headers.map((header) => ( | |
<TableCell key={`${rowIndex}-${header}`}> | |
{String(row[header])} | |
</TableCell> | |
))} | |
</TableRow> | |
))} | |
</TableBody> | |
</table> | |
); | |
}; | |