-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPaginatedTableContainer.tsx
86 lines (76 loc) · 2.55 KB
/
PaginatedTableContainer.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { useCallback, useMemo, useState } from "react";
import "./PaginatedTableContainer.css";
import DataListTable from "../../components/DataListTable/DataListTable";
import Pagination from "../../components/Pagination/Pagination";
import { useDebounce } from "use-debounce";
import Filters from "../../components/Filters/Filters";
import useFetch from "../../hooks/useFetch";
import type { PaginatedDataResponse } from "../../types/paginatedDataResponse";
const INPUT_DEBOUNCE_TIME = 300;
const API_URL = "/data";
function PaginatedTableContainer() {
const [currentPage, setCurrentPage] = useState<number>(1);
const [statusFilter, setStatusFilter] = useState<string>("");
const [nameFilter, setNameFilter] = useState<string>("");
const [itemsPerPage, setItemsPerPage] = useState<number>(20);
const [debouncedNameFilter] = useDebounce(nameFilter, INPUT_DEBOUNCE_TIME);
const options = useMemo(
() => ({
params: {
status: statusFilter,
search: debouncedNameFilter,
limit: itemsPerPage,
page: currentPage,
},
}),
[statusFilter, debouncedNameFilter, itemsPerPage, currentPage]
);
const { data, loading, error } = useFetch<PaginatedDataResponse>(
API_URL,
"GET",
options
);
const handlePageChange = (newPage: number) => {
setCurrentPage(newPage);
};
const handleStatusFilterChange = (newStatus: string) => {
setStatusFilter(newStatus);
setCurrentPage(1);
};
const handleNameFilterChange = useCallback((newName: string) => {
setNameFilter(newName);
setCurrentPage(1);
}, []);
return (
<div className="paginatedTableContainer">
<Filters
nameFilter={nameFilter}
statusFilter={statusFilter}
onStatusFilterChange={handleStatusFilterChange}
onNameFilterChange={handleNameFilterChange}
totalItems={data?.totalItems || 0}
/>
<div className="paginatedTableContainer-content">
{error ? (
<p className="error">{error}</p>
) : loading ? (
<div className="loading-spinner"></div>
) : data?.totalItems ? (
<>
<DataListTable data={data?.data || []} />
<Pagination
currentPage={currentPage}
totalPages={data?.totalPages || 0}
itemsPerPage={itemsPerPage}
onPageChange={handlePageChange}
onItemsPerPageChange={setItemsPerPage}
/>
</>
) : (
<p>No results were found</p>
)}
</div>
</div>
);
}
export default PaginatedTableContainer;