2019-10-10 06:42:00 +00:00
|
|
|
import React from 'react'
|
|
|
|
import PropTypes from 'prop-types'
|
|
|
|
import isEqual from "lodash/isEqual";
|
|
|
|
import TextInput from '../text-input'
|
2019-12-19 07:35:25 +00:00
|
|
|
import { EmailSettings, parseAddress, convertEmailSettings } from '../../utils/email/';
|
2019-10-10 06:42:00 +00:00
|
|
|
|
2019-12-19 07:35:25 +00:00
|
|
|
// eslint-disable-next-line no-unused-vars, react/prop-types
|
2019-10-14 07:23:26 +00:00
|
|
|
const SimpleInput = ({ onValidateInput, isValidEmail, emailSettings, ...props }) => <TextInput {...props}></TextInput>;
|
2019-10-10 06:42:00 +00:00
|
|
|
|
|
|
|
class EmailInput extends React.Component {
|
2019-10-11 17:59:27 +00:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
|
|
|
const { value, emailSettings } = this.props;
|
2019-12-19 07:35:25 +00:00
|
|
|
const validatedSettings = convertEmailSettings(emailSettings);
|
|
|
|
const isValidEmail = this.checkEmail(value, validatedSettings);
|
2019-10-10 06:42:00 +00:00
|
|
|
|
|
|
|
this.state = {
|
2019-12-19 07:35:25 +00:00
|
|
|
isValidEmail,
|
2019-10-11 17:59:27 +00:00
|
|
|
emailSettings: validatedSettings,
|
2019-10-14 10:57:46 +00:00
|
|
|
inputValue: value
|
2019-10-10 06:42:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-18 13:30:09 +00:00
|
|
|
componentDidUpdate(prevProps) {
|
2019-12-19 07:35:25 +00:00
|
|
|
const { emailSettings, value, onValidateInput } = this.props;
|
|
|
|
if (!EmailSettings.equals(this.props.emailSettings, prevProps.emailSettings)) {
|
|
|
|
const validatedSettings = convertEmailSettings(emailSettings);
|
2019-10-11 17:59:27 +00:00
|
|
|
|
2019-12-19 07:35:25 +00:00
|
|
|
this.setState({ emailSettings: validatedSettings }, function () {
|
|
|
|
this.checkEmail(this.state.inputValue);
|
|
|
|
});
|
2019-12-18 13:30:09 +00:00
|
|
|
}
|
|
|
|
|
2019-12-19 07:35:25 +00:00
|
|
|
if (prevProps.value !== value) {
|
|
|
|
const isValidEmail = this.checkEmail(value);
|
|
|
|
this.setState({
|
|
|
|
inputValue: value,
|
|
|
|
isValidEmail
|
|
|
|
});
|
|
|
|
onValidateInput && onValidateInput(isValidEmail);
|
|
|
|
}
|
2019-10-11 17:59:27 +00:00
|
|
|
|
2019-10-10 06:42:00 +00:00
|
|
|
}
|
|
|
|
|
2019-12-19 07:35:25 +00:00
|
|
|
checkEmail = (value, emailSettings = this.state.emailSettings) => {
|
|
|
|
const { customValidateFunc } = this.props;
|
|
|
|
if (customValidateFunc) {
|
|
|
|
customValidateFunc(value);
|
2019-12-18 13:30:09 +00:00
|
|
|
}
|
|
|
|
else {
|
2019-12-19 07:35:25 +00:00
|
|
|
const emailObj = parseAddress(value, emailSettings);
|
|
|
|
const isValidEmail = emailObj.isValid();
|
2019-12-23 09:02:03 +00:00
|
|
|
const parsedErrors = emailObj.parseErrors;
|
|
|
|
const errors = parsedErrors ? parsedErrors.map(error => error.errorKey) : [];
|
|
|
|
return {
|
|
|
|
isValid: isValidEmail,
|
|
|
|
errors
|
|
|
|
};
|
2019-12-18 13:30:09 +00:00
|
|
|
}
|
2019-12-19 07:35:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
onChange = (e) => {
|
|
|
|
const { onChange, onValidateInput } = this.props;
|
|
|
|
onChange ? onChange(e) : this.setState({ inputValue: e.target.value });
|
|
|
|
|
|
|
|
const isValidEmail = this.checkEmail(e.target.value);
|
|
|
|
this.setState({ isValidEmail });
|
2019-10-30 14:24:52 +00:00
|
|
|
|
2019-12-19 07:35:25 +00:00
|
|
|
onValidateInput && onValidateInput(isValidEmail);
|
2019-10-10 06:42:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
shouldComponentUpdate(nextProps, nextState) {
|
|
|
|
return !isEqual(this.props, nextProps) || !isEqual(this.state, nextState);
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
//console.log('EmailInput render()');
|
2019-10-14 10:57:46 +00:00
|
|
|
// eslint-disable-next-line no-unused-vars
|
2019-12-23 09:02:03 +00:00
|
|
|
const { onValidateInput, emailSettings, onChange, value, hasError, ...rest } = this.props;
|
2019-10-10 06:42:00 +00:00
|
|
|
|
2019-10-14 14:02:08 +00:00
|
|
|
const { isValidEmail, inputValue } = this.state;
|
2019-12-23 10:40:19 +00:00
|
|
|
const isError = typeof (hasError) === 'boolean' ? hasError : Boolean(inputValue && !isValidEmail.isValid);
|
2019-10-10 06:42:00 +00:00
|
|
|
|
|
|
|
return (
|
2019-12-19 07:35:25 +00:00
|
|
|
<SimpleInput
|
2019-12-23 09:02:03 +00:00
|
|
|
hasError={isError}
|
2019-10-14 14:02:08 +00:00
|
|
|
value={inputValue}
|
2019-12-18 13:30:09 +00:00
|
|
|
onChange={this.onChange}
|
2019-10-31 10:31:39 +00:00
|
|
|
type='text'
|
2019-10-10 06:42:00 +00:00
|
|
|
onValidateInput={onValidateInput}
|
2019-10-14 10:57:46 +00:00
|
|
|
{...rest}
|
2019-10-10 06:42:00 +00:00
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
EmailInput.propTypes = {
|
2019-12-23 09:02:03 +00:00
|
|
|
className: PropTypes.string,
|
2019-10-14 11:14:32 +00:00
|
|
|
customValidateFunc: PropTypes.func,
|
2019-11-27 13:59:27 +00:00
|
|
|
emailSettings: PropTypes.oneOfType([PropTypes.instanceOf(EmailSettings), PropTypes.objectOf(PropTypes.bool)]),
|
2019-12-23 09:02:03 +00:00
|
|
|
hasError: PropTypes.bool,
|
2019-11-27 13:59:27 +00:00
|
|
|
id: PropTypes.string,
|
2019-12-23 09:02:03 +00:00
|
|
|
onChange: PropTypes.func,
|
|
|
|
onValidateInput: PropTypes.func,
|
|
|
|
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
|
|
|
|
value: PropTypes.string,
|
2019-10-10 06:42:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
EmailInput.defaultProps = {
|
|
|
|
autoComplete: 'email',
|
2019-12-23 09:02:03 +00:00
|
|
|
className: '',
|
2019-12-23 10:40:19 +00:00
|
|
|
hasError: undefined,
|
2019-12-23 09:02:03 +00:00
|
|
|
id: '',
|
2019-10-10 06:42:00 +00:00
|
|
|
isDisabled: false,
|
2019-10-10 11:33:48 +00:00
|
|
|
isReadOnly: false,
|
2019-12-23 09:02:03 +00:00
|
|
|
maxLength: 255,
|
|
|
|
name: '',
|
2019-10-10 11:33:48 +00:00
|
|
|
placeholder: '',
|
2019-12-23 09:02:03 +00:00
|
|
|
scale: false,
|
|
|
|
size: 'base',
|
2019-10-14 10:57:46 +00:00
|
|
|
title: '',
|
2019-12-23 09:02:03 +00:00
|
|
|
value: '',
|
|
|
|
withBorder: true,
|
2019-10-11 17:59:27 +00:00
|
|
|
|
2019-10-14 14:51:59 +00:00
|
|
|
emailSettings: new EmailSettings()
|
2019-10-10 06:42:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export default EmailInput;
|