CurrentIdentity.tsx

  1import React from 'react';
  2
  3import {
  4  Button,
  5  ClickAwayListener,
  6  Grow,
  7  Link,
  8  MenuItem,
  9  MenuList,
 10  Paper,
 11  Popper,
 12} from '@material-ui/core';
 13import Avatar from '@material-ui/core/Avatar';
 14import { makeStyles } from '@material-ui/core/styles';
 15import LockIcon from '@material-ui/icons/Lock';
 16
 17import { useCurrentIdentityQuery } from './CurrentIdentity.generated';
 18
 19const useStyles = makeStyles((theme) => ({
 20  displayName: {
 21    marginLeft: theme.spacing(2),
 22  },
 23  hidden: {
 24    display: 'none',
 25  },
 26  profileLink: {
 27    ...theme.typography.button,
 28  },
 29  popupButton: {
 30    textTransform: 'none',
 31    color: theme.palette.primary.contrastText,
 32  },
 33}));
 34
 35const CurrentIdentity = () => {
 36  const classes = useStyles();
 37  const { loading, error, data } = useCurrentIdentityQuery();
 38
 39  const [open, setOpen] = React.useState(false);
 40  const anchorRef = React.useRef<HTMLButtonElement>(null);
 41
 42  if (error || loading || !data?.repository?.userIdentity) return null;
 43
 44  const user = data.repository.userIdentity;
 45
 46  const handleToggle = () => {
 47    setOpen((prevOpen) => !prevOpen);
 48  };
 49
 50  const handleClose = (event: any) => {
 51    if (anchorRef.current && anchorRef.current.contains(event.target)) {
 52      return;
 53    }
 54    setOpen(false);
 55  };
 56
 57  return (
 58    <>
 59      <Button
 60        ref={anchorRef}
 61        aria-controls={open ? 'menu-list-grow' : undefined}
 62        aria-haspopup="true"
 63        onClick={handleToggle}
 64        className={classes.popupButton}
 65      >
 66        <Avatar src={user.avatarUrl ? user.avatarUrl : undefined}>
 67          {user.displayName.charAt(0).toUpperCase()}
 68        </Avatar>
 69        <div className={classes.displayName}>{user.displayName}</div>
 70        <LockIcon
 71          color="secondary"
 72          className={user.isProtected ? '' : classes.hidden}
 73        />
 74      </Button>
 75      <Popper
 76        open={open}
 77        anchorEl={anchorRef.current}
 78        role={undefined}
 79        transition
 80        disablePortal
 81      >
 82        {({ TransitionProps, placement }) => (
 83          <Grow
 84            {...TransitionProps}
 85            style={{
 86              transformOrigin:
 87                placement === 'bottom' ? 'center top' : 'center bottom',
 88            }}
 89          >
 90            <Paper>
 91              <ClickAwayListener onClickAway={handleClose}>
 92                <MenuList autoFocusItem={open} id="menu-list-grow">
 93                  <MenuItem>
 94                    <Link
 95                      color="inherit"
 96                      className={classes.profileLink}
 97                      href="/user"
 98                    >
 99                      Open profile
100                    </Link>
101                  </MenuItem>
102                </MenuList>
103              </ClickAwayListener>
104            </Paper>
105          </Grow>
106        )}
107      </Popper>
108    </>
109  );
110};
111
112export default CurrentIdentity;