appirio-tech-react-components-test10
Version:
Topcoder UI Kit library of components for our React apps.
99 lines (85 loc) • 3.2 kB
JSX
require('./UserDropdownMenu.scss')
import React from 'react'
import PropTypes from 'prop-types'
import classNames from 'classnames'
import { Link } from 'react-router-dom'
import Avatar from '../Avatar/Avatar'
import Dropdown from '../Dropdown/Dropdown'
const UserDropdownMenu = ({ userName, userHandle, userImage, domain, loginUrl, registerUrl, menuItems, forReactRouter}) => {
const userDropdownLists = [
[
{ label: 'My Profile', link: '/profile/' + userHandle, id: 0 },
{ label: 'Dashboard', link: '/my-dashbaord', id: 1 },
{ label: 'Settings', link: '/settings/profile', id: 2 },
{ label: 'Payments', link: '//community.' + domain + '/PactsMemberServlet?module=PaymentHistory&full_list=false', id: 3 }
],
[
{ label: 'Help', link: '//help.' + domain, id: 0 }
],
[
{ label: 'Log out', link: '/logout', id: 0 }
]
]
const loginButtonClasses= classNames('tc-btn', 'tc-btn-sm', {
// if register url is not present, we are not showing register button
// and if register button is not there, we assume it is present somewhere on the page itself
// and Login button should be secondary in that case
'tc-btn-default' : !registerUrl,
'tc-btn-primary': registerUrl
})
const publicDOM = (
<div className="UserDropdownMenu non-logged-in">
{ registerUrl && <a className="tc-btn tc-btn-sm tc-btn-secondary" href={registerUrl} >Register</a> }
{ loginUrl && <a className={ loginButtonClasses } href={loginUrl} >Log in</a> }
</div>
)
const menuList = menuItems ? menuItems : userDropdownLists
const rendreLink = (link) => {
if (link.link) {
return forReactRouter && !link.absolute
? <Link to={ link.link }>{ link.label }</Link>
: <a href={ link.link }>{ link.label }</a>
} else if (link.onClick) {
return <a href="#" onClick={link.onClick} >{ link.label }</a>
}
}
const loggedInDOM = (
<div className="UserDropdownMenu">
<Dropdown pointerShadow>
<div className="dropdown-menu-header">
<span className="user-image"><Avatar avatarUrl={ userImage } userName={ userName } /></span>
<span className="username">{ userHandle }</span>
<img className="dropdown-arrow" src={ require('./arrow-small-down.svg') } />
</div>
<div className="dropdown-menu-list">
{
menuList.map((list, i) => {
return ( <ul key={ i }>
{
list.map((link, j) => {
return (<li className="user-menu-item transition" key={ j }>
{ rendreLink(link) }
</li>)
})
}
</ul> )
})
}
</div>
</Dropdown>
</div>
)
return userHandle ? loggedInDOM : publicDOM
}
UserDropdownMenu.propTypes = {
userHandle : PropTypes.string,
userImage : PropTypes.string,
domain : PropTypes.string.isRequired,
loginUrl : PropTypes.string,
registerUrl : PropTypes.string
}
UserDropdownMenu.defaultProps = {
loginUrl : '/login',
registerUrl : '/register'
}
export default UserDropdownMenu