diff --git a/src/app/signupredirect/page.tsx b/src/app/signupredirect/page.tsx index 7b8abde..8ac98c2 100644 --- a/src/app/signupredirect/page.tsx +++ b/src/app/signupredirect/page.tsx @@ -24,6 +24,7 @@ export default function SignupRedirect() { name: user.fullName, email: user.primaryEmailAddress?.emailAddress, role: "Volunteer", + active: true, }), }); diff --git a/src/app/volunteers/page.tsx b/src/app/volunteers/page.tsx index 299c7fa..90478da 100644 --- a/src/app/volunteers/page.tsx +++ b/src/app/volunteers/page.tsx @@ -1,8 +1,277 @@ "use client"; -import React, { useState } from "react"; +import { + Box, + VStack, + InputGroup, + Input, + InputRightElement, + Table, + Thead, + Tbody, + Tr, + Th, + Td, + IconButton, + HStack, + Select, + Button, + Text, + Spinner, +} from "@chakra-ui/react"; + +import { IUser } from "@/database/userSchema"; +import { SquarePen, SearchIcon, FileDown, ChevronLeft, ChevronRight } from "lucide-react"; +import React, { useState, useEffect } from "react"; +import { relative } from "path"; function Volunteers() { - return
Volunteers
; + const [currentPage, setCurrentPage] = useState(1); + const [loading, setLoading] = useState(true); + const [usersData, setUsers] = useState([]); + const [searchTerm, setSearchTerm] = useState(""); + const [filteredUsers, setFilteredUsers] = useState([]); + const rowsPerPage = 7; + + const totalPages = Math.ceil(filteredUsers.length / rowsPerPage); + const idxLastUser = currentPage * rowsPerPage; + const idxFirstUser = idxLastUser - rowsPerPage; + const paginatedUsers = filteredUsers.slice(idxFirstUser, idxLastUser); + //Fetch Users + useEffect(() => { + const fetchUsers = async () => { + try { + const response = await fetch("/api/user"); + if (!response.ok) throw new Error("Failed to fetch users"); + const data = await response.json(); + setUsers(data); + setFilteredUsers(data); + } catch (error) { + console.error("Error fetching users:", error); + } finally { + setLoading(false); + } + }; + + fetchUsers(); + }, []); + //Search Filter + const handleSearch = (e: React.KeyboardEvent | React.MouseEvent) => { + if (!searchTerm.trim()) { + setFilteredUsers(usersData); + setCurrentPage(1); + return; + } + + const results = usersData.filter((user: IUser) => { + const searchValue = searchTerm.toLowerCase(); + return ( + user.name?.toLowerCase().includes(searchValue) || + user.email?.toLowerCase().includes(searchValue) || + user.role?.toLowerCase().includes(searchValue) || + user.phoneNumber?.toLowerCase().includes(searchValue) + ); + }); + + setFilteredUsers(results); + setCurrentPage(1); + }; + + return ( + + + {/*PageText*/} + + + + Volunteer Database + + + {filteredUsers.length} volunteers found + + + + {/*Search/Export*/} + + + setSearchTerm(e.target.value)} + onKeyDown={handleSearch} + /> + + + + + + + + + + {/*Table*/} + + {loading ? ( + + + + ) : ( + + + + + + + + + {/**/} + + + + + + {paginatedUsers.length > 0 ? ( + paginatedUsers.map((user: IUser, index) => ( + + + + + + {/* + */} + + + + )) + ) : ( + + + + )} + +
#UserRoleEmailPhone NumberActivity
+ + {index} + + {user.name} + + {user.role} + + {user.email} + {user.phoneNumber?.replace(/\D/g, "").replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") || "N/A"} + + + + + + + + +
+ No results +
+ {/*Table Pages*/} + {totalPages > 1 && ( + + + + {Array.from({ length: Math.min(totalPages, 3) }, (_, i) => { + let pageNumber = 0; + if (totalPages <= 3) { + pageNumber = i + 1; + } else if (currentPage === 1) { + pageNumber = i + 1; + } else if (currentPage === totalPages) { + pageNumber = totalPages - 2 + i; + } else { + pageNumber = currentPage - 1 + i; + } + return ( + + ); + })} + + + + )} +
+ )} +
+
+
+ ); } export default Volunteers; diff --git a/src/database/userSchema.ts b/src/database/userSchema.ts index 29a699f..bfb0999 100644 --- a/src/database/userSchema.ts +++ b/src/database/userSchema.ts @@ -6,6 +6,7 @@ const UserSchema = new Schema({ email: { type: String, required: true, unique: true }, phoneNumber: { type: String, required: false }, role: { type: String, required: true }, + active: { type: Boolean, required: true }, }); export type IUser = { @@ -14,6 +15,7 @@ export type IUser = { email: string; phoneNumber: string; role: string; + active: boolean; }; export default mongoose.models.User || mongoose.model("User", UserSchema);