import React, { Component } from "react"; import { Link } from "react-router-dom"; import { Grid, TextField, CircularProgress } from "@material-ui/core"; import { Alert } from "@material-ui/lab"; import { withStyles } from "@material-ui/styles"; import propTypes from "prop-types"; import { Formik } from "formik"; import validate from "./validate-yup"; import getValidationSchema from "./getValidationSchema-yup"; import "./signup.css"; import defaultPic from "./defaultPic.png"; import defaultPicLook from "./defaultPicLook.png"; import defaultPicPassword from "./defaultPicHide.png"; //redux import { connect } from "react-redux"; import { signupUser } from "../../redux/actions/userActions"; const styles = { wrapper: { alignItems: "center", display: "flex", justifyContent: "center", minHeight: "calc(100vh - 170px)", }, }; class SignupPage extends Component { constructor() { super(); this.state = { dberrors: {}, avatar: false, avatarPassword: false, }; } UNSAFE_componentWillReceiveProps(nextProps) { if (nextProps.ui.errors) { this.setState({ dberrors: nextProps.ui.errors }); } } changeAvatar = () => { this.setState({ avatar: true, avatarPassword: false, }); }; changeAvatarOriginal = () => { this.setState({ avatar: false, avatarPassword: false, }); }; changeAvatarPassword = () => { this.setState({ avatar: true, avatarPassword: true, }); }; render() { const { ui: { loading }, } = this.props; const { dberrors } = this.state; return ( <Formik initialValues={{ email: "", userName: "", password: "", passwordConfirmation: "", }} validate={validate(getValidationSchema)} onSubmit={(values, { setSubmitting, setErrors }) => { setTimeout(() => { const newUserData = { email: values.email, password: values.password, confirmPassword: values.passwordConfirmation, handle: values.userName, }; console.log("User has been sucessfully saved!", newUserData); this.props.signupUser(newUserData, this.props.history); setSubmitting(false); }, 500); }} > {({ touched, errors, handleChange, handleBlur, handleSubmit }) => ( <div className="SignUpContainer"> <div className="SignUpBox"> <div className="SignUpHeader"> <h1 className="SignUpHeading">SIGN UP</h1> <div className="SignUpHeaderImg"> <img alt="monkey img" src={ this.state.avatar ? this.state.avatarPassword ? defaultPicPassword : defaultPicLook : defaultPic } ></img> </div> </div> <Grid container spacing={2}> <Grid item xs={12}> {!loading ? (dberrors.email && ( <Alert severity="error" style={{ textTransform: "capitalize" }} > {dberrors.email} </Alert> )) || (dberrors.error && ( <Alert severity="error" style={{ textTransform: "capitalize" }} > {dberrors.error} </Alert> )) : null} </Grid> <Grid item xs={12}> <TextField error={errors.name && touched.name ? true : false} fullWidth helperText={errors.name && touched.name && errors.name} id="userName" label="Username" name="userName" className="SignUpUserName" onBlur={handleBlur} onChange={handleChange} required variant="outlined" onClick={this.changeAvatar} /> </Grid> <Grid item xs={12}> <TextField error={errors.email && touched.email ? true : false} fullWidth helperText={errors.email && touched.email && errors.email} id="email" label="Email" name="email" onBlur={handleBlur} onChange={handleChange} required type="email" variant="outlined" onClick={this.changeAvatarOriginal} /> </Grid> <Grid item xs={12}> <TextField error={errors.password && touched.password ? true : false} fullWidth helperText={ errors.password && touched.password && errors.password } id="password" label="Password" name="password" onBlur={handleBlur} onChange={handleChange} required type="password" variant="outlined" onClick={this.changeAvatarPassword} /> </Grid> <Grid item xs={12}> <TextField error={ errors.passwordConfirmation && touched.passwordConfirmation ? true : false } fullWidth helperText={ errors.passwordConfirmation && touched.passwordConfirmation && errors.passwordConfirmation } id="passwordConfirmation" label="Confirm Password" name="passwordConfirmation" onBlur={handleBlur} onChange={handleChange} required type="password" variant="outlined" onClick={this.changeAvatarPassword} /> </Grid> <div className="SignUpSubmit"> <button type="submit" onClick={handleSubmit} style={{ margin: "5px" }} disabled={loading} > Sign Up{" "} {loading ? ( <CircularProgress size={17} thickness={6} /> ) : null} </button> <div className="SignUpLink"> <Link to="/login"> Already have an Account ? Log In here </Link> </div> </div> </Grid> </div> </div> )} </Formik> ); } } SignupPage.propTypes = { user: propTypes.object.isRequired, ui: propTypes.object.isRequired, signupUser: propTypes.func.isRequired, }; const mapStateToProps = (state) => { return { ui: state.ui, user: state.user, }; }; const mapActionsToProps = { signupUser, }; export default connect( mapStateToProps, mapActionsToProps )(withStyles(styles)(SignupPage));