fix: wire menu to redux and add change meanu breakpoint for guide

This commit is contained in:
Ahmad Abdolsaheb
2019-02-21 14:07:01 +03:00
committed by Stuart Taylor
parent 210454444d
commit b5b3482d0e
6 changed files with 115 additions and 64 deletions

View File

@ -41,7 +41,7 @@ export const wrapPageElement = ({ element, props }) => {
} }
if (/^\/guide(\/.*)*/.test(pathname)) { if (/^\/guide(\/.*)*/.test(pathname)) {
return ( return (
<DefaultLayout showMobileSidenav={true}> <DefaultLayout onGuide={true}>
<GuideLayout>{element}</GuideLayout> <GuideLayout>{element}</GuideLayout>
</DefaultLayout> </DefaultLayout>
); );

View File

@ -38,7 +38,7 @@ export const wrapPageElement = ({ element, props }) => {
} }
if (/^\/guide(\/.*)*/.test(pathname)) { if (/^\/guide(\/.*)*/.test(pathname)) {
return ( return (
<DefaultLayout showMobileSidenav={true}> <DefaultLayout onGuide={true}>
<GuideLayout>{element}</GuideLayout> <GuideLayout>{element}</GuideLayout>
</DefaultLayout> </DefaultLayout>
); );

View File

@ -176,6 +176,7 @@ header {
#top-nav .menu-button { #top-nav .menu-button {
display: none; display: none;
color: white;
} }
@media (max-width: 734px) { @media (max-width: 734px) {
@ -232,3 +233,41 @@ header {
top: 2.4em; top: 2.4em;
} }
} }
@media (min-width: 735px) and (max-width: 991px) {
.onGuide #top-nav {
padding: 0;
}
.onGuide #top-nav .menu-button {
display: block;
margin: 0 20px 0 12px;
padding: 2px 14px;
border: 1px solid #fff;
border-radius: 3px;
cursor: pointer;
}
.onGuide #top-right-nav {
top: var(--header-height);
}
.opened #top-nav .menu-button {
background: white;
color: #006400;
}
.onGuide #top-right-nav {
position: absolute;
top: -300px;
flex-direction: column;
width: 100vw;
height: min-content;
min-height: 160px;
padding: 10px 0;
}
.onGuide #top-nav img {
margin: 0 0 0 10px;
}
}

View File

