import { useState } from 'react'; import { Link } from 'react-router-dom'; import { Shield, Plus, Search, Edit, Trash2, Lock } from 'lucide-react'; import { useRoles, useDeleteRole, usePermissions, getPermissionCategoryLabel, } from '@/hooks/useRbac'; export default function RolesPage() { const [searchTerm, setSearchTerm] = useState(''); const [selectedRole, setSelectedRole] = useState(null); const { data: roles, isLoading } = useRoles(); const { data: permissions } = usePermissions(); const deleteMutation = useDeleteRole(); const handleDelete = async (id: string, isSystem: boolean) => { if (isSystem) { alert('System roles cannot be deleted.'); return; } if (window.confirm('Are you sure you want to delete this role?')) { await deleteMutation.mutateAsync(id); } }; const filteredRoles = roles?.filter((role: any) => role.name.toLowerCase().includes(searchTerm.toLowerCase()) ); const selectedRoleData = roles?.find((r: any) => r.id === selectedRole); // Group permissions by category const permissionsByCategory = permissions?.reduce((acc: any, perm: any) => { if (!acc[perm.category]) { acc[perm.category] = []; } acc[perm.category].push(perm); return acc; }, {}); return (
{/* Header */}

Roles & Permissions

Manage user roles and their permissions

New Role
{/* Roles List */}
setSearchTerm(e.target.value)} className="w-full rounded-lg border border-gray-300 bg-white py-2 pl-10 pr-4 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white" />
{isLoading ? (
) : filteredRoles?.length ? (
{filteredRoles.map((role: any) => ( ))}
) : (

No roles found.

)}
{/* Role Details */}
{selectedRoleData ? (

{selectedRoleData.name}

{selectedRoleData.description || 'No description'}

{!selectedRoleData.is_system && ( <> Edit )}
{/* Role Info */}

Type

{selectedRoleData.is_system ? 'System' : 'Custom'}

Default

{selectedRoleData.is_default ? 'Yes' : 'No'}

Slug

{selectedRoleData.slug}

{/* Permissions */}

Permissions

{permissionsByCategory && Object.keys(permissionsByCategory).length > 0 ? (
{Object.entries(permissionsByCategory).map(([category, perms]: [string, any]) => { const rolePermSlugs = selectedRoleData.permissions?.map((p: any) => p.slug) || []; const categoryPerms = perms.filter((p: any) => rolePermSlugs.includes(p.slug)); if (categoryPerms.length === 0) return null; return (

{getPermissionCategoryLabel(category)}

{categoryPerms.map((perm: any) => ( {perm.name} ))}
); })}
) : (

No permissions assigned to this role.

)}
) : (

Select a role to view its details and permissions

)}
); }