Introduce UserNavBlock component to handle authenticated user actions

pull/10616/head
Alex P 2017-10-26 12:59:49 -07:00
parent 719c88c871
commit 250d5608e5
3 changed files with 86 additions and 38 deletions

View File

@ -0,0 +1,63 @@
import React, {PropTypes, Component} from 'react'
import {connect} from 'react-redux'
class UserNavBlock extends Component {
constructor(props) {
super(props)
}
render() {
const {logoutLink, customLinks, me} = this.props
return (
<div className="sidebar--item">
<div className="sidebar--square">
<div className="sidebar--icon icon user" />
</div>
<div className="sidebar-menu">
<div className="sidebar-menu--heading">
{me.name}
</div>
<div className="sidebar-menu--section">Organizations</div>
<a className="sidebar-menu--item active" href="#">
OrganizationName1 <strong>(Viewer)</strong>
</a>
<a className="sidebar-menu--item" href="#">
OrganizationName2 <strong>(Editor)</strong>
</a>
<a className="sidebar-menu--item" href={logoutLink}>
Logout
</a>
{customLinks ? <div className="sidebar-menu--divider" /> : null}
{customLinks
? <div className="sidebar-menu--section">Custom Links</div>
: null}
{customLinks
? customLinks.map((link, i) =>
<a key={i} className="sidebar-menu--item" href={link.url}>
{link.name}
</a>
)
: null}
<div className="sidebar-menu--triangle" />
</div>
</div>
)
}
}
const {array, shape, string} = PropTypes
UserNavBlock.propTypes = {
customLinks: array,
logoutLink: string.isRequired,
me: shape({
name: string.isRequired,
}),
}
const mapStateToProps = ({auth: {me}}) => ({
me,
})
export default connect(mapStateToProps)(UserNavBlock)

View File

@ -4,6 +4,7 @@ import {connect} from 'react-redux'
import Authorized, {ADMIN_ROLE} from 'src/auth/Authorized'
import UserNavBlock from 'src/side_nav/components/UserNavBlock'
import {
NavBar,
NavBlock,
@ -34,31 +35,6 @@ const SideNav = React.createClass({
),
},
renderUserMenuBlockWithCustomLinks(customLinks, logoutLink) {
return [
<NavHeader key={0} title="User" />,
...customLinks
.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase())
.map(({name, url}, i) =>
<NavListItem
key={i + 1}
useAnchor={true}
isExternal={true}
link={url}
>
{name}
</NavListItem>
),
<NavListItem
key={customLinks.length + 1}
useAnchor={true}
link={logoutLink}
>
Logout
</NavListItem>,
]
},
render() {
const {
params: {sourceID},
@ -152,18 +128,7 @@ const SideNav = React.createClass({
/>
</NavBlock>
{isUsingAuth
? <NavBlock icon="user" location={location}>
{customLinks
? this.renderUserMenuBlockWithCustomLinks(
customLinks,
logoutLink
)
: <NavHeader
useAnchor={true}
link={logoutLink}
title="Logout"
/>}
</NavBlock>
? <UserNavBlock logoutLink={logoutLink} customLinks={customLinks} />
: null}
</NavBar>
},

View File

@ -151,6 +151,7 @@ $sidebar-menu--gutter: 18px;
cursor: pointer;
}
}
.sidebar-menu--item,
.sidebar-menu--item:link,
.sidebar-menu--item:active,
.sidebar-menu--item:visited {
@ -163,13 +164,15 @@ $sidebar-menu--gutter: 18px;
transition: none;
// Rounding bottom outside corner of match container
&:last-child {border-bottom-right-radius: $radius;}
&:nth-last-child(2) {border-bottom-right-radius: $radius;}
}
.sidebar-menu--item.active,
.sidebar-menu--item.active:link,
.sidebar-menu--item.active:active,
.sidebar-menu--item.active:visited {
@include gradient-h($sidebar-menu--item-bg,$sidebar-menu--item-bg-accent);
color: $sidebar-menu--item-text-active;
font-weight: 700;
}
.sidebar-menu--item:hover,
.sidebar-menu--item.active:hover {
@ -188,6 +191,9 @@ $sidebar-menu--gutter: 18px;
font-weight: 400;
padding: 0px $sidebar-menu--gutter;
}
.sidebar-menu--item > strong {
opacity: 0.6;
}
// Invisible triangle for easier mouse movement when navigating to sub items
.sidebar-menu--item + .sidebar-menu--triangle {
position: absolute;
@ -198,3 +204,17 @@ $sidebar-menu--gutter: 18px;
left: 0px;
transform: translate(-50%,-50%) rotate(45deg);
}
.sidebar-menu--divider {
width: 100%;
height: 2px;
@include gradient-h($c-laser,$c-potassium);
}
.sidebar-menu--section {
white-space: nowrap;
font-size: 13px;
line-height: 22px;
font-weight: 600;
padding: 4px $sidebar-menu--gutter;
text-transform: uppercase;
color: $c-hydrogen;
}