@ -11,23 +11,28 @@ import { Link } from '../helpers';
import './header.css'; import './header.css';
import { toggleDisplaySideNav } from '../layouts/redux'; import { toggleDisplaySideNav, toggleDisplayMenu } from '../layouts/redux';
const mapStateToProps = state => {
return {
displayMenu: state.guideNav.displayMenu
};
};
const mapDispatchToProps = dispatch => const mapDispatchToProps = dispatch =>
bindActionCreators({ toggleDisplaySideNav }, dispatch); bindActionCreators({ toggleDisplaySideNav, toggleDisplayMenu }, dispatch);
const propTypes = { const propTypes = {
disableSettings: PropTypes.bool, disableSettings: PropTypes.bool,
showMobileSidenav: PropTypes.bool, displayMenu: PropTypes.bool,
onGuide: PropTypes.bool,
toggleDisplayMenu: PropTypes.func,
toggleDisplaySideNav: PropTypes.func toggleDisplaySideNav: PropTypes.func
}; };
class Header extends Component { class Header extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = {
isMenuOpened: false
};
this.menuButtonRef = React.createRef(); this.menuButtonRef = React.createRef();
} }
@ -39,81 +44,78 @@ class Header extends Component {
document.removeEventListener('click', this.handleClickOutside); document.removeEventListener('click', this.handleClickOutside);
} }
toggleClass = () => { toggleDisplayMenu = () => {
if (this.props.showMobileSidenav) { if (this.props.onGuide) {
this.props.toggleDisplaySideNav(); this.props.toggleDisplaySideNav();
} else {
this.props.toggleDisplayMenu();
} }
this.setState({
isMenuOpened: !this.state.isMenuOpened
});
}; };
handleClickOutside = event => { handleClickOutside = event => {
if ( if (
this.state.isMenuOpened && this.props.displayMenu &&
!this.menuButtonRef.current.contains(event.target) && !this.menuButtonRef.current.contains(event.target) &&
!this.props.showMobileSidenav !this.props.onGuide
) { ) {
this.toggleClass(); toggleDisplayMenu();
} }
}; };
handleMediaChange = matches => { handleMediaChange = matches => {
if (!matches && this.state.isMenuOpened) { if (!matches && this.props.displayMenu) {
this.toggleClass(); toggleDisplayMenu();
} }
}; };
render() { renderClassNames = (displayMenu, onGuide) => {
const { disableSettings, showMobileSidenav } = this.props; if (displayMenu && onGuide) {
if (this.state.isMenuOpened && showMobileSidenav) { return 'opened onGuide';
return ( } else if (displayMenu) {
<header className={this.state.isMenuOpened ? 'opened' : null}> return 'opened';
<nav id='top-nav'> } else if (onGuide) {
<Link className='home-link' to='/'> return 'onGuide';
<NavLogo />
</Link>
{disableSettings ? null : <FCCSearch />}
<span
className='menu-button'
onClick={this.toggleClass}
ref={this.menuButtonRef}
>
Menu
</span>
</nav>
</header>
);
} }
return '';
};
render() {
const viewportWidth = Math.max(
document.documentElement.clientWidth,
window.innerWidth || 0
);
console.log(viewportWidth);
const { disableSettings, onGuide, displayMenu } = this.props;
return ( return (
<header className={this.state.isMenuOpened ? 'opened' : null}> <header className={this.renderClassNames(displayMenu, onGuide)}>
<nav id='top-nav'> <nav id='top-nav'>
<Link className='home-link' to='/'> <Link className='home-link' to='/'>
<NavLogo /> <NavLogo />
</Link> </Link>
{disableSettings ? null : <FCCSearch />} {disableSettings ? null : <FCCSearch />}
<ul id='top-right-nav'> {onGuide && displayMenu && viewportWidth < 991 ? null : (
<li> <ul id='top-right-nav'>
<Link to='/learn'>Learn</Link> <li>
</li> <Link to='/learn'>Learn</Link>
<li> </li>
<Link external={true} to='/forum'> <li>
Forum <Link external={true} to='/forum'>
</Link> Forum
</li> </Link>
<li> </li>
<Link external={true} to='/news'> <li>
News <Link external={true} to='/news'>
</Link> News
</li> </Link>
<li className='user-state-link'> </li>
<UserState disableSettings={disableSettings} /> <li className='user-state-link'>
</li> <UserState disableSettings={disableSettings} />
</ul> </li>
</ul>
)}
<span <span
className='menu-button' className='menu-button'
onClick={this.toggleClass} onClick={this.toggleDisplayMenu}
ref={this.menuButtonRef} ref={this.menuButtonRef}
> >
Menu Menu
@ -128,6 +130,6 @@ class Header extends Component {
Header.propTypes = propTypes; Header.propTypes = propTypes;
export default connect( export default connect(
null, mapStateToProps,
mapDispatchToProps mapDispatchToProps
)(Header); )(Header);

View File

@ -72,7 +72,7 @@ const propTypes = {
onlineStatusChange: PropTypes.func.isRequired, onlineStatusChange: PropTypes.func.isRequired,
removeFlashMessage: PropTypes.func.isRequired, removeFlashMessage: PropTypes.func.isRequired,
showFooter: PropTypes.bool, showFooter: PropTypes.bool,
showMobileSidenav: PropTypes.bool onGuide: PropTypes.bool
}; };
const mapStateToProps = createSelector( const mapStateToProps = createSelector(
@ -141,7 +141,7 @@ class DefaultLayout extends Component {
removeFlashMessage, removeFlashMessage,
landingPage, landingPage,
showFooter = true, showFooter = true,
showMobileSidenav = false, onGuide = false,
isOnline, isOnline,
isSignedIn isSignedIn
} = this.props; } = this.props;
@ -162,7 +162,7 @@ class DefaultLayout extends Component {
</Helmet> </Helmet>
<Header <Header
disableSettings={disableSettings} disableSettings={disableSettings}
showMobileSidenav={showMobileSidenav} onGuide={onGuide}
/> />
<div className={`default-layout ${landingPage ? 'landing-page' : ''}`}> <div className={`default-layout ${landingPage ? 'landing-page' : ''}`}>
<OfflineWarning isOnline={isOnline} isSignedIn={isSignedIn} /> <OfflineWarning isOnline={isOnline} isSignedIn={isSignedIn} />

View File

@ -6,13 +6,18 @@ export const ns = 'guideNav';
const initialState = { const initialState = {
displaySideNav: false, displaySideNav: false,
displayMenu: false,
expandedState: {} expandedState: {}
}; };
const types = createTypes(['toggleExpandedState', 'toggleDisplaySideNav'], ns); const types = createTypes(
['toggleExpandedState', 'toggleDisplaySideNav', 'toggleDisplayMenu'],
ns
);
export const toggleExpandedState = createAction(types.toggleExpandedState); export const toggleExpandedState = createAction(types.toggleExpandedState);
export const toggleDisplaySideNav = createAction(types.toggleDisplaySideNav); export const toggleDisplaySideNav = createAction(types.toggleDisplaySideNav);
export const toggleDisplayMenu = createAction(types.toggleDisplayMenu);
export const reducer = handleActions( export const reducer = handleActions(
{ {
@ -25,7 +30,12 @@ export const reducer = handleActions(
}), }),
[types.toggleDisplaySideNav]: state => ({ [types.toggleDisplaySideNav]: state => ({
...state, ...state,
displayMenu: !state.displayMenu,
displaySideNav: !state.displaySideNav displaySideNav: !state.displaySideNav
}),
[types.toggleDisplayMenu]: state => ({
...state,
displayMenu: !state.displayMenu
}) })
}, },
initialState initialState