diff --git a/cryptide_project/src/Pages/LoginForm.tsx b/cryptide_project/src/Pages/LoginForm.tsx
index fae874f..0c56b55 100644
--- a/cryptide_project/src/Pages/LoginForm.tsx
+++ b/cryptide_project/src/Pages/LoginForm.tsx
@@ -1,11 +1,13 @@
import React, { useState, useEffect } from 'react';
import { AiOutlineSend } from 'react-icons/ai';
-import { useNavigate } from 'react-router-dom';
+import { useNavigate } from 'react-router-dom';
+import { useAuth } from '../Contexts/AuthContext';
import AuthService from '../services/AuthService';
import '../Style/Global.css';
const SignIn = () => {
- const navigate = useNavigate();
+ const navigate = useNavigate();
+ const { login } = useAuth();
const [error, setError] = useState
(null);
const [showConfirmation, setShowConfirmation] = useState(false);
@@ -32,6 +34,7 @@ const SignIn = () => {
setShowConfirmation(true);
setTimeout(() => {
+ login();
navigate('/play'); // 3 secondes avant de rediriger vers la page de connexion
}, 3000);
}
diff --git a/cryptide_project/src/Pages/Play.tsx b/cryptide_project/src/Pages/Play.tsx
index 86c593d..a3ea278 100644
--- a/cryptide_project/src/Pages/Play.tsx
+++ b/cryptide_project/src/Pages/Play.tsx
@@ -1,12 +1,12 @@
import React, { useEffect, useState } from 'react';
+/* Context */
+import { useAuth } from '../Contexts/AuthContext';
+
/* Style */
import './Play.css';
import { useTheme } from '../Style/ThemeContext';
-/* Nav */
-import { Link } from 'react-router-dom';
-
/* Component */
import ButtonImgNav from "../Components/ButtonImgNav"
import SessionService from "../services/SessionService";
@@ -15,43 +15,66 @@ import SessionService from "../services/SessionService";
import Person from '../res/img/Person.png';
/* Icon */
-import trophy from '../res/icon/trophy.png';
-import param from '../res/icon/param.png';
-import share from '../res/icon/share.png';
import { socket } from '../SocketConfig';
import { useNavigate } from 'react-router-dom';
import GameCreator from '../model/GameCreator';
import { useGame } from '../Contexts/GameContext';
import ScoreBoard from '../Components/ScoreBoard';
-import { set } from 'lodash';
+
+/* Types */
+import { PlayerProps } from '../types/Player';
function Play() {
const theme=useTheme()
- const [username, setUsername] = useState('');
- const [nbSoloGames, setNbSoloGames] = useState(0);
- const [soloBestScore, setSoloBestScore] = useState(0);
- const [soloAverageTry, setSoloAverageTry] = useState(0);
+ const {isLoggedIn, login} = useAuth();
+ const [player, setPlayer] = useState(null);
useEffect(() => {
const fetchUserInformation = async () => {
- try {
- const sessionData = await SessionService.getSession();
-
- console.log(sessionData);
- // Vérifie si il y a une session
- if (sessionData.user) {
- setUsername(sessionData.user.pseudo);
- setNbSoloGames(sessionData.user.soloStats.nbGames);
- setSoloBestScore(sessionData.user.soloStats.bestScore);
- setSoloAverageTry(sessionData.user.soloStats.averageTry);
- } else {
- // Pas de session on génère un guest random
- setUsername(`Guest ${Math.floor(Math.random() * 100000)}`);
+ try {
+ const sessionData = await SessionService.getSession();
+
+ // Vérifie si il y a une session
+ if (sessionData.user) {
+ // Il y a une session on récupère les infos du joueur
+ const updatedPlayer: PlayerProps = {
+ pseudo: sessionData.user.pseudo,
+ profilePicture: sessionData.user.profilePicture,
+ soloStats: {
+ nbGames: sessionData.user.soloStats.nbGames,
+ bestScore: sessionData.user.soloStats.bestScore,
+ avgNbTry: sessionData.user.soloStats.avgNbTry,
+ },
+ onlineStats: {
+ nbGames: sessionData.user.onlineStats.nbGames,
+ nbWins: sessionData.user.onlineStats.nbWins,
+ ratio: sessionData.user.onlineStats.ratio,
+ },
+ };
+ login();
+ setPlayer(updatedPlayer);
+ } else {
+ // Pas de session on génère un guest random
+ const guestPlayer: PlayerProps = {
+ pseudo: 'Guest_' + Math.floor(Math.random() * 1000000),
+ profilePicture: '',
+ soloStats: {
+ nbGames: 0,
+ bestScore: 0,
+ avgNbTry: 0,
+ },
+ onlineStats: {
+ nbGames: 0,
+ nbWins: 0,
+ ratio: 0,
+ },
+ };
+ setPlayer(guestPlayer);
+ }
+ } catch (error) {
+ console.error(error);
}
- } catch (error) {
- console.error(error);
- }
};
fetchUserInformation();
@@ -113,7 +136,7 @@ function Play() {
- {username}
+ {player && player.pseudo}
-
+ {player && ()}
);
diff --git a/cryptide_project/src/Translations/en.json b/cryptide_project/src/Translations/en.json
index b462ccd..c5fe91d 100644
--- a/cryptide_project/src/Translations/en.json
+++ b/cryptide_project/src/Translations/en.json
@@ -21,6 +21,7 @@
"log_in":" Log in ",
"sign_up":" Sign up ",
+ "log_out":" Log out ",
"join" : "Join",
"create_room" : "Create room",
diff --git a/cryptide_project/src/Translations/fr.json b/cryptide_project/src/Translations/fr.json
index a60b340..7dba79e 100644
--- a/cryptide_project/src/Translations/fr.json
+++ b/cryptide_project/src/Translations/fr.json
@@ -21,6 +21,7 @@
"log_in":" Se connecter ",
"sign_up":" S'inscrire ",
+ "log_out":" Se déconnecter ",
"join" : "Rejoindre",
diff --git a/cryptide_project/src/server/controllers/AuthController.js b/cryptide_project/src/server/controllers/AuthController.js
index 0316d35..6bd5aa7 100644
--- a/cryptide_project/src/server/controllers/AuthController.js
+++ b/cryptide_project/src/server/controllers/AuthController.js
@@ -87,16 +87,16 @@ class AuthController {
}
}
- static getSession(req, res) {
- console.log(req.session);
- // Vérifier si l'utilisateur est connecté
- if (req.session.user) {
- // Envoyer une réponse réussie
- res.status(200).json({ message: 'Utilisateur connecté', user: req.session.user });
- } else {
- // Envoyer une réponse d'erreur
- res.status(401).json({ error: 'Utilisateur non connecté' });
- }
+ static async logout(req, res) {
+ // Détruire la session pour déconnecter l'utilisateur
+ req.session.destroy((err) => {
+ if (err) {
+ console.error(err);
+ res.status(500).json({ error: 'Erreur lors de la déconnexion.' });
+ } else {
+ res.status(200).json({ message: 'Déconnexion réussie' });
+ }
+ });
}
}
diff --git a/cryptide_project/src/server/db/socialgraph.db b/cryptide_project/src/server/db/socialgraph.db
index 750cc18..fda2b9c 100644
Binary files a/cryptide_project/src/server/db/socialgraph.db and b/cryptide_project/src/server/db/socialgraph.db differ
diff --git a/cryptide_project/src/server/routes/AuthRoutes.js b/cryptide_project/src/server/routes/AuthRoutes.js
index 348346c..be94796 100644
--- a/cryptide_project/src/server/routes/AuthRoutes.js
+++ b/cryptide_project/src/server/routes/AuthRoutes.js
@@ -6,6 +6,7 @@ const SessionController = require('../controllers/SessionController');
// Routes pour l'authentification
router.post('/auth/signup', AuthController.signUp);
router.post('/auth/signin', AuthController.signIn);
+router.delete('/auth/logout', AuthController.logout)
// Routes pour les sessions
router.get('/session', SessionController.getUserInformation);
diff --git a/cryptide_project/src/services/AuthService.tsx b/cryptide_project/src/services/AuthService.tsx
index a6716bc..e7b85e4 100644
--- a/cryptide_project/src/services/AuthService.tsx
+++ b/cryptide_project/src/services/AuthService.tsx
@@ -58,6 +58,29 @@ class AuthService{
throw error;
}
}
+
+ static async logout() {
+ try {
+ const response = await fetch('http://localhost:3003/auth/logout', {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ credentials: 'include',
+ });
+
+ if (response.ok) {
+ const result = await response.json();
+ return result;
+ } else {
+ const errorResponse = await response.json();
+ throw new Error(errorResponse.error);
+ }
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+ }
}
export default AuthService;
\ No newline at end of file
diff --git a/cryptide_project/src/types/Player.tsx b/cryptide_project/src/types/Player.tsx
new file mode 100644
index 0000000..f522152
--- /dev/null
+++ b/cryptide_project/src/types/Player.tsx
@@ -0,0 +1,18 @@
+export interface PlayerSoloStats {
+ nbGames: number;
+ bestScore: number;
+ avgNbTry: number;
+};
+
+export interface PlayerOnlineStats {
+ nbGames: number;
+ nbWins: number;
+ ratio: number;
+};
+
+export interface PlayerProps {
+ profilePicture: string;
+ pseudo: string;
+ soloStats: PlayerSoloStats;
+ onlineStats: PlayerOnlineStats;
+};
\ No newline at end of file