rnr-starter
Version:
A comprehensive React Native Expo boilerplate with 50+ modern UI components, dark/light themes, i18n, state management, and production-ready architecture
97 lines (90 loc) • 2.62 kB
text/typescript
import {
ColumnDef,
ColumnFiltersState,
PaginationState,
SortingState,
getCoreRowModel,
getFilteredRowModel,
getPaginationRowModel,
getSortedRowModel,
useReactTable,
} from '@tanstack/react-table';
import { useMemo, useState } from 'react';
interface UseTableOptions<TData> {
data: TData[];
columns: ColumnDef<TData>[];
enableSorting?: boolean;
enableFiltering?: boolean;
enablePagination?: boolean;
pageSize?: number;
initialSorting?: SortingState;
initialFilters?: ColumnFiltersState;
}
export function useTable<TData>({
data,
columns,
enableSorting = true,
enableFiltering = false,
enablePagination = false,
pageSize = 10,
initialSorting = [],
initialFilters = [],
}: UseTableOptions<TData>) {
const [sorting, setSorting] = useState<SortingState>(initialSorting);
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(initialFilters);
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize,
});
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,
getFilteredRowModel: enableFiltering ? getFilteredRowModel() : undefined,
getPaginationRowModel: enablePagination ? getPaginationRowModel() : undefined,
onSortingChange: setSorting,
onColumnFiltersChange: setColumnFilters,
onPaginationChange: setPagination,
state: {
sorting,
columnFilters,
pagination,
},
});
const tableData = useMemo(
() => ({
rows: table.getRowModel().rows,
headers: table.getHeaderGroups(),
canPreviousPage: table.getCanPreviousPage(),
canNextPage: table.getCanNextPage(),
pageCount: table.getPageCount(),
currentPage: table.getState().pagination.pageIndex + 1,
totalRows: table.getFilteredRowModel().rows.length,
}),
[table]
);
const tableActions = useMemo(
() => ({
previousPage: () => table.previousPage(),
nextPage: () => table.nextPage(),
setPageIndex: (index: number) => table.setPageIndex(index),
firstPage: () => table.setPageIndex(0),
lastPage: () => table.setPageIndex(table.getPageCount() - 1),
setColumnFilter: (columnId: string, value: any) => {
table.getColumn(columnId)?.setFilterValue(value);
},
resetFilters: () => table.resetColumnFilters(),
resetSorting: () => table.resetSorting(),
}),
[table]
);
return {
table,
tableData,
tableActions,
sorting,
columnFilters,
pagination,
};
}