From 8c2a6ecb6f9326bb16e5bba7569d94d698b09998 Mon Sep 17 00:00:00 2001 From: miguel Date: Wed, 13 May 2026 20:52:05 -0600 Subject: [PATCH] feat: add modal to display user contador and update attendance confirmation flow Co-authored-by: Copilot --- .../formulario/[id_cuestionario]/page.tsx | 39 ++++++++- src/app/(admins)/user/qr/page.tsx | 83 +++++++++++-------- 2 files changed, 86 insertions(+), 36 deletions(-) diff --git a/src/app/(admins)/user/evento/[id_evento]/formulario/[id_cuestionario]/page.tsx b/src/app/(admins)/user/evento/[id_evento]/formulario/[id_cuestionario]/page.tsx index 78f4611..f5f77c9 100644 --- a/src/app/(admins)/user/evento/[id_evento]/formulario/[id_cuestionario]/page.tsx +++ b/src/app/(admins)/user/evento/[id_evento]/formulario/[id_cuestionario]/page.tsx @@ -11,6 +11,10 @@ import { useParams } from 'next/navigation'; import React, { useEffect } from 'react'; import toast from 'react-hot-toast'; import { useEvento } from '@/context/evento'; +import dynamic from 'next/dynamic'; +import Button from '@/components/button'; + +const Modal = dynamic(() => import('@/components/modal'), { ssr: false }); type Params = { id_evento: string; @@ -27,6 +31,7 @@ export default function Page() { const [loadingAsistencia, setLoadingAsistencia] = React.useState< Record >({}); + const [contadorModal, setContadorModal] = React.useState(null); const { data: participantes, setData } = useGetApi( `/participante-evento/evento/${params.id_cuestionario}` @@ -45,12 +50,15 @@ export default function Page() { ) => { setLoadingAsistencia((prev) => ({ ...prev, [id_participante]: true })); try { - await axiosInstance.post( + const response = await axiosInstance.post( `/participante-evento/asistencia/${id_participante}/${id_evento}` ); + if (response.data?.contador != null) { + setContadorModal(response.data.contador); + } + toast.success('Asistencia confirmada'); - // Actualiza lista const { data } = await axiosInstance.get( `/participante-evento/evento/${id_evento}` ); @@ -188,6 +196,33 @@ export default function Page() { )} + setContadorModal(null)} + closeButton + className={{ content: 'border-0 rounded-3', body: 'text-center' }} + > +
+
+ + Contador +
+
+
+

{contadorModal}

+

+ Este es el numero de estampillas a entregar al usuario +

+ +
+
); } diff --git a/src/app/(admins)/user/qr/page.tsx b/src/app/(admins)/user/qr/page.tsx index 174a63a..cd46c4a 100644 --- a/src/app/(admins)/user/qr/page.tsx +++ b/src/app/(admins)/user/qr/page.tsx @@ -15,6 +15,7 @@ export default function Page() { const [statusMessage, setStatusMessage] = useState(''); const [participante, setParticipante] = useState(''); + const [contador, setContador] = useState(0); const [message, setMessage] = useState(''); const [token, setToken] = useState(''); const [tokenValid, setTokenValid] = useState(false); @@ -29,7 +30,10 @@ export default function Page() { } try { - const response = await axiosInstance.post('/participante-evento/decode-token', { token: rawValue }); + const response = await axiosInstance.post( + '/participante-evento/decode-token', + { token: rawValue } + ); if (response.data) { // Token válido @@ -37,6 +41,7 @@ export default function Page() { setTokenValid(true); setShowModal(true); setEnableScan(false); + setContador(response.data.contador); } else { // Token caducado o cualquier otro error setStatusMessage(`❌ Error el código qr ya caduco`); @@ -53,22 +58,22 @@ export default function Page() { } }; - const handleConfirm = async () => { if (!tokenValid) return; try { const response = await axiosInstance.post( - `/participante-evento/asistencia`, { - token: token + `/participante-evento/asistencia`, + { + token: token, } ); //Validacion - if(response.data.success === false) { - console.error("El usuario ya se registro"); + if (response.data.success === false) { + console.error('El usuario ya se registro'); setMessage(response.data.message); - toast.error("❌ Error el usaurio ya se registro previamente.") + toast.error('❌ Error el usaurio ya se registro previamente.'); } else { setParticipante(response.data.data.participante); setMessage(response.data.message); @@ -137,7 +142,9 @@ export default function Page() {
- Ultimo participante registrado: {participante} + + Ultimo participante registrado: {participante} +
)} @@ -191,8 +198,8 @@ export default function Page() { statusMessage.includes('❌') ? 'alert-danger' : statusMessage.includes('⚠️') - ? 'alert-warning' - : 'alert-success' + ? 'alert-warning' + : 'alert-success' }`} >
@@ -240,34 +247,42 @@ export default function Page() {
{tokenValid ? ( // Modal de confirmación de asistencia -
- - -
+ <> +

+ Contador del usuario: {contador} +

+
+ + +
+ ) : ( // Modal de error
- +
{statusMessage}
-- 2.43.0