Contexto Global de Usuario
El archivo UserContext.tsx define un contexto global de React que gestiona la información del usuario autenticado a lo largo de toda la aplicación. Esto incluye su token, rol, tipo de cuenta y estado de carga. También proporciona funciones para establecer o refrescar el estado del usuario desde el token JWT almacenado.
🔍 Ubicación
src/context/UserContext.tsx
📦 Dependencias
React:createContext,useContext,useEffect,useStatejwt-decode: para decodificar el token JWT dellocalStorage
🧩 Estructuras de Datos
🔐 Usuario (adaptado desde el token)
interface Usuario {
idUsuario: number;
username: string;
correo: string;
tipoUsuario: "INDIVIDUAL" | "EMPRESARIAL";
rol: "ADMIN" | "DESARROLLADOR" | "LECTOR" | "EDITOR" | string;
rolEquipo?: string;
empresaId?: number;
perfilCompleto: boolean;
nombreEmpresa?: string;
}
🧾 RawToken (estructura cruda decodificada)
Contiene campos opcionales que son normalizados por el adaptador antes de usarlos.
⚙️ ¿Qué exporta este módulo?
1. UserProvider (componente de contexto)
<UserProvider>
{/* children de la app */}
</UserProvider>
- Proveedor que encapsula la lógica de lectura y adaptación del token del
localStorage. - Establece el estado global
usuario. - Gestiona el estado
cargandopara indicar si la verificación inicial ha terminado.
2. useUser() (hook personalizado)
const { usuario, setUsuario, cargando, refreshUsuario } = useUser();
- Permite acceder al contexto del usuario desde cualquier componente hijo del
UserProvider.
🧠 Lógica Interna
Estado local
usuario: Usuario | null;
cargando: boolean;
Efecto inicial
- Se ejecuta en
useEffectal montar el componente. - Si hay token en
localStorage, se decodifica y se adapta al tipoUsuario. - Se setea el estado
usuariocon la información extraída del token. - Finaliza estableciendo
cargando: false.
refreshUsuario()
- Método expuesto por el contexto para volver a leer el token JWT manualmente (sin recargar la página).
- Útil después de un login, edición de perfil, etc.
🧭 Comportamiento Condicional
| Condición | Resultado |
|---|---|
Token válido en localStorage | Se decodifica y adapta al formato interno Usuario |
| Token inválido o ausente | usuario permanece como null, y se marca como no cargando |
| Error de decodificación | Se registra en consola con prefijo ❌ y no se actualiza el estado |
🎨 Estilos y Diseño
- Este archivo no incluye estilos, ya que es puramente lógica y estado compartido.
💡 Ejemplo de Uso
Proveedor global
import { UserProvider } from "./context/UserContext";
function App() {
return (
<UserProvider>
<YourRoutesOrLayout />
</UserProvider>
);
}
Consumo con useUser()
import { useUser } from "../context/UserContext";
const Perfil = () => {
const { usuario, cargando } = useUser();
if (cargando) return <p>Cargando...</p>;
return (
<div>
<h1>Hola, {usuario?.username}</h1>
</div>
);
};
📌 Notas Adicionales
- ⚠️ El hook
useUser()lanza un error si se usa fuera de unUserProvider. - Las claves
rolEquipo,nombreEmpresa, etc. son opcionales para soportar diferentes tipos de usuarios (individuales o empresariales). - Está preparado para escalar a futuros roles o campos nuevos sin romper la estructura.