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 },
32}));
33
34const CurrentIdentity = () => {
35 const classes = useStyles();
36 const { loading, error, data } = useCurrentIdentityQuery();
37
38 const [open, setOpen] = React.useState(false);
39 const anchorRef = React.useRef<HTMLButtonElement>(null);
40
41 if (error || loading || !data?.repository?.userIdentity) return null;
42
43 const user = data.repository.userIdentity;
44
45 const handleToggle = () => {
46 setOpen((prevOpen) => !prevOpen);
47 };
48
49 const handleClose = (event: any) => {
50 if (anchorRef.current && anchorRef.current.contains(event.target)) {
51 return;
52 }
53 setOpen(false);
54 };
55
56 return (
57 <>
58 <Button
59 ref={anchorRef}
60 aria-controls={open ? 'menu-list-grow' : undefined}
61 aria-haspopup="true"
62 onClick={handleToggle}
63 className={classes.popupButton}
64 >
65 <Avatar src={user.avatarUrl ? user.avatarUrl : undefined}>
66 {user.displayName.charAt(0).toUpperCase()}
67 </Avatar>
68 <div className={classes.displayName}>{user.displayName}</div>
69 <LockIcon
70 color="secondary"
71 className={user.isProtected ? '' : classes.hidden}
72 />
73 </Button>
74 <Popper
75 open={open}
76 anchorEl={anchorRef.current}
77 role={undefined}
78 transition
79 disablePortal
80 >
81 {({ TransitionProps, placement }) => (
82 <Grow
83 {...TransitionProps}
84 style={{
85 transformOrigin:
86 placement === 'bottom' ? 'center top' : 'center bottom',
87 }}
88 >
89 <Paper>
90 <ClickAwayListener onClickAway={handleClose}>
91 <MenuList autoFocusItem={open} id="menu-list-grow">
92 <MenuItem>
93 <Link
94 color="inherit"
95 className={classes.profileLink}
96 href="/user"
97 >
98 Open profile
99 </Link>
100 </MenuItem>
101 </MenuList>
102 </ClickAwayListener>
103 </Paper>
104 </Grow>
105 )}
106 </Popper>
107 </>
108 );
109};
110
111export default CurrentIdentity;