elemental
Version:
React UI Framework
102 lines (96 loc) • 3.11 kB
JavaScript
'use strict';
var React = require('react');
var classNames = require('classnames');
var REGEXP_EMAIL = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
function validateEmail(value) {
return REGEXP_EMAIL.test(value);
}
module.exports = React.createClass({
displayName: 'EmailInputGroup',
propTypes: {
alwaysValidate: React.PropTypes.bool,
className: React.PropTypes.string,
invalidMessage: React.PropTypes.string,
label: React.PropTypes.string,
onChange: React.PropTypes.func,
required: React.PropTypes.bool,
requiredMessage: React.PropTypes.string,
value: React.PropTypes.string
},
getDefaultProps: function getDefaultProps() {
return {
requiredMessage: 'Email address is required',
invalidMessage: 'Please enter a valid email address'
};
},
getInitialState: function getInitialState() {
return {
isValid: true,
validationIsActive: this.props.alwaysValidate
};
},
componentDidMount: function componentDidMount() {
if (this.state.validationIsActive) {
this.validateInput(this.props.value);
}
},
componentWillReceiveProps: function componentWillReceiveProps(newProps) {
if (this.state.validationIsActive) {
if (newProps.value !== this.props.value && newProps.value !== this._lastChangeValue && !newProps.alwaysValidate) {
// reset validation state if the value was changed outside the component
return this.setState({
isValid: true,
validationIsActive: false
});
}
this.validateInput(newProps.value);
}
},
handleChange: function handleChange(e) {
this._lastChangeValue = e.target.value;
if (this.props.onChange) this.props.onChange(e);
},
handleBlur: function handleBlur() {
if (!this.props.alwaysValidate) {
this.setState({ validationIsActive: false });
}
this.validateInput(this.props.value);
},
validateInput: function validateInput(value) {
var newState = {
isValid: true
};
if (value.length && !validateEmail(value) || !value.length && this.props.required) {
newState.isValid = false;
}
if (!newState.isValid) {
newState.validationIsActive = true;
}
this.setState(newState);
},
render: function render() {
var validationMessage;
if (!this.state.isValid) {
validationMessage = React.createElement(
'div',
{ className: 'form-validation is-invalid' },
this.props.value.length ? this.props.invalidMessage : this.props.requiredMessage
);
}
var formGroupClass = classNames('FormField', {
'is-invalid': !this.state.isValid
}, this.props.className);
var componentLabel = this.props.label ? React.createElement(
'label',
{ className: 'FormLabel', htmlFor: 'inputEmail' },
this.props.label
) : null;
return React.createElement(
'div',
{ className: formGroupClass },
componentLabel,
React.createElement('input', { onChange: this.handleChange, onBlur: this.handleBlur, value: this.props.value, type: 'email', className: 'FormInput', placeholder: 'Enter email', id: 'inputEmail' }),
validationMessage
);
}
});