import React from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { Navbar } from 'react-bootstrap';
import LargeNav from './LargeNav.jsx';
import MediumNav from './MediumNav.jsx';
import SmallNav from './SmallNav.jsx';
import {
clickOnLogo,
clickOnMap
} from './redux';
import { panesSelector, panesByNameSelector } from '../Panes/redux';
import propTypes from './navPropTypes';
const mapStateToProps = createSelector(
panesSelector,
panesByNameSelector,
(panes, panesByName) => {
return {
panes: panes.map(({ name, type }) => {
content: name,
action: type,
isHidden: panesByName[name].isHidden
};
}, {}),
shouldShowMapButton: panes.length === 0
}
);
function mapDispatchToProps(dispatch) {
const dispatchers = bindActionCreators(
{
clickOnMap: e => {
e.preventDefault();
return clickOnMap();
},
clickOnLogo: e => {
return clickOnLogo();
dispatch
dispatchers.dispatch = dispatch;
return () => dispatchers;
function mergeProps(stateProps, dispatchProps, ownProps) {
const panes = stateProps.panes.map(pane => {
...pane,
actionCreator: () => dispatchProps.dispatch({ type: pane.action })
});
...ownProps,
...stateProps,
...dispatchProps,
panes
const allNavs = [
LargeNav,
MediumNav,
SmallNav
];
function FCCNav(props) {
const {
panes,
clickOnMap,
shouldShowMapButton
} = props;
const withNavProps = Component => (
<Component
clickOnLogo={ clickOnLogo }
clickOnMap={ clickOnMap }
key={ Component.displayName }
panes={ panes }
shouldShowMapButton={ shouldShowMapButton }
/>
return (
<Navbar
className='nav-height'
id='navbar'
staticTop={ true }
>
allNavs.map(withNavProps)
</Navbar>
FCCNav.displayName = 'FCCNav';
FCCNav.propTypes = propTypes;
export default connect(
mapStateToProps,
mapDispatchToProps,
mergeProps
)(FCCNav);