diff --git a/package.json b/package.json index 875382d..eac61ff 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "release-android": "cd android && fastlane beta" }, "dependencies": { + "email-validator": "^1.1.1", "moment": "^2.19.1", "native-base": "^2.3.2", "prop-types": "^15.5.10", diff --git a/src/api.js b/src/api.js index 133c5ca..2c3644a 100644 --- a/src/api.js +++ b/src/api.js @@ -11,6 +11,7 @@ export function requestLogin(username, password) { return (dispatch) => { // We are now logging in dispatch(loginRequest()); + return fetch(`${Config.DUSKEN_API_URL}/auth/obtain-token/`, { method: 'POST', headers: { diff --git a/src/modules/membership/MembershipContainer.js b/src/modules/membership/MembershipContainer.js index 9017461..8a4b2ff 100644 --- a/src/modules/membership/MembershipContainer.js +++ b/src/modules/membership/MembershipContainer.js @@ -2,16 +2,15 @@ import React, {Component} from 'react'; import {connect} from "react-redux"; import Membership from "./Membership"; +import ProofContainer from "./ProofContainer"; import { logout } from "../../actions"; import {requestUserData} from "../../api"; -import ProofContainer from "./ProofContainer"; class MembershipContainer extends Component { constructor(props) { super(props); this.state = { - isAuthenticated: props.isAuthenticated, isFetchingUserData: props.isFetchingUserData, userToken: props.userToken, lastOrder: props.lastOrder, @@ -19,9 +18,6 @@ class MembershipContainer extends Component { } componentWillReceiveProps(nextProps) { - if(this.state.isAuthenticated !== nextProps.isAuthenticated) { - this.setState({isAuthenticated: nextProps.isAuthenticated}) - } if(this.state.userToken !== nextProps.userToken) { this.setState({userToken: nextProps.userToken}, () => { if(nextProps.userToken) { @@ -60,6 +56,7 @@ class MembershipContainer extends Component { if (this.props.user) { return { - this.setState({firstName: text}, () => { this.validateForm('firstName'); }); + onChangeText={(firstName) => { + this.setState({firstName}, () => { this.validateForm('firstName'); }); }} onSubmitEditing={() => { this.refs.lastNameInput._root.focus() }} + value={this.state.firstName} /> {this.fieldHasError('firstName') && } ; @@ -67,12 +72,13 @@ export default class UserRegister extends Component { { - this.setState({lastName: text}, () => { this.validateForm('lastName'); }); + onChangeText={(lastName) => { + this.setState({lastName}, () => { this.validateForm('lastName'); }); }} onSubmitEditing={() => { this.refs.emailInput._root.focus() }} + value={this.state.lastName} /> {this.fieldHasError('lastName') && } ; @@ -87,12 +93,13 @@ export default class UserRegister extends Component { autoCapitalize="none" autoCorrect={false} returnKeyType="next" - onChangeText={(text) => { - this.setState({email: text}, () => { this.validateForm('email'); }); + onChangeText={(email) => { + this.setState({email}, () => { this.validateForm('email'); }); }} onSubmitEditing={() => { this.refs.phoneInput._root.focus() }} + value={this.state.email} /> {this.fieldHasError('email') && } ; @@ -105,12 +112,13 @@ export default class UserRegister extends Component { ref="phoneInput" returnKeyType="next" keyboardType="phone-pad" - onChangeText={(text) => { - this.setState({phoneNumber: text}, () => { this.validateForm('phoneNumber'); }); + onChangeText={(phoneNumber) => { + this.setState({phoneNumber}, () => { this.validateForm('phoneNumber'); }); }} onSubmitEditing={() => { this.refs.passwordInput._root.focus() }} + value={this.state.phoneNumber} /> {this.fieldHasError('phoneNumber') && } ; @@ -124,26 +132,38 @@ export default class UserRegister extends Component { secureTextEntry={true} autoCapitalize="none" autoCorrect={false} - onChangeText={(text) => { - this.setState({password: text}, () => { this.validateForm('password'); }); + onChangeText={(password) => { + this.setState({password}, () => { this.validateForm('password'); }); }} onSubmitEditing={this.onRegisterPress} + value={this.state.password} /> {this.fieldHasError('password') && } } - showError = () => { - // TODO: Move these from prop to state in componentWillRecieveProps - // TODO: Format these and highlight error fields - if (this.props.registerError && Object.keys(this.props.registerError).length !== 0) { - const err = this.props.registerError.non_field_errors; + componentWillReceiveProps(nextProps) { + if(this.props.registerError !== nextProps.registerError) { + this.setState({'errors': nextProps.registerError}) + } + } + + showNonFieldError = () => { + const errors = this.props.registerError; + if (Object.keys(errors).length !== 0 && 'non_field_errors' in errors) { + const err = errors.non_field_errors; let errorFormatted = err ? err[0] : 'Kunne ikke registrere bruker, prøv igjen...'; return {errorFormatted} } - else { - return + + return + }; + + showFieldError = (field) => { + if(!this.fieldHasError(field) ) { + return; } + return {this.state.errors[field]}; }; showSpinner = () => { @@ -158,11 +178,16 @@ export default class UserRegister extends Component {
{this.firstNameInput()} + {this.showFieldError('firstName')} {this.lastNameInput()} + {this.showFieldError('lastName')} {this.emailInput()} + {this.showFieldError('email')} {this.phoneNumberInput()} + {this.showFieldError('phoneNumber')} {this.passwordInput()} - {this.showError()} + {this.showFieldError('password')} + {this.showNonFieldError()} {this.registerbutton()} {this.showSpinner()}
@@ -172,7 +197,7 @@ export default class UserRegister extends Component { } onRegisterPress = () => { - if( !this.validateForm() ) { + if( !this.canSubmitForm() ) { Toast.show({ text: 'Noen av feltene er ikke fylt ut riktig', position: 'bottom', @@ -192,7 +217,7 @@ export default class UserRegister extends Component { }; registerbutton() { - const isDisabled = this.props.isRegisteringUser || !this.canSubmitForm(); + const isDisabled = this.state.touched.size === 0 || this.props.isRegisteringUser || !this.canSubmitForm(); return (