import React, { Component } from "react";
import Joi from "joi-browser";
import * as userService from "../services/userService";
import auth from "../services/authService";
import { Redirect } from "react-router-dom";
class RegisterForm extends Component {
state = {
data: { email: "", password: "", name: "" },
errors: {}
};
scheema = {
email: Joi.string()
.required()
.email()
.min(6)
.max(255)
.label("email"),
password: Joi.string()
.min(6)
.max(255)
.required()
.label("password"),
name: Joi.string()
.required()
.min(5)
.max(255)
.label("name")
};
validate = () => {
const result = Joi.validate(this.state.data, this.scheema, {
abortEarly: false
});
if (!result.error) return null;
const errors = {};
for (let item of result.error.details) {
errors[item.path[0]] = item.message;
}
return errors;
};
validateProperty = inputField => {
const { name, value } = inputField;
const obj = { [name]: value };
const scheema = { [name]: this.scheema[name] };
const result = Joi.validate(obj, scheema); //its not our validate() but its Joi.validate()
return result.error ? result.error.details[0].message : null;
};
handleSubmit = async (event) => {
event.preventDefault();
const errors = this.validate();
this.setState({ errors: errors ? errors : {} });
if (errors) return;
try {
await userService.register(this.state.data);
window.location = "/"; //go to homepage and reload it
} catch (ex) {
if (ex.response && ex.response.status === 400) {
const errors = { ...this.state.errors };
errors.email = ex.response.data;
this.setState({ errors: errors });
}
}
};
handleChange = event => {
const errors = { ...this.state.errors };
const errorMessage = this.validateProperty(event.currentTarget);
if (errorMessage) errors[event.currentTarget.name] = errorMessage;
else delete errors[event.currentTarget.name];
const data = { ...this.state.data };
data[event.currentTarget.name] = event.currentTarget.value;
this.setState({ data: data, errors: errors });
};
render() {
if (auth.isUserLoggedIn()) return