import { useState, useMemo } from 'react'; import { useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { rbacApi } from '@/api/rbac'; import { PermissionGate } from '@/components/auth/PermissionGate'; import { usePermissionStore } from '@/store/permissions'; import { usePlatform } from '@/platform/hooks/usePlatform'; // === Icons === const BackIcon = () => ( ); const PlusIcon = () => ( ); const EditIcon = () => ( ); const TrashIcon = () => ( ); const ShieldIcon = () => ( ); // === Main Page === export default function AdminRoles() { const { t } = useTranslation(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { capabilities } = usePlatform(); const canManageRole = usePermissionStore((s) => s.canManageRole); const [deleteConfirm, setDeleteConfirm] = useState(null); const [formError, setFormError] = useState(null); // Queries const { data: roles, isLoading: rolesLoading, error: rolesError, } = useQuery({ queryKey: ['admin-roles'], queryFn: rbacApi.getRoles, }); // Mutations const deleteMutation = useMutation({ mutationFn: rbacApi.deleteRole, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-roles'] }); setDeleteConfirm(null); }, onError: () => { setDeleteConfirm(null); setFormError(t('admin.roles.errors.deleteFailed')); }, }); // Sorted roles by level descending const sortedRoles = useMemo(() => { if (!roles) return []; return [...roles].sort((a, b) => b.level - a.level); }, [roles]); return (
{/* Header */}
{!capabilities.hasBackButton && ( )}

{t('admin.roles.title')}

{t('admin.roles.subtitle')}

{/* Error message */} {formError && (

{formError}

)} {/* Stats Overview */} {sortedRoles.length > 0 && (
{sortedRoles.length}
{t('admin.roles.stats.totalRoles')}
{sortedRoles.filter((r) => r.is_active).length}
{t('admin.roles.stats.active')}
{sortedRoles.filter((r) => r.is_system).length}
{t('admin.roles.stats.system')}
)} {/* Roles List */} {rolesLoading ? (
) : rolesError ? (

{t('admin.roles.errors.loadFailed')}

) : sortedRoles.length === 0 ? (

{t('admin.roles.noRoles')}

) : (
{sortedRoles.map((role) => (
{/* Role name with color badge */}
{/* Info */}
{t('admin.roles.levelLabel')}: {role.level} {role.description && {role.description}} {t('admin.roles.usersCount', { count: role.user_count ?? 0 })} {t('admin.roles.permissionsCount', { count: role.permissions.length, })}
{/* Actions */}
))}
)} {/* Delete Confirmation */} {deleteConfirm !== null && (
setDeleteConfirm(null)} aria-hidden="true" />

{t('admin.roles.confirm.title')}

{t('admin.roles.confirm.text')}

)}
); }