127 lines
4.6 KiB
TypeScript

import {
AppBar,
Toolbar,
Typography,
Button,
Menu,
MenuItem,
IconButton,
} from '@mui/material'
import { AccountCircle } from '@mui/icons-material'
import { Link, useNavigate, useLocation } from 'react-router-dom'
import { useAuth } from '../contexts/AuthContext'
import { useState } from 'react'
export default function Layout({ children }: { children: React.ReactNode }) {
const location = useLocation()
const navigate = useNavigate()
const { isLoggedIn, logout } = useAuth()
const [anchorElCharacter, setAnchorElCharacter] = useState<null | HTMLElement>(null)
const [anchorElHomework, setAnchorElHomework] = useState<null | HTMLElement>(null)
const [anchorElFriend, setAnchorElFriend] = useState<null | HTMLElement>(null)
const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null)
const handleMenuOpen = (
setter: React.Dispatch<React.SetStateAction<null | HTMLElement>>
) => (event: React.MouseEvent<HTMLElement>) => {
setter(event.currentTarget)
}
const handleMenuClose = (
setter: React.Dispatch<React.SetStateAction<null | HTMLElement>>
) => () => {
setter(null)
}
const handleUserMenuOpen = (event: React.MouseEvent<HTMLElement>) => {
setAnchorElUser(event.currentTarget)
}
const handleUserMenuClose = () => {
setAnchorElUser(null)
}
const handleLogout = () => {
logout()
navigate('/login')
}
const menuItems = isLoggedIn ? (
<>
<Button component={Link} to="/guide"> </Button>
<Button component={Link} to="/dashboard" color="inherit"></Button>
<Button color="inherit" onClick={handleMenuOpen(setAnchorElCharacter)}></Button>
<Menu
anchorEl={anchorElCharacter}
open={Boolean(anchorElCharacter)}
onClose={handleMenuClose(setAnchorElCharacter)}
>
<MenuItem component={Link} to="/characters" onClick={handleMenuClose(setAnchorElCharacter)}> </MenuItem>
<MenuItem component={Link} to="/characters/me/homeworks" onClick={handleMenuClose(setAnchorElCharacter)}> </MenuItem>
</Menu>
<Button color="inherit" onClick={handleMenuOpen(setAnchorElHomework)}></Button>
<Menu
anchorEl={anchorElHomework}
open={Boolean(anchorElHomework)}
onClose={handleMenuClose(setAnchorElHomework)}
>
<MenuItem component={Link} to="/homeworks" onClick={handleMenuClose(setAnchorElHomework)}> </MenuItem>
</Menu>
<Button color="inherit" onClick={handleMenuOpen(setAnchorElFriend)}></Button>
<Menu
anchorEl={anchorElFriend}
open={Boolean(anchorElFriend)}
onClose={handleMenuClose(setAnchorElFriend)}
>
<MenuItem component={Link} to="/friends" onClick={handleMenuClose(setAnchorElFriend)}></MenuItem>
<MenuItem component={Link} to="/friends/requests" onClick={handleMenuClose(setAnchorElFriend)}></MenuItem>
</Menu>
<IconButton color="inherit" onClick={handleUserMenuOpen} size="large">
<AccountCircle />
</IconButton>
<Menu
anchorEl={anchorElUser}
open={Boolean(anchorElUser)}
onClose={handleUserMenuClose}
>
<MenuItem onClick={() => { handleUserMenuClose(); navigate('/me') }}>
</MenuItem>
<MenuItem onClick={() => { handleUserMenuClose(); handleLogout() }}>
</MenuItem>
</Menu>
</>
) : (
<>
<Button component={Link} to="/guide"> </Button>
<Button component={Link} to="/signup" color="inherit"></Button>
<Button component={Link} to="/login" color="inherit"></Button>
</>
)
return (
<>
<AppBar position="static" key={location.pathname}>
<Toolbar>
<Typography variant="h6" sx={{ flexGrow: 1 }}>
<Button component={Link} to="/" color="inherit">
</Button>
</Typography>
{menuItems}
</Toolbar>
</AppBar>
{children}
</>
)
}