Skip to content

Commit af77a35

Browse files
committed
Convert user-dropdown to functional
1 parent e2d7c84 commit af77a35

File tree

3 files changed

+70
-69
lines changed

3 files changed

+70
-69
lines changed

frontend/src/components/ibutsu-header.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
3939
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
4040

4141

42-
import { FileUpload, UserDropdown } from '../components';
42+
import { FileUpload } from '../components';
43+
import UserDropdown from './user-dropdown';
4344
import { VERSION } from '../constants';
4445
import { HttpClient } from '../services/http';
4546
import { Settings } from '../settings';

frontend/src/components/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ export { ResultView } from './result';
1515
export { RunSummary } from './runsummary';
1616
export { TabTitle } from './tabs';
1717
export { TableEmptyState, TableErrorState } from './tablestates';
18-
export { UserDropdown } from './user-dropdown';
1918
export { View } from './view';
2019
export { EditWidgetModal } from './edit-widget-modal';
Lines changed: 68 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useContext, useState, useEffect } from 'react';
22
import PropTypes from 'prop-types';
33

44
import {
@@ -13,86 +13,87 @@ import { Link } from 'react-router-dom';
1313
import { AuthService } from '../services/auth';
1414
import { IbutsuContext } from '../services/context';
1515

16-
export class UserDropdown extends React.Component {
17-
static contextType = IbutsuContext;
18-
static propTypes = {
19-
eventEmitter: PropTypes.object
20-
}
16+
const UserDropdown = (props) => {
17+
const context = useContext(IbutsuContext);
18+
// TODO:
19+
// static propTypes = {
20+
// eventEmitter: PropTypes.object
21+
// }
2122

22-
constructor(props) {
23-
super(props);
24-
this.eventEmitter = props.eventEmitter;
25-
this.state = {
26-
displayName: 'User',
27-
isDropdownOpen: false,
28-
isSuperAdmin: false
29-
};
30-
this.eventEmitter.on('updateUserName', (userName) => {
31-
this.updateUserName(userName);
32-
});
33-
}
23+
// const eventEmitter = props.eventEmitter;
24+
25+
const [displayName, setDisplayName] = useState('User');
26+
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
27+
const [isSuperAdmin, setIsSuperAdmin] = useState(false);
3428

35-
updateUserName(userName) {
29+
30+
// TODO:
31+
// this.eventEmitter.on('updateUserName', (userName) => {
32+
// this.updateUserName(userName);
33+
// })
34+
35+
function updateUserName(userName) {
3636
// Update the user in the browser
3737
const sessionUser = AuthService.getUser();
3838
sessionUser.name = userName;
3939
AuthService.setUser(sessionUser);
40-
this.setState({displayName: userName});
40+
setDisplayName(userName);
4141
}
4242

43-
onDropdownToggle = () => {
44-
this.setState({isDropdownOpen: !this.state.isDropdownOpen});
45-
};
43+
function onDropdownToggle() {
44+
setIsDropdownOpen(!isDropdownOpen);
45+
}
4646

47-
onDropdownSelect = () => {
48-
this.setState({isDropdownOpen: false});
49-
};
47+
function onDropdownSelect() {
48+
setIsDropdownOpen(false);
49+
}
5050

51-
logout = () => {
52-
const { setPrimaryObject } = this.context;
53-
setPrimaryObject();
51+
function logout() {
52+
const { primaryObject } = context;
5453
AuthService.logout();
5554
window.location = '/';
5655
}
5756

58-
componentDidMount() {
59-
AuthService.isSuperAdmin().then(isSuperAdmin => this.setState({isSuperAdmin}));
60-
this.setState({
61-
displayName: AuthService.getUser() && (AuthService.getUser().name || AuthService.getUser().email)
62-
});
63-
}
57+
useEffect(() => {
58+
AuthService.isSuperAdmin().then(isSuperAdmin => setIsSuperAdmin(isSuperAdmin));
59+
setDisplayName(AuthService.getUser() && (AuthService.getUser().name || AuthService.getUser().email));
60+
});
6461

65-
render() {
66-
return (
67-
<Dropdown
68-
isOpen={this.state.isDropdownOpen}
69-
onSelect={this.onDropdownSelect}
70-
onOpenChange={() => this.setState({isDropdownOpen: false})}
71-
toggle={toggleRef => (
72-
<MenuToggle
73-
ref={toggleRef}
74-
onClick={this.onDropdownToggle}
75-
isExpanded={this.state.isDropdownOpen}
76-
icon={<UserIcon />}
77-
>
78-
{this.state.displayName}
79-
</MenuToggle>
80-
)}
81-
>
82-
<DropdownList>
83-
<DropdownItem key="profile">
84-
<Link to="/profile/user" className="pf-v5-c-menu__list-item">Profile</Link>
85-
</DropdownItem>
86-
{!!this.state.isSuperAdmin &&
87-
<DropdownItem key="admin">
88-
<Link to="/admin/home" className="pf-v5-c-menu__list-item">Administration</Link>
89-
</DropdownItem>
90-
}
91-
<DropdownItem key="logout" onClick={this.logout}>
92-
Logout
62+
return (
63+
<Dropdown
64+
isOpen={isDropdownOpen}
65+
onSelect={onDropdownSelect}
66+
onOpenChange={() => setIsDropdownOpen(false)}
67+
toggle={toggleRef => (
68+
<MenuToggle
69+
ref={toggleRef}
70+
onClick={onDropdownToggle}
71+
isExpanded={isDropdownOpen}
72+
icon={<UserIcon />}
73+
>
74+
{displayName}
75+
</MenuToggle>
76+
)}
77+
>
78+
<DropdownList>
79+
<DropdownItem key="profile">
80+
<Link to="/profile/user" className="pf-v5-c-menu__list-item">Profile</Link>
81+
</DropdownItem>
82+
{!!isSuperAdmin &&
83+
<DropdownItem key="admin">
84+
<Link to="/admin/home" className="pf-v5-c-menu__list-item">Administration</Link>
9385
</DropdownItem>
94-
</DropdownList>
95-
</Dropdown>
96-
);
97-
}
86+
}
87+
<DropdownItem key="logout" onClick={logout}>
88+
Logout
89+
</DropdownItem>
90+
</DropdownList>
91+
</Dropdown>
92+
);
9893
}
94+
95+
UserDropdown.propTypes = {
96+
// eventEmitter: PropTypes.object
97+
};
98+
99+
export default UserDropdown;

0 commit comments

Comments
 (0)