Skip to content
Snippets Groups Projects
SignUp.js 7.46 KiB
import React, { useEffect } from "react";
import Grid from "@material-ui/core/Grid";
import { Redirect } from "react-router-dom";
import { createMuiTheme, MuiThemeProvider } from "@material-ui/core";
import IconButton from "@material-ui/core/IconButton";
import { useHistory } from "react-router-dom";
import { makeStyles } from "@material-ui/core/styles";
import KeyboardArrowRightIcon from "@material-ui/icons/KeyboardArrowRight";
import FormInput from "../components/fieldsSignUp/FormInput";
import Paper from "@material-ui/core/Paper";
import api from "../api";

const useStyles = makeStyles((theme) => ({
  register: {
    maxWidth: "1000px",
    background: "#ffffff",
    borderRadius: "2px",
    padding: "2% 1%",
    marginTop: "3%",
    margin: "0 auto",
    width: "95%",
  },
  custom_strong: {
    fontSize: "25px",
    textAlign: "center",
    display: "block",
    color: "#46525d",
  },
  strong_description: {
    fontSize: "14px",
    color: "#c2c6ca",
  },
  form: {
    alignItems: "center",
    textAlign: "center",
  },
  alreadyAcc: {
    marginTop: "10px",
  },
  button: {
    type: "submit",
    width: "30%",
    marginTop: "4%",
    marginBottom: "10%",
    background: "#6ec46c",
    borderRadius: "2px",
    padding: "10px 20px",
    fontSize: "18px",
    "&:hover": {
      backgroundColor: "rgb(25, 109, 23)",
    },
    ["@media (max-width:550px)"]: {
      width: "55%",
    },
  },
  errorGridOpts: {
    marginTop: "1%",
    color: "#ff4646",
    width: "100%",
    fontSize: "13px",
  },
}));
export default function SignUp() {
  const history = useHistory();
  const classes = useStyles();
  const [isLoged, setIsLoged] = React.useState(
    window.sessionStorage.getItem("token")
  );
  const [values, setValues] = React.useState({
    name: "",
    email: "",
    password: "",
    password_confirm: "",
    nameError: false,
    emailError: false,
  });
  useEffect(() => {
    !checkName() ? (values.nameError = true) : (values.nameError = false);
  }, [values.name]);
  useEffect(() => {
    !checkEmail() ? (values.emailError = true) : (values.emailError = false);
  }, [values.email]);

  const handleChange = (prop) => (event) => {
    setValues({ ...values, [prop]: event.target.value });
  };
  function checkPassword() {
    if (values.password !== values.password_confirm) {
      alert("As senhas não conferem");
      return false;
    }
    return true;
  }
  function checkName() {
    return values.name
      ? /^[A-Za-záàâãéèêíïóôõöúçñÁÀÂÃÉÈÍÏÓÔÕÖÚÇÑ ]+$/.test(values.name) &&
        values.name.length <= 225
        ? true
        : false
      : true;
  }

  function checkEmail() {
    return values.email
      ? /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(values.email)
        ? true
        : false
      : true;
  }

  function checkPasswordString() {
    return values.password
      ? /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&+_ ():;/?\|"'-])[A-Za-z\d@$!%*?&+_ ():;/?\|"'-]{8,24}$/.test(
          values.password
        )
      : true;
  }

  function verifyValues() {
    if (
      values.name &&
      values.email &&
      values.password &&
      values.password_confirm
    ) {
      if (verifyValuesContent()) {
        return true;
      } else return false;
    }
    return false;
  }
  // Ficou com essa configuração porque as funções para verificar nome e email são chamadas em 'tempo real' para deixar o campo em vermelho.
  function verifyValuesContent() {
    if (!checkName()) {
      alert("Nome inválido");
      return false;
    } else if (!checkEmail()) {
      alert("Email invalido");
      return false;
    } else if (!checkPassword()) {
      alert("Verifique se sua senha satisfaz as condições mencionadas");
      return false;
    } else if (!checkPasswordString()) {
      return false;
    } else return true;
  }
  async function handleSubmit() {
    const response = await api
      .post(`/user/signUp`, {
        email: values.email,
        name: values.name,
        hash: values.password,
      })
      .then(function (error) {
        if (!error.response) {
          let path = `signin`;
          history.push(path);
        }
      })
      .catch(function (error) {
        if (error.response) {
          switch (error.response.data.error) {
            case 'duplicate key value violates unique constraint "form_user_name_key"':
              alert("Você já tem uma conta.");
              break;
            case "Email exists on the database.":
              alert("Email já cadastrado");
              break;
            case "data and salt arguments required":
              alert(
                "Ocorreu um erro com sua senha. Tente novamente em alguns minutos ou tente mudá-la"
              );
            default:
              alert("Um erro ocorreu. Tente novamente mais tarde.");
          }
          return;
        }
      });
  }
  function submit() {
    if (verifyValues()) {
      handleSubmit();
    }
  }
  const theme = createMuiTheme({
    overrides: {
      root: {
        color: "white",
      },
      MuiInput: {
        underline: {
          "&:before": {
            borderBottom: "1px solid #35c7fc",
          },
          "&:after": {
            borderBottom: "1px solid #3f51b5",
          },
        },
      },
    },
  });
  return isLoged ? (
    <Redirect to="/signin" />
  ) : (
    <MuiThemeProvider theme={theme}>
      <Paper className={classes.register} justify="center">
        <strong className={classes.custom_strong}>
          Cadastro de Usuário
          <p className={classes.strong_description}>
            Insira as informações abaixo
          </p>
        </strong>
        <form className={classes.form} autocomplete="off">
          <Grid>
            <FormInput
              label="Nome Completo"
              param="name"
              onUpdate={handleChange}
              error={!checkName()}
            />
          </Grid>
          <Grid>
            <FormInput
              label="E-mail"
              param="email"
              onUpdate={handleChange}
              error={!checkEmail()}
            />
          </Grid>
          <Grid>
            <FormInput
              label="Senha"
              param="password"
              onUpdate={handleChange}
              error={!checkPasswordString()}
            />
            {(!checkPasswordString() || !values.password) && (
              <Grid className={classes.errorGridOpts}>
                Sua senha deve conter entre 8 e 24 caracteres, uma letra
                maiúscula, uma minúscula e um número
              </Grid>
            )}
          </Grid>
          <Grid>
            <FormInput
              label="Confirmar Senha"
              param="password_confirm"
              onUpdate={handleChange}
              error={
                values.password_confirm
                  ? values.password === values.password_confirm
                    ? false
                    : true
                  : false
              }
            />
          </Grid>
          <Grid className={classes.alreadyAcc}>
            <a href="https://genforms.c3sl.ufpr.br/#/signin">
              Já é cadastrado?
            </a>
          </Grid>
          <Grid>
            <IconButton
              size="medium"
              className={classes.button}
              id="whiteTextedButton"
              onClick={() => submit()}
            >
              <KeyboardArrowRightIcon />
              Cadastre-se
            </IconButton>
          </Grid>
        </form>
      </Paper>
    </MuiThemeProvider>
  );
}