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