scinote-web/app/javascript/packs/shared/navigation/index.jsx

166 lines
4.9 KiB
JavaScript

import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { Navbar, Nav, NavItem } from "react-bootstrap";
import { FormattedMessage } from "react-intl";
import styled from "styled-components";
import {
MAIN_COLOR_BLUE,
WHITE_COLOR,
BORDER_GRAY_COLOR
} from "../../app/constants/colors";
import { getActivities, destroyActivities } from "../actions/ActivitiesActions";
import TeamSwitch from "./components/TeamSwitch";
import GlobalActivitiesModal from "./components/GlobalActivitiesModal";
import SearchDropdown from "./components/SearchDropdown";
import NotificationsDropdown from "./components/NotificationsDropdown";
import InfoDropdown from "./components/InfoDropdown";
import UserAccountDropdown from "./components/UserAccountDropdown";
const StyledNavbar = styled(Navbar)`
background-color: ${WHITE_COLOR};
border-color: ${BORDER_GRAY_COLOR};
`;
const StyledBrand = styled.a`
background-color: ${MAIN_COLOR_BLUE};
&:hover,
&:active,
&:focus {
background-color: ${MAIN_COLOR_BLUE} !important;
}
& > img {
margin-top: -4px;
max-width: 132px;
max-height: 26px;
}
`;
class Navigation extends Component {
constructor(props) {
super(props);
this.state = {
showActivitesModal: false,
page: "",
current_team: { id: 0 }
};
this.selectItemCallback = this.selectItemCallback.bind(this);
this.closeModalCallback = this.closeModalCallback.bind(this);
}
selectItemCallback(key, ev) {
switch (key) {
case 1:
window.location = "/";
break;
case 2:
window.location = "/protocols";
break;
case 3:
window.location = `/teams/${this.props.current_team.id}/repositories`;
break;
case 4:
ev.preventDefault();
this.setState({ showActivitesModal: !this.state.showActivitesModal });
// Call action creator to fetch activities from the server
this.props.fetchActivities();
break;
default:
}
}
closeModalCallback() {
this.setState({ showActivitesModal: false });
this.props.destroyActivities();
}
render() {
return (
<div>
<StyledNavbar onSelect={this.selectItemCallback}>
<Navbar.Header>
<Navbar.Brand>
<StyledBrand href="/" title="sciNote">
<img src="/images/logo.png" alt="Logo" />
</StyledBrand>
</Navbar.Brand>
</Navbar.Header>
<Nav>
<NavItem eventKey={1}>
<span className="glyphicon glyphicon-home" title="Home" />&nbsp;
<span className="visible-xs-inline visible-sm-inline">
<FormattedMessage id="navbar.home_label" />
</span>
</NavItem>
<NavItem eventKey={2}>
<span
className="glyphicon glyphicon-list-alt"
title="Protocol repositories"
/>&nbsp;
<span className="visible-xs-inline visible-sm-inline">
<FormattedMessage id="navbar.protocols_label" />
</span>
</NavItem>
<NavItem eventKey={3}>
<i
className="fa fa-cubes"
aria-hidden="true"
title="Repositories"
/>&nbsp;
<span className="visible-xs-inline visible-sm-inline">
<FormattedMessage id="navbar.repositories_label" />
</span>
</NavItem>
<NavItem eventKey={4}>
<span
className="glyphicon glyphicon-equalizer"
title="Activities"
/>&nbsp;
<span className="visible-xs-inline visible-sm-inline">
<FormattedMessage id="navbar.activities_label" />
</span>
</NavItem>
</Nav>
<Nav pullRight>
<TeamSwitch eventKey={5} />
<SearchDropdown />
<NotificationsDropdown />
<InfoDropdown />
<UserAccountDropdown />
</Nav>
</StyledNavbar>
<GlobalActivitiesModal
showModal={this.state.showActivitesModal}
onCloseModal={this.closeModalCallback}
/>
</div>
);
}
}
Navigation.propTypes = {
fetchActivities: PropTypes.func.isRequired,
destroyActivities: PropTypes.func.isRequired,
current_team: PropTypes.shape({
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired,
current_team: PropTypes.bool.isRequired
}).isRequired
};
// Map the states from store to component props
const mapStateToProps = ({ current_team }) => ({ current_team });
// Map the fetch activity action to component props
const mapDispatchToProps = dispatch => ({
fetchActivities() {
dispatch(getActivities());
},
destroyActivities() {
dispatch(destroyActivities());
}
});
export default connect(mapStateToProps, mapDispatchToProps)(Navigation);