nextuiq
Version:
NextUIQ is a modern, lightweight, and developer-friendly UI component library for React and Next.js. Built with TypeScript and Tailwind CSS, it offers customizable, accessible, and performance-optimized components with built-in dark mode, theme customizat
40 lines (37 loc) • 1.41 kB
JavaScript
import { useState, useMemo } from 'react';
function useTable({ data, itemsPerPage = 5, searchFields = [] }) {
const [searchTerm, setSearchTerm] = useState("");
const [statusFilter, setStatusFilter] = useState("all");
const [roleFilter, setRoleFilter] = useState("all");
const [currentPage, setCurrentPage] = useState(1);
const filteredData = useMemo(() => {
return data.filter((item) => {
const matchesSearch = searchFields.some(
(field) => String(item[field]).toLowerCase().includes(searchTerm.toLowerCase())
);
const matchesStatus = statusFilter === "all" || item.status === statusFilter;
const matchesRole = roleFilter === "all" || item.role === roleFilter;
return matchesSearch && matchesStatus && matchesRole;
});
}, [data, searchTerm, statusFilter, roleFilter, searchFields]);
const totalPages = Math.ceil(filteredData.length / itemsPerPage);
const startIndex = (currentPage - 1) * itemsPerPage;
const paginatedData = filteredData.slice(startIndex, startIndex + itemsPerPage);
return {
searchTerm,
setSearchTerm,
statusFilter,
setStatusFilter,
roleFilter,
setRoleFilter,
currentPage,
setCurrentPage,
filteredData,
paginatedData,
totalPages,
startIndex,
endIndex: Math.min(startIndex + itemsPerPage, filteredData.length),
totalItems: filteredData.length
};
}
export { useTable };