fleet/frontend/components/side_panels/SiteNavHeader/SiteNavHeader.jsx

109 lines
2.7 KiB
React
Raw Normal View History

2016-12-01 22:14:39 +00:00
import React, { Component, PropTypes } from 'react';
import classnames from 'classnames';
import configInterface from 'interfaces/config';
import OrgLogoIcon from 'components/icons/OrgLogoIcon';
import Icon from 'components/icons/Icon';
import userInterface from 'interfaces/user';
import UserMenu from 'components/side_panels/SiteNavHeader/UserMenu';
2016-12-01 22:14:39 +00:00
class SiteNavHeader extends Component {
2016-12-01 22:14:39 +00:00
static propTypes = {
config: configInterface,
onLogoutUser: PropTypes.func,
onNavItemClick: PropTypes.func,
2016-12-01 22:14:39 +00:00
user: userInterface,
};
constructor (props) {
super(props);
this.state = { userMenuOpened: false };
2016-12-01 22:14:39 +00:00
}
componentDidMount = () => {
const { document } = global;
const { closeUserMenu } = this;
2016-12-01 22:14:39 +00:00
document.addEventListener('mousedown', closeUserMenu, false);
}
setHeaderNav = (ref) => {
this.headerNav = ref;
return false;
}
closeUserMenu = ({ target }) => {
2016-12-01 22:14:39 +00:00
const { headerNav } = this;
if (headerNav && !headerNav.contains(target)) {
2016-12-01 22:14:39 +00:00
this.setState({ userMenuOpened: false });
}
return false;
2016-12-01 22:14:39 +00:00
}
toggleUserMenu = (evt) => {
evt.preventDefault();
2016-12-01 22:14:39 +00:00
const { userMenuOpened } = this.state;
this.setState({ userMenuOpened: !userMenuOpened });
return false;
2016-12-01 22:14:39 +00:00
}
render () {
const {
config: {
org_name: orgName,
org_logo_url: orgLogoURL,
2016-12-01 22:14:39 +00:00
},
onLogoutUser,
onNavItemClick,
2016-12-01 22:14:39 +00:00
user,
} = this.props;
const { userMenuOpened } = this.state;
const { setHeaderNav, toggleUserMenu } = this;
2016-12-01 22:14:39 +00:00
const { enabled, username } = user;
const headerBaseClass = 'site-nav-header';
const headerToggleClass = classnames(
`${headerBaseClass}__button`,
'button',
2017-01-05 15:41:53 +00:00
'button--unstyled'
2016-12-01 22:14:39 +00:00
);
const userStatusClass = classnames(
`${headerBaseClass}__user-status`,
{ [`${headerBaseClass}__user-status--enabled`]: enabled }
);
return (
<header className={headerBaseClass}>
<button className={headerToggleClass} onClick={toggleUserMenu} ref={setHeaderNav}>
2016-12-01 22:14:39 +00:00
<div className={`${headerBaseClass}__org`}>
<OrgLogoIcon className={`${headerBaseClass}__logo`} src={orgLogoURL} />
2016-12-01 22:14:39 +00:00
<h1 className={`${headerBaseClass}__org-name`}>{orgName}</h1>
<div className={userStatusClass} />
<h2 className={`${headerBaseClass}__username`}>{username}</h2>
<Icon name="downcarat" className={`${headerBaseClass}__carat`} />
2016-12-01 22:14:39 +00:00
</div>
<UserMenu
isOpened={userMenuOpened}
onLogout={onLogoutUser}
onNavItemClick={onNavItemClick}
2016-12-01 22:14:39 +00:00
user={user}
/>
</button>
</header>
);
}
}
export default SiteNavHeader;