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 (
+ <>
+
+

- 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 (
- <>
-
-

+
+
+
+

+
+
+
+
+
+ >
+ );
+}
-
-
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;