CurrentIdentity.tsx

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