From d458b8085fb89268033e2e6126662e4fe6cff9f7 Mon Sep 17 00:00:00 2001 From: KrisG012 Date: Mon, 3 Jun 2024 22:59:34 -0700 Subject: [PATCH 01/23] Espacio de agregar foto al crear cuenta arreglado. --- .../CrearCuenta/InformacionBasica.jsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx b/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx index dd759b1f..373d793a 100644 --- a/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx +++ b/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx @@ -8,6 +8,14 @@ import React, { useState, useEffect } from "react"; import '../../../../../txt.css'; const InformacionBasica = () => { + const [selectedImage, setSelectedImage] = useState(null); + + const handleImageChange = (e) => { + if (e.target.files && e.target.files[0]) { + const file = e.target.files[0]; + setSelectedImage(URL.createObjectURL(file)); + } + }; return (
@@ -251,9 +259,16 @@ const InformacionBasica = () => {
- +
- +
From 9bb75cec4d9a005683c0357f9c31f7f671a98781 Mon Sep 17 00:00:00 2001 From: ItsJorgeRdz03 <82615294+ItsJorgeRdz03@users.noreply.github.com> Date: Mon, 3 Jun 2024 23:43:24 -0700 Subject: [PATCH 02/23] =?UTF-8?q?Bot=C3=B3n=20de=20favorito=20funcional=20?= =?UTF-8?q?en=20servicios.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ui/servicios/ServiciosEstetica.jsx | 14 ++++++++++++-- .../src/components/ui/servicios/ServiciosSpa.jsx | 8 ++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/client/src/components/ui/servicios/ServiciosEstetica.jsx b/client/src/components/ui/servicios/ServiciosEstetica.jsx index eebf7407..1e926e05 100644 --- a/client/src/components/ui/servicios/ServiciosEstetica.jsx +++ b/client/src/components/ui/servicios/ServiciosEstetica.jsx @@ -6,6 +6,7 @@ export default function ServicioEstetica() { const [estetica, setEstetica] = useState([]); const [log, setLog] = useState(false); const [id, setId] = useState(); + const [st, setSt] = useState(false); let respuestaJson = null; async function checkLogin() { @@ -61,7 +62,11 @@ export default function ServicioEstetica() { }); }, 3000); } - }, [id]); + }, [id, st]); + + function changeSt() { + setSt(!st); + } return ( <> @@ -78,7 +83,12 @@ export default function ServicioEstetica() {
- +

diff --git a/client/src/components/ui/servicios/ServiciosSpa.jsx b/client/src/components/ui/servicios/ServiciosSpa.jsx index c05f298e..2b747ccc 100644 --- a/client/src/components/ui/servicios/ServiciosSpa.jsx +++ b/client/src/components/ui/servicios/ServiciosSpa.jsx @@ -108,7 +108,6 @@ export default function ServicioEstetica() { }; function changeSt() { - console.log(5); setSt(!st); } @@ -151,21 +150,22 @@ export default function ServicioEstetica() {

- {toggleState == 1 ? ( +
- ) : ( +
+
- )} +

From e898a0d95e59da9f99eccc727441ffc7976a5da2 Mon Sep 17 00:00:00 2001 From: KarimSoto Date: Tue, 4 Jun 2024 00:03:49 -0700 Subject: [PATCH 03/23] solucione los issues con respecto a las validaciones en el proceso de crear cuenta --- client/public/scripts/step1.js | 6 +- client/public/scripts/step2.js | 4 +- client/public/scripts/step3.js | 12 +- client/src/txt.css | 23 +-- .../controllers/createAccount.controllers.js | 187 +++++++++++++----- server/middlewares/register.js | 2 +- 6 files changed, 157 insertions(+), 77 deletions(-) diff --git a/client/public/scripts/step1.js b/client/public/scripts/step1.js index e497bfee..8c649cf0 100644 --- a/client/public/scripts/step1.js +++ b/client/public/scripts/step1.js @@ -75,17 +75,17 @@ document.getElementById('step-one').addEventListener('click',async ()=>{ let temporal = document.getElementById(arreglo[indice][0]); temporal.style.borderColor='orange'; + if(arreglo[indice][1] != ''){ // si el mensaje es un mensaje vacio, entonces no mostara ningun alert let toastBox = document.getElementById('toastBox'); let div = document.createElement('div'); div.classList.add('toast'); - div.innerHTML = '

no pusiste '+arreglo[indice][1]+'
'; + div.innerHTML = '
No pusiste '+arreglo[indice][1]+'
'; div.classList.add('orange'); toastBox.appendChild(div); setTimeout(()=>{ div.remove(); },6000) - - // + } } return; } diff --git a/client/public/scripts/step2.js b/client/public/scripts/step2.js index 0e20f9ac..db4896fd 100644 --- a/client/public/scripts/step2.js +++ b/client/public/scripts/step2.js @@ -64,7 +64,7 @@ document.getElementById('step2').addEventListener('click', async ()=>{ let toastBox = document.getElementById('toastBox'); let div = document.createElement('div'); div.classList.add('toast'); - div.innerHTML = '
dejaste en blanco la pregunta '+arreglo[indice].slice(1);+'
'; + div.innerHTML = '
Dejaste en blanco la pregunta '+arreglo[indice].slice(1);+'
'; div.classList.add('orange'); toastBox.appendChild(div); setTimeout(()=>{ @@ -84,7 +84,7 @@ document.getElementById('step2').addEventListener('click', async ()=>{ let toastBox = document.getElementById('toastBox'); let div = document.createElement('div'); div.classList.add('toast'); - div.innerHTML = '
se mas especifico en la pregunta '+arreglo[indice].slice(1);+', escribe mas al respecto
'; + div.innerHTML = '
Se más específico en la pregunta '+arreglo[indice].slice(1);+', escribe más al respecto
'; toastBox.appendChild(div); setTimeout(()=>{ div.remove(); diff --git a/client/public/scripts/step3.js b/client/public/scripts/step3.js index 087e2ed8..1214bb58 100644 --- a/client/public/scripts/step3.js +++ b/client/public/scripts/step3.js @@ -14,7 +14,7 @@ proximamente.innerHTML = `

La contraseña esta
- siendo procesada
+ siendo procesada.

`; @@ -56,7 +56,7 @@ document.getElementById('step3').addEventListener('click',async ()=>{ let toastBox = document.getElementById('toastBox'); let div = document.createElement('div'); div.classList.add('toast'); - div.innerHTML = '
Debes de aceptar las politicas
'; + div.innerHTML = '
Debes de aceptar las políticas
'; div.classList.add('blue'); toastBox.appendChild(div); setTimeout(()=>{ @@ -129,7 +129,7 @@ document.getElementById('step3').addEventListener('click',async ()=>{ for(let i in arreglo){ let div = document.createElement('div'); div.classList.add('toast'); - div.innerHTML = '
tu contraseña '+arreglo[i]+'
'; + div.innerHTML = '
Tu contraseña '+arreglo[i]+'
'; toastBox.appendChild(div); setTimeout(()=>{ @@ -150,12 +150,12 @@ document.getElementById('step3').addEventListener('click',async ()=>{ proximamente.innerHTML = `

- Insercion de Usuario + Inserción de Usuario

- Felicidades, en un momento se creara tu cuenta
- este proceso puede tardar unos segundos, se paciente
+ Felicidades, en un momento se creará tu cuenta.
+ Este proceso puede tardar unos segundos, se paciente.

`; } diff --git a/client/src/txt.css b/client/src/txt.css index 27cf0232..25425e84 100644 --- a/client/src/txt.css +++ b/client/src/txt.css @@ -1,16 +1,16 @@ .toast{ width: 300px; - height: 60px; + height: 44px; background: #fff; - margin: 10px 0; + margin: 3.5px 0; box-shadow: 0 0 20px rgba(0,0,0,0.3); display: flex; - font-size: 14px; + font-size: 13px; flex-direction: row; align-items: center; position: relative; border-radius: 5px; - padding: 2px; + padding: 0px 3px 0px 3px; font-family:Verdana,Tahoma, sans-serif; } @@ -51,7 +51,9 @@ .toast #texto{ position: relative; - min-width: 80%; + width: 80%; + justify-content: center; + align-items: center; } @@ -94,9 +96,9 @@ } #toastBox{ - position: absolute; - bottom: 30px; - right: 30px; + position: fixed; + bottom: 0; + right: 0; display: flex; align-items: flex-end; flex-direction: column; @@ -115,8 +117,3 @@ } } -#cancelar:hover{ - border-color: blue; - color: blue; -} - diff --git a/server/controllers/createAccount.controllers.js b/server/controllers/createAccount.controllers.js index 6d8d7806..c616b7e5 100644 --- a/server/controllers/createAccount.controllers.js +++ b/server/controllers/createAccount.controllers.js @@ -11,7 +11,7 @@ const regex_apellidos = /[a-zA-Zá-úñ]{3,}/; const regex_lada = /^\+?\d{1,3}$/; const regex_telefono = /^(\d{9,10}|\d{2,3} \d{7}|\d{2,3} \d{3} \d{4}|\d{2,3}-\d{7}|\d{2,3}-\d{3}-\d{4})$/; const regex_postal = /^\d{5}$/; -const regex_numero = /^\S{1,10}$/; +const regex_numero = /^\S*$/; @@ -137,60 +137,54 @@ async function paso1(solicitud,respuesta){ // INICIO 2 CREAR UN ARREGLO QUE ALMACENARA CAMPOS SIN CONTESTAR let campos_faltantes = []; - if(!nombre){ + if(!nombre || nombre==''){ campos_faltantes.push([nombre_id,'tu nombre']); } - if(!apodo){ + if(!apodo || apodo==''){ campos_faltantes.push(apodo_id,'tu apodo'); } - if(!paterno){ + if(!paterno || paterno==''){ campos_faltantes.push([paterno_id,'tu apellido paterno']); } - if(!materno){ + if(!materno || materno==''){ campos_faltantes.push([materno_id,'tu apellido materno']); } - if(!correo){ + if(!correo || correo==''){ campos_faltantes.push([correo_id,'tu correo']); } - if(!lada){ - campos_faltantes.push([lada_id,'la lada de tu pais']); + if(!lada || lada==''){ + campos_faltantes.push([lada_id,'la lada de tu país']); } - if(!telefono){ - campos_faltantes.push([telefono_id,'tu telefono']); + if(!telefono || telefono==''){ + campos_faltantes.push([telefono_id,'tu teléfono']); } - if(!dia){ - campos_faltantes.push([dia_id,'el dia en que naciste']); + if(!año || año=='' || !mes || mes=='' || !dia || dia ==''){ + campos_faltantes.push([dia_id,'']); + campos_faltantes.push([mes_id,'']); + campos_faltantes.push([año_id,'todos los campos correspondientes a fecha']); } - if(!mes){ - campos_faltantes.push([mes_id,'el mes en que naciste']); - } - - if(!año){ - campos_faltantes.push([año_id,' el año en que naciste']); - } - - if(!calle){ + if(!calle || calle==''){ campos_faltantes.push([calle_id,'tu calle']); } - if(!colonia){ + if(!colonia || colonia==''){ campos_faltantes.push([colonia_id,'tu colonia']); } - if(!numero){ - campos_faltantes.push([numero_id,'el numero de tu casa']); + if(!numero || numero==''){ + campos_faltantes.push([numero_id,'el número de tu casa']); } - if(!codigo_postal){ - campos_faltantes.push([codigo_postal_id,'tu codigo postal']); + if(!codigo_postal || codigo_postal==''){ + campos_faltantes.push([codigo_postal_id,'tu código postal']); } @@ -224,46 +218,40 @@ async function paso1(solicitud,respuesta){ if(nombre_valido == false){ - campos_invalidos.push([nombre_id, 'tu nombre no es valido']); + campos_invalidos.push([nombre_id, 'Tu nombre no es válido']); } if(paterno_valido == false){ - campos_invalidos.push([paterno_id,'tu apellido paterno no es valido']); + campos_invalidos.push([paterno_id,'Tu apellido paterno no es válido']); } if(materno_valido == false){ - campos_invalidos.push([materno_id,'tu apellido materno no es valido']); + campos_invalidos.push([materno_id,'Tu apellido materno no es válido']); } if(correo_valido == false){ - campos_invalidos.push([correo_id,'el correo ingresado no es valido']); + campos_invalidos.push([correo_id,'El correo ingresado no es válido']); } if(telefono_valido == false){ - campos_invalidos.push([telefono_id,'el telefono no es valido']); + campos_invalidos.push([telefono_id,'El teléfono no es válido']); } if(lada_valida == false){ - campos_invalidos.push([lada_id,'la lada de tu pais no es valida']); + campos_invalidos.push([lada_id,'La lada de tu país no es válida']); } if(regex_numero.test(numero) == false){ - campos_invalidos.push([numero_id,'el numero de tu casa no es valido ']); + campos_invalidos.push([numero_id,'El número de tu casa no es válido']); } if(postal_valido == false){ - campos_invalidos.push([codigo_postal_id,'tu codigo postal no es valido']); + campos_invalidos.push([codigo_postal_id,'Tu código postal no es válido']); } - try{ - var fecha = new Date(`${mes}/${dia}/${año}`); - if(isNaN(fecha.getTime())){ - campos_invalidos.push([dia_id,'']); - campos_invalidos.push([mes_id,'']); - campos_invalidos.push([año_id,'']); - } - - }catch(error){ + let fecha_boolean = ValidarFecha(dia,mes,año); + + if(fecha_boolean == false){ campos_invalidos.push([dia_id,'']); campos_invalidos.push([mes_id,'']); campos_invalidos.push([año_id,'']); } - + //FIN 3 @@ -291,10 +279,10 @@ async function paso1(solicitud,respuesta){ let repetidos = []; if(fields.length > 0){ - repetidos.push([correo_id,'ya hay una cuenta con este correo']); + repetidos.push([correo_id,'Ya hay una cuenta con este correo']); } if(fieldsTelefono.length > 0){ - repetidos.push([telefono_id,'ya hay una cuenta con este telefono']); + repetidos.push([telefono_id,'Ya hay una cuenta con este teléfono']); } // FIN 4 @@ -404,7 +392,7 @@ async function paso2(solicitud,respuesta){ if(campos_vacios.length > 0){ respuesta.send({vacios:campos_vacios}); - console.log("no contestaste todos los campos"); + console.log("No contestaste todos los campos"); } else{ @@ -433,7 +421,7 @@ async function paso2(solicitud,respuesta){ if(campos_incorrectos.length > 0){ respuesta.send({incorrectos:campos_incorrectos}); - console.log("hubo campos incorrectos"); + console.log("Hubo campos incorrectos"); }else{ @@ -517,19 +505,19 @@ async function paso3(solicitud,respuesta){ let regex_mayor = /\w{20,}/; if(regex_numero.test(contraseña)==false){ - arreglo_regex.push("no tiene un numero"); + arreglo_regex.push("no tiene un número"); } if(regex_caracter_especial.test(contraseña)==false){ - arreglo_regex.push("no tiene un caracter especial"); + arreglo_regex.push("no tiene un carácter especial"); } if(regex_Mayuscula.test(contraseña)==false){ - arreglo_regex.push("no tiene una mayuscula"); + arreglo_regex.push("no tiene una mayúscula"); } if(regex_minuscula.test(contraseña)==false){ - arreglo_regex.push("no tiene una minuscula"); + arreglo_regex.push("no tiene una minúscula"); } if(regex_mayor.test(contraseña)==true){ @@ -612,6 +600,101 @@ function eliminar(imagen){ +function añoBisiesto(year){ + + if(year%4==0){ + //puede que sea bisiesto + if(year%100==0){ + + if(year%400==0){ + return 29; + } + else{ + return 28; + } + } + else{ + return 29; + } + } + else{ + return 28; + } + +} + + +function ValidarFecha(dia,mes,año){ + + let month = parseInt(mes); // si recibimos '1' o '01' o '00001', de igual forma pasara a 0 + + if(isNaN(month)){ + return false; + } + else{ + month = month-1; + } + + + let year = parseInt(año); + if(isNaN(year)){ + return false; + } + + + let day = parseInt(dia); + + if(isNaN(day)){ + return false; + } + + + let days = añoBisiesto(year); // le debemos pasar un numero y no un string + + let formato = [ 31,days,31,30,31,30,31,31,30,31,30,31 ]; + + if(year <= 0){ + // significa que el usuario puso una año negativo, o que puso un año mayor al actual + return false; + } + else{ + if((month +1) > formato.length || (month+1) <= 0){ + // significa que la persona puso un mes menor a 0, o que puso un mes mayor a 12 + return false; + } + else{ + if(formato[month] < day || day <= 0){ + //significa que la persona paso un dia mayor al limite o que puso en dia igual a 0 o negativo + return false; + } + else{ + // por el momento todo bien, pero ahora toca verificar que la fecha que ingreso no sea mayor + + let birthday = new Date(`${year}-${month+1}-${day}`); + let fa = new Date(Date.now()); + let fecha_actual = new Date(`${fa.getFullYear()}-${fa.getMonth()+1}-${fa.getDate()}`); + + if(birthday.getTime()>=fecha_actual.getTime()){ + // la fecha de nacimiento es igual a la de hoy o mayor + return false; + } + else{ + return true; + } + } + } + } + + + + + + + + +} + + export const methods ={ paso1, diff --git a/server/middlewares/register.js b/server/middlewares/register.js index 3de19012..dc0f5ca8 100644 --- a/server/middlewares/register.js +++ b/server/middlewares/register.js @@ -9,7 +9,7 @@ dotenv.config(); async function InsertUser(solicitud,respuesta,siguiente){ if(solicitud.headers.cookie == undefined){ - respuesta.send({megumin_cookie:false}); + return respuesta.send({megumin_cookie:false}); } else{ let galletas = solicitud.headers.cookie.split("; "); From 4c94a4c198a6e37ec7172193e9cba8cb61fe6d5f Mon Sep 17 00:00:00 2001 From: KrisG012 Date: Tue, 4 Jun 2024 00:08:59 -0700 Subject: [PATCH 04/23] =?UTF-8?q?Cobro=20autom=C3=A1tico=20y=20poder=20can?= =?UTF-8?q?celar=20en=20secci=C3=B3n=20de=20Suscripciones=20en=20el=20perf?= =?UTF-8?q?il.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/perfil/Suscripciones.jsx | 71 ++++++++++++++++++++++- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/client/src/pages/perfil/Suscripciones.jsx b/client/src/pages/perfil/Suscripciones.jsx index fffc0f7e..e7ba7867 100644 --- a/client/src/pages/perfil/Suscripciones.jsx +++ b/client/src/pages/perfil/Suscripciones.jsx @@ -4,12 +4,15 @@ import { IoIosArrowBack } from "react-icons/io"; import { ToastContainer, toast } from 'react-toastify'; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faCircleExclamation } from "@fortawesome/free-solid-svg-icons"; +import { faCircleExclamation, faX, faTriangleExclamation } from "@fortawesome/free-solid-svg-icons"; function Suscripciones() { const [nombre, setNombre] = useState(false); //<<< PARA EL INICIO DE SESION const [correo, setCorreo] = useState(false); //<<< PARA EL INICIO DE SESION const [sus, setSus] = useState(false); //<<< PARA VERIFICAR SI ES MIEMBRO EL USUARIO + const [sure, setSure] = useState(false); + const [canceled, setCanceled] = useState(false); + const [succeed, setSucceed] = useState(false); const [diaInicio, setDiaInicio] = useState(''); const [mesInicio, setMesInicio] = useState(''); @@ -20,7 +23,16 @@ function Suscripciones() { const [semanaFinal, setSemanaFinal] = useState(''); const [diasFaltantes, setDiasFaltantes] = useState(0); - + const [cobro, setCobro] = useState(false); + const handleCobro = () => { + setCobro(!cobro); + } + + const cancelar = () => { + setSure(!sure); + cancelarSuscripcion(); + setCanceled(!canceled); + } @@ -99,10 +111,12 @@ function Suscripciones() { if (respuesta2Json.suscripcion == false) { // la suscripcion fue eliminada con exito window.location.href = respuesta2Json.redirect; + setSucceed(true); } else { // la suscripcion no fue eliminada, un toast que diga que no se pudo toast(
{`Al parecer estamos teniendo problemas al cancelar tu suscripcion`}
); + setSucceed(false); } } } @@ -171,6 +185,15 @@ function Suscripciones() {
+
+ + +
) : ( @@ -202,7 +225,7 @@ function Suscripciones() { {sus ? ( <>

¿Estás seguro que quisieras cancelar tu suscripción? Una vez cancelada tu suscripción, los cambios son irreversibles.

- + ) : ( <> @@ -213,6 +236,48 @@ function Suscripciones() {
+ {sure && +
+
+
+ setSure(!sure)}/> +
+ +

¿Estás segura de cancelar la suscripción?

+
+

Si da click en cancelar, no habrá retorno.

+ +
+
+
+ } + {canceled && +
+
+
+ {succeed ? ( +
+ +

¡Tu suscripción ha sido cancelada con éxito!

+
+ ) : ( +
+ +

Al parecer hubo un error a la hora de cancelar su suscripción

+
+ )} + +
+
+
+ } ); } From d25887d1bb67bedea7758a917dc9dd9bcff21c6f Mon Sep 17 00:00:00 2001 From: Adrian Santelis Date: Tue, 4 Jun 2024 00:28:05 -0700 Subject: [PATCH 05/23] =?UTF-8?q?Dise=C3=B1o=20actualizado=20en=20paquetes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/Carrito.jsx | 6 +-- client/src/pages/cita/Paquetes.jsx | 60 ++++++++++++++++------------ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/client/src/components/ui/Carrito.jsx b/client/src/components/ui/Carrito.jsx index 506587c0..ad1c7873 100644 --- a/client/src/components/ui/Carrito.jsx +++ b/client/src/components/ui/Carrito.jsx @@ -7,8 +7,8 @@ import { useNavigate } from "react-router-dom"; export const CarritoProvider = ({ children }) => { - localStorage.setItem('tarjeta',null) - localStorage.setItem('monedero',-1) + localStorage.setItem('tarjeta', null) + localStorage.setItem('monedero', -1) const [cartItems, setCartItems] = useState(() => { const savedCart = localStorage.getItem('cartItems'); @@ -199,7 +199,7 @@ const Carrito = ({ cerrar, totalProductos, logCart }) => {

Total:

${total}
- diff --git a/client/src/pages/cita/Paquetes.jsx b/client/src/pages/cita/Paquetes.jsx index 039fa9d5..63727a87 100644 --- a/client/src/pages/cita/Paquetes.jsx +++ b/client/src/pages/cita/Paquetes.jsx @@ -14,9 +14,9 @@ function Paquetes({ next }) { }; const getPriceClass = (priceIndex) => { - let baseClass = "p-2 border-2 border-black hover:bg-purple-600 hover:text-white rounded-full cursor-pointer text-center shadow-[0_0px_5px_rgb(0,0,0,0.2)] shadow-purple-600"; + let baseClass = "p-2 border-2 border-black hover:bg-[#036C65] hover:text-white rounded-xl cursor-pointer text-center shadow-[0_0px_5px_rgb(0,0,0,0.2)] shadow-[#036C65]"; if (selectedPriceIndex === priceIndex) { - return `${baseClass} opacity-100 bg-purple-600 text-white`; // Cambia de color y opacidad al seleccionarse + return `${baseClass} opacity-100 bg-[#036C65] text-white`; // Cambia de color y opacidad al seleccionarse } return `${baseClass} `; // Opacidad de 50 para las no seleccionadas }; @@ -57,33 +57,43 @@ function Paquetes({ next }) {
- {servicio} -
+ {servicio} + {/*

{servicio}

{descripcion}

-
+
*/}
-
-
-
-
-
-
1 Sesión
-
handleClickPrice(1)}> - {'$ ' + parseFloat(precio).toFixed(0)} +
+
+
+
Descripción
+
+

{servicio}

+

{descripcion}

+
+
+
+
+

Sesiones

+
+
+
1 Sesión
+
handleClickPrice(1)}> + {'$ ' + parseFloat(precio).toFixed(0)} +
+
+
+
5 Sesiones
+ +
+
+
10 Sesiones
+
-
-
-
5 Sesiones
- -
-
-
10 Sesiones
-
From ac27031b497c2c4d9b770884d74a27fa102128a3 Mon Sep 17 00:00:00 2001 From: Adrian Santelis Date: Tue, 4 Jun 2024 00:32:41 -0700 Subject: [PATCH 06/23] Hover en tarjeta servicio --- client/src/components/ui/TarjetaDeServicio.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/ui/TarjetaDeServicio.jsx b/client/src/components/ui/TarjetaDeServicio.jsx index 14b5e35d..1ddb4aa4 100644 --- a/client/src/components/ui/TarjetaDeServicio.jsx +++ b/client/src/components/ui/TarjetaDeServicio.jsx @@ -73,7 +73,7 @@ const TarjetaDeServicio = ({ servicio, next }) => { />
From c3f9e26f22c6b81dc92c2de523ef77a8bfa6bcb4 Mon Sep 17 00:00:00 2001 From: KarimSoto Date: Tue, 4 Jun 2024 00:37:52 -0700 Subject: [PATCH 07/23] algunos detalles sobre los input --- client/public/scripts/step3.js | 2 +- .../ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx | 5 ++--- client/src/txt.css | 6 ++++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/client/public/scripts/step3.js b/client/public/scripts/step3.js index 1214bb58..2c273029 100644 --- a/client/public/scripts/step3.js +++ b/client/public/scripts/step3.js @@ -144,7 +144,7 @@ document.getElementById('step3').addEventListener('click',async ()=>{ if(respuestaJson.redirect = '/spa/signUp/Confirmacion'){ - proximamente.innerHTML = ``; + proximamente.innerHTML = ``; await new Promise(resolve=> setTimeout(resolve, 1200)); diff --git a/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx b/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx index dd759b1f..ff9b8013 100644 --- a/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx +++ b/client/src/components/ui/Login/Procesos/CrearCuenta/InformacionBasica.jsx @@ -127,7 +127,7 @@ const InformacionBasica = () => { { { Date: Tue, 4 Jun 2024 00:44:46 -0700 Subject: [PATCH 08/23] =?UTF-8?q?Bot=C3=B3n=20para=20el=20QR=20del=20socio?= =?UTF-8?q?=20listo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/MenuPerfil.jsx | 56 ++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/client/src/components/ui/MenuPerfil.jsx b/client/src/components/ui/MenuPerfil.jsx index 564cd49b..85ed90ff 100644 --- a/client/src/components/ui/MenuPerfil.jsx +++ b/client/src/components/ui/MenuPerfil.jsx @@ -1,6 +1,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faUser, faUserPen, faBagShopping, faCalendarDays, faMoneyBill ,faClockRotateLeft, faCreditCard, faArrowRightFromBracket } from '@fortawesome/free-solid-svg-icons'; +import { faUser, faUserPen, faBagShopping, faCalendarDays, faMoneyBill ,faClockRotateLeft, faCreditCard, faArrowRightFromBracket, faQrcode } from '@fortawesome/free-solid-svg-icons'; import { Helmet, HelmetProvider } from "react-helmet-async"; +import { useEffect, useState } from 'react'; // eslint-disable-next-line react/prop-types function MenuPerfil() { @@ -9,6 +10,51 @@ function MenuPerfil() { + + const [clave, setClave] = useState(false); + const [sus, setSus] = useState(false); + + async function recibido() { + const respuesta = await fetch("/api/logueado", { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!respuesta.ok) { + setClave(false); + } + + let respuestaJson = await respuesta.json(); + + if (respuestaJson.logueado == true) { + setClave(respuestaJson.clave); + } else { + setClave(false); + } + } + + useEffect(() => { + recibido(); + }, []); + useEffect(() => { + + const Prod = async () => { + try { + if (clave) { + + const response = await fetch(`/api/admin/cliente/StatusSus/${clave}`) + const data = await response.json(); + setSus(data) + } + } catch (error) { + console.error("hubo error :", error) + } + } + Prod() + }, [clave]) + return (
From 0b5ca750b4122c293145de7e5a98adda8dd31884 Mon Sep 17 00:00:00 2001 From: ItsJorgeRdz03 <82615294+ItsJorgeRdz03@users.noreply.github.com> Date: Tue, 4 Jun 2024 01:52:46 -0700 Subject: [PATCH 17/23] =?UTF-8?q?Correciones=20en=20el=20dise=C3=B1o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/TarjetaFavoritos.jsx | 82 ++++++++++++------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/client/src/components/ui/TarjetaFavoritos.jsx b/client/src/components/ui/TarjetaFavoritos.jsx index ad02c5d6..0be3102a 100644 --- a/client/src/components/ui/TarjetaFavoritos.jsx +++ b/client/src/components/ui/TarjetaFavoritos.jsx @@ -1,7 +1,7 @@ import { styled } from "@mui/material/styles"; import Box from "@mui/material/Box"; import { Rating } from "@mui/material"; -import { AiOutlineShoppingCart } from "react-icons/ai"; +import { RiCalendarTodoFill } from "react-icons/ri"; import FavoriteIcon from "@mui/icons-material/Favorite"; import FavoriteBorderIcon from "@mui/icons-material/FavoriteBorder"; @@ -14,47 +14,69 @@ const StyledRating = styled(Rating)({ }, }); +function hr(hr) { + if (hr != undefined) { + let h = hr.charAt(1); + if (h[0] == "0") { + return hr + " min."; + } else if (h[0] == "1") { + return hr + " hr."; + } else { + return hr + " hrs."; + } + } +} + const TarjetaFavoritos = ({ props }) => { return ( -
+
- legend": { mt: 2 }, - }} - > -
-
- - `${value} Heart${value !== 1 ? "s" : ""}` - } - precision={1} - icon={} - emptyIcon={ - - } - /> -
+
+
+
- + legend": { mt: 2 }, + }} + > +
+
+ + `${value} Heart${value !== 1 ? "s" : ""}` + } + precision={1} + icon={} + emptyIcon={ + + } + /> +
+
+
+
{props.nombre}
-

{props.descr}

+

+ {props.descr.substring(0, 200) + "..."} +

{ -

{props.dur} min

+

{hr(props.dur)}

Date: Tue, 4 Jun 2024 01:53:00 -0700 Subject: [PATCH 18/23] Funcionalidad parcial en favoritos de descuentos --- client/src/components/ui/Filtros.jsx | 4 -- client/src/components/ui/Ofertas.jsx | 61 ++++++++++++++++++++++++++ client/src/components/ui/Productos.jsx | 1 - client/src/pages/Productos.jsx | 39 +++++++++++++--- 4 files changed, 94 insertions(+), 11 deletions(-) diff --git a/client/src/components/ui/Filtros.jsx b/client/src/components/ui/Filtros.jsx index 1e6b77dd..9adfc13b 100644 --- a/client/src/components/ui/Filtros.jsx +++ b/client/src/components/ui/Filtros.jsx @@ -81,7 +81,6 @@ export default function Filtros() { }, }); respuestaJson = await respuesta.json(); - console.log("id en uso: ", respuestaJson.clave); await setId(respuestaJson.clave); } catch (error) { console.log("Error"); @@ -98,7 +97,6 @@ export default function Filtros() { useEffect(() => { setTimeout(() => { - console.log("idFavoritos:", id); fetch(`/api/admin/favoritos/ProductFavoritosbyId/${id}`) .then((response) => { if (!response.ok) { @@ -108,7 +106,6 @@ export default function Filtros() { }) .then((data) => { setProductosFavorites(data); - console.log("favoritos" + data); }) .catch((error) => { //setErrorSpa(error.message); @@ -183,7 +180,6 @@ export default function Filtros() { //useEffect para obtener los productos useEffect(() => { setTimeout(() => { - console.log("idFinal:", id); fetch(`/api/admin/productos/getProducts/${id}`) .then((response) => { if (!response.ok) { diff --git a/client/src/components/ui/Ofertas.jsx b/client/src/components/ui/Ofertas.jsx index 7e0fc1e6..7b37ca50 100644 --- a/client/src/components/ui/Ofertas.jsx +++ b/client/src/components/ui/Ofertas.jsx @@ -28,6 +28,27 @@ function Ofertas({ producto, handleClickCarrito, noDesc }) { const notify = () => toast("Producto agregado al carrito"); const { agregarAlCarrito } = useCarrito(); + const [favorites, setFavorites] = useState({}); + const [uid, setUid] = useState(null); + + useEffect(() => { + localStorage.removeItem("favoritos") + }, []) + + useEffect(() => { + const cookie = obteneridCookie('Naruto_cookie'); + if (cookie) { + const decoded = jwtDecode(cookie); + setUid(decoded.user); + } + }, []); + + const obteneridCookie = (cookieName) => { + const cookies = document.cookie.split(';'); + const cookie = cookies.find(c => c.trim().startsWith(cookieName + "=")); + return cookie ? cookie.split('=')[1] : null; + }; + const handleViewMore = (producto) => { // navigate to the product page with the product current id const product = { @@ -63,6 +84,45 @@ function Ofertas({ producto, handleClickCarrito, noDesc }) { return Number(price).toFixed(2); } + const toggleFavorite = async (idProducto) => { + const estaEnFavoritos = favorites[idProducto.pkIdPS]; + + if (uid) { + try { + fetch('/api/admin/favoritos/invertirFav', { + method: "POST", + body: JSON.stringify({ idCliente: uid, IdProducto: idProducto.pkIdPS }), + headers: { "Content-Type": "application/json" }, + }); + + setFavorites(prev => ({ + ...prev, + [idProducto.pkIdPS]: !estaEnFavoritos + })); + + + } catch (error) { + console.error('Error en la solicitud:', error); + } + } else { + setFavorites(prev => ({ + ...prev, + [idProducto.pkIdPS]: !estaEnFavoritos + })); + let favoritos = JSON.parse(localStorage.getItem("favoritos")) || []; + const estaEnFavoritos = favoritos.some(fav => fav.pkIdPS === idProducto.pkIdPS); + if (!estaEnFavoritos) { + + favoritos.push(idProducto); + localStorage.setItem("favoritos", JSON.stringify(favoritos)); + } else { + let favoritos = JSON.parse(localStorage.getItem("favoritos")) || []; + favoritos = favoritos.filter((obj) => obj.pkIdPS !== idProducto.pkIdPS); + localStorage.setItem("favoritos", JSON.stringify(favoritos)); + } + } + }; + return (
@@ -76,6 +136,7 @@ function Ofertas({ producto, handleClickCarrito, noDesc }) { name="customized-color" defaultValue={0} max={1} + value={producto.favorito || favorites[producto.pkIdPS] ? 1 : 0} getLabelText={(value) => `${value} Heart${value !== 1 ? 's' : ''}`} precision={1} icon={} diff --git a/client/src/components/ui/Productos.jsx b/client/src/components/ui/Productos.jsx index 1ac16bc7..3c4a0321 100644 --- a/client/src/components/ui/Productos.jsx +++ b/client/src/components/ui/Productos.jsx @@ -155,7 +155,6 @@ function Productos({ productos }) { } */} - {console.log("esta en favoritos: ", producto.favorito)} { const Productos = () => { const [descuentos, setDescuentos] = useState([]); const [soon, setSoon] = useState(false); + const [id, setId] = useState(0); + + async function getId() { + let respuestaJson = null; + try { + const respuesta = await fetch("/api/logueado", { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + respuestaJson = await respuesta.json(); + console.log("id en uso: ", respuestaJson.clave); + await setId(respuestaJson.clave); + } catch (error) { + console.log("Error"); + } + } + + useEffect(() => { + getId(); + }, []); const toggleSoon = () => { setSoon(!soon) @@ -38,18 +60,23 @@ const Productos = () => { //useEffect para obtener los productos con descuento useEffect(() => { setTimeout(() => { - fetch("/api/admin/productos/descuento") - .then((response) => response.json()) + console.log("issssssssdd", id); + fetch(`/api/admin/productos/descuento/${id}`) + .then((response) => { + if (!response.ok) { + throw new Error("Error al obtener los descuentos"); + } + return response.json(); + }) .then((data) => { - // Acceder al array de objetos en la posición 0 del array dentro de data - setDescuentos(data.data); + setDescuentos(data); + console.log("descuentos", data); }) .catch((error) => { console.log("error", error); }); }, [1000]) - }, []); - + }, [id]); return ( From a2a1bbbff40db2034a8c2b510cfe8faa9fbb2f95 Mon Sep 17 00:00:00 2001 From: KrisG012 Date: Tue, 4 Jun 2024 02:12:01 -0700 Subject: [PATCH 19/23] =?UTF-8?q?Informaci=C3=B3n=20de=20un=20servicio=20e?= =?UTF-8?q?n=20el=20historial.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/ReturnCita.jsx | 66 +++++++++++++++++++++++-- client/src/index2.css | 2 +- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/client/src/components/ui/ReturnCita.jsx b/client/src/components/ui/ReturnCita.jsx index 074b4688..1bd24093 100644 --- a/client/src/components/ui/ReturnCita.jsx +++ b/client/src/components/ui/ReturnCita.jsx @@ -1,9 +1,15 @@ +import { useState } from "react" + function ReturnCitas({ citas }) { + const [info, setInfo] = useState(false); return (
-

{`${citas.day} de ${citas.month} del ${citas.year}`}

+
+

{`${citas.day} de ${citas.month} del ${citas.year}`}

+

{`Hora: ${citas.hora}`}

+

@@ -18,11 +24,63 @@ function ReturnCitas({ citas }) {
- + +
- -
+ {info && +
+
+
+

Servicio

+
+

{`Fecha: ${citas.day} / ${citas.month} / ${citas.year}`}

+
+
+

{citas.nombre}

+ +

Calificación de los clientes:

+

Excelente

+
+
+
+

{`Pedido: #${citas.id}`}

+
+
+

Sesiones

+

{`1 x $${citas.precio}`}

+
+
+

IVA:

+

$0.00

+
+
+

Descuento

+

$0.00

+
+
+

Método de pago:

+

Tarjeta

+
+
+

Tarjeta utilizada

+

************9382

+
+
+

Puntos obtenidos:

+

{parseInt(citas.precio/10)} puntos

+
+
+
+
+ + + +
+
+
+
+ }
) } diff --git a/client/src/index2.css b/client/src/index2.css index fce34d25..3d437f22 100644 --- a/client/src/index2.css +++ b/client/src/index2.css @@ -598,7 +598,7 @@ body { color: rgb(236, 87, 102); } .nav-cart:hover { - color: rgb(255, 181, 167); + color: #ffb5a6; transition: 0.25s; } From 38e027e0d14d2ee1880a4f18abbb50cbfa3dd37a Mon Sep 17 00:00:00 2001 From: ItsJorgeRdz03 <82615294+ItsJorgeRdz03@users.noreply.github.com> Date: Tue, 4 Jun 2024 02:18:32 -0700 Subject: [PATCH 20/23] =?UTF-8?q?A=C3=B1adido=20funcionalidad=20del=20bot?= =?UTF-8?q?=C3=B3n=20agregar=20favorito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/TarjetaFavoritos.jsx | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/client/src/components/ui/TarjetaFavoritos.jsx b/client/src/components/ui/TarjetaFavoritos.jsx index 0be3102a..a342e68f 100644 --- a/client/src/components/ui/TarjetaFavoritos.jsx +++ b/client/src/components/ui/TarjetaFavoritos.jsx @@ -1,4 +1,5 @@ import { styled } from "@mui/material/styles"; +import { useState, useEffect } from "react"; import Box from "@mui/material/Box"; import { Rating } from "@mui/material"; import { RiCalendarTodoFill } from "react-icons/ri"; @@ -28,6 +29,40 @@ function hr(hr) { } const TarjetaFavoritos = ({ props }) => { + const [login, setLogin] = useState(false); + const [fav, setFav] = useState(props.favorito); + + const callFav = async () => { + if (props.id != 0) { + try { + const respuesta = await fetch("/api/admin/productos/setFavorito", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: props.id, + idPS: props.ps, + estado: props.favorito, + }), + }); + + let respuestaJson = await respuesta.json(); + if ((await respuestaJson[0].res) == true) { + setFav(!fav); + } + } catch (error) { + console.log(error, "error"); + } + } + }; + + useEffect(() => { + if (fav !== props.favorito) { + props.st(); + } + }, [fav]); + return (
@@ -51,6 +86,7 @@ const TarjetaFavoritos = ({ props }) => {
callFav()} name="customized-color" defaultValue={props.favorito} max={1} From 96d4be33215716d0e8f425d060f3dfc2b541b67e Mon Sep 17 00:00:00 2001 From: ItsJorgeRdz03 <82615294+ItsJorgeRdz03@users.noreply.github.com> Date: Tue, 4 Jun 2024 02:19:30 -0700 Subject: [PATCH 21/23] =?UTF-8?q?Modificado=20consulta=20y=20a=C3=B1adidos?= =?UTF-8?q?=20parametros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/Favoritos.jsx | 49 +++++++++++++++++++++----- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/client/src/components/ui/Favoritos.jsx b/client/src/components/ui/Favoritos.jsx index 2c397a08..8a4230e2 100644 --- a/client/src/components/ui/Favoritos.jsx +++ b/client/src/components/ui/Favoritos.jsx @@ -80,10 +80,35 @@ function Favoritos() { const [estetica, setEstetica] = useState([]); const [color1, setColor1] = useState("#EB5765"); const [color2, setColor2] = useState("#F6B3B9"); + const [id, setId] = useState(0); + const [st, setSt] = useState(false); + + let respuestaJson = null; + async function checkLogin() { + try { + const respuesta = await fetch("/api/logueado", { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + respuestaJson = await respuesta.json(); + if (respuestaJson.logueado == true) { + await setId(respuestaJson.clave); + } + } catch (error) { + setLog(false); + } + } + + useEffect(() => { + checkLogin(); + }, []); useEffect(() => { setTimeout(() => { - fetch("/api/admin/favoritos/ServiceFavoritosSpa") + fetch(`/api/admin/favoritos/ServiceFavoritosSpa/${id}`) .then((response) => { if (!response.ok) { throw new Error("Error al obtener los favoritos de spa"); @@ -97,11 +122,11 @@ function Favoritos() { console.log("error", error); }); }, 3000); - }, []); + }, [id, st]); useEffect(() => { setTimeout(() => { - fetch("/api/admin/favoritos/ServiceFavoritosEstetica") + fetch(`/api/admin/favoritos/ServiceFavoritosEstetica/${id}`) .then((response) => { if (!response.ok) { throw new Error("Error al obtener los favoritos de estetica"); @@ -115,7 +140,7 @@ function Favoritos() { console.log("error", error); }); }, 3000); - }, []); + }, [id, st]); const toggleService = (index) => { if (index === 1) { @@ -155,6 +180,10 @@ function Favoritos() { } }; + function changeSt() { + setSt(!st); + } + return ( <> ); @@ -209,14 +240,16 @@ function Favoritos() { return ( ); From f8422caedcc6186782448daeb8fd13cce5bfd414 Mon Sep 17 00:00:00 2001 From: KrisG012 Date: Tue, 4 Jun 2024 02:19:31 -0700 Subject: [PATCH 22/23] =?UTF-8?q?Obtenci=C3=B3n=20distinta=20de=20puntos?= =?UTF-8?q?=20entre=20socio=20y=20usuario.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/ui/Agenda.jsx | 5 ++--- client/src/components/ui/RevisionProductos.jsx | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/client/src/components/ui/Agenda.jsx b/client/src/components/ui/Agenda.jsx index 69c9e2f6..74805bad 100644 --- a/client/src/components/ui/Agenda.jsx +++ b/client/src/components/ui/Agenda.jsx @@ -14,6 +14,7 @@ function Agenda({ restart, next }) { const [soon, setSoon] = useState(false); const [del, setDel] = useState(false); const [selectedCitaIndex, setSelectedCitaIndex] = useState(null); + const [sus, setSus] = useState(false); //<<< CARACTERISTICA GRAFICA DE QUE EL USUARIO ES SOCIO const handleModificar = () => { selectedCitaIndex === null && notify(); @@ -105,9 +106,7 @@ function Agenda({ restart, next }) { const iva = (total * 0.08).toFixed(2); const totalIva = (parseFloat(total) + parseFloat(iva)).toFixed(2); - const puntos = parseFloat(totalIva) / 10; - //En caso de ser Socio VVV - //const puntos = (parseInt(totalIva))/5; + const puntos = (sus ? ((parseInt(totalIva))/5):((parseFloat(totalIva)) / 10)); localStorage.setItem("total", total); localStorage.setItem("totalIva", totalIva); diff --git a/client/src/components/ui/RevisionProductos.jsx b/client/src/components/ui/RevisionProductos.jsx index ddaea087..0884fa16 100644 --- a/client/src/components/ui/RevisionProductos.jsx +++ b/client/src/components/ui/RevisionProductos.jsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import Carousel from 'react-multi-carousel'; +//import Carousel from 'react-multi-carousel'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faTrash } from '@fortawesome/free-solid-svg-icons'; import { Rating } from '@mui/material'; @@ -60,7 +60,7 @@ function RevisionProductos({ restart, producto, next }) { const total = (parseFloat(subTotal) + parseFloat(ivaTotal)).toFixed(2); const [puntosTotal, setPuntosTotal] = useState(0); //<<< PUNTOS TOTALES const [sus, setSus] = useState(false); //<<< CARACTERISTICA GRAFICA DE QUE EL USUARIO ES SOCIO - const puntos = (sus ? ((parseInt(sus))/5):((parseFloat(total)) / 10)); + const puntos = (sus ? ((parseInt(total))/5):((parseFloat(total)) / 10)); async function callRango() { const respuesta3 = await fetch("/api/perfil/rangos", { From c01e41af0f564878c33944962bac80d066072f95 Mon Sep 17 00:00:00 2001 From: KrisG012 Date: Tue, 4 Jun 2024 02:22:06 -0700 Subject: [PATCH 23/23] Cantidad mostrada de puntos obtenidos en agendar. --- client/src/components/ui/Agenda.jsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/components/ui/Agenda.jsx b/client/src/components/ui/Agenda.jsx index 74805bad..7fa3586f 100644 --- a/client/src/components/ui/Agenda.jsx +++ b/client/src/components/ui/Agenda.jsx @@ -263,6 +263,10 @@ function Agenda({ restart, next }) { ${totalIva}
+
+

Puntos obtenidos:

+ {parseInt(puntos)} +