Gestion et affichage des erreurs + redirection apr connexion réussi

pull/81/head
Baptiste MARCEL 1 year ago
parent 6afa571c56
commit d737280f1b

@ -1,53 +1,76 @@
import React, { Component } from 'react'; import React, { useState, useEffect } from 'react';
import { AiOutlineSend } from 'react-icons/ai'; import { AiOutlineSend } from 'react-icons/ai';
import { useNavigate } from 'react-router-dom';
import AuthService from '../services/AuthService'; import AuthService from '../services/AuthService';
import '../Style/Global.css'; import '../Style/Global.css';
export default class Login extends Component { const SignIn = () => {
handleSubmit = async (event: any) => { const navigate = useNavigate();
const [error, setError] = useState<string | null>(null);
const [showConfirmation, setShowConfirmation] = useState(false);
const handleSubmit = async (event: React.FormEvent) => {
event.preventDefault(); event.preventDefault();
try{
try {
const data = { const data = {
pseudo: event.target.pseudo.value, pseudo: (event.target as any).pseudo.value,
password: event.target.password.value, password: (event.target as any).password.value,
remember: event.target.remember.value remember: (event.target as any).remember.checked
}; };
const result = await AuthService.signIn(data); const validation = await AuthService.validateSignIn(data);
console.log(result);
alert('Connexion réussie !'); if (!validation.valid) {
} setError(validation.error);
catch(error){ } else {
console.error(error); setError(null);
const result = await AuthService.signIn(data);
// console.log(result);
setShowConfirmation(true);
setTimeout(() => {
navigate('/play'); // 3 secondes avant de rediriger vers la page de connexion
}, 3000);
}
} catch (error: any) {
setError(error.message);
} }
}; };
render() { useEffect(() => {
return ( return () => {
<div className="form-container"> setShowConfirmation(false);
<form onSubmit={this.handleSubmit}> };
<br/> }, []);
<h3>Log In</h3>
<div className="mb-3"> return (
<label>Pseudo</label> <div className="form-container">
<input <form onSubmit={handleSubmit}>
<br/>
<h3>Log In</h3>
<div className="mb-3">
<label>Pseudo</label>
<input
type="pseudo" type="pseudo"
name='pseudo' name='pseudo'
className="form-control" className="form-control"
placeholder="Entrez votre pseudo ici" placeholder="Entrez votre pseudo ici"
/> />
</div> </div>
<div className="mb-3"> <div className="mb-3">
<label>Password</label> <label>Password</label>
<input <input
type="password" type="password"
name='password' name='password'
className="form-control" className="form-control"
placeholder="Entrez votre mot de passe ici" placeholder="Entrez votre mot de passe ici"
/> />
</div> </div>
<div className="mb-3"> <div className="mb-3">
<div className="custom-control custom-checkbox"> <div className="custom-control custom-checkbox">
<input <input
type="checkbox" type="checkbox"
name='remember' name='remember'
@ -57,18 +80,31 @@ export default class Login extends Component {
<label className="custom-control-label" htmlFor="customCheck1"> <label className="custom-control-label" htmlFor="customCheck1">
Se souvenir de moi Se souvenir de moi
</label> </label>
</div>
</div> </div>
<div className="d-grid"> </div>
<button type="submit" className="btn btn-primary"> <div className="d-grid">
<button type="submit" className="btn btn-primary">
Soumettre <AiOutlineSend/> Soumettre <AiOutlineSend/>
</button> </button>
</div> </div>
<p className="forgot-password text-right"> <p className="forgot-password text-right">
<a href="#">Mot de passe</a> oublié ? <a href="#">Mot de passe</a> oublié ?
</p> </p>
</form> </form>
</div>
) {error && (
} <div className="alert alert-danger" role="alert">
} {error}
</div>
)}
{showConfirmation && (
<div className="alert alert-success" role="alert">
Connexion réussie ! Vous serez redirigé vers votre profil dans 3 secondes.
</div>
)}
</div>
);
};
export default SignIn;

@ -1,11 +1,11 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { AiOutlineSend } from 'react-icons/ai'; import { AiOutlineSend } from 'react-icons/ai';
import { useNavigate } from 'react-router-dom'; // Use useNavigate instead of useHistory import { useNavigate } from 'react-router-dom';
import AuthService from '../services/AuthService'; import AuthService from '../services/AuthService';
import '../Style/Global.css'; import '../Style/Global.css';
const SignUp = () => { const SignUp = () => {
const navigate = useNavigate(); // Use useNavigate instead of useHistory const navigate = useNavigate();
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const [showConfirmation, setShowConfirmation] = useState(false); const [showConfirmation, setShowConfirmation] = useState(false);

@ -7,6 +7,10 @@ class AuthService{
return VerificationService.validateSignUpData(data); return VerificationService.validateSignUpData(data);
} }
static async validateSignIn(data: any): Promise<{valid: boolean, error: string}> {
return VerificationService.validateSignInData(data);
}
static async signUp(data: any) { static async signUp(data: any) {
try { try {
const response = await fetch('http://localhost:3000/auth/signup', { const response = await fetch('http://localhost:3000/auth/signup', {
@ -32,21 +36,23 @@ class AuthService{
static async signIn(data: any) { static async signIn(data: any) {
try { try {
const response = await fetch('http://localhost:3000/auth/signin', { const response = await fetch('http://localhost:3000/auth/signin', {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify(data), body: JSON.stringify(data),
}); });
if (response.ok) { if (response.ok) {
const result = await response.json(); const result = await response.json();
return result; return result;
} else { } else {
throw new Error('Échec de la connexion.'); const errorResponse = await response.json();
} throw new Error(errorResponse.error);
} catch (error) { }
}
catch (error) {
console.error(error); console.error(error);
throw error; throw error;
} }

@ -14,6 +14,18 @@ class ValidationService {
return {valid: true, error: ''}; return {valid: true, error: ''};
} }
public static validateSignInData(data: any): {valid: boolean, error: string} {
if(!data.pseudo || !data.password) {
return {valid: false, error: 'Veuillez remplir tous les champs.'};
}
if(data.password.length < 8) {
return {valid: false, error: 'Le mot de passe doit contenir au moins 8 caractères.'};
}
return {valid: true, error: ''};
}
} }
export default ValidationService; export default ValidationService;
Loading…
Cancel
Save