A nossa conexão vai ser bem similar a que tivemos no registro. Mas antes, nós vamos configurar o toast de sucesso para quando o usuário vier da página de registro.
const router = useRouter();
const [toastColor, setToastColor] = useState("");
const [toastIsOpen, setToastIsOpen] = useState(false);
const [toastMessage, setToastMessage] = useState("");
Nós iremos fazer um if para verificar se a mensagem está vindo como verdadeira. Para isso nós usaremos um useEffect e colocaremos como dependência o método “router.query”. Dessa forma o useEffect só será processado quando tivermos uma mudança na rota. (Caso isso não seja feito, o if entrará em um loop de verificação, causando erro ao next)
const registerSucess = router.query.registred;
useEffect(() => {
if (registerSucess === "true") {
alert("Sucesso")
}
}, [router.query]);
Agora que está funcionando, nós podemos configurar as props do nosso toast.
if (registerSucess === "true") {
setToastColor("bg-success");
setToastIsOpen(true);
setTimeout(() => {
setToastIsOpen(false);
}, 1000 * 3);
setToastMessage("Cadatro feito com sucesso!");
}
Agora vamos passar tudo isso para o nosso toast
<ToastComponent color={toastColor} isOpen={toastIsOpen} message={toastMessage}/>
Agora, nós podemos testar novamente de forma manual e verificar se está sendo retornada a mensagem. (http://localhost:3001/login?sucess=true)
Nós iremos agora no arquivo “authService.ts” para criar parâmetros para o login. Esse parâmetros serão apenas os inputs de email e senha, que é o que usamos.
interface LoginParams {
email: string;
password: string;
}
Agora iremos começar criando um método de login, muito parecido com o de registro
login: async (params: LoginParams) => {},
Vamos colocar agora um “res”, que vai ter um método post para a url de login, pegando dessa vez o erro 400 e 401.
login: async (params: LoginParams) => {
const res = await api.post("/auth/login", params).catch((error) => {
if (error.response.status === 400 || error.response.status === 401) {
return error.response;
}
return error;
});
},
agora faremos uma verificação, se tiver sucesso, retorna 200, então se for 200, iremos colocar no sessionStorage o token que vem do login.
login: async (params: LoginParams) => {
const res = await api.post("/auth/login", params).catch((error) => {
if (error.response.status === 400 || error.response.status === 401) {
return error.response;
}
return error;
});
if (res.status === 200) {
sessionStorage.setItem("onebitflix-token", res.data.token);
}
return res;
},
Agora abaixo do useState de registro, nós iremos criar um handle de login, que vamos colocar no formulário, parecido com o de registro.
const handleLogin = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
}
Agora iremos pegar as informações usando o “formData”
const handleLogin = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
const formData = new FormData(event.currentTarget);
const email = formData.get("email")!.toString();
const password = formData.get("password")!.toString();
const params = { email, password };
}
Nós iremos agora colocar o método de login, iremos pegar apenas o status, pois as mesagens de erro que vão vir, nós vamos colocar juntas em uma só.
const { status } = await authService.login(params);
Agora vamo verificar se o status é 200, se for, vamos mandar ele para home, se não for, vamos dizer que ou o email ou a senha estão incorretos.
if (status === 200) {
router.push("/home");
} else {
setToastColor("bg-danger");
setToastIsOpen(true);
setTimeout(() => {
setToastIsOpen(false);
}, 1000 * 3);
setToastMessage("Email ou senha incorretos!");
}
Nós vamos conseguir verificar se a pessoa está autenticada através do “sessision-storage” nas páginas, quando a pessoa é logada o “authService” vai colocar o token no “session”.