admin visibilty- temp fix
This commit is contained in:
@@ -15,6 +15,10 @@ function AuthPage() {
|
||||
});
|
||||
const [signin, setSignin] = useState(false);
|
||||
|
||||
const adminEmails = [
|
||||
"harshitha.ss@somaiya.edu",
|
||||
];
|
||||
|
||||
const notifyError = (message) => {
|
||||
toast.error(message);
|
||||
};
|
||||
@@ -70,27 +74,44 @@ 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const handleGoogleLogin = (event) => {
|
||||
event.preventDefault();
|
||||
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 />
|
||||
|
||||
@@ -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);
|
||||
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 >
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -16,6 +16,10 @@ const UserSchema = new mongoose.Schema(
|
||||
type: Date,
|
||||
default: null,
|
||||
},
|
||||
isAdmin:{
|
||||
type:Boolean,
|
||||
default: false,
|
||||
}
|
||||
},
|
||||
{
|
||||
timestamps: true,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user