aboutsummaryrefslogtreecommitdiff
path: root/modern/src/components/BottomNav.js
blob: 3d1a6752b4a586afa8ab759391c71da601062ce6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import React from 'react';
import { useDispatch } from 'react-redux';
import { Link, useHistory } from 'react-router-dom';
import {
  makeStyles, Paper, Toolbar, IconButton, useMediaQuery, useTheme,
} from '@material-ui/core';

import ReplayIcon from '@material-ui/icons/Replay';
import DescriptionIcon from '@material-ui/icons/Description';
import ShuffleIcon from '@material-ui/icons/Shuffle';
import MapIcon from '@material-ui/icons/Map';
import LogoutIcon from '@material-ui/icons/ExitToApp';

import { sessionActions } from '../store';
import { useTranslation } from '../LocalizationProvider';

const useStyles = makeStyles((theme) => ({
  container: {
    bottom: theme.spacing(0),
    left: '0px',
    width: '100%',
    position: 'fixed',
    zIndex: 1301,
    [theme.breakpoints.up('lg')]: {
      left: theme.spacing(1.5),
      bottom: theme.spacing(1.5),
      width: theme.dimensions.drawerWidthDesktop,
    },
  },
  toolbar: {
    padding: theme.spacing(0, 2),
    display: 'flex',
    justifyContent: 'space-around',
    maxWidth: theme.dimensions.bottomNavMaxWidth,
    margin: 'auto',
  },
  navItem: {
    display: 'flex',
    flexDirection: 'column',
    fontSize: '0.75rem',
    fontWeight: 'normal',
  },
}));

const BottomNav = ({ showOnDesktop }) => {
  const classes = useStyles();
  const theme = useTheme();
  const history = useHistory();
  const t = useTranslation();

  const isDesktop = useMediaQuery(theme.breakpoints.up('lg'));
  const dispatch = useDispatch();

  const NavLink = ({ children, location }) => (
    <IconButton component={Link} classes={{ label: classes.navItem }} to={location}>
      {children}
    </IconButton>
  );

  const handleLogout = async () => {
    const response = await fetch('/api/session', { method: 'DELETE' });
    if (response.ok) {
      dispatch(sessionActions.updateUser(null));
      history.push('/login');
    }
  };

  if (isDesktop && !showOnDesktop) return null;

  return (
    <div className={classes.container}>
      <Paper square elevation={3}>
        <Toolbar className={classes.toolbar} disableGutters>

          {isDesktop ? (
            <NavLink location="/replay">
              <ReplayIcon />
              {t('reportReplay')}
            </NavLink>
          ) : (
            <NavLink location="/">
              <MapIcon />
              {t('mapTitle')}
            </NavLink>
          )}

          <NavLink location="/reports/route">
            <DescriptionIcon />
            {t('reportTitle')}
          </NavLink>

          <NavLink location="/settings/notifications">
            <ShuffleIcon />
            {t('settingsTitle')}
          </NavLink>

          <IconButton classes={{ label: classes.navItem }} onClick={handleLogout}>
            <LogoutIcon />
            {t('loginLogout')}
          </IconButton>
        </Toolbar>
      </Paper>
    </div>
  );
};

export default BottomNav;