feat: Gestion multi-profil multi-école

This commit is contained in:
N3WT DE COMPET
2025-03-09 16:22:28 +01:00
parent 95c154a4a2
commit 16178296ec
51 changed files with 1621 additions and 802 deletions

View File

@ -3,7 +3,7 @@
import React, { useState, useEffect } from 'react';
import Sidebar from '@/components/Sidebar';
import { usePathname } from 'next/navigation';
import {useTranslations} from 'next-intl';
import { useTranslations } from 'next-intl';
import Image from 'next/image';
import {
Users,
@ -35,6 +35,9 @@ import ProtectedRoute from '@/components/ProtectedRoute';
import { getGravatarUrl } from '@/utils/gravatar';
import Footer from '@/components/Footer';
import { getRightStr, RIGHTS } from '@/utils/rights';
import { getSession } from 'next-auth/react';
import logger from '@/utils/logger';
import { useEstablishment } from '@/context/EstablishmentContext';
export default function Layout({
children,
@ -51,11 +54,12 @@ export default function Layout({
"settings": { "id": "settings", "name": t('settings'), "url": FE_ADMIN_SETTINGS_URL, "icon": Settings }
};
const [establishment, setEstablishment] = useState(null);
const [establishments, setEstablishments] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [isPopupVisible, setIsPopupVisible] = useState(false);
const [user, setUser] = useState(null);
const { data: session } = useSession();
const { selectedEstablishmentId, setSelectedEstablishmentId, profileRole, setProfileRole } = useEstablishment();
const pathname = usePathname();
const currentPage = pathname.split('/').pop();
@ -80,7 +84,7 @@ export default function Layout({
content: (
<div className="px-4 py-2">
<div className="font-medium">{user?.email || 'Utilisateur'}</div>
<div className="text-xs text-gray-400">{getRightStr(user?.role) || ''}</div>
<div className="text-xs text-gray-400">{getRightStr(profileRole) || ''}</div>
</div>
)
},
@ -106,17 +110,34 @@ export default function Layout({
}, [pathname]);
useEffect(() => {
setIsLoading(true);
fetchEstablishment()
.then(data => {
setEstablishment(data);
getSession()
.then(session => {
if (session && session.user) {
setUser(session.user);
setEstablishments(session.user.roles.map(role => ({
id: role.establishment__id,
name: role.establishment__name,
role_type: role.role_type
})));
// Sélectionner l'établissement depuis le localStorage ou le premier établissement par défaut
const storedEstablishmentId = localStorage.getItem('selectedEstablishmentId');
if (storedEstablishmentId) {
setSelectedEstablishmentId(storedEstablishmentId);
const storedProfileRole = session.user.roles.find(role => role.establishment__id === parseInt(storedEstablishmentId))?.role_type;
setProfileRole(storedProfileRole);
} else if (session.user.roles.length > 0) {
setSelectedEstablishmentId(session.user.roles[0].establishment__id);
setProfileRole(session.user.roles[0].role_type);
}
}
})
.catch(error => console.error('Error fetching establishment : ', error))
.finally(() => setIsLoading(false));
.catch(err => {
logger.error('Error fetching session:', err);
});
}, []);
useEffect(() => {
const fetchUser = async () => {
const fetchUser = async () => {
if (session) { // Vérifier que la session existe
const userData = await getUser();
setUser(userData);
@ -126,8 +147,6 @@ export default function Layout({
fetchUser();
}, [session]);
return (
<ProtectedRoute requiredRight={RIGHTS.ADMIN}>
{!isLoading && (
@ -138,12 +157,16 @@ export default function Layout({
style={{ height: '100vh' }} // Force la hauteur à 100% de la hauteur de la vue
>
<Sidebar
establishment={establishment}
establishments={establishments}
currentPage={currentPage}
items={Object.values(sidebarItems)}
onCloseMobile={toggleSidebar}
onEstablishmentChange={(establishmentId) => {
const parsedEstablishmentId = parseInt(establishmentId, 10);
setSelectedEstablishmentId(parsedEstablishmentId);
const role = session.user.roles.find(role => role.establishment__id === parsedEstablishmentId)?.role_type;
setProfileRole(role);
}}
/>
</div>