admin visibilty- temp fix

This commit is contained in:
Harshitha Shetty
2025-03-14 12:43:12 +05:30
parent 19797290f3
commit 366dc07bb6
4 changed files with 193 additions and 39 deletions

View File

@@ -15,6 +15,10 @@ function AuthPage() {
});
const [signin, setSignin] = useState(false);
const adminEmails = [
"harshitha.ss@somaiya.edu",
];
const notifyError = (message) => {
toast.error(message);
};
@@ -70,19 +74,22 @@ function AuthPage() {
)}?d=identicon`;
user.profilePicture = gravatarUrl;
if (adminEmails.includes(user.email)) {
await axios.post(`http://localhost:8080/api/user/make-admin/${user._id}`);
const updatedUser = await axios.get(`http://localhost:8080/api/user/${user._id}`);
user.isAdmin = updatedUser.data.isAdmin;
localStorage.setItem("isAdmin", user.isAdmin);
} else {
localStorage.setItem("isAdmin", false);
}
// ✅ Save user to localStorage
localStorage.setItem("user", JSON.stringify(user));
window.location.href = "/Welcome";
}
} catch (error) {
console.error("Authentication error:", error);
if (
error.response &&
error.response.status === 400 &&
error.response.data.message === "User already exists"
) {
notifyError("User already exists");
} else {
notifyError(error.response?.data.message || "An error occurred");
}
notifyError(error.response?.data.message || "An error occurred");
}
}
@@ -91,6 +98,20 @@ function AuthPage() {
window.location.href = "http://localhost:8080/auth/google";
};
useEffect(() => {
const queryParams = new URLSearchParams(window.location.search);
const email = queryParams.get("email");
if (email) {
if (adminEmails.includes(email)) {
localStorage.setItem("isAdmin", true);
} else {
localStorage.setItem("isAdmin", false);
}
}
}, []);
return (
<>
<ToastContainer />

View File

@@ -1,7 +1,6 @@
import React, { useEffect, useState } from "react";
import { FaUserCircle } from "react-icons/fa";
import { NavLink, useNavigate } from "react-router-dom"; // Import NavLink for navigation
import "./Navbar.css"; // Navbar-specific styles
import axios from "axios";
import { toast, ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
@@ -9,21 +8,61 @@ import 'react-toastify/dist/ReactToastify.css';
const Navbar = () => {
const navigate = useNavigate();
const [user, setUser] = useState(null);
const [isAdmin, setIsAdmin] = useState(false);
// useEffect(() => {
// const loggedInUser = localStorage.getItem("user");
// const adminStatus = localStorage.getItem("isAdmin");
// if (loggedInUser) {
// // ✅ Set user from localStorage
// setUser(JSON.parse(loggedInUser));
// if (adminStatus === "true") setIsAdmin(true);
// }
// // ✅ Even after refresh, reconfirm the user from backend
// axios.get("http://localhost:8080/api/user/profile", { withCredentials: true })
// .then((response) => {
// const userData = response.data.user;
// setUser(userData);
// console.log(userData);
// // ✅ Check if the user is admin (FROM BACKEND)
// if (userData.isAdmin == true) {
// setIsAdmin(true);
// localStorage.setItem("isAdmin", true);
// } else {
// setIsAdmin(false);
// localStorage.setItem("isAdmin", false);
// }
// console.log(isAdmin);
// })
// .catch((error) => {
// console.error("Error fetching user data:", error);
// toast.error("Failed to fetch user data.");
// });
// }, []);
useEffect(() => {
const loggedInUser = localStorage.getItem("user");
if (loggedInUser) {
setUser(JSON.parse(loggedInUser));
} else {
axios.get("http://localhost:8080/api/user/profile", { withCredentials: true })
.then((response) => {
setUser(response.data.user);
})
.catch((error) => {
console.error("Error fetching user data:", error);
});
}
}, []);
axios.get("http://localhost:8080/api/user/profile", { withCredentials: true })
.then((response) => {
const userData = response.data.user;
setUser(userData);
if (userData.isAdmin) {
setIsAdmin(true);
localStorage.setItem("isAdmin", "true");
} else {
setIsAdmin(false);
localStorage.setItem("isAdmin", "false");
}
})
.catch((error) => {
console.error("Error fetching user data:", error);
});
}, [user]); // ✅ Add `user` dependency to re-run when `user` updates
// Handle logout functionality
const handleLogout = async () => {
@@ -41,31 +80,113 @@ const Navbar = () => {
};
return (
<header className="navbar">
<div className="navbar-container">
<header style={{
backgroundColor: "#800000",
color: "white",
padding: "15px 0",
width: "100vw",
boxShadow: "0 2px 10px rgba(0,0,0,0.1)",
position: "sticky",
top: "0",
zIndex: "1000"
}} >
<div style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
width: "95%",
margin: "0 auto"
}}>
<ToastContainer />
<NavLink to="/Welcome" className="navbar-logo">
<img src="logo_.png" alt="Logo" className="logo-img" />
<NavLink to="/Welcome">
<img src="logo_.png" alt="Logo" style={{
height: "50px",
cursor: "pointer"
}} />
</NavLink>
<div className="button-container">
<div style={{ display: "flex", gap: "30px" }}>
{/* Consolidated buttons in the center */}
<NavLink to="/consolidated" className="consolidated-button nav-btn">
<NavLink to="/consolidated" style={{
color: "white",
textDecoration: "none",
fontSize: "16px",
transition: "0.3s",
padding: "10px 15px",
borderRadius: "5px"
}}
onMouseEnter={(e) => e.target.style.backgroundColor = "#660000"}
onMouseLeave={(e) => e.target.style.backgroundColor = "transparent"}>
Faculty Consolidated
</NavLink>
<NavLink to="/courseConsolidated" className="consolidated-button nav-btn">
<NavLink to="/courseConsolidated" style={{
color: "white",
textDecoration: "none",
fontSize: "16px",
transition: "0.3s",
padding: "10px 15px",
borderRadius: "5px"
}}
onMouseEnter={(e) => e.target.style.backgroundColor = "#660000"}
onMouseLeave={(e) => e.target.style.backgroundColor = "transparent"}>
Course Consolidated
</NavLink>
<NavLink to="/departmentConsolidated" className="navbar-title nav-btn">
<NavLink to="/departmentConsolidated" style={{
color: "white",
textDecoration: "none",
fontSize: "16px",
transition: "0.3s",
padding: "10px 15px",
borderRadius: "5px"
}}
onMouseEnter={(e) => e.target.style.backgroundColor = "#660000"}
onMouseLeave={(e) => e.target.style.backgroundColor = "transparent"}>
Department Consolidated
</NavLink>
<NavLink to="/panelConsolidated" style={{
color: "white",
textDecoration: "none",
fontSize: "16px",
transition: "0.3s",
padding: "10px 15px",
borderRadius: "5px"
}}
onMouseEnter={(e) => e.target.style.backgroundColor = "#660000"}
onMouseLeave={(e) => e.target.style.backgroundColor = "transparent"}>
Panel
</NavLink>
{isAdmin && (
<NavLink to="/AdminFacultyPage" style={{
color: "white",
textDecoration: "none",
fontSize: "16px",
transition: "0.3s",
padding: "10px 15px",
borderRadius: "5px",
backgroundColor: "#B22222"
}}
onMouseEnter={(e) => e.target.style.backgroundColor = "#660000"}
onMouseLeave={(e) => e.target.style.backgroundColor = "#B22222"}>
Faculty
</NavLink>
)}
</div>
<div>
<button className="logout-button" onClick={handleLogout}>
<button className="logout-button" onClick={handleLogout} style={{
backgroundColor: "#ff4d4d",
color: "white",
border: "none",
padding: "10px 20px",
borderRadius: "5px",
cursor: "pointer",
transition: "0.3s"
}}
onMouseEnter={(e) => e.target.style.backgroundColor = "##660000"}
onMouseLeave={(e) => e.target.style.backgroundColor = "#ff4d4d"}>
Logout
</button>
</div>
@@ -76,15 +197,23 @@ const Navbar = () => {
<img
src={user.profilePicture}
alt="Profile"
className="user-icon"
style={{ width: '40px', height: '40px', borderRadius: '50%' }}
style={{
width: "40px",
height: "40px",
borderRadius: "50%",
border: "2px solid white",
objectFit: "cover"
}}
/>
) : (
<FaUserCircle className="user-icon" />
<FaUserCircle style={{
color: "white",
fontSize: "35px"
}} />
)}
</NavLink>
</div>
</header>
</header >
);
};

View File

@@ -16,6 +16,10 @@ const UserSchema = new mongoose.Schema(
type: Date,
default: null,
},
isAdmin:{
type:Boolean,
default: false,
}
},
{
timestamps: true,

View File

@@ -23,9 +23,9 @@ const transporter = nodemailer.createTransport({
pass: "umlc hbkr dpga iywd",
},
tls: { rejectUnauthorized: false },
connectionTimeout: 30000,
greetingTimeout: 30000,
socketTimeout: 30000,
connectionTimeout: 60000,
greetingTimeout: 60000,
socketTimeout: 60000,
});
// Existing Excel route unchanged, except transporter removal