+ Sin resultados — no se encontraron usuarios con los filtros seleccionados.
+
+ )
+ }
+
+ return (
+
+
+
+ {user.nombre} {user.apellido}
+
+ navigate('/usuarios')}>
+ Volver
+
+
+
+
+
+ Usuario
+ {user.username}
+
+
+ Email
+ {user.email ?? '—'}
+
+
+ Rol
+ {user.rol}
+
+
+ Estado
+ {user.activo
+ ? Activo
+ : Inactivo
+ }
+
+
+
+
+ navigate(`/usuarios/${userId}/editar`)}
+ >
+ Editar
+
+
+ {user.activo ? (
+ deactivate(userId)}
+ >
+ {deactivating ? 'Desactivando...' : 'Desactivar'}
+
+ ) : (
+ reactivate(userId)}
+ >
+ {reactivating ? 'Reactivando...' : 'Reactivar'}
+
+ )}
+
+ {loggedUserId !== userId && }
+
+
+ )
+}
diff --git a/src/web/src/features/users/pages/UserEditPage.tsx b/src/web/src/features/users/pages/UserEditPage.tsx
new file mode 100644
index 0000000..8ac581d
--- /dev/null
+++ b/src/web/src/features/users/pages/UserEditPage.tsx
@@ -0,0 +1,233 @@
+import { useEffect } from 'react'
+import { useNavigate, useParams } from 'react-router-dom'
+import { useForm } from 'react-hook-form'
+import { zodResolver } from '@hookform/resolvers/zod'
+import { z } from 'zod'
+import { isAxiosError } from 'axios'
+import { AlertCircle } from 'lucide-react'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+import { Alert, AlertDescription } from '@/components/ui/alert'
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from '@/components/ui/form'
+import { useUser } from '../hooks/useUser'
+import { useUpdateUser } from '../hooks/useUpdateUser'
+import { ResetPasswordModal } from '../components/ResetPasswordModal'
+import { useAuthStore } from '@/stores/authStore'
+
+const editSchema = z.object({
+ nombre: z.string().min(1, 'El nombre es requerido'),
+ apellido: z.string().min(1, 'El apellido es requerido'),
+ email: z.string().email('Email inválido').optional().or(z.literal('')),
+ rol: z.string().min(1, 'Seleccioná un rol válido'),
+ activo: z.boolean(),
+})
+
+type EditFormValues = z.infer