From f7553f24f3a8ffeb2eaac1a312a7badb039cb670 Mon Sep 17 00:00:00 2001 From: code-wolf-byte Date: Fri, 8 Nov 2024 15:58:35 -0700 Subject: [PATCH] Added Modals and made the page responsive --- src/pages/LeaderBoard.tsx | 127 +++++++++++++++++++++++++++++--------- 1 file changed, 99 insertions(+), 28 deletions(-) diff --git a/src/pages/LeaderBoard.tsx b/src/pages/LeaderBoard.tsx index 8ffd429..1805956 100644 --- a/src/pages/LeaderBoard.tsx +++ b/src/pages/LeaderBoard.tsx @@ -13,6 +13,46 @@ interface LeaderboardEntry { total_points: number; } +const Modal: React.FC<{ isOpen: boolean; onClose: () => void; data: PointsDetails[]; name: string }> = ({ isOpen, onClose, data, name }) => { + if (!isOpen) return null; + + return ( +
+
+

Points Breakdown for {name}

+
+ + + + + + + + + + + {data.map((detail, index) => ( + + + + + + + ))} + +
EventPointsAwarded ByDate
{detail.event}{detail.points}{detail.awarded_by}{new Date(detail.timestamp).toLocaleDateString()}
+
+ +
+
+ ); +}; + const Leaderboard: React.FC = () => { const [leaderboardData, setLeaderboardData] = useState([]); const [loading, setLoading] = useState(true); @@ -20,6 +60,8 @@ const Leaderboard: React.FC = () => { const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(10); const [searchTerm, setSearchTerm] = useState(''); + const [modalOpen, setModalOpen] = useState(false); + const [selectedEntry, setSelectedEntry] = useState(null); useEffect(() => { const fetchData = async () => { @@ -52,31 +94,41 @@ const Leaderboard: React.FC = () => { const handleNext = () => setCurrentPage((prev) => Math.min(prev + 1, totalPages)); const handleItemsPerPageChange = (e: React.ChangeEvent) => { setItemsPerPage(Number(e.target.value)); - setCurrentPage(1); // Reset to first page on items per page change + setCurrentPage(1); }; const handleSearchChange = (e: React.ChangeEvent) => { setSearchTerm(e.target.value); - setCurrentPage(1); // Reset to first page on new search + setCurrentPage(1); + }; + + const openModal = (entry: LeaderboardEntry) => { + setSelectedEntry(entry); + setModalOpen(true); + }; + + const closeModal = () => { + setModalOpen(false); + setSelectedEntry(null); }; if (loading) return
Loading...
; if (error) return
Error: {error}
; return ( -
-

Leaderboard

+
+

Leaderboard

{/* Search and Items Per Page Selector */} -
+
-
+
- entries per page + entries
{/* Leaderboard Table */} - - - - - - - - - {currentItems.map((entry, index) => ( - - - +
+
NamePoints Earned
{entry.name}{entry.total_points}
+ + + + + - ))} - -
NamePoints EarnedActions
+ + + {currentItems.map((entry, index) => ( + + {entry.name} + {entry.total_points} + + + + + ))} + + +
{/* Pagination Controls */} -
+
- + Page {currentPage} of {totalPages}
+ + {/* Modal */} +
); }; -export default Leaderboard; +export default Leaderboard; \ No newline at end of file