// ============ App + ruteo ============ const SCREEN_TITLES = { inicio: "Inicio", cursos: "Mis Cursos", calendario: "Calendario", tareas: "Tareas", certificados: "Certificados", progreso: "Mi progreso", }; function App() { const [route, setRoute] = useState({ screen: "inicio", params: {} }); const [query, setQuery] = useState(""); const [ready, setReady] = useState(false); const [session, setSession] = useState(API.getSession()); const [showSupport, setShowSupport] = useState(false); useEffect(() => { if (!session || (session.user && session.user.is_admin)) return; API.getCampus() .then((data) => { window.DATA = data; setReady(true); }) .catch((err) => { console.warn("No se pudo cargar el campus", err); API.clearSession(); setSession(null); setReady(true); }); }, [session]); if (!session) return ; if (session.user && session.user.is_admin) { window.location.href = "/admin"; return null; } const go = (screen, params = {}) => { setRoute({ screen, params }); const main = document.querySelector(".main-scroll"); if (main) main.scrollTop = 0; }; const pendingTasks = DATA.assignments.filter((a) => a.status === "pending").length; // map "curso", "leccion", "sala" to nav highlight const navScreen = ["curso", "leccion"].includes(route.screen) ? "cursos" : route.screen === "sala" ? "calendario" : route.screen; let content, title, crumb = null; switch (route.screen) { case "inicio": content = ; title = "Inicio"; break; case "cursos": content = ; title = "Mis Cursos"; break; case "curso": { const c = DATA.courses.find((x) => x.id === route.params.courseId); content = ; title = c ? c.title : "Curso"; crumb = ; break; } case "leccion": content = ; title = ""; break; case "calendario": content = ; title = "Calendario"; break; case "sala": content = ; title = "Sesión en vivo"; break; case "tareas": content = ; title = "Tareas"; break; case "certificados": content = ; title = "Certificados"; break; case "progreso": content = ; title = "Mi progreso"; break; default: content = ; title = "Inicio"; } const bare = route.screen === "leccion"; if (!ready) { return
Cargando campus...
; } return (
setShowSupport(true)} />
{!bare && }
{content}
{showSupport && setShowSupport(false)} />}
); } ReactDOM.createRoot(document.getElementById("root")).render();