From 50322e970739569a6614dd55a6b1e351edb8dcb1 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:48:41 +0530 Subject: [PATCH 1/2] Fix: Added Dropdown toggle on Dropdown Elements to close dropdown when any dropdown button is clicked --- client-side/src/components/NavBar/NavBar.jsx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/client-side/src/components/NavBar/NavBar.jsx b/client-side/src/components/NavBar/NavBar.jsx index c8fc41c..a8c3756 100644 --- a/client-side/src/components/NavBar/NavBar.jsx +++ b/client-side/src/components/NavBar/NavBar.jsx @@ -203,25 +203,37 @@ function Navbar() {

navigate("/dashboard")} + onClick={() => { + navigate("/dashboard") + setDropdownOpen(false) + }} > Dashboard

navigate("/education")} + onClick={() => { + navigate("/education") + setDropdownOpen(false) + }} > Education

navigate("/leader-board")} + onClick={() => { + navigate("/leader-board") + setDropdownOpen(false) + }} > Leaderboard

{ + handleLogout() + setDropdownOpen(false) + }} > Logout

From 394cf95db803207c9a1b69e7dd6354b171d36038 Mon Sep 17 00:00:00 2001 From: Rudransh Pratap Singh <87255169+CoderFleet@users.noreply.github.com> Date: Thu, 9 Jan 2025 12:27:10 +0530 Subject: [PATCH 2/2] Enhancement: Added Dropdown styles, Dropdown Animation using framer, Close dropdown on item click implemented --- client-side/src/components/NavBar/NavBar.jsx | 293 ++++++++++--------- 1 file changed, 155 insertions(+), 138 deletions(-) diff --git a/client-side/src/components/NavBar/NavBar.jsx b/client-side/src/components/NavBar/NavBar.jsx index a8c3756..d0cafa4 100644 --- a/client-side/src/components/NavBar/NavBar.jsx +++ b/client-side/src/components/NavBar/NavBar.jsx @@ -1,4 +1,3 @@ - // import { useNavigate } from "react-router-dom"; // import CodeHubLogo from "./Assets/Logos/CodeHubSmall.png"; // import HamburgerMenu from "./HamburgerMenu"; @@ -17,7 +16,6 @@ // navigate("/"); // }; - // return ( // <> // {/* Render for larger screens */} @@ -114,157 +112,176 @@ // export default Navbar; - - - - import { useNavigate } from "react-router-dom"; import CodeHubLogo from "./Assets/Logos/CodeHubSmall.png"; import HamburgerMenu from "./HamburgerMenu"; import { useSelector, useDispatch } from "react-redux"; import { useState, useRef, useEffect } from "react"; import { logout } from "../../redux/slices/authSlice"; +import { motion, AnimatePresence } from "framer-motion"; function Navbar() { - const auth = useSelector(state => state.auth.user); - const navigate = useNavigate(); - const dispatch = useDispatch(); - const [dropdownOpen, setDropdownOpen] = useState(false); - const dropdownRef = useRef(null); + const auth = useSelector((state) => state.auth.user); + const navigate = useNavigate(); - const handleLogoClick = (e) => { - e.preventDefault(); - e.stopPropagation(); - navigate("/"); - }; + const handleLogoClick = (e) => { + e.preventDefault(); + e.stopPropagation(); + navigate("/"); + }; - const handleLogout = async() => { - console.log("Inside HandleLogout navbar"); - await dispatch(logout()); - navigate("/login"); - }; + return ( + <> +
+ Codehub Website's Logo - const handleDropdownToggle = () => { - setDropdownOpen(!dropdownOpen); - }; +
+

navigate("/")}> + HOME +

+

navigate("/contact-us")}> + Contact Us +

+

navigate("/notice-board")}> + NoticeBoard +

+
- // Close dropdown if clicked outside - useEffect(() => { - const handleClickOutside = (event) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { - setDropdownOpen(false); - } - }; - document.addEventListener("mousedown", handleClickOutside); - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; - }, []); + {auth ? ( + + ) : ( + + )} +
- return ( - <> -
- +
+
+
+ Codehub Website's Logo +
+
+ +
+
+ + ); +} -
-

navigate("/")} - > - HOME -

-

navigate("/contact-us")} - > - Contact Us -

-

navigate("/notice-board")} - > - NoticeBoard -

-
+const DropdownMenu = () => { + const [dropdownOpen, setDropdownOpen] = useState(false); + const [arrowColor, setArrowColor] = useState(false); + const dropdownRef = useRef(null); + const dispatch = useDispatch(); + const navigate = useNavigate(); - {auth ? ( -
- - {dropdownOpen && ( -
-

{ - navigate("/dashboard") - setDropdownOpen(false) - }} - > - Dashboard -

-

{ - navigate("/education") - setDropdownOpen(false) - }} - > - Education -

-

{ - navigate("/leader-board") - setDropdownOpen(false) - }} - > - Leaderboard -

-

{ - handleLogout() - setDropdownOpen(false) - }} - > - Logout -

-
- )} -
- ) : ( - - )} -
+ const handleLogout = async () => { + console.log("Inside HandleLogout navbar"); + await dispatch(logout()); + navigate("/login"); + }; -
-
-
- -
-
- -
-
- - ); -} + const handleDropdownToggle = () => { + setDropdownOpen(!dropdownOpen); + }; + + // Close dropdown if clicked outside + useEffect(() => { + const handleClickOutside = (event) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setDropdownOpen(false); + } + }; + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + + // Change Square color back to white incase mouseLeave is not triggered + useEffect(() => { + setArrowColor(false); + }, [navigate]) + + return ( +
+ + + {dropdownOpen && ( + +
+

setArrowColor(true)} + onMouseLeave={() => setArrowColor(false)} + onClick={() => { + navigate("/dashboard"); + setDropdownOpen(false); + }}> + Dashboard +

+

{ + navigate("/education"); + setDropdownOpen(false); + }}> + Education +

+

{ + navigate("/leader-board"); + setDropdownOpen(false); + }}> + Leaderboard +

+

{ + handleLogout(); + setDropdownOpen(false); + }}> + Logout +

+ + )} + +
+ ); +}; export default Navbar;