mirror of
https://github.com/idanoo/GoScrobble.git
synced 2024-11-23 00:45:16 +00:00
Daniel Mason
e570314ac2
- Fix mobile menu auto collapse on select - Add /u/ route for public user profiles (Added private flag to db - to implement later) - Add /user route for your own profile / edit profile - Added handling for if API is offline/incorrect - Add index.html loading spinner while react bundle downloads - Change HashRouter to BrowserRouter - Added sources column to scrobbles
181 lines
5.2 KiB
JavaScript
181 lines
5.2 KiB
JavaScript
import { React, useState, useContext } from 'react';
|
|
import { Navbar, NavbarBrand, Collapse, Nav, NavbarToggler, NavItem } from 'reactstrap';
|
|
import { Link, useLocation } from 'react-router-dom';
|
|
import logo from '../logo.png';
|
|
import './Navigation.css';
|
|
|
|
import AuthContext from '../Contexts/AuthContext';
|
|
|
|
const menuItems = [
|
|
'Home',
|
|
'About',
|
|
];
|
|
|
|
const loggedInMenuItems = [
|
|
'Dashboard',
|
|
'About',
|
|
]
|
|
|
|
const isMobile = () => {
|
|
return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent))
|
|
};
|
|
|
|
const Navigation = () => {
|
|
const location = useLocation();
|
|
|
|
// Lovely hack to highlight the current page (:
|
|
let active = "Home"
|
|
if (location && location.pathname && location.pathname.length > 1) {
|
|
active = location.pathname.replace(/\//, "");
|
|
}
|
|
|
|
let activeStyle = { color: '#FFFFFF' };
|
|
let { user, Logout } = useContext(AuthContext);
|
|
let [collapsed, setCollapsed] = useState(true);
|
|
|
|
const toggleCollapsed = () => {
|
|
setCollapsed(!collapsed)
|
|
}
|
|
|
|
const renderMobileNav = () => {
|
|
return <Navbar color="dark" dark fixed="top">
|
|
<NavbarBrand className="mr-auto"><img src={logo} className="nav-logo" alt="logo" /> GoScrobble</NavbarBrand>
|
|
<NavbarToggler onClick={toggleCollapsed} className="mr-2" />
|
|
<Collapse isOpen={!collapsed} navbar>
|
|
{user ?
|
|
<Nav className="navLinkLoginMobile" navbar>
|
|
{loggedInMenuItems.map(menuItem =>
|
|
<NavItem key={menuItem}>
|
|
<Link
|
|
key={menuItem}
|
|
className="navLinkMobile"
|
|
style={active === menuItem ? activeStyle : {}}
|
|
to={menuItem}
|
|
onClick={toggleCollapsed}
|
|
>{menuItem}</Link>
|
|
</NavItem>
|
|
)}
|
|
<Link
|
|
to="/user"
|
|
style={active === "user" ? activeStyle : {}}
|
|
className="navLinkMobile"
|
|
onClick={toggleCollapsed}
|
|
>{user.username}</Link>
|
|
{user.admin &&
|
|
<Link
|
|
to="/admin"
|
|
style={active === "admin" ? activeStyle : {}}
|
|
className="navLink"
|
|
onClick={toggleCollapsed}
|
|
>Admin</Link>}
|
|
<Link to="/" className="navLink" onClick={Logout}>Logout</Link>
|
|
</Nav>
|
|
: <Nav className="navLinkLoginMobile" navbar>
|
|
{menuItems.map(menuItem =>
|
|
<NavItem key={menuItem}>
|
|
<Link
|
|
key={menuItem}
|
|
className="navLinkMobile"
|
|
style={active === menuItem ? activeStyle : {}}
|
|
to={menuItem === "Home" ? "/" : menuItem}
|
|
onClick={toggleCollapsed}
|
|
>{menuItem}
|
|
</Link>
|
|
</NavItem>
|
|
)}
|
|
<NavItem>
|
|
<Link
|
|
to="/Login"
|
|
style={active === "Login" ? activeStyle : {}}
|
|
className="navLinkMobile"
|
|
onClick={toggleCollapsed}
|
|
>Login</Link>
|
|
</NavItem>
|
|
<NavItem>
|
|
<Link
|
|
to="/Register"
|
|
className="navLinkMobile"
|
|
style={active === "Register" ? activeStyle : {}}
|
|
onClick={toggleCollapsed}
|
|
>Register</Link>
|
|
</NavItem>
|
|
</Nav>
|
|
}
|
|
</Collapse>
|
|
</Navbar>
|
|
}
|
|
|
|
const renderDesktopNav = () => {
|
|
return <Navbar color="dark" dark fixed="top">
|
|
<NavbarBrand className="mr-auto"><img src={logo} className="nav-logo" alt="logo" /> GoScrobble</NavbarBrand>
|
|
{user ?
|
|
<div>
|
|
{loggedInMenuItems.map(menuItem =>
|
|
<Link
|
|
key={menuItem}
|
|
className="navLink"
|
|
style={active === menuItem ? activeStyle : {}}
|
|
to={menuItem}
|
|
>
|
|
{menuItem}
|
|
</Link>
|
|
)}
|
|
</div>
|
|
: <div>
|
|
{menuItems.map(menuItem =>
|
|
<Link
|
|
key={menuItem}
|
|
className="navLink"
|
|
style={active === menuItem ? activeStyle : {}}
|
|
to={menuItem === "Home" ? "/" : menuItem}
|
|
>
|
|
{menuItem}
|
|
</Link>
|
|
)}
|
|
</div>
|
|
}
|
|
{user ?
|
|
<div className="navLinkLogin">
|
|
<Link
|
|
to="/user"
|
|
style={active === "user" ? activeStyle : {}}
|
|
className="navLink"
|
|
>{user.username}</Link>
|
|
{user.admin &&
|
|
<Link
|
|
to="/admin"
|
|
style={active === "admin" ? activeStyle : {}}
|
|
className="navLink"
|
|
>Admin</Link>}
|
|
<Link to="/admin" className="navLink" onClick={Logout}>Logout</Link>
|
|
</div>
|
|
:
|
|
<div className="navLinkLogin">
|
|
<Link
|
|
to="/login"
|
|
style={active === "login" ? activeStyle : {}}
|
|
className="navLink"
|
|
>Login</Link>
|
|
<Link
|
|
to="/register"
|
|
className="navLink"
|
|
style={active === "register" ? activeStyle : {}}
|
|
>Register</Link>
|
|
</div>
|
|
|
|
}
|
|
</Navbar>
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
{
|
|
isMobile()
|
|
? renderMobileNav()
|
|
: renderDesktopNav()
|
|
}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default Navigation; |