86 lines
3.1 KiB
TypeScript
Executable File
86 lines
3.1 KiB
TypeScript
Executable File
'use client';
|
|
|
|
import { useState, useEffect } from 'react';
|
|
|
|
interface UserRoles {
|
|
roles: string[];
|
|
hasRole: (role: string) => boolean;
|
|
hasAnyRole: (roles: string[]) => boolean;
|
|
canAccess: (requiredRoles: string[]) => boolean;
|
|
isLoading: boolean;
|
|
}
|
|
|
|
export const useUserRoles = (): UserRoles => {
|
|
const [roles, setRoles] = useState<string[]>([]);
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
const loadUserRoles = () => {
|
|
try {
|
|
// Récupérer les rôles depuis le token stocké
|
|
const accessToken = localStorage.getItem('accessToken');
|
|
if (accessToken) {
|
|
// Décoder le token JWT pour extraire les rôles
|
|
const payload = JSON.parse(atob(accessToken.split('.')[1]));
|
|
|
|
// Extraire les rôles du realm et du client
|
|
const realmRoles = payload.realm_access?.roles || [];
|
|
const clientRoles = payload.resource_access?.['btpxpress-frontend']?.roles || [];
|
|
|
|
const allRoles = [...realmRoles, ...clientRoles];
|
|
setRoles(allRoles);
|
|
console.log('🔐 Rôles utilisateur chargés:', allRoles);
|
|
} else {
|
|
console.warn('⚠️ Aucun token d\'accès trouvé');
|
|
setRoles([]);
|
|
}
|
|
} catch (error) {
|
|
console.error('❌ Erreur lors du chargement des rôles:', error);
|
|
setRoles([]);
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
loadUserRoles();
|
|
}, []);
|
|
|
|
const hasRole = (role: string): boolean => {
|
|
return roles.includes(role);
|
|
};
|
|
|
|
const hasAnyRole = (requiredRoles: string[]): boolean => {
|
|
return requiredRoles.some(role => roles.includes(role));
|
|
};
|
|
|
|
const canAccess = (requiredRoles: string[]): boolean => {
|
|
if (requiredRoles.length === 0) return true;
|
|
return hasAnyRole(requiredRoles);
|
|
};
|
|
|
|
return {
|
|
roles,
|
|
hasRole,
|
|
hasAnyRole,
|
|
canAccess,
|
|
isLoading
|
|
};
|
|
};
|
|
|
|
// Configuration des rôles par page/fonctionnalité
|
|
export const PAGE_ROLES = {
|
|
DASHBOARD: [], // Accessible à tous les utilisateurs authentifiés
|
|
PLANNING: ['super_admin', 'admin', 'directeur', 'manager', 'chef_chantier'],
|
|
CHANTIERS: ['super_admin', 'admin', 'directeur', 'manager', 'chef_chantier', 'ouvrier'],
|
|
CLIENTS: ['super_admin', 'admin', 'directeur', 'commercial'],
|
|
DEVIS: ['super_admin', 'admin', 'directeur', 'commercial'],
|
|
FACTURES: ['super_admin', 'admin', 'directeur', 'comptable'],
|
|
MATERIELS: ['super_admin', 'admin', 'directeur', 'manager', 'logisticien'],
|
|
EMPLOYES: ['super_admin', 'admin', 'directeur', 'manager'],
|
|
EQUIPES: ['super_admin', 'admin', 'directeur', 'manager', 'chef_chantier'],
|
|
REPORTS: ['super_admin', 'admin', 'directeur', 'manager'],
|
|
ADMIN: ['super_admin', 'admin']
|
|
} as const;
|
|
|
|
export type PageRole = keyof typeof PAGE_ROLES;
|