diff --git a/diplomas/src/components/dialogs/crearDiplomaDialog.jsx b/diplomas/src/components/dialogs/crearDiplomaDialog.jsx index b9e05df..24915f9 100644 --- a/diplomas/src/components/dialogs/crearDiplomaDialog.jsx +++ b/diplomas/src/components/dialogs/crearDiplomaDialog.jsx @@ -27,13 +27,13 @@ export default function CrearDiplomaDialog({ fecha, setFecha, }) { - const [diseñoSeleccionado, setDiseñoSeleccionado] = useState(DISEÑOS[0]?.id || null); + const [diseñoSeleccionado, setDiseñoSeleccionado] = useState( + DISEÑOS[0]?.id || null + ); const toggleCompetencia = (id) => { setCompetenciasAcreditadas((prev) => - prev.includes(id) - ? prev.filter((cid) => cid !== id) - : [...prev, id] + prev.includes(id) ? prev.filter((cid) => cid !== id) : [...prev, id] ); }; @@ -68,7 +68,9 @@ export default function CrearDiplomaDialog({
- + {competencias.map((comp) => (
setFecha(e.target.value)} + onChange={(e) => setFecha(e.target.value)} />
- - diff --git a/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx b/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx index 82567e6..7151584 100644 --- a/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx +++ b/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import { useState, useEffect } from "react"; import { Dialog, DialogContent, @@ -6,57 +6,164 @@ import { DialogTitle, } from "@/components/ui/dialog"; import Diploma from "@/components/Diploma"; -import { PDFDownloadLink, PDFViewer } from "@react-pdf/renderer"; -import { Button } from "../ui/button"; +import { PDFDownloadLink, PDFViewer, pdf } from "@react-pdf/renderer"; +import { supabaseClient } from "@/utils/supabase"; function VistaPreviaDiplomaDialog({ open, onOpenChange, alumno, - competencias, + competencias: competenciasProp, fecha, competenciasAcreditadas, }) { const [mostrarVistaPrevia, setMostrarVistaPrevia] = useState(false); + const [enviando, setEnviando] = useState(false); + const [mensaje, setMensaje] = useState(""); + const [competencias, setCompetencias] = useState([]); - if (!open || !alumno) return null; + useEffect(() => { + if (alumno && alumno.curso?.id) { + supabaseClient + .from("curso_competencia") + .select("competencia(id, descripcion)") + .eq("curso_id", alumno.curso.id) + .then(({ data }) => { + const comps = data?.map((c) => c.competencia).filter(Boolean) || []; + setCompetencias(comps); + }); + } + }, [alumno]); - // Filtra solo las competencias seleccionadas si se pasa el array de acreditadas - const competenciasMostradas = Array.isArray(competenciasAcreditadas) - ? (Array.isArray(competencias) ? competencias : []).filter((comp) => - competenciasAcreditadas.includes(comp.id) - ) - : (Array.isArray(competencias) ? competencias : []); + if (!alumno) return null; - const competenciasParaPDF = - Array.isArray(competenciasMostradas) && competenciasMostradas.length > 0 - ? competenciasMostradas - : []; + const competenciasMostradas = competenciasAcreditadas + ? competencias.filter((comp) => competenciasAcreditadas.includes(comp.id)) + : competencias; + + // Simulación de envío de PDF por correo y WhatsApp + const handleEnviar = async () => { + setEnviando(true); + setMensaje(""); + // Simula la generación del PDF + const blob = await pdf( + + ).toBlob(); + + // Simula el envío por correo (espera 2 segundos) + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // Enviar mensaje real por WhatsApp usando la API de WhatsApp (abrirá una nueva ventana) + const telefono = alumno.telefono.replace(/\D/g, ""); // Solo números + const mensajeWhatsapp = encodeURIComponent( + `Hola ${alumno.nombre}, tu diploma ha sido generado y enviado a tu correo (${alumno.correo}). ¡Felicidades!` + ); + window.open(`https://wa.me/${telefono}?text=${mensajeWhatsapp}`, "_blank"); + + setMensaje( + `Diploma enviado por correo a ${alumno.correo} y mensaje enviado por WhatsApp al ${alumno.telefono}.` + ); + setEnviando(false); + }; return ( -
-

Diploma

-
- Alumno: {alumno.nombre} -
-
- Curso: {alumno.curso?.nombre || "Sin curso"} -
-
- Competencias Acreditadas: -
    - {competenciasMostradas.map((comp) => ( -
  • {comp.descripcion}
  • - ))} -
-
-
- Fecha: {fecha || new Date().toLocaleDateString()} -
-
- Vista previa -
-
+ + + + Diploma + +
+ Alumno: {alumno.nombre} +
+
+ Curso: {alumno.curso?.nombre || "Sin curso"} +
+
+ Competencias Acreditadas: +
    + {competenciasMostradas.map((comp) => ( +
  • {comp.descripcion}
  • + ))} +
+
+
+ Fecha: {fecha || new Date().toLocaleDateString()} +
+
+ Vista previa +
+
+ + } + fileName={`Diploma_${alumno.nombre}.pdf`} + > + {({ loading }) => + loading ? ( + + ) : ( + + ) + } + + + +
+ {mensaje && ( +
+ {mensaje} +
+ )} + {mostrarVistaPrevia && ( +
+
+
+ + + +
+ +
+
+ )} +
+
); } diff --git a/diplomas/src/pages/diplomasVista.jsx b/diplomas/src/pages/diplomasVista.jsx index fe6af1d..5fe5e71 100644 --- a/diplomas/src/pages/diplomasVista.jsx +++ b/diplomas/src/pages/diplomasVista.jsx @@ -37,6 +37,20 @@ export default function DiplomasVista() { } }; + useEffect(() => { + if (alumnoSeleccionado && alumnoSeleccionado.curso?.id) { + supabaseClient + .from("curso_competencia") + .select("competencia(id, descripcion)") + .eq("curso_id", alumnoSeleccionado.curso.id) + .then(({ data }) => { + const comps = data?.map((c) => c.competencia).filter(Boolean) || []; + setCompetencias(comps); + setCompetenciasAcreditadas(comps.map((c) => c.id)); // Opcional: selecciona todas por default + }); + } + }, [alumnoSeleccionado]); + return (
@@ -82,7 +96,7 @@ export default function DiplomasVista() { {mostrarDialog && (
- + />*/}