Actualizar frontend/src/lib/auth.jsx

This commit is contained in:
2026-08-22 11:23:25 -05:00
parent de1af4e8fe
commit 51d6de32dd

View File

@@ -6,15 +6,12 @@ const AuthContext = createContext(null);
export function AuthProvider({ children }) { export function AuthProvider({ children }) {
const [session, setSession] = useState(null); const [session, setSession] = useState(null);
const [perfil, setPerfil] = useState(null); // { nombre, rol } const [perfil, setPerfil] = useState(null);
const [permisos, setPermisos] = useState([]); // ["ocupabilidad", "cobranza", ...] const [permisos, setPermisos] = useState([]);
const [cargando, setCargando] = useState(true); 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) => { const cargarPerfil = useCallback(async (userId) => {
try { try {
// 1) Traer el rol del usuario desde la tabla "perfiles"
const { data: perf, error: e1 } = await supabase const { data: perf, error: e1 } = await supabase
.from("perfiles") .from("perfiles")
.select("nombre, rol, activo") .select("nombre, rol, activo")
@@ -25,7 +22,6 @@ export function AuthProvider({ children }) {
setPermisos([]); setPermisos([]);
return false; return false;
} }
// 2) Traer los módulos permitidos para ese rol desde "permisos"
const { data: perms } = await supabase const { data: perms } = await supabase
.from("permisos") .from("permisos")
.select("modulo, puede_ver") .select("modulo, puede_ver")
@@ -43,13 +39,18 @@ export function AuthProvider({ children }) {
return false; return false;
} }
}, []); }, []);
// Al iniciar: revisar si ya hay sesión activa.
// try/finally garantiza que "cargando" SIEMPRE se apague (aunque falle la red).
useEffect(() => { useEffect(() => {
let activo = true; let activo = true;
// Respaldo: si en 10s no termina (sesion colgada), apaga "Cargando..." igual.
const tSeguridad = setTimeout(() => { if (activo) setCargando(false); }, 10000);
(async () => { (async () => {
try { 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; if (!activo) return;
const s = data?.session || null; const s = data?.session || null;
setSession(s); setSession(s);
@@ -57,10 +58,11 @@ export function AuthProvider({ children }) {
} catch (e) { } catch (e) {
console.error("[auth] getSession falló:", e); console.error("[auth] getSession falló:", e);
} finally { } finally {
clearTimeout(tSeguridad);
if (activo) setCargando(false); if (activo) setCargando(false);
} }
})(); })();
// Escuchar cambios de sesión (login/logout)
const { data: sub } = supabase.auth.onAuthStateChange(async (_evt, s) => { const { data: sub } = supabase.auth.onAuthStateChange(async (_evt, s) => {
try { try {
setSession(s); setSession(s);
@@ -72,13 +74,13 @@ export function AuthProvider({ children }) {
if (activo) setCargando(false); if (activo) setCargando(false);
} }
}); });
return () => { activo = false; sub?.subscription?.unsubscribe(); };
return () => { activo = false; clearTimeout(tSeguridad); sub?.subscription?.unsubscribe(); };
}, [cargarPerfil]); }, [cargarPerfil]);
const login = async (email, password) => { const login = async (email, password) => {
const { data, error } = await supabase.auth.signInWithPassword({ email, password }); const { data, error } = await supabase.auth.signInWithPassword({ email, password });
if (error) return { ok: false, msg: traducirError(error.message) }; if (error) return { ok: false, msg: traducirError(error.message) };
// Verificar que tenga perfil/rol válido
const ok = await cargarPerfil(data.user.id); const ok = await cargarPerfil(data.user.id);
if (!ok) { if (!ok) {
await supabase.auth.signOut(); await supabase.auth.signOut();