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