aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/common/AppBar.tsx
blob: 8349aef750311a4de62d8bf093182f8b06772ea5 (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 { useHistory, matchPath } from 'react-router';
import { Link, NavLink } from 'react-router-dom';
import { Navbar, NavbarToggler, Collapse, Nav, NavItem } from 'reactstrap';
import { useMediaQuery } from 'react-responsive';
import { useTranslation } from 'react-i18next';

import { useUser, useAvatar } from '../data/user';

import TimelineLogo from './TimelineLogo';
import BlobImage from './BlobImage';

const AppBar: React.FC = (_) => {
  const history = useHistory();
  const user = useUser();
  const avatar = useAvatar(user?.username);

  const { t } = useTranslation();

  const isUpMd = useMediaQuery({
    minWidth: getComputedStyle(document.documentElement).getPropertyValue(
      '--breakpoint-md'
    ),
  });

  const [isMenuOpen, setIsMenuOpen] = React.useState(false);

  const toggleMenu = React.useCallback((): void => {
    setIsMenuOpen((oldIsMenuOpen) => !oldIsMenuOpen);
  }, []);

  const isAdministrator = user && user.administrator;

  const rightArea = (
    <div className="ml-auto mr-2">
      {user != null ? (
        <NavLink to={`/users/${user.username}`}>
          <BlobImage
            className="avatar small rounded-circle bg-white"
            blob={avatar}
          />
        </NavLink>
      ) : (
        <NavLink className="text-light" to="/login">
          {t('nav.login')}
        </NavLink>
      )}
    </div>
  );

  return (
    <Navbar dark className="fixed-top w-100 bg-primary app-bar" expand="md">
      <Link to="/" className="navbar-brand d-flex align-items-center">
        <TimelineLogo style={{ height: '1em' }} />
        Timeline
      </Link>

      {isUpMd ? null : rightArea}

      <NavbarToggler onClick={toggleMenu} />
      <Collapse isOpen={isMenuOpen} navbar>
        <Nav className="mr-auto" navbar>
          <NavItem
            className={
              matchPath(history.location.pathname, '/settings')
                ? 'active'
                : undefined
            }
          >
            <NavLink className="nav-link" to="/settings">
              {t('nav.settings')}
            </NavLink>
          </NavItem>

          <NavItem
            className={
              matchPath(history.location.pathname, '/about')
                ? 'active'
                : undefined
            }
          >
            <NavLink className="nav-link" to="/about">
              {t('nav.about')}
            </NavLink>
          </NavItem>

          {isAdministrator && (
            <NavItem
              className={
                matchPath(history.location.pathname, '/admin')
                  ? 'active'
                  : undefined
              }
            >
              <NavLink className="nav-link" to="/admin">
                Administration
              </NavLink>
            </NavItem>
          )}
        </Nav>
        {isUpMd ? rightArea : null}
      </Collapse>
    </Navbar>
  );
};

export default AppBar;