CurrentIdentity.tsx

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