Skip to content

Commit

Permalink
cambios en rutas
Browse files Browse the repository at this point in the history
  • Loading branch information
jul1oCesar0 committed Nov 28, 2024
1 parent cf1d3d4 commit aa29fa0
Show file tree
Hide file tree
Showing 6 changed files with 266 additions and 241 deletions.
2 changes: 1 addition & 1 deletion dev-dist/sw.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ define(['./workbox-fde070c5'], (function (workbox) { 'use strict';
*/
workbox.precacheAndRoute([{
"url": "/offline.html",
"revision": "0.pef915uabhg"
"revision": "0.f6jp5lmvjvg"
}], {});
workbox.cleanupOutdatedCaches();
workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("/offline.html"), {
Expand Down
24 changes: 23 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview",
"test": "vitest",
"test:unit": "vitest",
"test:unit": "vitest",
"cypress:run": "cypress run"

},
"dependencies": {
"@emotion/react": "^11.11.3",
Expand Down
114 changes: 72 additions & 42 deletions src/views/Admin/reportes.jsx
Original file line number Diff line number Diff line change
@@ -1,78 +1,104 @@
import React, { useState, useEffect } from "react";
import { Pie } from "react-chartjs-2";
import { Chart as ChartJS, Title, Tooltip, Legend, ArcElement, CategoryScale, LinearScale } from "chart.js";

ChartJS.register(Title, Tooltip, Legend, ArcElement, CategoryScale, LinearScale);
import {
Chart as ChartJS,
Title,
Tooltip,
Legend,
ArcElement,
CategoryScale,
LinearScale,
} from "chart.js";

ChartJS.register(
Title,
Tooltip,
Legend,
ArcElement,
CategoryScale,
LinearScale
);

function ResultadosEncuestas() {
const [resultados, setResultados] = useState([]);
const [totalPersonas, setTotalPersonas] = useState(0); // Nuevo estado para personas únicas
const [cargando, setCargando] = useState(true);
const [resultados, setResultados] = useState([]); // Datos de las encuestas
const [totalPersonas, setTotalPersonas] = useState(0); // Total de personas que han respondido
const [cargando, setCargando] = useState(true); // Estado de carga

const mapeoPreguntas = {
question1: "¿Qué tan fácil fue encontrar la información que buscabas?",
question2: "¿Cómo calificarías la facilidad de uso del sistema para agendar tu cita?",
question3: "¿Qué tan satisfecho estás con el proceso de agendar una cita?",
question4: "¿Qué tan rápido te pareció el sistema para agendar tu cita?",
question5: "¿Qué tan claro fue el mensaje de confirmación de tu cita?",
};

useEffect(() => {
// Obtener los resultados de las encuestas
const obtenerResultados = async () => {
try {
const response = await fetch("http://localhost:3000/resultados", {
method: "GET",
headers: { "Content-Type": "application/json" },
});
const response = await fetch(
"https://backopt-production.up.railway.app/feedback/obtenerResultadosEncuestas",
{
method: "GET",
headers: { "Content-Type": "application/json" },
}
);

if (response.ok) {
const data = await response.json();

if (data) {
setResultados(data.data || []); // Manejo de resultados de encuestas
setTotalPersonas(data.totalPersonas || 0); // Guardar el total de personas únicas
setResultados(data.data || []); // Maneja los resultados de las encuestas
setTotalPersonas(data.totalPersonas || 0); // Guarda el total de personas únicas
} else {
console.error("La respuesta no contiene datos válidos");
setResultados([]);
setTotalPersonas(0);
}
} else {
alert("Error al obtener los resultados");
}
} catch (error) {
console.error("Error al obtener los resultados:", error);
alert("Hubo un error al obtener los resultados");
console.error("Error al obtener los resultados:", error);
} finally {
setCargando(false);
setCargando(false); // Finaliza la carga
}
};

obtenerResultados();
obtenerResultados(); // Llamar la función de obtención de resultados
}, []);

if (cargando) {
return <div>Cargando resultados...</div>;
}

const procesarDatos = () => {
const respuestasPorPregunta = {};

resultados.forEach((encuesta) => {
const { pregunta, respuestas } = encuesta;

if (!respuestasPorPregunta[pregunta]) {
respuestasPorPregunta[pregunta] = { "1": 0, "2": 0, "3": 0, "4": 0, "5": 0 };
}

Object.entries(respuestas).forEach(([calificacion, cantidad]) => {
respuestasPorPregunta[pregunta][calificacion] += cantidad;
if (typeof resultados !== "object" || Array.isArray(resultados)) {
console.error("Los resultados no son un objeto:", resultados);
return { labels: [], datasets: [] };
}

const respuestasPorPregunta = [];

Object.entries(resultados).forEach(([pregunta, respuestas]) => {
const preguntaReal = mapeoPreguntas[pregunta] || pregunta; // Usa el mapeo o la clave por defecto
const respuestasArray = Object.values(respuestas);

respuestasPorPregunta.push({
label: preguntaReal,
data: respuestasArray,
backgroundColor: [
"#FF6F61",
"#6B5B95",
"#88B04B",
"#F7CAC9",
"#92A8D1",
],
});
});

const labels = Object.keys(respuestasPorPregunta);
const datasets = labels.map((pregunta) => {
return {
label: pregunta,
data: Object.values(respuestasPorPregunta[pregunta]),
backgroundColor: ["#FF6F61", "#6B5B95", "#88B04B", "#F7CAC9", "#92A8D1"],
};
});

return {
labels: ["1", "2", "3", "4", "5"], // Mantenemos las etiquetas originales (números)
datasets,
labels: ["1", "2", "3", "4", "5"],
datasets: respuestasPorPregunta,
};
};

Expand All @@ -83,7 +109,7 @@ function ResultadosEncuestas() {
<div className="container mx-auto p-4">
<h1 className="text-3xl font-bold mb-4">Resultados de Encuestas Web</h1>

{/* Mostrar cantidad de personas únicas que han respondido */}
{/* Mostrar el total de personas que han respondido */}
<p className="text-lg font-semibold mb-6">
Total de personas que han respondido: {totalPersonas}
</p>
Expand All @@ -93,7 +119,10 @@ function ResultadosEncuestas() {
) : (
<div className="flex flex-wrap gap-4 justify-center">
{data.datasets.map((dataset, index) => (
<div key={index} className="flex-1 max-w-sm p-6 bg-white rounded-lg shadow">
<div
key={index}
className="flex-1 max-w-sm p-6 bg-white rounded-lg shadow"
>
<h3 className="text-xl font-semibold mb-2">{dataset.label}</h3>
<div className="w-full h-[400px]">
<Pie
Expand All @@ -107,7 +136,8 @@ function ResultadosEncuestas() {
tooltip: {
callbacks: {
label: (tooltipItem) => {
const calificacion = estrellas[tooltipItem.dataIndex]; // Convertir índice a estrellas
const calificacion =
estrellas[tooltipItem.dataIndex]; // Convertir índice a estrellas
const value = dataset.data[tooltipItem.dataIndex];
return `${calificacion}: Personas que han respondido: ${value}`;
},
Expand Down
90 changes: 57 additions & 33 deletions src/views/feedback/encuesta.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useRef } from "react";
import { useNavigate } from "react-router-dom";

// Función para decodificar JWT
Expand All @@ -24,6 +24,9 @@ function EncuestaCitas() {
const [encuestaCompletada, setEncuestaCompletada] = useState(false); // Estado para verificar si ya se completó la encuesta
const navigate = useNavigate();

// Usamos un useRef para asegurarnos de que registrarAcceso se ejecute solo una vez
const accesoRegistrado = useRef(false);

const preguntas = [
"¿Qué tan fácil fue encontrar la información que buscabas?",
"¿Cómo calificarías la facilidad de uso del sistema para agendar tu cita?",
Expand All @@ -33,40 +36,53 @@ function EncuestaCitas() {
];

useEffect(() => {
// Recuperar el token del localStorage
const token = localStorage.getItem("token");

if (token) {
const decodedToken = parseJwt(token);
const idUsuario = decodedToken.clienteId; // Asumimos que el idUsuario está en el campo `id`

// Verificar si la encuesta ya fue completada
const verificarEncuesta = async () => {
try {
const response = await fetch(`http://localhost:3000/Encuesta/completada?idUsuario=${idUsuario}`, {
method: "GET",
headers: { "Content-Type": "application/json" },
});

if (response.ok) {
const data = await response.json();
if (data.completada) {
setEncuestaCompletada(true); // Establecer que la encuesta ya fue completada
}
}
} catch (error) {
console.error("Error al verificar encuesta:", error);
} finally {
setCargando(false); // Finaliza el estado de carga
const decodedToken = parseJwt(token);
console.log(decodedToken); // Verifica el contenido del token

const idUsuario = decodedToken.clienteId;

if (!idUsuario) {
console.error("El idUsuario no se pudo obtener del token.");
return; // Salir si no hay idUsuario
}
};

verificarEncuesta();
// Evitar llamar registrarAcceso si ya fue completado
if (!accesoRegistrado.current && !encuestaCompletada) {
const registrarAcceso = async () => {
try {
const response = await fetch("https://backopt-production.up.railway.app/feedback/acceso", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ idUsuario }),
});

if (response.ok) {
const data = await response.json();
if (data.estado === "Encuesta ya completada") {
setEncuestaCompletada(true); // Marcar como completada si ya está hecho
}
} else {
console.error("Error al registrar el acceso al feedback");
}
} catch (error) {
console.error("Error al registrar acceso:", error);
} finally {
setCargando(false); // Finaliza el estado de carga
}
};

registrarAcceso(); // Solo ejecutar si la encuesta no está completada
accesoRegistrado.current = true; // Marcar como registrado
} else {
setCargando(false); // Si ya está completada, no hacer nada
}
} else {
// Si no hay token, redirigir al login o manejar el error
navigate("/login");
navigate("/login"); // Redirige al login si no hay token
}
}, [navigate]);
}, [encuestaCompletada, navigate]); // Solo ejecutará cuando cambie `encuestaCompletada`

const handleRespuestaChange = (index, value) => {
setRespuestas((prev) => ({
Expand All @@ -87,14 +103,22 @@ function EncuestaCitas() {
const decodedToken = parseJwt(token);
const idUsuario = decodedToken.clienteId;

if (!idUsuario) {
alert("No se pudo obtener el idUsuario del token.");
return; // Salir si no hay idUsuario
}

try {
const response = await fetch("http://localhost:3000/Encuesta", {
method: "POST",
const response = await fetch("https://backopt-production.up.railway.app/feedback/completar", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
idUsuario, // Usar el id del usuario decodificado del JWT
respuestas,
preguntas, // Envía las preguntas al backend
idUsuario,
question1: respuestas[0],
question2: respuestas[1],
question3: respuestas[2],
question4: respuestas[3],
question5: respuestas[4],
}),
});

Expand Down
Loading

0 comments on commit aa29fa0

Please sign in to comment.