diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index c632b7816..ce15517c9 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -1,3 +1,16 @@ -export default function Home() { - return
; +import { FilterlistTable, Filterlist } from "@/components/filterlist-table"; + +const getFilterlists = async (): Promise => { + const res = await fetch("https://api.filterlists.com/lists"); + if (!res.ok) throw new Error("Failed to fetch lists"); + return res.json(); +}; + +export default async function Home() { + const filterlists = await getFilterlists(); + return ( +
+ +
+ ); } diff --git a/web/src/components/filterlist-table.tsx b/web/src/components/filterlist-table.tsx new file mode 100644 index 000000000..0e002ac69 --- /dev/null +++ b/web/src/components/filterlist-table.tsx @@ -0,0 +1,105 @@ +"use client"; + +import * as React from "react"; +import { + ColumnDef, + useReactTable, + getCoreRowModel, + flexRender, +} from "@tanstack/react-table"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { Button } from "@/components/ui/button"; + +export type Filterlist = { + id: number; + name: string; +}; + +interface FilterlistTableProps { + filterlists: Filterlist[]; +} + +const columns: ColumnDef[] = [ + { + accessorKey: "name", + header: "Name", + cell: (info) => info.getValue(), + }, +]; + +export function FilterlistTable({ filterlists }: FilterlistTableProps) { + const [page, setPage] = React.useState(0); + const pageSize = 10; + const pageCount = Math.ceil(filterlists.length / pageSize); + + const pagedData = React.useMemo( + () => filterlists.slice(page * pageSize, (page + 1) * pageSize), + [filterlists, page, pageSize], + ); + + const table = useReactTable({ + data: pagedData, + columns, + getCoreRowModel: getCoreRowModel(), + }); + + return ( +
+ + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {flexRender( + header.column.columnDef.header, + header.getContext(), + )} + + ))} + + ))} + + + {table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ))} + +
+
+ + + Page {page + 1} of {pageCount} + + +
+
+ ); +}