scratch-www/src/components/join-flow/email-step.jsx

95 lines
3.6 KiB
React
Raw Normal View History

const bindAll = require('lodash.bindall');
2019-08-01 15:40:46 -04:00
const classNames = require('classnames');
const React = require('react');
const PropTypes = require('prop-types');
import {Formik} from 'formik';
const {injectIntl, intlShape} = require('react-intl');
const emailValidator = require('email-validator');
const JoinFlowStep = require('./join-flow-step.jsx');
2019-08-01 15:40:46 -04:00
const FormikInput = require('../../components/formik-forms/formik-input.jsx');
require('./join-flow-steps.scss');
class EmailStep extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'handleValidSubmit',
2019-08-01 15:40:46 -04:00
'validateEmailIfPresent',
'validateForm'
]);
}
2019-08-01 15:40:46 -04:00
validateEmailIfPresent (email) {
if (!email) return null; // skip validation if email is blank; null indicates valid
2019-08-08 00:22:15 -04:00
const isValidLocally = emailValidator.validate(email);
if (isValidLocally) {
2019-08-01 15:40:46 -04:00
return null; // TODO: validate email address remotely
}
return this.props.intl.formatMessage({id: 'registration.validationEmailInvalid'});
}
validateForm () {
return {};
}
handleValidSubmit (formData, formikBag) {
formikBag.setSubmitting(false);
this.props.onNextStep(formData);
}
render () {
return (
<Formik
initialValues={{
}}
validate={this.validateForm}
validateOnBlur={false}
validateOnChange={false}
onSubmit={this.handleValidSubmit}
>
{props => {
const {
2019-08-01 15:40:46 -04:00
errors,
handleSubmit,
2019-08-01 15:40:46 -04:00
isSubmitting,
validateField
} = props;
return (
<JoinFlowStep
description={this.props.intl.formatMessage({id: 'registration.emailStepDescription'})}
footerMessage={this.props.intl.formatMessage({id: 'registration.acceptTermsOfService'})}
headerImgSrc="/images/hoc/getting-started.jpg"
2019-08-01 15:40:46 -04:00
innerContentClassName="modal-inner-content-email"
nextButton={this.props.intl.formatMessage({id: 'registration.createAccount'})}
title={this.props.intl.formatMessage({id: 'registration.emailStepTitle'})}
waiting={isSubmitting}
onSubmit={handleSubmit}
2019-08-01 15:40:46 -04:00
>
<FormikInput
className={classNames(
'join-flow-input',
'join-flow-input-tall',
{fail: errors.email}
)}
error={errors.email}
id="email"
name="email"
2019-08-08 11:19:18 -04:00
placeholder={this.props.intl.formatMessage({id: 'general.emailAddress'})}
2019-08-01 15:40:46 -04:00
validate={this.validateEmailIfPresent}
validationClassName="validation-full-width-input"
onBlur={() => validateField('email')} // eslint-disable-line react/jsx-no-bind
/>
</JoinFlowStep>
);
}}
</Formik>
);
}
}
EmailStep.propTypes = {
intl: intlShape,
onNextStep: PropTypes.func
};
module.exports = injectIntl(EmailStep);