let usuarioYaEstaEnEquipo = false; $(document).ready(function () { comprobarSalaUsuario(); }); // 1. Comprobar si el usuario actual ya pertenece a una sala function comprobarSalaUsuario() { $("#cargandoSalas").remove(); $.ajax({ url: "controladores/ControladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { orden: "obtenerSalaUsuario" }, success: function (respuesta) { if (respuesta.error || !respuesta.asociado) { usuarioYaEstaEnEquipo = false; $("#contenedorCrearSala").show(); cargarSalas(); } else { usuarioYaEstaEnEquipo = true; $("#contenedorCrearSala").hide(); // Ocultar "Crear Sala" si ya pertenece a una cargarSalaUsuario(respuesta.idPartida); } }, error: function (xhr, status, error) { console.error("Error al comprobar la sala del usuario:", error); usuarioYaEstaEnEquipo = false; cargarSalas(); }, }); } // 2. Cargar únicamente la sala en la que está metido el usuario function cargarSalaUsuario(idPartida) { $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { orden: "buscar", idPartida: idPartida }, success: function (partida) { if (partida.error) { console.error(partida.error); return; } $("#contenedorSalas").empty(); cargarInformacionSala(partida); }, error: function (xhr, status, error) { console.error("Error al obtener la sala del usuario:", error); }, }); } // 3. Cargar la lista completa de todas las salas function cargarSalas() { $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { orden: "listar" }, success: function (partidas) { const contenedor = $("#contenedorSalas"); contenedor.empty(); if (!Array.isArray(partidas) || partidas.length === 0) { contenedor.html(`

No hay salas disponibles actualmente.

