diff --git a/src/hooks/useListSearch.tsx b/src/hooks/useListSearch.tsx index 4f2a23ac..512a644a 100644 --- a/src/hooks/useListSearch.tsx +++ b/src/hooks/useListSearch.tsx @@ -1,6 +1,6 @@ import {useState, useMemo} from "react"; import Input from "@/components/Low/Input"; -import { search } from "@/utils/search"; +import {search} from "@/utils/search"; export function useListSearch(fields: string[][], rows: T[]) { const [text, setText] = useState(""); @@ -8,7 +8,8 @@ export function useListSearch(fields: string[][], rows: T[]) { const renderSearch = () => ; const updatedRows = useMemo(() => { - return search(text, fields, rows); + if (text.length > 0) return search(text, fields, rows); + return rows; }, [fields, rows, text]); return { diff --git a/src/hooks/usePagination.tsx b/src/hooks/usePagination.tsx new file mode 100644 index 00000000..490c6c9e --- /dev/null +++ b/src/hooks/usePagination.tsx @@ -0,0 +1,28 @@ +import Button from "@/components/Low/Button"; +import {useMemo, useState} from "react"; + +export default function usePagination(list: T[], size = 25) { + const [page, setPage] = useState(0); + + const items = useMemo(() => list.slice(page * size, (page + 1) * size), [page, size, list]); + + const render = () => ( +
+
+ +
+
+ + {page * size + 1} - {(page + 1) * size > list.length ? list.length : (page + 1) * size} / {list.length} + + +
+
+ ); + + return {page, items, setPage, render}; +} diff --git a/src/pages/(admin)/Lists/UserList.tsx b/src/pages/(admin)/Lists/UserList.tsx index 335e57ba..619630fa 100644 --- a/src/pages/(admin)/Lists/UserList.tsx +++ b/src/pages/(admin)/Lists/UserList.tsx @@ -28,6 +28,7 @@ import {checkAccess} from "@/utils/permissions"; import {PermissionType} from "@/interfaces/permissions"; import usePermissions from "@/hooks/usePermissions"; import useUserBalance from "@/hooks/useUserBalance"; +import usePagination from "@/hooks/usePagination"; const columnHelper = createColumnHelper(); const searchFields = [["name"], ["email"], ["corporateInformation", "companyInformation", "name"]]; @@ -62,15 +63,12 @@ export default function UserList({ const [sorter, setSorter] = useState(); const [displayUsers, setDisplayUsers] = useState([]); const [selectedUser, setSelectedUser] = useState(); - const [page, setPage] = useState(0); const userHash = useMemo( () => ({ type, - size: 16, - page, }), - [type, page], + [type], ); const {users, total, isLoading, reload} = useUsers(userHash); @@ -102,9 +100,9 @@ export default function UserList({ (async () => { if (users && users.length > 0) { const filteredUsers = filters.reduce((d, f) => d.filter(f), users); - const sortedUsers = await asyncSorter(filteredUsers, sortFunction); + // const sortedUsers = await asyncSorter(filteredUsers, sortFunction); - setDisplayUsers([...sortedUsers]); + setDisplayUsers([...filteredUsers]); } })(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -513,10 +511,14 @@ export default function UserList({ return a.id.localeCompare(b.id); }; - const {rows: filteredRows, renderSearch} = useListSearch(searchFields, displayUsers); + const {rows: filteredRows, renderSearch, text: searchText} = useListSearch(searchFields, displayUsers); + const {items, setPage, render: renderPagination} = usePagination(filteredRows, 16); + + // eslint-disable-next-line react-hooks/exhaustive-deps + useEffect(() => setPage(0), [searchText]); const table = useReactTable({ - data: filteredRows, + data: items, columns: (!showDemographicInformation ? defaultColumns : demographicColumns) as any, getCoreRowModel: getCoreRowModel(), }); @@ -632,27 +634,7 @@ export default function UserList({ Download List -
- -
- - {page * userHash.size + 1} - {(page + 1) * userHash.size > total ? total : (page + 1) * userHash.size} / {total} - - -
-
+ {renderPagination()} {table.getHeaderGroups().map((headerGroup) => ( diff --git a/src/pages/api/users/list.ts b/src/pages/api/users/list.ts index 40362185..4914257a 100644 --- a/src/pages/api/users/list.ts +++ b/src/pages/api/users/list.ts @@ -32,5 +32,5 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { direction, ); - res.status(200).json({users: uniqBy([...users, req.session.user], "id"), total}); + res.status(200).json({users: uniqBy([...users], "id"), total}); }