import { Box, Container, IconButton, Menu, MenuItem, MenuList, Paper, Grow, Popper } from '@material-ui/core'; import AccountCircle from '@material-ui/icons/AccountCircle'; import AppBar from '@material-ui/core/AppBar'; import { positions } from '@material-ui/system'; import { createMuiTheme, createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import Toolbar from '@material-ui/core/Toolbar'; import Typography from '@material-ui/core/Typography'; import { ThemeProvider } from '@material-ui/styles'; import React, { useState, } from 'react'; import { BrowserRouter, NavLink, Redirect, Route, Switch, Link } from 'react-router-dom'; import BirdmapTitle from './components/appBar/BirdmapTitle'; import Auth from './components/auth/Auth'; import AuthService from './components/auth/AuthService'; import { ClickAwayListener } from '@material-ui/core'; import MapContainer from './components/heatmap/Heatmap'; import Devices from './components/devices/Devices'; import { blueGrey, blue, orange, grey } from '@material-ui/core/colors'; import DevicesContextProvider from './contexts/DevicesContextProvider' import Dashboard from './components/dashboard/Dashboard'; const theme = createMuiTheme({ palette: { primary: { main: blueGrey[900], dark: grey[400], }, secondary: { main: orange[200], dark: blueGrey[50], } }, }); function App() { const [authenticated, setAuthenticated] = useState(AuthService.isAuthenticated()); const [isAdmin, setIsAdmin] = useState(AuthService.isAdmin()); const onAuthenticated = () => { setAuthenticated(AuthService.isAuthenticated()); setIsAdmin(AuthService.isAdmin()); }; const AuthComponent = () => { return ( ); } const DashboardComponent = () => { return ; }; const DevicesComponent = () => { return ; }; const HeatmapComponent = () => { return ( ); }; return ( ); } export default App; const PublicRoute = ({ component: Component, ...rest }: { [x: string]: any, component: any}) => { return ( ( )} /> ); } const PrivateRoute = ({ component: Component, authenticated: Authenticated, ...rest }: { [x: string]: any, component: any, authenticated: any }) => { return ( ( Authenticated ? : )} /> ); }; const DefaultLayout = ({ component: Component, authenticated: Authenticated, ...rest }: { [x: string]: any, component: any, authenticated: any }) => { const classes = useDefaultLayoutStyles(); const [open, setOpen] = React.useState(false); const anchorRef = React.useRef(null); const handleToggle = () => { setOpen((prevOpen) => !prevOpen); }; const handleClose = (event: React.MouseEvent) => { if (anchorRef.current && anchorRef.current.contains(event.target as HTMLElement)) { return; } setOpen(false); }; const handleLogout = (event: React.MouseEvent) => { if (anchorRef.current && anchorRef.current.contains(event.target as HTMLElement)) { return; } AuthService.logout(); setOpen(false); }; function handleListKeyDown(event: React.KeyboardEvent) { if (event.key === 'Tab') { event.preventDefault(); setOpen(false); } } const prevOpen = React.useRef(open); React.useEffect(() => { if (prevOpen.current === true && open === false) { anchorRef.current!.focus(); } prevOpen.current = open; }, [open]); const renderNavLinks = () => { return Authenticated ? Dashboard Devices Heatmap {({ TransitionProps, placement }) => ( Logout )} : null; }; return ( {renderNavLinks()} ); }; const useDefaultLayoutStyles = makeStyles((theme: Theme) => createStyles({ bar_root: { height: '7%', }, box_root: { backgroundColor: theme.palette.primary.dark, height: '93%', }, typo: { marginLeft: 'auto', color: 'white', }, nav_menu: { display: 'flex', flexDirection: 'row', alignItems: 'center', }, nav_menu_icon: { color: 'inherit', marginLeft: '24px', '&:hover': { color: 'inherit', } }, nav_menu_item: { textDecoration: 'none', fontWeight: 'normal', color: 'inherit', marginLeft: '24px', '&:hover': { color: 'inherit', } }, nav_menu_item_active: { textDecoration: 'underline', fontWeight: 'bold', color: 'inherit', marginLeft: '24px', '&:hover': { color: 'inherit', } }, }), );