UNPKG

react-cm-ui

Version:
137 lines (123 loc) 3.97 kB
import ReactPhoneInput, { formatPhoneNumberIntl, isValidPhoneNumber, parsePhoneNumber, } from 'react-phone-number-input/max'; import _ from 'lodash'; import ClassNames from 'classnames'; import flags from 'react-phone-number-input/flags'; import PropTypes from 'prop-types'; import React from 'react'; import PhoneInputCountryDropdown from './phoneInputCountryDropdown'; const propTypes = { className: PropTypes.string, country: PropTypes.string, countryOptions: PropTypes.arrayOf(PropTypes.string), /** * Deprecated prop. Please use `disabled` instead. */ disable: PropTypes.bool, /** * A PhoneInput can be disabled. */ disabled: PropTypes.bool, error: PropTypes.oneOfType([ PropTypes.bool, PropTypes.string, ]), fluid: PropTypes.bool, id: PropTypes.string, label: PropTypes.string, labelStyle: PropTypes.shape({}), onChange: PropTypes.func.isRequired, required: PropTypes.bool, style: PropTypes.shape({}), value: PropTypes.string.isRequired, }; const defaultProps = { className: undefined, country: 'US', countryOptions: ['US', '|'], disable: false, disabled: false, error: false, fluid: false, id: undefined, label: undefined, labelStyle: undefined, required: false, style: undefined, }; class PhoneInput extends React.PureComponent { constructor() { super(); this.onChange = this.onChange.bind(this); } onChange(value) { const { onChange } = this.props; const number = value || ''; const phoneNumberObj = number && parsePhoneNumber(number); const countryCode = (phoneNumberObj && phoneNumberObj.country) || ''; const dialCode = phoneNumberObj && phoneNumberObj.countryCallingCode; const formattedNumber = (number && formatPhoneNumberIntl(number)) || ''; const isValid = (number && isValidPhoneNumber(number)) || false; onChange(number, formattedNumber, dialCode, countryCode, isValid); } render() { const { className, countryOptions, disable, disabled, error, fluid, id, label, labelStyle, required, style, value, } = this.props; const isDisabled = disable || disabled; const containerClasses = ClassNames('ui', 'phone-input', className, { 'phone-input--disabled': isDisabled, 'phone-input--error': error, 'phone-input--fluid': fluid, }); return ( <div className={containerClasses} id={id} style={style} > {label ? ( <label className="label" htmlFor={id} style={labelStyle}> {label} {required && !value ? ( <span className="phone-input--required_indicator">*</span> ) : null} </label> ) : null} <ReactPhoneInput // eslint-disable-next-line react/jsx-props-no-spreading {...this.props} disabled={isDisabled} className="" countryOptions={countryOptions} countrySelectComponent={PhoneInputCountryDropdown} fluid="" international={false} onChange={this.onChange} flags={flags} style={{}} /> {error && _.isString(error) ? ( <p className="input-error-message">{error}</p> ) : null} </div> ); } } PhoneInput.propTypes = propTypes; PhoneInput.defaultProps = defaultProps; export default PhoneInput;