1import {
2 getCoreRowModel,
3 getPaginationRowModel,
4 getSortedRowModel,
5 useReactTable,
6} from "@tanstack/react-table";
7import type {
8 ColumnDef,
9 OnChangeFn,
10 PaginationState,
11} from "@tanstack/react-table";
12import type {
13 UseRowSelectionReturn,
14 UseSortingReturn,
15 UseVisibilityReturn,
16} from ".";
17
18interface UseEntityTableProps<TData, TValue> {
19 columns: ColumnDef<TData, TValue>[];
20 data: {
21 entity: TData[];
22 pageCount: number;
23 };
24 sorting: UseSortingReturn;
25 visibility: UseVisibilityReturn;
26 rowSelection?: UseRowSelectionReturn;
27 manualSorting?: boolean;
28 pageIndex: number;
29 pageSize: number;
30 onPaginationChange: OnChangeFn<PaginationState>;
31}
32
33export const useEntityTable = <TData, TValue>({
34 columns,
35 data,
36 sorting,
37 manualSorting = false,
38 visibility,
39 rowSelection,
40 pageIndex,
41 pageSize,
42 onPaginationChange,
43}: UseEntityTableProps<TData, TValue>) =>
44 useReactTable({
45 data: data.entity,
46 columns,
47 manualPagination: true,
48 manualSorting,
49 pageCount: data.pageCount + 1,
50 autoResetPageIndex: false,
51 onPaginationChange,
52 onSortingChange: sorting.setSorting,
53 getCoreRowModel: getCoreRowModel(),
54 getPaginationRowModel: getPaginationRowModel(),
55 getSortedRowModel: getSortedRowModel(),
56 onColumnVisibilityChange: visibility.setColumnVisibility,
57 onRowSelectionChange: rowSelection?.setSelectedRow,
58 state: {
59 sorting: sorting.sorting,
60 columnVisibility: visibility.columnVisibility,
61 pagination: { pageIndex: pageIndex - 1, pageSize: pageSize },
62 rowSelection: rowSelection ? rowSelection.selectedRow : {},
63 },
64 });