// ============ 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
;
}
return (
setShowSupport(true)} />
{showSupport && setShowSupport(false)} />}
);
}
ReactDOM.createRoot(document.getElementById("root")).render();