Petit ajustement

Petit ajustement du frontend pour l'affichage des options disponibles et la restriction des routes en fonction de la connexion. Enlever la nécessité du token pour récupérer les authActive, puisqu'on n'est pas encore connecté à ce stade.
This commit is contained in:
MathieuSevignyLavallee 2024-09-30 11:07:23 -04:00
parent f379ddcb28
commit ab3925885a
3 changed files with 94 additions and 68 deletions

View file

@ -1,5 +1,4 @@
// App.tsx import { Routes, Route, Navigate } from 'react-router-dom';
import { Routes, Route } from 'react-router-dom';
// Page main // Page main
import Home from './pages/Home/Home'; import Home from './pages/Home/Home';
@ -27,20 +26,16 @@ import ApiService from './services/ApiService';
const handleLogout = () => { const handleLogout = () => {
ApiService.logout(); ApiService.logout();
} };
const isLoggedIn = () => { const isLoggedIn = () => {
return ApiService.isLoggedIn(); return ApiService.isLoggedIn();
} };
function App() { function App() {
return ( return (
<div className="content"> <div className="content">
<Header isLoggedIn={isLoggedIn} handleLogout={handleLogout} />
<Header
isLoggedIn={isLoggedIn}
handleLogout={handleLogout}/>
<div className="app"> <div className="app">
<main> <main>
<Routes> <Routes>
@ -51,20 +46,35 @@ function App() {
<Route path="/teacher/login" element={<Login />} /> <Route path="/teacher/login" element={<Login />} />
<Route path="/teacher/register" element={<Register />} /> <Route path="/teacher/register" element={<Register />} />
<Route path="/teacher/resetPassword" element={<ResetPassword />} /> <Route path="/teacher/resetPassword" element={<ResetPassword />} />
<Route path="/teacher/dashboard" element={<Dashboard />} />
<Route path="/teacher/share/:id" element={<Share />} /> {/* Routes protégées : redirection si l'utilisateur n'est pas connecté */}
<Route path="/teacher/editor-quiz/:id" element={<QuizForm />} /> <Route
<Route path="/teacher/manage-room/:id" element={<ManageRoom />} /> path="/teacher/dashboard"
element={isLoggedIn() ? <Dashboard /> : <Navigate to="/auth-selection" />}
/>
<Route
path="/teacher/share/:id"
element={isLoggedIn() ? <Share /> : <Navigate to="/auth-selection" />}
/>
<Route
path="/teacher/editor-quiz/:id"
element={isLoggedIn() ? <QuizForm /> : <Navigate to="/auth-selection" />}
/>
<Route
path="/teacher/manage-room/:id"
element={isLoggedIn() ? <ManageRoom /> : <Navigate to="/auth-selection" />}
/>
{/* Pages espace étudiant */} {/* Pages espace étudiant */}
<Route path="/student/join-room" element={<JoinRoom />} /> <Route path="/student/join-room" element={isLoggedIn() ? <JoinRoom /> : <Navigate to="/auth-selection" />}
/>
{/* Pages authentification selection */} {/* Pages authentification sélection */}
<Route path="/auth-selection" element={<AuthSelection />} /> <Route path="/auth-selection" element={<AuthSelection />} />
</Routes> </Routes>
</main> </main>
</div> </div>
<Footer/> <Footer />
</div> </div>
); );
} }

View file

@ -1,10 +1,12 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import './authselection.css'; import './authselection.css';
const AuthSelection: React.FC = () => { const AuthSelection: React.FC = () => {
const [simpleLoginData, setSimpleLoginData] = useState({ username: '', password: '' }); const [simpleLoginData, setSimpleLoginData] = useState({ username: '', password: '' });
const [authData, setAuthData] = useState<any>(null); // Stocke les données d'auth const [authData, setAuthData] = useState<any>(null); // Stocke les données d'auth
const navigate = useNavigate(); const navigate = useNavigate();
// Récupérer les données d'authentification depuis l'API // Récupérer les données d'authentification depuis l'API
useEffect(() => { useEffect(() => {
const fetchAuthData = async () => { const fetchAuthData = async () => {
@ -19,15 +21,18 @@ const AuthSelection: React.FC = () => {
}; };
fetchAuthData(); // Appel de la fonction pour récupérer les données fetchAuthData(); // Appel de la fonction pour récupérer les données
}, []); }, []);
const handleSimpleLoginChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleSimpleLoginChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target; const { name, value } = e.target;
setSimpleLoginData((prev) => ({ ...prev, [name]: value })); setSimpleLoginData((prev) => ({ ...prev, [name]: value }));
}; };
const handleSimpleLoginSubmit = (e: React.FormEvent) => { const handleSimpleLoginSubmit = (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();
// Logique d'authentification pour Simple Login // Logique d'authentification pour Simple Login
console.log('Simple Login Data:', simpleLoginData); console.log('Simple Login Data:', simpleLoginData);
}; };
const handleAuthLogin = (provider: string) => { const handleAuthLogin = (provider: string) => {
window.location.href = 'http://localhost:3000/api/auth/' + provider; window.location.href = 'http://localhost:3000/api/auth/' + provider;
}; };
@ -35,7 +40,9 @@ const AuthSelection: React.FC = () => {
return ( return (
<div className="auth-selection-page"> <div className="auth-selection-page">
<h1>Connexion</h1> <h1>Connexion</h1>
{/* Formulaire de connexion simple */}
{/* Formulaire de connexion Simple Login */}
{authData && authData['simple-login'] && (
<div className="form-container"> <div className="form-container">
<form onSubmit={handleSimpleLoginSubmit}> <form onSubmit={handleSimpleLoginSubmit}>
<input <input
@ -57,10 +64,13 @@ const AuthSelection: React.FC = () => {
<button type="submit">Se connecter</button> <button type="submit">Se connecter</button>
</form> </form>
</div> </div>
)}
{/* Conteneur OAuth */} {/* Conteneur OAuth */}
{authData && Object.keys(authData).some(key => authData[key].type === 'oauth') && (
<div className="oauth-container"> <div className="oauth-container">
<h2>Se connecter avec OAuth</h2> <h2>Se connecter avec OAuth</h2>
{authData && Object.keys(authData).map((providerKey) => { {Object.keys(authData).map((providerKey) => {
const provider = authData[providerKey]; const provider = authData[providerKey];
if (provider.type === 'oauth') { if (provider.type === 'oauth') {
return ( return (
@ -72,14 +82,17 @@ const AuthSelection: React.FC = () => {
return null; return null;
})} })}
</div> </div>
)}
{/* Conteneur OIDC */} {/* Conteneur OIDC */}
{authData && Object.keys(authData).some(key => authData[key].type === 'oidc') && (
<div className="oidc-container"> <div className="oidc-container">
<h2>Se connecter avec OIDC</h2> <h2>Se connecter avec OIDC</h2>
{authData && Object.keys(authData).map((providerKey) => { {Object.keys(authData).map((providerKey) => {
const provider = authData[providerKey]; const provider = authData[providerKey];
if (provider.type === 'oidc') { if (provider.type === 'oidc') {
return ( return (
<button key={providerKey} className="provider-btn oauth-btn" onClick={() => handleAuthLogin(providerKey)}> <button key={providerKey} className="provider-btn oidc-btn" onClick={() => handleAuthLogin(providerKey)}>
Continuer avec {providerKey} Continuer avec {providerKey}
</button> </button>
); );
@ -87,10 +100,13 @@ const AuthSelection: React.FC = () => {
return null; return null;
})} })}
</div> </div>
)}
<div> <div>
<button className="home-button-container" onClick={() => navigate('/')}>Retour à l'accueil</button> <button className="home-button-container" onClick={() => navigate('/')}>Retour à l'accueil</button>
</div> </div>
</div> </div>
); );
}; };
export default AuthSelection; export default AuthSelection;

View file

@ -4,6 +4,6 @@ const jwt = require('../middleware/jwtToken.js');
const authController = require('../controllers/auth.js') const authController = require('../controllers/auth.js')
router.get("/getActiveAuth",jwt.authenticate, authController.getActive); router.get("/getActiveAuth",authController.getActive);
module.exports = router; module.exports = router;