Home Reference Source

app/Presentational/Login/Login.jsx

import React from 'react';
import PropTypes from 'prop-types';
import onKeyDown from '../../Tools/input';
import setRef from '../../Tools/ref';
import Toolbar from '../../Presentational/Toolbar/Toolbar';
import ThrobberButton from '../../Presentational/Throbber/ThrobberButton';
import style from './Login.less';

/**
 * Login form.
 * @param {Object} props Props of the component.
 * @return {React.Component} Login with username/password
 */
const Login = ({ pending, onLogin, error }) => {
  const refs = {};

  function submit() {
    onLogin(refs.loginInput.value, refs.passwordInput.value);
  }

  return (
    <span className={style.flex}>
      <h2>Login</h2>
      <input
        ref={e => setRef(refs, 'loginInput', e)}
        name="login"
        type="text"
        placeholder="login"
        onKeyDown={e => onKeyDown(e, submit)}
      />
      <input
        ref={e => setRef(refs, 'passwordInput', e)}
        name="password"
        type="password"
        placeholder="password"
        onKeyDown={e => onKeyDown(e, submit)}
      />
      <Toolbar className={style.center} error={error}>
        <ThrobberButton onClick={submit} pending={pending}>Login</ThrobberButton>
      </Toolbar>
    </span>
  );
};

Login.displayName = 'Login';

Login.propTypes = {
  pending: PropTypes.bool,
  onLogin: PropTypes.func.isRequired,
  error: PropTypes.string,
};

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

export default Login;