From 9266dd82b92bf4a551bb36a626e6a73d9a4cd335 Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 10 Jul 2026 14:30:32 -0500 Subject: [PATCH] Actualizar frontend/src/lib/auth.jsx --- frontend/src/lib/auth.jsx | 88 +++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/frontend/src/lib/auth.jsx b/frontend/src/lib/auth.jsx index e218452..0284c61 100644 --- a/frontend/src/lib/auth.jsx +++ b/frontend/src/lib/auth.jsx @@ -10,54 +10,68 @@ export function AuthProvider({ children }) { const [permisos, setPermisos] = useState([]); // ["ocupabilidad", "cobranza", ...] const [cargando, setCargando] = useState(true); - // Cargar perfil (rol) y permisos del usuario logueado + // 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) => { - // 1) Traer el rol del usuario desde la tabla "perfiles" - const { data: perf, error: e1 } = await supabase - .from("perfiles") - .select("nombre, rol, activo") - .eq("id", userId) - .single(); - - if (e1 || !perf || perf.activo === false) { + try { + // 1) Traer el rol del usuario desde la tabla "perfiles" + const { data: perf, error: e1 } = await supabase + .from("perfiles") + .select("nombre, rol, activo") + .eq("id", userId) + .single(); + if (e1 || !perf || perf.activo === false) { + setPerfil(null); + 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") + .eq("rol", perf.rol); + const modulos = (perms || []) + .filter((p) => p.puede_ver) + .map((p) => p.modulo); + setPerfil({ nombre: perf.nombre, rol: perf.rol }); + setPermisos(modulos); + return true; + } catch (e) { + console.error("[auth] cargarPerfil falló:", e); setPerfil(null); 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") - .eq("rol", perf.rol); - - const modulos = (perms || []) - .filter((p) => p.puede_ver) - .map((p) => p.modulo); - - setPerfil({ nombre: perf.nombre, rol: perf.rol }); - setPermisos(modulos); - return true; }, []); - - // Al iniciar: revisar si ya hay sesión activa + // 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; - supabase.auth.getSession().then(async ({ data }) => { - if (!activo) return; - const s = data?.session || null; - setSession(s); - if (s?.user) await cargarPerfil(s.user.id); - setCargando(false); - }); - + (async () => { + try { + const { data } = await supabase.auth.getSession(); + if (!activo) return; + const s = data?.session || null; + setSession(s); + if (s?.user) await cargarPerfil(s.user.id); + } catch (e) { + console.error("[auth] getSession falló:", e); + } finally { + if (activo) setCargando(false); + } + })(); // Escuchar cambios de sesión (login/logout) const { data: sub } = supabase.auth.onAuthStateChange(async (_evt, s) => { - setSession(s); - if (s?.user) await cargarPerfil(s.user.id); - else { setPerfil(null); setPermisos([]); } + try { + setSession(s); + if (s?.user) await cargarPerfil(s.user.id); + else { setPerfil(null); setPermisos([]); } + } catch (e) { + console.error("[auth] onAuthStateChange falló:", e); + } finally { + if (activo) setCargando(false); + } }); - return () => { activo = false; sub?.subscription?.unsubscribe(); }; }, [cargarPerfil]);