Initial commit
This commit is contained in:
85
hooks/useUserRoles.ts
Normal file
85
hooks/useUserRoles.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
'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;
|
||||
Reference in New Issue
Block a user