From 51d6de32dda77674974b4e0c2300c2fd5ddbb024 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sat, 22 Aug 2026 11:23:25 -0500 Subject: [PATCH] Actualizar frontend/src/lib/auth.jsx --- frontend/src/lib/auth.jsx | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/frontend/src/lib/auth.jsx b/frontend/src/lib/auth.jsx index 0284c61..a930b8c 100644 --- a/frontend/src/lib/auth.jsx +++ b/frontend/src/lib/auth.jsx @@ -6,15 +6,12 @@ const AuthContext = createContext(null); export function AuthProvider({ children }) { const [session, setSession] = useState(null); - const [perfil, setPerfil] = useState(null); // { nombre, rol } - const [permisos, setPermisos] = useState([]); // ["ocupabilidad", "cobranza", ...] + const [perfil, setPerfil] = useState(null); + const [permisos, setPermisos] = useState([]); const [cargando, setCargando] = useState(true); - // Cargar perfil (rol) y permisos del usuario logueado. - // Nunca lanza: ante cualquier error devuelve false (evita que la app se cuelgue). const cargarPerfil = useCallback(async (userId) => { try { - // 1) Traer el rol del usuario desde la tabla "perfiles" const { data: perf, error: e1 } = await supabase .from("perfiles") .select("nombre, rol, activo") @@ -25,7 +22,6 @@ export function AuthProvider({ children }) { setPermisos([]); return false; } - // 2) Traer los módulos permitidos para ese rol desde "permisos" const { data: perms } = await supabase .from("permisos") .select("modulo, puede_ver") @@ -43,13 +39,18 @@ export function AuthProvider({ children }) { return false; } }, []); - // Al iniciar: revisar si ya hay sesión activa. - // try/finally garantiza que "cargando" SIEMPRE se apague (aunque falle la red). + useEffect(() => { let activo = true; + // Respaldo: si en 10s no termina (sesion colgada), apaga "Cargando..." igual. + const tSeguridad = setTimeout(() => { if (activo) setCargando(false); }, 10000); (async () => { try { - const { data } = await supabase.auth.getSession(); + // getSession con timeout de 8s: si no responde, no bloquea el arranque. + const conTimeout = (p, ms) => Promise.race([ + p, new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")), ms)), + ]); + const { data } = await conTimeout(supabase.auth.getSession(), 8000); if (!activo) return; const s = data?.session || null; setSession(s); @@ -57,10 +58,11 @@ export function AuthProvider({ children }) { } catch (e) { console.error("[auth] getSession falló:", e); } finally { + clearTimeout(tSeguridad); if (activo) setCargando(false); } })(); - // Escuchar cambios de sesión (login/logout) + const { data: sub } = supabase.auth.onAuthStateChange(async (_evt, s) => { try { setSession(s); @@ -72,13 +74,13 @@ export function AuthProvider({ children }) { if (activo) setCargando(false); } }); - return () => { activo = false; sub?.subscription?.unsubscribe(); }; + + return () => { activo = false; clearTimeout(tSeguridad); sub?.subscription?.unsubscribe(); }; }, [cargarPerfil]); const login = async (email, password) => { const { data, error } = await supabase.auth.signInWithPassword({ email, password }); if (error) return { ok: false, msg: traducirError(error.message) }; - // Verificar que tenga perfil/rol válido const ok = await cargarPerfil(data.user.id); if (!ok) { await supabase.auth.signOut();