Files
btpxpress-frontend/hooks/useUserRoles.ts

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;