import { useState } from "react"; import { Box, List, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, MenuItem, Stack, Tooltip, Typography, } from "@mui/material"; import { useLocation, useNavigate } from "react-router"; import { useTheme } from "@emotion/react"; import { useDispatch, useSelector } from "react-redux"; import { clearAuthState } from "../../Features/Auth/authSlice"; import { clearUptimeMonitorState } from "../../Features/UptimeMonitors/uptimeMonitorsSlice"; import Avatar from "../Avatar"; import LockSvg from "../../assets/icons/lock.svg?react"; import UserSvg from "../../assets/icons/user.svg?react"; import TeamSvg from "../../assets/icons/user-two.svg?react"; import LogoutSvg from "../../assets/icons/logout.svg?react"; import BWULogo from "../../assets/Images/bwl-logo.svg?react"; import Support from "../../assets/icons/support.svg?react"; import StatusPages from "../../assets/icons/status-pages.svg?react"; import Maintenance from "../../assets/icons/maintenance.svg?react"; import Monitors from "../../assets/icons/monitors.svg?react"; import Incidents from "../../assets/icons/incidents.svg?react"; import Integrations from "../../assets/icons/integrations.svg?react"; import PageSpeed from "../../assets/icons/page-speed.svg?react"; import Settings from "../../assets/icons/settings.svg?react"; import Arrow from "../../assets/icons/down-arrow.svg?react"; import "./index.css"; const menu = [ { name: "Monitors", path: "monitors", icon: }, { name: "Incidents", path: "incidents", icon: }, { name: "Status pages", path: "status", icon: }, { name: "Maintenance", path: "maintenance", icon: }, { name: "Page speed", path: "pagespeed", icon: }, { name: "Integrations", path: "integrations", icon: }, ]; const other = [ { name: "Support", path: "support", icon: }, { name: "Settings", path: "settings", icon: }, ]; const icons = { Profile: , Team: , Password: , Logout: , }; /** * @component * Sidebar component serves as a sidebar containing a menu. * * @returns {JSX.Element} The JSX element representing the Sidebar component. */ function Sidebar() { const theme = useTheme(); const navigate = useNavigate(); const location = useLocation(); const dispatch = useDispatch(); const [anchorElUser, setAnchorElUser] = useState(null); const authState = useSelector((state) => state.auth); // Initialize settings and update based on user role let settings = ["Profile", "Password", "Team", "Logout"]; if (authState.user?.role && !authState.user.role.includes("admin")) { settings = ["Profile", "Password", "Logout"]; } /** * Handles opening the user menu. * * @param {React.MouseEvent} event - The event triggered by clicking the user menu button. */ const handleOpenUserMenu = (event) => { setAnchorElUser(event.currentTarget); }; /** * Handles logging out the user * */ const logout = async () => { // Clear auth state dispatch(clearAuthState()); dispatch(clearUptimeMonitorState()); navigate("/login"); }; /** * Handles closing the user menu. */ const handleCloseUserMenu = (setting) => { setAnchorElUser(null); switch (setting) { case "Profile": navigate("/account/profile"); break; case "Team": navigate("/account/team"); break; case "Password": navigate("/account/password"); break; case "Logout": logout(); break; default: break; } }; return ( {/* menu */} Menu } sx={{ width: "100%" }} > {menu.map((item) => ( navigate(`/${item.path}`)} sx={{ gap: theme.gap.medium, borderRadius: `${theme.shape.borderRadius}px`, }} > {item.icon} {item.name} ))} {/* other */} Other } sx={{ width: "100%" }} > {other.map((item) => ( item.path === "support" ? window.open( "https://github.com/bluewave-labs/bluewave-uptime", "_blank", "noreferrer" ) : navigate(`/${item.path}`) } sx={{ gap: theme.gap.medium, borderRadius: `${theme.shape.borderRadius}px`, }} > {item.icon} {item.name} ))} {authState.user?.firstName} {authState.user?.lastName} {settings.map((setting) => ( handleCloseUserMenu(setting)}> {icons[setting]} {setting} ))} {/* {menu.map((item) => ( item.path === "support" ? window.open( "https://github.com/bluewave-labs/bluewave-uptime", "_blank", "noreferrer" ) : navigate(`/${item.path}`) } > {item.icon} {item.name} ))} */} ); } export default Sidebar;