fix: wire menu to redux and add change meanu breakpoint for guide
This commit is contained in:
committed by
Stuart Taylor
parent
210454444d
commit
b5b3482d0e
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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} />
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user