Home Reference Source

app/Presentational/Compose/Compose.jsx

import React from 'react';
import PropTypes from 'prop-types';
import FaArrowLeft from 'react-icons/lib/fa/arrow-left';
import setRef from '../../Tools/ref';
import onKeyDown from '../../Tools/input';
import Toolbar from '../../Presentational/Toolbar/Toolbar';
import Button from '../../Presentational/Button/Button';
import ThrobberButton from '../../Presentational/Throbber/ThrobberButton';
import style from './Compose.less';

/**
 * Compose form.
 * @param {Object} props Props of the component.
 * @return {React.Component} Compose form with inputs.
 */
const Compose = ({ onCompose, onBack, pending, error }) => {
  const refs = {};

  /**
   * Submit form with saved information.
   */
  function submit() {
    onCompose(refs.nameInput.value, refs.composeInput.value);
  }

  return (
    <div className={style.flex}>
      <Toolbar error={error}>
        <Button onClick={onBack}>
          <FaArrowLeft />
        </Button>
      </Toolbar>
      <h2>Create an app</h2>
      <span>
        <input
          ref={e => setRef(refs, 'nameInput', e)}
          name="name"
          type="text"
          placeholder="name"
          onKeyDown={e => onKeyDown(e, submit)}
        />
      </span>
      <span>
        <textarea
          ref={e => setRef(refs, 'composeInput', e)}
          name="compose"
          placeholder="compose file yaml v2"
          className={style.code}
          rows={19}
          onKeyDown={e => onKeyDown(e, submit)}
        />
      </span>
      <span>
        <ThrobberButton onClick={submit} pending={pending}>Create</ThrobberButton>
      </span>
    </div>
  );
};

Compose.displayName = 'Compose';

Compose.propTypes = {
  onCompose: PropTypes.func.isRequired,
  onBack: PropTypes.func.isRequired,
  pending: PropTypes.bool,
  error: PropTypes.string,
};

Compose.defaultProps = {
  pending: false,
  error: '',
};

export default Compose;