Dataset/JS/ReactNavbar/navbar.js (118 lines of code) (raw):
import React, { PropTypes } from 'react';
import { Link } from 'react-router';
import {
Nav,
NavItem,
Navbar,
NavDropdown,
MenuItem,
} from 'react-bootstrap';
import Gravatar from './gravatar';
import Icon from './icon';
class NavBar extends React.Component {
constructor(props) {
super(props);
this.state = { expanded: false };
this.handleSelected = this.handleSelected.bind(this);
this.handleToggle = this.handleToggle.bind(this);
this.handleOpenAddChannelForm = this.handleOpenAddChannelForm.bind(this);
}
handleToggle() {
this.setState({ expanded: !this.state.expanded });
}
handleSelected() {
this.setState({ expanded: false });
}
handleOpenAddChannelForm(event) {
this.props.onOpenAddChannelForm(event);
this.handleSelected();
}
render() {
const { isLoggedIn, name, email } = this.props.auth;
const { createHref, isActive } = this.props.router;
const dropdownTitle = isLoggedIn ? <span><Gravatar email={email} /> {name}</span> : '';
return (
<Navbar fixedTop
expanded={this.state.expanded}
onToggle={this.handleToggle}
>
<Navbar.Header>
<Navbar.Brand>
<Link style={{ fontFamily: 'GoodDog' }} to="/"><Icon icon="headphones" /> PodBaby</Link>
</Navbar.Brand>
<Navbar.Toggle />
</Navbar.Header>
<Navbar.Collapse>
<Nav pullLeft>
<NavItem
active={isActive('/new/')}
href={createHref('/new/')}
onClick={this.handleSelected}
><Icon icon="flash" /> New episodes
</NavItem>
<NavItem
active={isActive('/browse/')}
href={createHref('/browse/')}
onClick={this.handleSelected}
><Icon icon="list" /> Browse
</NavItem>
<NavItem
active={isActive('/search/')}
href={createHref('/search/')}
onClick={this.handleSelected}
><Icon icon="search" /> Search
</NavItem>
<NavItem
active={isActive('/recommendations/')}
href={createHref('/recommendations/')}
onClick={this.handleSelected}
><Icon icon="thumbs-up" /> Recommended
</NavItem>
</Nav>
{isLoggedIn ?
<Nav pullLeft>
<NavItem
onClick={this.handleOpenAddChannelForm}
href="#"
><Icon icon="rss" /> Add new feed
</NavItem>
</Nav>
: ''}
{isLoggedIn ?
<Nav pullRight>
<NavDropdown title={dropdownTitle} id="user-dropdown">
<MenuItem
href={createHref('/member/subscriptions/')}
onClick={this.handleSelected}
><Icon icon="folder" /> Subscriptions
</MenuItem>
<MenuItem
href={createHref('/member/bookmarks/')}
onClick={this.handleSelected}
><Icon icon="bookmark" /> Bookmarks
</MenuItem>
<MenuItem
href={createHref('/member/recent/')}
onClick={this.handleSelected}
><Icon icon="history" /> Recent
</MenuItem>
<MenuItem
href={createHref('/user/')}
onClick={this.handleSelected}
><Icon icon="cog" /> Settings
</MenuItem>
<MenuItem href="#" onClick={this.props.onLogout}>
<Icon icon="sign-out" /> Logout
</MenuItem>
</NavDropdown>
</Nav> :
<Nav pullRight>
<NavItem
active={isActive('/login/')}
href={createHref('/login/')}
onClick={this.handleSelected}
><Icon icon="sign-in" /> Login
</NavItem>
<NavItem
active={isActive('/signup/')}
href={createHref('/signup/')}
onClick={this.handleSelected}
><Icon icon="sign-in" /> Signup
</NavItem>
</Nav>}
</Navbar.Collapse>
</Navbar>
);
}
}
NavBar.propTypes = {
onOpenAddChannelForm: PropTypes.func.isRequired,
onLogout: PropTypes.func.isRequired,
auth: PropTypes.object.isRequired,
router: PropTypes.object.isRequired,
};
export default NavBar;