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;