I'm trying to set an error for when the email isn't correct. When I'm checking if the string is empty the form alerts with the proper message. But when I'm checking if the email matches the regular expression it doesn't work. Any ideas?
import React, { Component } from 'react';
import { Link } from 'react-router';
// Our custom input component, which uses label, id and tabIndex properties
var MyInput = React.createClass({
render: function() {
// Get the error message by calling a function, passed to this
// component through getError property
var errorMessage = this.props.getError(this.props.id);
return (
<fieldset className={"form-fieldset ui-input first " + (errorMessage ? "erroneous" : "")}>
<input type="text" name={this.props.id} id={this.props.id} tabIndex={this.props.tabIndex} />
<label htmlFor={this.props.id}>
<span data-text={this.props.label}>{this.props.label}</span>
</label>
<span className="error">{errorMessage ? errorMessage : null}</span>
</fieldset>
)
}
});
// Form
var SendForm = React.createClass ({
getError: function (fieldName) {
return this.state[fieldName+"Error"];
},
setError: function (fieldName, error) {
var update = {};
update[fieldName+"Error"] = error;
this.setState(update);
},
getInitialState: function() {
return {
isMailSent: false,
errorMessage: null,
};
},
componentDidMount: function () {
// This will be called right when the form element is displayed
$('form').parsley()
},
validateForm: function(){
var hasErrors = false;
if ($('#company').val().length < 1){
this.setError("company", "Please enter your company name");
hasErrors = true;
} else this.setError("company", null)
if ($('#industry').val().length < 1){
this.setError("industry", "Please enter the industry");
hasErrors = true;
} else this.setError("industry", null)
if ($('#firstName').val().length < 1){
this.setError("firstName", "Please enter your first name");
hasErrors = true;
} else this.setError("firstName", null)
if ($('#lastName').val().length < 1) {
this.setError("lastName", "Please enter your last name");
hasErrors = true;
} else this.setError("lastName", null)
if ($('#email').val() == '') {
this.setError("email", "Please enter your email address");
hasErrors = true;
} else this.setError("email", null)
if ($('#email').val() !== /^[a-zA-Z0-9]+@+[a-zA-Z0-9]+.+[A-z]/) {
this.setError("email", "Please enter a valid email address");
hasErrors = true;
} else this.setError("email", null)
if ($('#phone').val().length < 1) {
this.setError("phone", "Please enter your phone number");
hasErrors = true;
} else this.setError("phone", null)
return !hasErrors;
},
handleSubmit: function (e) {
e.preventDefault();
// Check if data is valid
if (!this.validateForm()) {
//return if not valid
return;
}
// Get the form.
var form = $('form');
// Serialize the form data.
var formData = $(form).serialize();
var self = this;
console.log(formData)
// Submit the form using AJAX.
$.ajax({
type: 'POST',
url: 'email-handler.php',
data: formData
}).done(function(response) {
// Update the state, notifying that mail was sent
// This value will be used in the form when rendering
self.setState({isMailSent: true})
// Hide the form
$('.formCont').hide();
}).fail(function(data) {
// Make sure that the formMessages div has the 'error' class.
self.setState({errorMessage : "Something went wrong. Please try again."});
});
},
render: function(){
return (
<div className="companyForm">
<h2 className="header compFormHead">Form</h2>
{ this.state.isMailSent ?
<div className="success">Thank you for submission. Someone will be in contact with you shortly.</div>
: null }
<div className="container formCont">
<form method="post" acceptCharset="utf-8" autoComplete="off" onSubmit={this.handleSubmit}>
<MyInput id="company" label="Company" tabIndex="1" getError={this.getError}/>
<MyInput id="industry" label="Industry" tabIndex="2" getError={this.getError}/>
<div className="two-column">
<MyInput id="firstName" label="First Name" tabIndex="3" getError={this.getError}/>
<MyInput id="lastName" label="Last Name" tabIndex="4" getError={this.getError}/>
</div>
<div className="two-column">
<MyInput id="email" type="email" label="Email" tabIndex="5" getError={this.getError}/>
<MyInput id="phone" label="Phone" tabIndex="6" getError={this.getError}/>
</div>
{this.state.errorMessage ? <div className="fail">{this.state.errorMessage}</div> : null}
<div className="form">
<input type="submit" name="submit" className="btn btn-primary" value="APPLY" tabIndex="7" />
</div>
</form>
</div>
</div>
);
}
});
export default SendForm;
Use RegExp#test
and fix the regex like this:
if (/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[A-Za-z]+$/.test($('#email').val())) { /* return true */ }
^^^^^^^^^^^^
To support multiple dots in the domain name, you may wrap the first part with a non-capturing group and set a 1 or more occurrences quantifier:
/^[a-zA-Z0-9]+@(?:[a-zA-Z0-9]+\.)+[A-Za-z]+$/
^^^ ^^
The [A-z]
actually matches some non letter symbols, and unescaped .
matches any char but line break chars. Note that $
anchors the string at the end and +
matches 1 or more occurrences.
There are other email regexps out there, see Validate email address in JavaScript? if your scenario differs from the one in OP.
Another regex you can use which is a bit shorter is .+@.+\..+
It's not so strict but it checks the format which is the most important thing.
Maybe not perfect, customized @tw_hoff's post.
/.+@.+\.[A-Za-z]+$/.test("[email protected]") //true
/.+@.+\.[A-Za-z]+$/.test("[email protected]") //false
Instead of using a regex, I suggest using a library called yup
.
You can use as as follows:
import * as Yup from 'yup';
// here you can add multiple validations per field
const EmailSchema = Yup.object().shape({
email: Yup.string().required('This field is mandatory').email('Enter a valid email'),
});
Inside your
{<Formik
initialValues={this.state.form}
validationSchema={EmailSchema}
onSubmit={ values => {
const data = {
email: values.email
};
}}
>
{({handleSubmit, handleChange, values, touched, errors, isSubmitting}) => (
<form onSubmit={handleSubmit} autoComplete="off" noValidate>
<div className="form-group">
<label htmlFor="id_email">Email <span>*</span></label>
<input
type="email"
name="email"
id="id_email"
className={((errors.email && touched.email) ? 'is-invalid ' : '') + 'form-control'}
autoComplete="off"
value={values.email}
onChange={handleChange}
/>
{errors.email && touched.email && <div className="invalid-feedback">{errors.email}</div>}
</div>
<div className="row">
<div className="col text-right">
<button type="submit" name="btn-letsgo" disabled={isSubmitting} className="btn btn-primary">Submit</button>
</div>
</div>
</form>
)}
</Formik>}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With