From 43e301ed641a742323a98c430e30e134babc4aa4 Mon Sep 17 00:00:00 2001 From: Luc SORIGNET Date: Thu, 1 May 2025 12:19:07 +0200 Subject: [PATCH] fix: Correction du Establishment context au refresh --- Front-End/src/app/[locale]/admin/layout.js | 23 +--- Front-End/src/app/[locale]/parents/layout.js | 4 +- .../src/app/[locale]/users/login/page.js | 27 +--- Front-End/src/components/ProfileSelector.js | 4 +- Front-End/src/components/ProtectedRoute.js | 40 ++++-- Front-End/src/components/Sidebar.js | 4 +- Front-End/src/context/EstablishmentContext.js | 117 ++++++++++++++---- Front-End/src/context/PlanningContext.js | 1 - Front-End/src/utils/Url.js | 2 +- 9 files changed, 136 insertions(+), 86 deletions(-) diff --git a/Front-End/src/app/[locale]/admin/layout.js b/Front-End/src/app/[locale]/admin/layout.js index 9c6180b..01dc897 100644 --- a/Front-End/src/app/[locale]/admin/layout.js +++ b/Front-End/src/app/[locale]/admin/layout.js @@ -40,14 +40,8 @@ import { useEstablishment } from '@/context/EstablishmentContext'; export default function Layout({ children }) { const t = useTranslations('sidebar'); const [isSidebarOpen, setIsSidebarOpen] = useState(false); - const { - setSelectedRoleId, - setSelectedEstablishmentId, - profileRole, - setProfileRole, - establishments, - user, - } = useEstablishment(); + const { profileRole, establishments, user, clearContext } = + useEstablishment(); // Déplacer le reste du code ici... const sidebarItems = { @@ -112,6 +106,7 @@ export default function Layout({ children }) { const confirmDisconnect = () => { setIsPopupVisible(false); disconnect(); + clearContext(); }; const dropdownItems = [ @@ -161,18 +156,6 @@ export default function Layout({ children }) { currentPage={currentPage} items={Object.values(sidebarItems)} onCloseMobile={toggleSidebar} - onRoleChange={(roleId) => { - let parsedRoleId = parseInt(roleId, 10); - if (parsedRoleId === -1) { - parsedRoleId = 0; - } - const role = user.roles[parsedRoleId].role_type; - const establishmentId = - user.roles[parsedRoleId].establishment__id; - setProfileRole(role); - setSelectedRoleId(parsedRoleId); - setSelectedEstablishmentId(establishmentId); - }} /> diff --git a/Front-End/src/app/[locale]/parents/layout.js b/Front-End/src/app/[locale]/parents/layout.js index a814c33..e75237d 100644 --- a/Front-End/src/app/[locale]/parents/layout.js +++ b/Front-End/src/app/[locale]/parents/layout.js @@ -25,9 +25,8 @@ import Footer from '@/components/Footer'; export default function Layout({ children }) { const router = useRouter(); // Définition de router const [messages, setMessages] = useState([]); - const [isLoading, setIsLoading] = useState(true); const [isPopupVisible, setIsPopupVisible] = useState(false); - const { profileRole, user } = useEstablishment(); + const { profileRole, user, clearContext } = useEstablishment(); const softwareName = 'N3WT School'; const softwareVersion = `${process.env.NEXT_PUBLIC_APP_VERSION}`; @@ -38,6 +37,7 @@ export default function Layout({ children }) { const confirmDisconnect = () => { setIsPopupVisible(false); disconnect(); + clearContext(); }; const dropdownItems = [ diff --git a/Front-End/src/app/[locale]/users/login/page.js b/Front-End/src/app/[locale]/users/login/page.js index 47b1c8d..c279ac4 100644 --- a/Front-End/src/app/[locale]/users/login/page.js +++ b/Front-End/src/app/[locale]/users/login/page.js @@ -19,7 +19,7 @@ export default function Page() { const [errorMessage, setErrorMessage] = useState(''); const [userFieldError, setUserFieldError] = useState(''); const [passwordFieldError, setPasswordFieldError] = useState(''); - const { setUser } = useEstablishment(); + const { initializeContextWithSession } = useEstablishment(); const [isLoading, setIsLoading] = useState(false); const router = useRouter(); @@ -40,35 +40,18 @@ export default function Page() { setErrorMessage(result.error); setIsLoading(false); } else { + // On initialise le contexte establishement avec la session getSession() .then((session) => { - if (!session || !session.user) { - throw new Error('Session not found'); - } - const user = session.user; - logger.debug('User Session:', user); - setUser(session.user); - if (session.user.roles && session.user.roles.length > 0) { - let roleIndex = 0; - if ( - session.user.roles.length > session.user.roleIndexLoginDefault - ) { - roleIndex = session.user.roleIndexLoginDefault; - } - const role = session.user.roles[roleIndex].role_type; + initializeContextWithSession(session, (role) => { const url = getRedirectUrlFromRole(role); if (url) { router.push(url); } else { - setIsLoading(false); setErrorMessage('Type de rôle non géré'); } - } else { - setIsLoading(false); - setErrorMessage( - 'Aucun rôle trouvé pour le profil sélectionné.' - ); - } + }); + setIsLoading(false); }) .catch((error) => { logger.error( diff --git a/Front-End/src/components/ProfileSelector.js b/Front-End/src/components/ProfileSelector.js index ad1c3ae..b66c083 100644 --- a/Front-End/src/components/ProfileSelector.js +++ b/Front-End/src/components/ProfileSelector.js @@ -17,11 +17,11 @@ const ProfileSelector = ({ onRoleChange, className = '' }) => { const handleRoleChange = (roleId) => { // Pas bon quand on a plusieur role pour le même établissement - setSelectedRoleId(roleId); const role = user.roles[roleId].role_type; - setProfileRole(role); const establishmentId = user.roles[roleId].establishment__id; + setProfileRole(role); setSelectedEstablishmentId(establishmentId); + setSelectedRoleId(roleId); if (onRoleChange) { onRoleChange(roleId); } diff --git a/Front-End/src/components/ProtectedRoute.js b/Front-End/src/components/ProtectedRoute.js index 878c47a..5e16e5f 100644 --- a/Front-End/src/components/ProtectedRoute.js +++ b/Front-End/src/components/ProtectedRoute.js @@ -1,33 +1,47 @@ -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { useEstablishment } from '@/context/EstablishmentContext'; import { FE_USERS_LOGIN_URL, getRedirectUrlFromRole } from '@/utils/Url'; +import logger from '@/utils/logger'; const ProtectedRoute = ({ children, requiredRight }) => { const { user, profileRole } = useEstablishment(); const router = useRouter(); - let hasRequiredRight = false; - - if (requiredRight && Array.isArray(requiredRight)) { - // Vérifier si l'utilisateur a le droit requis - hasRequiredRight = requiredRight.some((right) => profileRole === right); - } else { - hasRequiredRight = profileRole === requiredRight; - } + const [hasRequiredRight, setHasRequiredRight] = useState(false); // Vérifier si l'utilisateur a au moins un rôle correspondant au requiredRight useEffect(() => { - if (user) { + logger.debug({ + user, + profileRole, + requiredRight, + hasRequiredRight, + }); + + if (user && profileRole) { + let requiredRightChecked = false; + if (requiredRight && Array.isArray(requiredRight)) { + // Vérifier si l'utilisateur a le droit requis + requiredRightChecked = requiredRight.some( + (right) => profileRole === right + ); + } else { + requiredRightChecked = profileRole === requiredRight; + } + setHasRequiredRight(requiredRightChecked); + // Vérifier si l'utilisateur a le droit requis mais pas le bon role on le redirige la page d'accueil associé au role - if (!hasRequiredRight) { + if (!requiredRightChecked) { const redirectUrl = getRedirectUrlFromRole(profileRole); - router.push(`${redirectUrl}`); + if (redirectUrl !== null) { + router.push(`${redirectUrl}`); + } } } else { // User non authentifié router.push(`${FE_USERS_LOGIN_URL}`); } - }, [profileRole]); + }, [user]); // Autoriser l'affichage si authentifié et rôle correct return hasRequiredRight ? children : null; diff --git a/Front-End/src/components/Sidebar.js b/Front-End/src/components/Sidebar.js index 3888c63..f8da173 100644 --- a/Front-End/src/components/Sidebar.js +++ b/Front-End/src/components/Sidebar.js @@ -17,7 +17,7 @@ const SidebarItem = ({ icon: Icon, text, active, url, onClick }) => ( ); -function Sidebar({ currentPage, items, onCloseMobile, onRoleChange }) { +function Sidebar({ currentPage, items, onCloseMobile }) { const router = useRouter(); const [selectedItem, setSelectedItem] = useState(currentPage); @@ -37,7 +37,7 @@ function Sidebar({ currentPage, items, onCloseMobile, onRoleChange }) { return (
- +