// AdminApp.jsx — entrada del panel admin: sesión + login/dashboard function AdminApp() { const [session, setSession] = React.useState(null); const [ready, setReady] = React.useState(false); const [initError, setInitError] = React.useState(''); React.useEffect(() => { let mounted = true; // Guardia: supabaseApi debe estar inicializado (CDN cargado) if (!window.supabaseApi || !window.sb) { setInitError('No se pudo conectar con Supabase. Recarga la página (F5). Si persiste, comprueba que config.js tiene la anon key correcta.'); setReady(true); return; } // Timeout de seguridad: si getSession no responde en 8s mostramos error const timeout = setTimeout(() => { if (!mounted) return; setInitError('Tiempo de espera agotado conectando con Supabase. Comprueba tu conexión y recarga.'); setReady(true); }, 8000); window.supabaseApi.getSession().then((s) => { if (!mounted) return; clearTimeout(timeout); setSession(s); setReady(true); }).catch((e) => { if (!mounted) return; clearTimeout(timeout); setInitError(e.message || 'Error al verificar la sesión.'); setReady(true); }); const { data } = window.sb.auth.onAuthStateChange((_event, s) => { setSession(s); }); return () => { mounted = false; clearTimeout(timeout); data?.subscription?.unsubscribe?.(); }; }, []); if (!ready) { return
Cargando…
; } if (initError) { return (

Panel IsaMuñoz

{initError}
); } if (!session) { return { }} />; } return ; } window.AdminApp = AdminApp;