UNPKG

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
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 };