swimmingArt/public/js/atleta.js

184 lines
5.8 KiB
JavaScript

const traducciones = {
es: {
logout: "Salir",
role: "Atleta",
titulo: "Equipos Disponibles",
subtitulo: "Consulta las competencias en las que estás asignado",
sinSesion: "No se encontró tu sesión. Inicia sesión nuevamente.",
sinAsignacion: "No estás asignado a ninguna formación aún.",
errorCarga: "Error al cargar tus asignaciones.",
rutinaSinNombre: "Rutina sin nombre",
formacion: "Formación",
duracion: "Duración",
notas: "Notas",
rol: "Rol",
id: "ID",
figura: "Figura",
verSimulacion: "Ver simulación"
},
en: {
logout: "Logout",
role: "Athlete",
titulo: "Available Teams",
subtitulo: "Check the competitions you are assigned to",
sinSesion: "Session not found. Please log in again.",
sinAsignacion: "You are not assigned to any formation yet.",
errorCarga: "Error loading your assignments.",
rutinaSinNombre: "Unnamed routine",
formacion: "Formation",
duracion: "Duration",
notas: "Notes",
rol: "Role",
id: "ID",
figura: "Figure",
verSimulacion: "View simulation"
},
fr: {
logout: "Se déconnecter",
role: "Athlète",
titulo: "Équipes disponibles",
subtitulo: "Consultez les compétitions auxquelles vous êtes affecté",
sinSesion: "Session introuvable. Veuillez vous reconnecter.",
sinAsignacion: "Vous n'êtes affecté à aucune formation pour le moment.",
errorCarga: "Erreur lors du chargement de vos affectations.",
rutinaSinNombre: "Routine sans nom",
formacion: "Formation",
duracion: "Durée",
notas: "Remarques",
rol: "Rôle",
id: "ID",
figura: "Figure",
verSimulacion: "Voir la simulation"
}
};
let langActual = 'es';
function translateStatic() {
document.querySelector('[data-i18n="logout"]').textContent = traducciones[langActual].logout;
document.querySelector('h2').textContent = traducciones[langActual].titulo;
document.querySelector('p.text-muted').textContent = traducciones[langActual].subtitulo;
const rolEl = document.querySelector('[data-i18n="role"]');
if (rolEl) rolEl.textContent = traducciones[langActual].role;
}
document.getElementById('langSelector')?.addEventListener('change', async (e) => {
langActual = e.target.value;
translateStatic();
cargarAsignaciones();
const userId = sessionStorage.getItem("userId");
if (userId) {
await fetch(`/api/users/${userId}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ language: langActual })
});
}
});
function logout() {
sessionStorage.clear();
alert("Sesión cerrada");
window.location.href = "../index.html";
}
function verSimuladorCompleto(rutinaId) {
window.location.href = `simulador.html?routineId=${rutinaId}`;
}
async function cargarAsignaciones() {
const atletaId = sessionStorage.getItem("userId");
const contenedor = document.getElementById("rutinas-list");
if (!atletaId) {
contenedor.innerHTML = `<p>${traducciones[langActual].sinSesion}</p>`;
return;
}
try {
const res = await fetch(`/api/rutinas/atleta/${atletaId}/formaciones`);
if (!res.ok) throw new Error("Error al obtener formaciones del atleta");
const formaciones = await res.json();
if (formaciones.length === 0) {
contenedor.innerHTML = `<p>${traducciones[langActual].sinAsignacion}</p>`;
return;
}
// Agrupar por rutinaId
const grupos = {};
formaciones.forEach(f => {
if (!grupos[f.rutinaId]) {
grupos[f.rutinaId] = {
nombre: f.rutinaNombre,
formaciones: []
};
}
grupos[f.rutinaId].formaciones.push(f);
});
contenedor.innerHTML = '';
Object.entries(grupos).forEach(([rutinaId, grupo]) => {
const card = document.createElement("div");
card.className = "card text-start my-3 shadow-sm";
const formacionesHTML = grupo.formaciones.map(f => `
<div class="mb-2">
<strong>${traducciones[langActual].formacion}:</strong> ${f.nombreColoquial || "—"}<br>
<strong>${traducciones[langActual].duracion}:</strong> ${f.duracion || "?"}s<br>
<strong>${traducciones[langActual].notas}:</strong> ${f.notasTacticas || "—"}<br>
<strong>${traducciones[langActual].rol}:</strong> ${f.atleta.rol || "—"} |
<strong>${traducciones[langActual].id}:</strong> ${f.atleta.idPersonalizado || "—"} |
<strong>${traducciones[langActual].figura}:</strong> ${f.atleta.figura || "—"}
</div>
`).join('');
card.innerHTML = `
<div class="card-body">
<h5 class="card-title text-primary fw-bold">${grupo.nombre || traducciones[langActual].rutinaSinNombre}</h5>
${formacionesHTML}
<button class="btn btn-sm btn-outline-success mt-2" onclick="verSimuladorCompleto('${rutinaId}')">
${traducciones[langActual].verSimulacion}
</button>
</div>
`;
contenedor.appendChild(card);
});
} catch (err) {
console.error("❌ Error al obtener formaciones:", err);
contenedor.innerHTML = `<p>${traducciones[langActual].errorCarga}</p>`;
}
}
async function loadUserInfoYIdioma() {
const userId = sessionStorage.getItem("userId");
if (!userId) return;
try {
const res = await fetch(`/api/users/${userId}`);
const user = await res.json();
if (user?.name) {
document.getElementById("nombreUsuarioHeader").textContent = user.name;
}
if (user?.language && traducciones[user.language]) {
langActual = user.language;
const selector = document.getElementById('langSelector');
if (selector) selector.value = langActual;
}
translateStatic();
cargarAsignaciones();
} catch (err) {
console.error("❌ Error al obtener usuario:", err);
}
}
document.addEventListener("DOMContentLoaded", loadUserInfoYIdioma);