import { useMemo } from "react"; import P from "@moduletrace/twui/layout/P"; import Stack from "@moduletrace/twui/layout/Stack"; import { AppData } from "@/src/data/app-data"; import parseCsv from "@/src/utils/parse-csv"; import FilePreviewNotice from "./file-preview-notice"; import FilePreviewTableRow from "./file-preview-table-row"; type Props = { text: string; delimiter: string; }; /** * A CSV or TSV file as a table: its first row the header (kept in view * while scrolling), up to `AppData.FilePreviewMaxTableRows` rows. Cells * are text only. Tables have no children-based twui equivalent, so they're * styled elements, as in a message. */ export default function FilePreviewTable({ text, delimiter }: Props) { const { rows, truncated } = useMemo( () => parseCsv({ text, delimiter, max_rows: AppData.FilePreviewMaxTableRows + 1 }), [text, delimiter], ); if (!rows.length) return ; const [header, ...body] = rows; return ( {body.map((cells, index) => ( ))}

{truncated ? `Showing the first ${body.length} rows. Download the file for the rest.` : `${body.length} ${body.length == 1 ? "row" : "rows"}`}

); }