redbadger/website-honestly

View on GitHub
site/components/header/small-screen-nav.js

Summary

Maintainability
A
0 mins
Test Coverage
F
0%
// @flow

import React from 'react';

import styles from './style.css';
import Link from '../link';

type State = {
  navOpen: boolean,
};

export default class SmallScreenNav extends React.Component<any, State> {
  constructor() {
    super();
    this.state = {
      navOpen: false,
    };
  }

  smallScreenNav: HTMLElement;

  documentBodyLock = () => {
    const mainContent = document.getElementById('mainContent');
    if (!mainContent) return;
    mainContent.setAttribute('aria-hidden', 'true');
    if (!document.body) return;
    document.body.style.position = 'fixed';
    this.smallScreenNav.scrollTop = 0;
  };

  documentBodyRelease = () => {
    const mainContent = document.getElementById('mainContent');
    if (!mainContent) return;
    mainContent.removeAttribute('aria-hidden');
    if (!document.body) return;
    document.body.style.position = 'relative';
  };

  handleInputChange = (event: SyntheticInputEvent<any>) => {
    if (event.target.checked) {
      this.documentBodyLock();
    } else {
      this.documentBodyRelease();
    }
    this.setState({
      navOpen: event.target.checked,
    });
  };

  closeMenu = () => {
    this.documentBodyRelease();
    this.setState({
      navOpen: false,
    });
    return true;
  };

  render() {
    const { navOpen } = this.state;
    const navTabIndex = navOpen ? 0 : -1;

    return (
      <div className={styles.smallScreenNavComponent}>
        {!navOpen && (
          <div className={styles.triggerContainer}>
            <label htmlFor="burger" className={styles.triggerLabel} data-cy="burger-menu-trigger">
              MENU
            </label>
          </div>
        )}
        <input
          type="checkbox"
          className={styles.trigger}
          id="burger"
          checked={navOpen}
          onChange={this.handleInputChange}
          hidden
        />

        <div className={styles.overlay}>
          {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}
          <div className={styles.smallScreenNavMargin} onClick={this.closeMenu} />
          <div
            ref={c => {
              if (c) this.smallScreenNav = c;
            }}
            className={styles.smallScreenNavWrapper}
          >
            {navOpen && (
              <label htmlFor="burger" className={styles.menuCloseButton}>
                Close
              </label>
            )}

            <nav className={styles.smallScreenNavContainer}>
              <ul role="listbox" className={styles.smallScreenNav}>
                <li>
                  <Link
                    data-link="header"
                    tabIndex={navTabIndex}
                    to="homePage"
                    navigating={this.closeMenu}
                  >
                    Home
                  </Link>
                </li>
                <li>
                  <Link
                    data-link="header"
                    tabIndex={navTabIndex}
                    to="whatWeDoPage"
                    navigating={this.closeMenu}
                  >
                    What we do
                  </Link>
                  <ul className={styles.childList}>
                    <li>
                      <Link
                        to="experienceUs"
                        data-link="header"
                        activeCssClass={styles.activeNavLink}
                        navigating={this.closeMenu}
                      >
                        Experience us
                      </Link>
                    </li>
                    <li>
                      <Link
                        data-link="header"
                        tabIndex={navTabIndex}
                        to="technology"
                        navigating={this.closeMenu}
                      >
                        Technology
                      </Link>
                    </li>
                    <li>
                      <Link
                        data-link="header"
                        tabIndex={navTabIndex}
                        to="ourWorkPage"
                        navigating={this.closeMenu}
                      >
                        Our work
                      </Link>
                    </li>
                  </ul>
                </li>
                <li>
                  <Link
                    data-link="header"
                    tabIndex={navTabIndex}
                    to="aboutUsPage"
                    navigating={this.closeMenu}
                  >
                    About us
                  </Link>
                  <ul className={styles.childList}>
                    <li>
                      <Link
                        data-link="header"
                        tabIndex={navTabIndex}
                        to="badgers"
                        navigating={this.closeMenu}
                      >
                        Our team
                      </Link>
                    </li>
                  </ul>
                </li>
                <li>
                  <a tabIndex={navTabIndex} href="/blog">
                    Blog
                  </a>
                </li>
                <li>
                  <Link
                    data-link="header"
                    tabIndex={navTabIndex}
                    to="events"
                    navigating={this.closeMenu}
                  >
                    Events
                  </Link>
                </li>
                <li>
                  <Link
                    data-link="header"
                    tabIndex={navTabIndex}
                    to="joinUs"
                    navigating={this.closeMenu}
                  >
                    Jobs
                  </Link>
                </li>
                <li>
                  <Link
                    data-link="header"
                    tabIndex={navTabIndex}
                    to="homePage"
                    navigationData={{ contactUs: true }}
                    navigating={this.closeMenu}
                  >
                    Contact us
                  </Link>
                </li>
              </ul>
            </nav>
          </div>
        </div>
      </div>
    );
  }
}