3
3
4
4
import React , { useState } from 'react' ;
5
5
import PropTypes from 'prop-types' ;
6
- import { Box , Menu , MenuItem , makeStyles } from '@material-ui/core' ;
6
+ import { Box , Menu , MenuItem , makeStyles , ClickAwayListener } from '@material-ui/core' ;
7
7
import { ArrowRight as ArrowRightIcon , Check as CheckIcon } from '@material-ui/icons' ;
8
8
9
9
const useStyles = makeStyles ( ( theme ) => ( {
@@ -47,114 +47,106 @@ const useStyles = makeStyles((theme) => ({
47
47
menuIcon : {
48
48
marginLeft : '20px' ,
49
49
} ,
50
- docLink : {
51
- color : theme . palette . primary . contrastText ,
52
- } ,
53
50
} ) ) ;
54
51
55
52
export const UserInfo = ( props ) => {
56
53
const classes = useStyles ( ) ;
57
- const [ isMenuOpened , setIsMenuOpened ] = useState ( false ) ;
58
- const [ isLangMenuOpened , setLangIsMenuOpened ] = useState ( false ) ;
54
+ const [ isMenuOpen , setMenuOpen ] = useState ( false ) ;
55
+ const [ isLanguageMenuOpen , setLanguangeMenuOpen ] = useState ( false ) ;
59
56
const [ anchorEl , setAnchorEl ] = useState ( null ) ;
60
57
const [ langAnchorEl , setLangAnchorEl ] = useState ( null ) ;
61
58
59
+ const handleClose = ( ) => {
60
+ setMenuOpen ( false ) ;
61
+ setLanguangeMenuOpen ( false ) ;
62
+ } ;
63
+
62
64
const handleClick = ( e ) => {
63
65
setAnchorEl ( e . target ) ;
64
- setIsMenuOpened ( ! isMenuOpened ) ;
66
+ setMenuOpen ( ! isMenuOpen ) ;
65
67
} ;
66
68
67
69
const handleLanguageMenuClick = ( e ) => {
68
70
setLangAnchorEl ( e . target ) ;
69
- setLangIsMenuOpened ( ! isLangMenuOpened ) ;
71
+ setLanguangeMenuOpen ( ! isLanguageMenuOpen ) ;
70
72
} ;
71
73
72
74
const setLanguage = ( lang ) => {
73
- setIsMenuOpened ( false ) ;
74
- setLangIsMenuOpened ( false ) ;
75
75
changeLanguage ( lang ) ;
76
+ handleClose ( ) ;
76
77
} ;
77
78
78
- const { userName, profilePlaceholder, languages, documentationUrl, onLogout, changeLanguage, language, labels } =
79
- props ;
79
+ const { userName, profilePlaceholder, languages, onLogout, changeLanguage, language, labels } = props ;
80
80
81
81
return (
82
- < React . Fragment >
83
- < Box
84
- data-cy = "user-profile-menu"
85
- aria-controls = "user-profile-button"
86
- aria-haspopup = "true"
87
- onClick = { handleClick }
88
- className = { `${ classes . menuTrigger } ${ isMenuOpened ? 'active' : '' } ` }
89
- >
90
- < img className = { classes . profilePic } src = { profilePlaceholder } />
91
- < span className = { classes . userName } > { userName } </ span >
92
- </ Box >
93
- < Menu
94
- className = { classes . menu }
95
- data-cy = "main-menu"
96
- keepMounted
97
- anchorEl = { anchorEl }
98
- open = { isMenuOpened }
99
- onClose = { handleClick }
100
- >
101
- { languages && (
102
- < MenuItem data-cy = "change-language" onClick = { handleLanguageMenuClick } className = { classes . menuContainer } >
103
- { labels . language }
104
- < ArrowRightIcon className = { classes . menuIcon } />
105
- </ MenuItem >
106
- ) }
107
- { documentationUrl && (
108
- < MenuItem data-cy = "download-documentation" >
109
- < a href = { documentationUrl } className = { classes . docLink } target = "_blank" rel = "noreferrer" >
110
- { labels . documentation }
111
- </ a >
112
- </ MenuItem >
113
- ) }
114
- < MenuItem data-cy = "logout" onClick = { onLogout } >
115
- { labels . logOut }
116
- </ MenuItem >
117
- </ Menu >
118
- { languages && (
82
+ < ClickAwayListener onClickAway = { handleClose } >
83
+ < div >
84
+ < Box
85
+ data-cy = "user-profile-menu"
86
+ aria-controls = "user-profile-button"
87
+ aria-haspopup = "true"
88
+ onClick = { handleClick }
89
+ className = { `${ classes . menuTrigger } ${ isMenuOpen ? 'active' : '' } ` }
90
+ >
91
+ < img className = { classes . profilePic } src = { profilePlaceholder } />
92
+ < span className = { classes . userName } > { userName } </ span >
93
+ </ Box >
94
+
119
95
< Menu
120
96
className = { classes . menu }
121
- id = "simple -menu"
97
+ data-cy = "main -menu"
122
98
keepMounted
123
- anchorEl = { langAnchorEl }
124
- getContentAnchorEl = { null }
125
- anchorOrigin = { { vertical : 'top' , horizontal : 'left' } }
126
- transformOrigin = { { vertical : 'center' , horizontal : 'right' } }
127
- open = { isLangMenuOpened }
128
- onClose = { handleLanguageMenuClick }
99
+ anchorEl = { anchorEl }
100
+ open = { isMenuOpen }
101
+ onClose = { handleClick }
129
102
>
130
- {
131
- // Language menu items
132
- Object . entries ( languages ) . map ( ( [ langKey , langLabel ] ) => (
133
- < MenuItem
134
- data-cy = { 'set-lang-' + langKey }
135
- key = { langKey }
136
- onClick = { ( ) => setLanguage ( langKey ) }
137
- className = { classes . menuContainer }
138
- >
139
- { langLabel }
140
- {
141
- // Add a check mark for the currently selected language
142
- langKey === language && < CheckIcon className = { classes . menuIcon } />
143
- }
144
- </ MenuItem >
145
- ) )
146
- }
103
+ { languages && (
104
+ < MenuItem data-cy = "change-language" onClick = { handleLanguageMenuClick } className = { classes . menuContainer } >
105
+ { labels . language }
106
+ < ArrowRightIcon className = { classes . menuIcon } />
107
+ </ MenuItem >
108
+ ) }
109
+ < MenuItem data-cy = "logout" onClick = { onLogout } >
110
+ { labels . logOut }
111
+ </ MenuItem >
147
112
</ Menu >
148
- ) }
149
- </ React . Fragment >
113
+ { languages && (
114
+ < Menu
115
+ className = { classes . menu }
116
+ id = "simple-menu"
117
+ keepMounted
118
+ anchorEl = { langAnchorEl }
119
+ getContentAnchorEl = { null }
120
+ anchorOrigin = { { vertical : 'top' , horizontal : 'left' } }
121
+ transformOrigin = { { vertical : 'center' , horizontal : 'right' } }
122
+ open = { isLanguageMenuOpen }
123
+ onClose = { handleLanguageMenuClick }
124
+ >
125
+ {
126
+ // Language menu items
127
+ Object . entries ( languages ) . map ( ( [ langKey , langLabel ] ) => (
128
+ < MenuItem
129
+ data-cy = { 'set-lang-' + langKey }
130
+ key = { langKey }
131
+ onClick = { ( ) => setLanguage ( langKey ) }
132
+ className = { classes . menuContainer }
133
+ >
134
+ { langLabel }
135
+ {
136
+ // Add a check mark for the currently selected language
137
+ langKey === language && < CheckIcon className = { classes . menuIcon } />
138
+ }
139
+ </ MenuItem >
140
+ ) )
141
+ }
142
+ </ Menu >
143
+ ) }
144
+ </ div >
145
+ </ ClickAwayListener >
150
146
) ;
151
147
} ;
152
148
153
149
UserInfo . propTypes = {
154
- /**
155
- * Documentation url
156
- */
157
- documentationUrl : PropTypes . string ,
158
150
/**
159
151
* List of available languages
160
152
*/
@@ -185,14 +177,12 @@ UserInfo.propTypes = {
185
177
* <pre>
186
178
{
187
179
language: 'string',
188
- documentation: 'string',
189
180
logOut: 'string'
190
181
}
191
182
* </pre>
192
183
*/
193
184
labels : PropTypes . shape ( {
194
185
language : PropTypes . string . isRequired ,
195
- documentation : PropTypes . string . isRequired ,
196
186
logOut : PropTypes . string . isRequired ,
197
187
} ) ,
198
188
} ;
@@ -201,7 +191,6 @@ UserInfo.defaultProps = {
201
191
profilePictureUrl : '../../assets/profile_placeholder.png' ,
202
192
labels : {
203
193
language : 'Change language' ,
204
- documentation : 'Download documentation' ,
205
194
logOut : 'Log out' ,
206
195
} ,
207
196
} ;
0 commit comments