33
44import React , { useState } from 'react' ;
55import 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' ;
77import { ArrowRight as ArrowRightIcon , Check as CheckIcon } from '@material-ui/icons' ;
88
99const useStyles = makeStyles ( ( theme ) => ( {
@@ -47,114 +47,106 @@ const useStyles = makeStyles((theme) => ({
4747 menuIcon : {
4848 marginLeft : '20px' ,
4949 } ,
50- docLink : {
51- color : theme . palette . primary . contrastText ,
52- } ,
5350} ) ) ;
5451
5552export const UserInfo = ( props ) => {
5653 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 ) ;
5956 const [ anchorEl , setAnchorEl ] = useState ( null ) ;
6057 const [ langAnchorEl , setLangAnchorEl ] = useState ( null ) ;
6158
59+ const handleClose = ( ) => {
60+ setMenuOpen ( false ) ;
61+ setLanguangeMenuOpen ( false ) ;
62+ } ;
63+
6264 const handleClick = ( e ) => {
6365 setAnchorEl ( e . target ) ;
64- setIsMenuOpened ( ! isMenuOpened ) ;
66+ setMenuOpen ( ! isMenuOpen ) ;
6567 } ;
6668
6769 const handleLanguageMenuClick = ( e ) => {
6870 setLangAnchorEl ( e . target ) ;
69- setLangIsMenuOpened ( ! isLangMenuOpened ) ;
71+ setLanguangeMenuOpen ( ! isLanguageMenuOpen ) ;
7072 } ;
7173
7274 const setLanguage = ( lang ) => {
73- setIsMenuOpened ( false ) ;
74- setLangIsMenuOpened ( false ) ;
7575 changeLanguage ( lang ) ;
76+ handleClose ( ) ;
7677 } ;
7778
78- const { userName, profilePlaceholder, languages, documentationUrl, onLogout, changeLanguage, language, labels } =
79- props ;
79+ const { userName, profilePlaceholder, languages, onLogout, changeLanguage, language, labels } = props ;
8080
8181 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+
11995 < Menu
12096 className = { classes . menu }
121- id = "simple -menu"
97+ data-cy = "main -menu"
12298 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 }
129102 >
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 >
147112 </ 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 >
150146 ) ;
151147} ;
152148
153149UserInfo . propTypes = {
154- /**
155- * Documentation url
156- */
157- documentationUrl : PropTypes . string ,
158150 /**
159151 * List of available languages
160152 */
@@ -185,14 +177,12 @@ UserInfo.propTypes = {
185177 * <pre>
186178 {
187179 language: 'string',
188- documentation: 'string',
189180 logOut: 'string'
190181 }
191182 * </pre>
192183 */
193184 labels : PropTypes . shape ( {
194185 language : PropTypes . string . isRequired ,
195- documentation : PropTypes . string . isRequired ,
196186 logOut : PropTypes . string . isRequired ,
197187 } ) ,
198188} ;
@@ -201,7 +191,6 @@ UserInfo.defaultProps = {
201191 profilePictureUrl : '../../assets/profile_placeholder.png' ,
202192 labels : {
203193 language : 'Change language' ,
204- documentation : 'Download documentation' ,
205194 logOut : 'Log out' ,
206195 } ,
207196} ;
0 commit comments