`); return; } partidas.forEach(function (partida) { cargarInformacionSala(partida); }); }, error: function (xhr, status, error) { console.error("Error al obtener las partidas:", error); }, }); } // 4. Obtener equipos y jugadores asociados a una sala concreta function cargarInformacionSala(partida) { $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { orden: "getEquipos", idPartida: partida.idPartida }, success: function (equipos) { $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { orden: "getJugadores", idPartida: partida.idPartida }, success: function (jugadores) { mostrarSala(partida, equipos, jugadores); }, error: function (xhr, status, error) { console.error("Error al obtener jugadores:", error); }, }); }, error: function (xhr, status, error) { console.error("Error al obtener equipos:", error); }, }); } // 5. Renderizar el HTML de la sala y botones según estado function mostrarSala(partida, equipos, jugadores) { const contenedor = $("#contenedorSalas"); let equiposHTML = ""; equipos.forEach(function (equipo) { const jugadoresEquipo = jugadores.filter(function (jugador) { return jugador.idEquipo == equipo.idEquipo; }); let jugadoresHTML = ""; if (jugadoresEquipo.length > 0) { jugadoresEquipo.forEach(function (jugador) { const esHost = jugador.idUsuario == partida.idUsuario; jugadoresHTML += `
${esHost ? '' : ''} ${escapeHTML(jugador.nombreUsuario)}
${ esHost ? `HOST` : "" }
`; }); } else { jugadoresHTML = `
Sin jugadores
`; } // Botón "Unirse" solo visible si NO pertenece a ningún equipo let botonUnirseHTML = ""; if (!usuarioYaEstaEnEquipo) { botonUnirseHTML = ` `; } equiposHTML += `
${escapeHTML(equipo.nombreEquipo)}
${jugadoresHTML}
${botonUnirseHTML}
`; }); // Acciones disponibles si el usuario YA ESTÁ dentro de esta sala // Acciones disponibles si el usuario YA ESTÁ dentro de esta sala let accionesSalaHTML = ""; if (usuarioYaEstaEnEquipo) { const esHost = partida.idUsuario == idUsuarioSesion; let botonIniciarHTML = ""; // Solo el host puede iniciar la partida if (esHost) { botonIniciarHTML = ` ¡Iniciar Partida! `; } accionesSalaHTML = `
${botonIniciarHTML}
`; } const salaHTML = `
${escapeHTML(partida.nombrePartida)}
${equiposHTML}
${accionesSalaHTML}
`; contenedor.append(salaHTML); } // 6. Evento: Unirse a un Equipo $(document).on("click", ".btn-unirse-equipo", function () { const boton = $(this); const idEquipo = boton.data("id-equipo"); const idPartida = boton.data("id-partida"); boton.prop("disabled", true).text("Uniéndose..."); $.ajax({ url: "controladores/ControladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { orden: "registrarUsuarioEnEquipo", idEquipo: idEquipo, }, success: function (respuesta) { if (respuesta.error) { alert(respuesta.error); boton.prop("disabled", false).text("Unirse"); return; } usuarioYaEstaEnEquipo = true; $("#contenedorCrearSala").hide(); $("#contenedorSalas").empty(); cargarSalaUsuario(idPartida); }, error: function (xhr, status, error) { console.error("Error al unirse al equipo:", error); alert("No se ha podido unir al equipo."); boton.prop("disabled", false).text("Unirse"); }, }); }); // 7. Evento: Abandonar Sala // Guardamos temporalmente el botón presionado let botonAbandonarReferencia = null; // A. Al hacer clic en el botón "Abandonar sala" de la tarjeta, abrimos el modal $(document).on("click", ".btn-abandonar-sala", function () { botonAbandonarReferencia = $(this); const esHost = $(this).data("es-host") === true || $(this).data("es-host") === "true"; const titulo = $("#modalAbandonarSalaLabel"); const mensaje = $("#modalAbandonarSalaMensaje"); const botonConfirmar = $("#btnConfirmarAbandonar"); if (esHost) { titulo.text("¿Abandonar la sala?"); mensaje.text( "Si abandonas la sala como anfitrión, la partida terminará para todos los jugadores.", ); botonConfirmar.text("Sí, abandonar"); } else { titulo.text("¿Abandonar la sala?"); mensaje.text( "Si sales de la sala, perderás tu lugar en el equipo.", ); botonConfirmar.text("Sí, salir"); } const modal = new bootstrap.Modal( document.getElementById("modalAbandonarSala"), ); modal.show(); }); // B. Al hacer clic en "Sí, salir" dentro del modal Kahoot $(document).on("click", "#btnConfirmarAbandonar", function () { const modalEl = document.getElementById("modalAbandonarSala"); const modalInstance = bootstrap.Modal.getInstance(modalEl); const btnConfirmar = $(this); btnConfirmar.prop("disabled", true).text("Saliendo..."); $.ajax({ url: "controladores/ControladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { orden: "salirDeSala" }, success: function (respuesta) { btnConfirmar.prop("disabled", false).text("Sí, salir"); if (modalInstance) { modalInstance.hide(); } if (respuesta.error) { alert(respuesta.error); return; } // Restablecemos la interfaz a la lista completa de salas usuarioYaEstaEnEquipo = false; $("#contenedorCrearSala").show(); cargarSalas(); }, error: function (xhr, status, error) { console.error("Error al salir de la sala:", error); alert("No se pudo salir de la sala."); btnConfirmar.prop("disabled", false).text("Sí, salir"); if (modalInstance) { modalInstance.hide(); } }, }); }); // 8. Evento: Crear Sala $("#btnCrearSala").on("click", function () { const nombreSala = $("#nombreSala").val().trim(); const nombreEquipo1 = $("#nombreEquipo1").val().trim(); const nombreEquipo2 = $("#nombreEquipo2").val().trim(); let valido = true; $(".mensaje-error-sala").remove(); $(".input-kahoot").removeClass("is-invalid"); if (nombreSala === "" || nombreSala.length < 3) { mostrarError( "#nombreSala", "El nombre de la sala debe tener al menos 3 caracteres.", ); valido = false; } if (nombreEquipo1 === "" || nombreEquipo1.length < 2) { mostrarError( "#nombreEquipo1", "El nombre del equipo debe tener al menos 2 caracteres.", ); valido = false; } if (nombreEquipo2 === "" || nombreEquipo2.length < 2) { mostrarError( "#nombreEquipo2", "El nombre del equipo debe tener al menos 2 caracteres.", ); valido = false; } if ( nombreEquipo1 !== "" && nombreEquipo2 !== "" && nombreEquipo1.toLowerCase() === nombreEquipo2.toLowerCase() ) { mostrarError( "#nombreEquipo2", "Los dos equipos deben tener nombres diferentes.", ); valido = false; } if (!valido) return; const boton = $("#btnCrearSala"); boton.prop("disabled", true).text("Creando sala..."); $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { orden: "crear", nombrePartida: nombreSala, nombreEquipo1: nombreEquipo1, nombreEquipo2: nombreEquipo2, }, success: function (respuesta) { if (respuesta.error) { alert(respuesta.error); boton.prop("disabled", false).text("Crear sala"); return; } if (respuesta.exito) { $("#modalCrearSala").modal("hide"); location.reload(); } }, error: function (xhr, status, error) { console.error("Error al crear la sala:", error); alert("No se ha podido crear la sala."); boton.prop("disabled", false).text("Crear sala"); }, }); }); // Auxiliares function escapeHTML(texto) { return $("
") .text(texto ?? "") .html(); } function mostrarError(selector, mensaje) { const input = $(selector); input.addClass("is-invalid"); input.after( `
${mensaje}
`, ); } $(document).on("input", ".input-kahoot", function () { $(this).removeClass("is-invalid"); $(this).next(".mensaje-error-sala").remove(); });