kumabook/stickynotes

View on GitHub
src/containers/Home.jsx

Summary

Maintainability
A
1 hr
Test Coverage
/* global confirm: false */
import browser from 'webextension-polyfill';
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import getMessage from '../utils/i18n';
import Confirm from '../components/Confirm';

class Home extends React.Component {
  static canOpenSidebar() {
    return browser.sidebarAction && browser.sidebarAction.open;
  }
  menus() {
    let menus = ['options'];
    switch (this.props.info.os) {
      case 'android':
        menus.push('list');
        break;
      default:
        menus.push('list');
        if (Home.canOpenSidebar()) {
          menus.push('sidebar');
        }
        menus = menus.concat(['toggle', 'create']);
        break;
    }
    if (this.props.user) {
      menus = menus.concat(['sync', 'logout', 'clearCache']);
    } else {
      menus = menus.concat(['login']);
    }
    return menus;
  }
  render() {
    return (
      <div>
        <div className="home">
          <ul className="ul">
            {this.menus().map(m => (
              <li className="li" key={m}>
                <span
                  role="button"
                  className="menuItem"
                  onClick={() => this.props.handleClick(m)}
                  onKeyDown={() => {}}
                  tabIndex="0"
                >
                  {getMessage(m)}
                </span>
              </li>
             ))}
          </ul>
        </div>
        <Confirm
          hidden={!this.props.confirm}
          title={getMessage('clearCache')}
          message={getMessage('clearCacheConfirmMessage')}
          onSubmit={result => this.props.handleConfirm(result)}
        />
      </div>
    );
  }
}

Home.propTypes = {
  info: PropTypes.shape({
    os: PropTypes.string,
  }).isRequired,
  user:          PropTypes.shape({}),
  confirm:       PropTypes.bool.isRequired,
  handleClick:   PropTypes.func.isRequired,
  handleConfirm: PropTypes.func.isRequired,
};
Home.defaultProps =  {
  user: null,
};

function mapStateToProps(state) {
  return {
    info:    state.info,
    user:    state.user,
    confirm: state.confirm,
  };
}

function mapDispatchToProps(dispatch, { history }) {
  return {
    handleClick: (menu) => {
      switch (menu) {
        case 'login':
          history.push('/login');
          break;
        case 'options':
          browser.runtime.openOptionsPage();
          break;
        case 'sidebar':
          browser.sidebarAction.open();
          break;
        case 'clearCache':
          dispatch({ type: 'CONFIRM_CLEAR_CACHE' });
          break;
        default:
          dispatch({ type: 'MENU', payload: { name: menu } });
          break;
      }
    },
    handleConfirm: (result) => {
      if (result) {
        dispatch({ type: 'MENU', payload: { name: 'clearCache' } });
      }
      dispatch({ type: 'HIDE_CONFIRM' });
    },
  };
}

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Home));