import { List } from 'immutable'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Button, Picker, ScrollView, Text, TextInput, View } from 'react-native'; import { Avatar } from 'react-native-elements'; import { getEmailAvailability, getNomAvailability } from '../../api/profile.js'; import EditNomDeBid from './EditNomDeBid.js'; import PhoneListInput from './PhoneInput/PhoneListInput.js'; import styles from './Profile.styles.js'; const STRINGS = { AVATAR_HEADING: 'Want to add a picture?', CANCEL: 'Cancel', EMAIL_HEADING: 'Email (this will be your username)', NOM_HEADING: 'and a Nom de Bid - your bidding alias!', PASSWORD_HEADING: 'For security, let\'s choose a password', PERSONAL_HEADING: 'Great! And now a bit about you...', SAVE_PROFILE: 'Save profile', }; export default class EditProfile extends Component { static get propTypes() { return { addresses: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]), avatar: PropTypes.string, cancelEditAction: PropTypes.func.isRequired, email: PropTypes.string, firstName: PropTypes.string, initials: PropTypes.string, isGeneratedNomDeBid: PropTypes.bool, isGuided: PropTypes.bool, isRegsiteredAccount: PropTypes.bool, lastName: PropTypes.string, nomDeBid: PropTypes.string, phones: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]), saveProfileAction: PropTypes.func.isRequired, saveProfileLabel: PropTypes.string, showPasswordEntry: PropTypes.bool, }; } static get defaultProps() { return { addresses: new List(), avatar: null, email: null, firstName: null, initials: null, isGeneratedNomDeBid: false, isGuided: false, isRegsiteredAccount: false, lastName: null, nomDeBid: null, phones: new List(), saveProfileLabel: STRINGS.SAVE_PROFILE, showPasswordEntry: false, }; } static validatePasswordMatch(password, passwordCheck) { if ((!password || !passwordCheck) || (password || passwordCheck && password.length === passwordCheck.length) ){ return null; } return password === passwordCheck; } constructor(props) { super(props); this.state = { addresses: this.props.addresses, avatar: this.props.avatar, email: this.props.email, firstName: this.props.firstName, lastName: this.props.lastName, invalidEmail: null, nomDeBid: this.props.nomDeBid, password: this.props.password, passwordCheck: null, phones: this.props.phones, }; this.handleCancel = this.handleCancel.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } _validateEmail() { getEmailAvailability(this.state.email) .then((result) => { console.log(`_validateEmail => getEmailAvailability(${this.state.email}):`, result); this.setState({ invalidEmail: !result.available }); }); } getProfileFromState() { return { addresses: this.state.addresses.toArray(), avatar: this.state.avatar, email: this.state.email, firstName: this.state.firstName, lastName: this.state.lastName, nomDeBid: this.state.nomDeBid, password: this.state.password, phones: this.state.phones.toArray(), }; } handleCancel() { this.props.cancelEditAction(); } handleSubmit() { if (!this.isFormComplete()) { console.error('Incomplete form... how did the button become enabled?'); alert('Please complete all of the required fields. They have bold labels.'); return; } this.props.saveProfileAction(this.getProfileFromState()); } isFormComplete() { const { showPasswordEntry } = this.props; const { password, passwordCheck } = this.state; return ( !this.state.invalidEmail && !this.state.invalidNomDeBid && !!this.state.firstName && !!this.state.lastName && !!this.state.email && !!this.state.nomDeBid && !!this.state.phones.size && ((showPasswordEntry && EditProfile.validatePasswordMatch(password, passwordCheck)) || !showPasswordEntry) ); } render() { const { isGeneratedNomDeBid, isGuided, isRegsiteredAccount, showPasswordEntry } = this.props; const { addresses, avatar, firstName, invalidEmail, lastName, password, passwordCheck, phones } = this.state; const addressesTitle = 'Addresses'; const numbersTitle = 'Numbers'; return ( {STRINGS.EMAIL_HEADING} this.setState({ email: text })} onEndEditing={(text) => this._validateEmail(text)} placeholder="email address" style={[styles.textInput, styles.requiredInput]} value={this.state.email || ''} /> {invalidEmail === true && ( {`You've already registered!`}