From dfc4daf696b99f33eaa2dc87c3d3917ae574d15f Mon Sep 17 00:00:00 2001 From: Mike Fitzpatrick Date: Wed, 7 Aug 2019 17:49:34 -0400 Subject: [PATCH] - Stuff --- .../Profile/EditProfile.container.js | 17 ++ app/components/Profile/EditProfile.js | 178 ++++++++++++++++++ app/components/Profile/Profile.container.js | 20 ++ app/components/Profile/Profile.js | 50 +++++ app/components/Profile/Profile.styles.js | 0 .../Profile/ViewProfile.container.js | 17 ++ app/components/Profile/ViewProfile.js | 102 ++++++++++ app/domain/Profile.js | 11 ++ app/screens/Profile.container.js | 7 +- app/screens/Profile.js | 93 +++++++-- app/screens/Profile.styles.js | 15 ++ app/screens/Register.js | 134 ++----------- app/screens/Register.styles.js | 9 +- app/screens/SignInOrRegister.js | 41 ++-- 14 files changed, 522 insertions(+), 172 deletions(-) create mode 100644 app/components/Profile/EditProfile.container.js create mode 100644 app/components/Profile/EditProfile.js create mode 100644 app/components/Profile/Profile.container.js create mode 100644 app/components/Profile/Profile.js create mode 100644 app/components/Profile/Profile.styles.js create mode 100644 app/components/Profile/ViewProfile.container.js create mode 100644 app/components/Profile/ViewProfile.js create mode 100644 app/screens/Profile.styles.js diff --git a/app/components/Profile/EditProfile.container.js b/app/components/Profile/EditProfile.container.js new file mode 100644 index 0000000..aead19e --- /dev/null +++ b/app/components/Profile/EditProfile.container.js @@ -0,0 +1,17 @@ +import { connect } from 'react-redux'; + +import { commonProfileStateToProps } from './Profile.container.js'; +import EditProfile from './EditProfile.js'; + +const matchStateToProps = (dispatch) => { + const commonProps = commonProfileStateToProps(state); + const profile = getProfile(state); + + return { + ...commonProps, + firstName: profile.get('firstName'), + lastName: profile.get('lastName'), + }; +}; + +export default connect(matchStateToProps, null)(EditProfile); diff --git a/app/components/Profile/EditProfile.js b/app/components/Profile/EditProfile.js new file mode 100644 index 0000000..f352816 --- /dev/null +++ b/app/components/Profile/EditProfile.js @@ -0,0 +1,178 @@ +import React, { Component } from 'react'; +import { Text, TextInput, View } from 'react-native'; +import { Avatar } from 'react-native-elements'; + +import { getEmailAvailability, getNomAvailability } from '../api/profile.js'; + +import styles from './Profile.styles.js'; + +const STRINGS = { + CANCEL: 'Cancel', + NOM_EXPLANATION: 'Selecting a nom de bid allows you to bid anonymously - or not. By default, we\'ll use your first initial and last name.', + SAVE_PROFILE: 'Save profile', +}; + +export default class EditProfile extends Component { + + static get propTypes() { + return { + addresses: PropTypes.array, + avatar: PropTypes.string, + cancelEditAction: PropTypes.func.isRequired, + email: PropTypes.string, + firstName: PropTypes.string, + initials: PropTypes.string, + lastName: PropTypes.string, + nomDeBid: PropTypes.string, + phones: PropTypes.array, + saveProfileAction: PropTypes.func.isRequired, + saveProfileLabel: PropTypes.string, + }; + } + + static get defaultProps() { + return { + addresses: null, + avatar: null, + email: null, + firstName: null, + initials: null, + lastName: null, + nomDeBid: null, + phones: null, + saveProfileLabel: STRINGS.SAVE_PROFILE, + }; + } + + constructor() { + 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: false, + invalidNomDeBid: false, + nomDeBid: this.props.nomDeBid, + password: this.props.password, + phones: this.props.phones, + }; + + this.handleCancel = this.handleCancel.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } + + _validateEmail() { + getEmailAvailability(this.state.email, (result) => this.setState('invalidEmail', !result.available)); + } + + _validateNomDeBid() { + getNomAvailability(this.state.nomDeBid, (result) => this.setState('invalidNomDeBid', !result.available)); + } + + getProfileFromState() { + return { + addresses: this.state.addresses, + 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, + }; + } + + 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() { + return !this.state.invalidEmail && !this.state.invalidNomDeBid && + !!this.state.firstName && !!this.state.lastName && !!this.state.email && + !!this.state.nomDeBid && !!this.state.phones.length && !!this.state.password; + } + + render() { + const { avatar, firstName, lastName } = this.state; + const avatarTitle = !avatar && firstName && lastName + ? `${firstName.substring(0,1)}${lastName.substring(0,1)}` + : null; + + return ( + + + {avatar !== null ? ( + + ) : ( + + )} + + + this.setState({ firstName: text })} + placeholder="first name" + style={[styles.textInput, styles.requiredInput]} + value={this.state.firstName} + /> + this.setState({ lastName: text })} + placeholder="last name" + style={[styles.textInput, styles.requiredInput]} + value={this.state.lastName} + /> + + + this.setState({ email: text })} + onEndEditing={(text) => this._validateEmail(text)} + placeholder="email address" + style={[styles.textInput, styles.requiredInput]} + value={this.state.email} + /> + + + {STRINGS.NOM_EXPLANATION} + this.setState({ nomDeBid: text })} + onEndEditing={(text) => this._validateEmail(text)} + placeholder="nom de bid" + style={[styles.textInput, styles.requiredInput]} + value={this.state.nomDeBid} + /> + + + Numbers + {phones.length > 0 && ( + // LIST PHONES + )} +