index.js
  1  import React from 'react';
  2  import { PropTypes } from 'prop-types';
  3  import Parser from 'html-react-parser';
  4  import getConfig from 'next/config';
  5  import Modal from '../../modal';
  6  import './style.scss';
  7  
  8  const { publicRuntimeConfig } = getConfig();
  9  
 10  class InterviewsList extends React.Component {
 11    constructor(props) {
 12      super(props);
 13  
 14      this.state = {
 15        activeLetter: 'A',
 16      };
 17    }
 18  
 19    render() {
 20      const { activeLetter } = this.state;
 21  
 22      // Sort interviews alphabetically
 23      const sortedInterviews = this.props.data.sort((a, b) => a.name.localeCompare(b.name));
 24      const interviews = {};
 25  
 26      // Build up interviews object with letter key
 27      sortedInterviews.forEach((interview) => {
 28        const firstLetter = interview.name.charAt(0);
 29  
 30        if (typeof interviews[firstLetter] === 'undefined') {
 31          interviews[firstLetter] = [];
 32        }
 33  
 34        interviews[firstLetter].push(interview);
 35      });
 36  
 37      return (
 38        <div className="interviews-wrap">
 39          <div className="mob-interviews-link">
 40            <button onClick={this.props.toggleInterviewsListModal}>
 41              <span>Interviews ({this.props.data.length})</span>
 42            </button>
 43            <button onClick={this.props.toggleInterviewsListModal}>
 44              <span>View</span> <img src={`${publicRuntimeConfig.subDirPath}/static/img/right-chevron-icon.svg`} alt="right chevron icon" />
 45            </button>
 46          </div>
 47          <Modal
 48            isModalOpen={this.props.isInterviewsListModalOpen}
 49            closeModal={this.props.toggleInterviewsListModal}
 50            modalOnMobileOnly
 51          >
 52            <React.Fragment>
 53              <h4>Interviews</h4>
 54              <div className="interviews-nav-wrap">
 55                <div className="interviews-list">
 56                  {
 57                    Object.keys(interviews).map(firstLetter => (
 58                      <div className="letter-block" key={firstLetter}>
 59                        <div id={firstLetter}>{ firstLetter }</div>
 60                        <ul>
 61                          { interviews[firstLetter].map(interview => (
 62                            <li
 63                              id={interview.id}
 64                              key={interview.id}
 65                            >
 66                              <button onClick={this.props.toggleSingleInterview}>
 67                                { Parser(interview.name) }
 68                              </button>
 69                            </li>
 70                          ))
 71                          }
 72                        </ul>
 73                      </div>
 74                    ))
 75                  }
 76                </div>
 77                <div className="letters-nav">
 78                  {
 79                    Object.keys(interviews).map(firstLetter => (
 80                      <button
 81                        key={firstLetter}
 82                        onClick={() => {
 83                          document.querySelector(`#${firstLetter}`).scrollIntoView({ behavior: 'smooth' });
 84                          this.setState({ activeLetter: firstLetter });
 85                        }}
 86                        className={activeLetter === firstLetter ? 'active' : ''}
 87                      >
 88                        { firstLetter }
 89                      </button>
 90                    ))
 91                  }
 92                </div>
 93              </div>
 94            </React.Fragment>
 95          </Modal>
 96        </div>
 97      );
 98    }
 99  }
100  
101  InterviewsList.propTypes = {
102    isInterviewsListModalOpen: PropTypes.bool.isRequired,
103    data: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
104    toggleSingleInterview: PropTypes.func.isRequired, /* eslint-disable-line */
105    toggleInterviewsListModal: PropTypes.func.isRequired,
106  };
107  
108  export default InterviewsList;