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';
14
15import { useCurrentIdentityQuery } from './CurrentIdentity.generated';
16
17const useStyles = makeStyles((theme) => ({
18  displayName: {
19    marginLeft: theme.spacing(2),
20  },
21}));
22
23const CurrentIdentity = () => {
24  const classes = useStyles();
25  const { loading, error, data } = useCurrentIdentityQuery();
26
27  const [open, setOpen] = React.useState(false);
28  const anchorRef = React.useRef<HTMLButtonElement>(null);
29
30  if (error || loading || !data?.repository?.userIdentity) return null;
31
32  const user = data.repository.userIdentity;
33  const handleToggle = () => {
34    setOpen((prevOpen) => !prevOpen);
35  };
36
37  const handleClose = (event: any) => {
38    if (anchorRef.current && anchorRef.current.contains(event.target)) {
39      return;
40    }
41    setOpen(false);
42  };
43
44  return (
45    <>
46      <Button
47        ref={anchorRef}
48        aria-controls={open ? 'menu-list-grow' : undefined}
49        aria-haspopup="true"
50        onClick={handleToggle}
51      >
52        <Avatar src={user.avatarUrl ? user.avatarUrl : undefined}>
53          {user.displayName.charAt(0).toUpperCase()}
54        </Avatar>
55      </Button>
56      <Popper
57        open={open}
58        anchorEl={anchorRef.current}
59        role={undefined}
60        transition
61        disablePortal
62      >
63        {({ TransitionProps, placement }) => (
64          <Grow
65            {...TransitionProps}
66            style={{
67              transformOrigin:
68                placement === 'bottom' ? 'center top' : 'center bottom',
69            }}
70          >
71            <Paper>
72              <ClickAwayListener onClickAway={handleClose}>
73                <MenuList autoFocusItem={open} id="menu-list-grow">
74                  <MenuItem>Display Name: {user.displayName}</MenuItem>
75                  <MenuItem>Human Id: {user.humanId}</MenuItem>
76                  <MenuItem>Email: {user.email}</MenuItem>
77                </MenuList>
78              </ClickAwayListener>
79            </Paper>
80          </Grow>
81        )}
82      </Popper>
83      <div className={classes.displayName}>{user.displayName}</div>
84    </>
85  );
86};
87
88export default CurrentIdentity;