Home Reference Source

src/components/layout/Modal/index.js

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { faTimes } from '@fortawesome/free-solid-svg-icons';

import Button from '../../controls/Button';
// import LoginModal from '../modals/LoginModal';
import getStyles from './styles';

import { hideModal } from '../../../stores/ui/actions';

/**
 * A modal layout component that sets document language based on Redux state.
 * @return {React.Component} returns a React element
 */
export class Modal extends Component {
  constructor() {
    super();

    this.handleClickOutside = this.handleClickOutside.bind(this);
  }

  handleClickOutside(e) {
    if (this.modalRef && !this.modalRef.contains(e.target)) {
      if (this.props.modalVisible) this.props.hideModal();
    }
  }

  render() {
    const { className, styles } = getStyles(this.props);
    let classNameShield = `${className} shield`;
    // let title = '';
    // let content = null;

    if (this.props.modalVisible) classNameShield += ' visible';

    // if (this.props.modalContent === 'login') {
    //   title = languages[this.props.lang].login;
    //   content = <LoginModal />;
    // }

    return (
      <div className={ classNameShield }>
        <div className={ `${className} modal` } ref={ (node) => { this.modalRef = node; } }>
          <h2 className={ className }>
            {/* { title } */}
            <Button className={ className } kind="flat" icon={ faTimes } onClick={ this.props.hideModal }></Button>
          </h2>

          {/* { content } */}
        </div>

        { styles }
      </div>
    );
  }

  componentDidMount() {
    document.addEventListener('mousedown', this.handleClickOutside, false);
  }

  componentWillMount() {
    document.removeEventListener('mousedown', this.handleClickOutside, false);
  }
}

export default connect(state => ({
  modalContent: state.ui.modalContent,
  modalVisible: state.ui.modalVisible,
  lang: state.settings.lang,
  theme: state.settings.theme,
}), {
  hideModal,
})(Modal);