@@ -118,7 +118,7 @@ export default function TableWrapper({
const TableIsLoading = () => {
return (
-
+
)
diff --git a/src/components/tableWrapper/_TableWrapper.jsx b/src/components/tableWrapper/_TableWrapper.jsx
new file mode 100644
index 0000000..d666394
--- /dev/null
+++ b/src/components/tableWrapper/_TableWrapper.jsx
@@ -0,0 +1,125 @@
+import { ReactNode, useEffect, useState } from "react";
+import MainBtn from "../MainBtn";
+import Icons from "../Icons";
+
+
+export default function TableWrapper({
+ data = [],
+ itemsPerPage = 5,
+ filterItem,
+ children,
+}) {
+ const [isLoading, setIsLoading] = useState(true)
+ const [searchTerm, setSearchTerm] = useState("");
+ const [filteredData, setFilteredData] = useState(data);
+
+ const [currentPage, setCurrentPage] = useState(0);
+ const [newData, setNewData] = useState([]);
+
+ const numberOfSelection = itemsPerPage;
+
+ const handlePrev = () => {
+ if (currentPage != 0) {
+ setCurrentPage((prev) => prev - numberOfSelection);
+ }
+ };
+ const handleNext = () => {
+ if (currentPage < data.length) {
+ setCurrentPage((prev) => prev + numberOfSelection);
+ }
+ };
+
+ const handleSearch = ({ target: { value } }, name) => {
+ setSearchTerm(value);
+ let newFilteredData = data.filter((item) =>
+ item[name].toLowerCase().startsWith(value.toLowerCase())
+ );
+ setFilteredData(newFilteredData);
+ setCurrentPage(0);
+ };
+
+ useEffect(() => {
+ setIsLoading(true)
+ setTimeout(()=>{
+ setNewData(
+ filteredData?.slice(currentPage, numberOfSelection + currentPage)
+ );
+ setIsLoading(false)
+ },1000)
+ }, [currentPage, filteredData]);
+
+ useEffect(()=>{
+ setCurrentPage(0)
+ },[itemsPerPage])
+
+ return (
+
+ {data.length > 0 && filterItem && (
+
+ {filterItem.map((item, index) => (
+
+ ))}
+
+ )}
+
+
+
+ {children({ data: newData })}
+
+
+ {/* PAGINATION BUTTON */}
+ {newData.length > 0 &&
+
+
Showing
+ {isLoading ? '----' : `${currentPage + 1}-${currentPage + numberOfSelection >= data.length ? data.length : (currentPage + numberOfSelection)}`} of {data.length}
+
+ {(newData.length >= itemsPerPage) &&
+
+
+
+
+ = data.length ? 'bg-primary/50 pointer-events-none' : 'bg-primary'} text-white-light text-center flex justify-center gap-2 items-center`}
+ disabled={isLoading}
+ >
+
+
+
+ }
+
+ }
+
+
+ {isLoading &&
}
+
+ );
+}
+
+const TableIsLoading = () => {
+ return (
+
+ )
+}
diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx
index f5530f3..94bb17d 100644
--- a/src/pages/HomePage.jsx
+++ b/src/pages/HomePage.jsx
@@ -2,6 +2,8 @@ import React from 'react'
import BreadcrumbCom from '../components/breadcrumb/BreadcrumbCom'
import CustomCounter from '../components/CustomCounter'
import Icons from '../components/Icons'
+import TableWrapper from '../components/tableWrapper/TableWrapper'
+import Avatar from '../assets/user_avatar.jpg'
export default function HomePage() {
return (
@@ -69,14 +71,77 @@ export default function HomePage() {