Ignore:
Timestamp:
01/24/26 21:18:40 (6 months ago)
Author:
Mihail <mihail2.naumov@…>
Branches:
main
Children:
a744c90
Parents:
ad211d1
Message:

Fixed suggests component and also added hamburger menu for small screens for the navbar.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • components/Navbar.tsx

    rad211d1 r87b79bc  
    77import Menu from "@mui/material/Menu";
    88import MenuItem from "@mui/material/MenuItem";
     9import IconButton from "@mui/material/IconButton";
     10import Drawer from "@mui/material/Drawer";
     11import List from "@mui/material/List";
     12import ListItem from "@mui/material/ListItem";
     13import ListItemButton from "@mui/material/ListItemButton";
     14import ListItemIcon from "@mui/material/ListItemIcon";
     15import ListItemText from "@mui/material/ListItemText";
     16import Divider from "@mui/material/Divider";
     17import Collapse from "@mui/material/Collapse";
     18
    919import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
     20import MenuIcon from '@mui/icons-material/Menu';
     21import CloseIcon from '@mui/icons-material/Close';
     22import BuildIcon from '@mui/icons-material/Build';
     23import ViewListIcon from '@mui/icons-material/ViewList';
     24import ExpandLess from '@mui/icons-material/ExpandLess';
     25import ExpandMore from '@mui/icons-material/ExpandMore';
     26import PersonIcon from '@mui/icons-material/Person';
     27import LogoutIcon from '@mui/icons-material/Logout';
     28import LoginIcon from '@mui/icons-material/Login';
     29import PersonAddIcon from '@mui/icons-material/PersonAdd';
     30
    1031import {
    11     Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, ListItemText
     32    Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions
    1233} from "@mui/material";
    1334
     
    3960    { id: 'power_supply', label: 'Power Supplies', icon: <StorageIcon fontSize="small" /> },
    4061    { id: 'cooler', label: 'Cooling', icon: <StorageIcon fontSize="small" /> },
    41 
    42     // Peripherals / Accessories (Missing ones)
    4362    { id: 'network_adapter', label: 'Network Adapters (WiFi)', icon: <RouterIcon fontSize="small" /> },
    4463    { id: 'network_card', label: 'Network Cards (Ethernet)', icon: <LanIcon fontSize="small" /> },
     
    4968];
    5069
    51 
    5270export default function Navbar() {
    5371    const [auth, setAuth] = useState<AuthState | null>(null);
    5472    const [openLogoutDialog, setOpenLogoutDialog] = useState(false);
     73    const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false);
     74    const [mobileComponentsOpen, setMobileComponentsOpen] = useState(false);
    5575
    5676    const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
     
    7292        setBrowserOpen(true);
    7393        handleMenuClose();
     94        setMobileDrawerOpen(false);
     95        setMobileComponentsOpen(false);
    7496    };
    7597
     
    7799        e.preventDefault();
    78100        setOpenLogoutDialog(true);
     101        setMobileDrawerOpen(false);
    79102    };
    80103
     
    114137            <AppBar position="static" color="default" enableColorOnDark>
    115138                <Toolbar>
    116                     <Box sx={{ display: 'flex', alignItems: 'center', mr: 4 }}>
    117                         <Box component="img" src={LogoUrl} alt="PC Forge Logo" sx={{ height: 40, mr: 2, cursor: 'pointer' }} onClick={() => window.location.href='/'} />
    118                         <Typography variant="h6" component="a" href="/" sx={{ textDecoration: "none", color: "inherit", fontWeight: "bold" }}>
     139                    <Box sx={{ display: 'flex', alignItems: 'center', mr: { xs: 1, md: 4 } }}>
     140                        <Box
     141                            component="img"
     142                            src={LogoUrl}
     143                            alt="PC Forge Logo"
     144                            sx={{ height: 40, mr: { xs: 1, md: 2 }, cursor: 'pointer' }}
     145                            onClick={() => window.location.href='/'}
     146                        />
     147                        <Typography
     148                            variant="h6"
     149                            component="a"
     150                            href="/"
     151                            sx={{
     152                                textDecoration: "none",
     153                                color: "inherit",
     154                                fontWeight: "bold",
     155                                display: { xs: 'none', sm: 'block' }
     156                            }}
     157                        >
    119158                            PC Forge
    120159                        </Typography>
     
    140179                            {COMPONENT_CATEGORIES.map((cat) => (
    141180                                <MenuItem key={cat.id} onClick={() => handleCategorySelect(cat.id)}>
    142                                     {/*<ListItemIcon>{cat.icon}</ListItemIcon>*/}
     181                                    <ListItemIcon>{cat.icon}</ListItemIcon>
    143182                                    <ListItemText>{cat.label}</ListItemText>
    144183                                </MenuItem>
     
    151190                    <Box sx={{ flexGrow: 1 }} />
    152191
    153                     <Box sx={{ display: 'flex', gap: 1 }}>
     192                    <Box sx={{ display: { xs: 'none', md: 'flex' }, gap: 1 }}>
    154193                        {auth?.isLoggedIn ? (
    155194                            <>
     
    159198                        ) : (
    160199                            <>
    161                                 <Button color="inherit" href="/auth/login">Login</Button>
    162                                 <Button color="inherit" href="/auth/register">Register</Button>
     200                                <Button color="inherit" href="/auth/login" sx={onHoverNav}>Login</Button>
     201                                <Button color="inherit" href="/auth/register" sx={onHoverNav}>Register</Button>
    163202                            </>
    164203                        )}
    165204                    </Box>
     205
     206                    <IconButton
     207                        color="inherit"
     208                        edge="end"
     209                        onClick={() => setMobileDrawerOpen(true)}
     210                        sx={{ display: { xs: 'block', md: 'none' } }}
     211                    >
     212                        <MenuIcon />
     213                    </IconButton>
    166214                </Toolbar>
    167215            </AppBar>
     216
     217            <Drawer
     218                anchor="right"
     219                open={mobileDrawerOpen}
     220                onClose={() => setMobileDrawerOpen(false)}
     221                sx={{
     222                    display: { xs: 'block', md: 'none' },
     223                    '& .MuiDrawer-paper': { width: 280 , height: '60%'}
     224                }}
     225            >
     226                <Box sx={{ p: 2, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
     227                    <Typography variant="h6" fontWeight="bold">Menu</Typography>
     228                    <IconButton onClick={() => setMobileDrawerOpen(false)}>
     229                        <CloseIcon />
     230                    </IconButton>
     231                </Box>
     232                <Divider />
     233
     234                <List>
     235                    <ListItem disablePadding>
     236                        <ListItemButton onClick={() => { window.location.href = '/forge'; }}>
     237                            <ListItemIcon><BuildIcon /></ListItemIcon>
     238                            <ListItemText primary="Forge" />
     239                        </ListItemButton>
     240                    </ListItem>
     241
     242                    <ListItem disablePadding>
     243                        <ListItemButton onClick={() => setMobileComponentsOpen(!mobileComponentsOpen)}>
     244                            <ListItemIcon><ViewListIcon /></ListItemIcon>
     245                            <ListItemText primary="Components" />
     246                            {mobileComponentsOpen ? <ExpandLess /> : <ExpandMore />}
     247                        </ListItemButton>
     248                    </ListItem>
     249                    <Collapse in={mobileComponentsOpen} timeout="auto" unmountOnExit>
     250                        <List component="div" disablePadding>
     251                            {COMPONENT_CATEGORIES.map((cat) => (
     252                                <ListItemButton
     253                                    key={cat.id}
     254                                    sx={{ pl: 4 }}
     255                                    onClick={() => handleCategorySelect(cat.id)}
     256                                >
     257                                    <ListItemIcon>{cat.icon}</ListItemIcon>
     258                                    <ListItemText primary={cat.label} />
     259                                </ListItemButton>
     260                            ))}
     261                        </List>
     262                    </Collapse>
     263
     264                    <ListItem disablePadding>
     265                        <ListItemButton onClick={() => { window.location.href = '/completed-builds'; }}>
     266                            <ListItemIcon><ViewListIcon /></ListItemIcon>
     267                            <ListItemText primary="Completed Builds" />
     268                        </ListItemButton>
     269                    </ListItem>
     270
     271                    <Divider sx={{ my: 1 }} />
     272
     273                    {auth?.isLoggedIn ? (
     274                        <>
     275                            <ListItem disablePadding>
     276                                <ListItemButton onClick={() => { window.location.href = checkDashboardUrl; }}>
     277                                    <ListItemIcon><PersonIcon /></ListItemIcon>
     278                                    <ListItemText primary={"My Profile"} />
     279                                </ListItemButton>
     280                            </ListItem>
     281                            <ListItem disablePadding>
     282                                <ListItemButton onClick={handleLogoutClick}>
     283                                    <ListItemIcon><LogoutIcon /></ListItemIcon>
     284                                    <ListItemText primary="Logout" />
     285                                </ListItemButton>
     286                            </ListItem>
     287                        </>
     288                    ) : (
     289                        <>
     290                            <ListItem disablePadding>
     291                                <ListItemButton onClick={() => { window.location.href = '/auth/login'; }}>
     292                                    <ListItemIcon><LoginIcon /></ListItemIcon>
     293                                    <ListItemText primary="Login" />
     294                                </ListItemButton>
     295                            </ListItem>
     296                            <ListItem disablePadding>
     297                                <ListItemButton onClick={() => { window.location.href = '/auth/register'; }}>
     298                                    <ListItemIcon><PersonAddIcon /></ListItemIcon>
     299                                    <ListItemText primary="Register" />
     300                                </ListItemButton>
     301                            </ListItem>
     302                        </>
     303                    )}
     304                </List>
     305            </Drawer>
    168306
    169307            <Dialog open={openLogoutDialog} onClose={() => setOpenLogoutDialog(false)}>
Note: See TracChangeset for help on using the changeset viewer.