From c747b4615c806db7e22e3039f990692e50280921 Mon Sep 17 00:00:00 2001 From: SirRobert-1 Date: Tue, 3 Jun 2025 22:33:10 -0600 Subject: [PATCH] feat: add custom message functionality for diploma emails and WhatsApp notifications --- .../dialogs/vistaPreviaDiplomaDialog.jsx | 150 +++++++++++++++--- diplomas/src/pages/api/send-diploma.js | 8 +- diplomas/src/schemas/mensajesSchema.js | 6 + 3 files changed, 138 insertions(+), 26 deletions(-) create mode 100644 diplomas/src/schemas/mensajesSchema.js diff --git a/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx b/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx index efae999..936cfcc 100644 --- a/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx +++ b/diplomas/src/components/dialogs/vistaPreviaDiplomaDialog.jsx @@ -8,11 +8,16 @@ import { import Diploma from "@/components/Diploma"; import { PDFDownloadLink, PDFViewer, pdf } from "@react-pdf/renderer"; import { supabaseClient } from "@/utils/supabase"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { mensajesSchema } from "@/schemas/mensajesSchema"; +import { Textarea } from "../ui/textarea"; function VistaPreviaDiplomaDialog({ open, onOpenChange, alumno, + curso, competencias: competenciasProp, fecha, competenciasAcreditadas, @@ -20,8 +25,77 @@ function VistaPreviaDiplomaDialog({ const [mostrarVistaPrevia, setMostrarVistaPrevia] = useState(false); const [enviando, setEnviando] = useState(false); const [mensaje, setMensaje] = useState(""); + const [loadingMensajes, setLoadingMensajes] = useState(false); const [competencias, setCompetencias] = useState([]); + const form = useForm({ + resolver: zodResolver(mensajesSchema), + defaultValues: { + correo: "", + whatsapp: "", + }, + }); + + const { + register, + handleSubmit, + setValue, + getValues, + formState: { errors }, + } = form; + + // 🔄 Cargar mensajes al abrir el modal + useEffect(() => { + if (open) { + setLoadingMensajes(true); + Promise.all([ + supabaseClient.from("mensaje_correo").select("id, mensaje").single(), + supabaseClient.from("mensaje_whatsapp").select("id, mensaje").single(), + ]) + .then(([correoRes, whatsappRes]) => { + if (correoRes.data) setValue("correo", correoRes.data.mensaje); + if (whatsappRes.data) setValue("whatsapp", whatsappRes.data.mensaje); + }) + .finally(() => setLoadingMensajes(false)); + } + }, [open, setValue]); + + // 📝 Guardar mensajes personalizados + const handleGuardarMensajes = async () => { + const { correo, whatsapp } = getValues(); + + const [{ data: correoExistente }] = await Promise.all([ + supabaseClient.from("mensaje_correo").select("id").maybeSingle(), + ]); + + if (correoExistente) { + await supabaseClient + .from("mensaje_correo") + .update({ mensaje: correo }) + .eq("id", correoExistente.id); + } else { + await supabaseClient.from("mensaje_correo").insert({ mensaje: correo }); + } + + const { data: whatsappExistente } = await supabaseClient + .from("mensaje_whatsapp") + .select("id") + .maybeSingle(); + + if (whatsappExistente) { + await supabaseClient + .from("mensaje_whatsapp") + .update({ mensaje: whatsapp }) + .eq("id", whatsappExistente.id); + } else { + await supabaseClient + .from("mensaje_whatsapp") + .insert({ mensaje: whatsapp }); + } + + setMensaje("Mensajes guardados correctamente."); + }; + useEffect(() => { if (alumno && alumno.curso?.id) { supabaseClient @@ -41,28 +115,25 @@ function VistaPreviaDiplomaDialog({ ? 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(""); - // Genera el PDF como blob + const blob = await pdf( ).toBlob(); - // Convierte el blob a base64 const pdfBase64 = await new Promise((resolve) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result.split(",")[1]); reader.readAsDataURL(blob); }); - // Llama a tu API de Next.js const resp = await fetch("/api/send-diploma", { method: "POST", headers: { "Content-Type": "application/json" }, @@ -71,32 +142,30 @@ function VistaPreviaDiplomaDialog({ nombre: alumno.nombre, curso: alumno.curso?.nombre || "Sin curso", pdfBase64, + mensajeCorreo: getValues("correo"), }), }); if (resp.ok) { - // WhatsApp real (abre ventana) const telefono = alumno.telefono.replace(/\D/g, ""); - const mensajeWhatsapp = encodeURIComponent( - `Hola ${alumno.nombre}, tu diploma ha sido generado y enviado a tu correo (${alumno.correo}). ¡Felicidades!` - ); + const mensajeWhatsapp = encodeURIComponent(getValues("whatsapp")); 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}.` - ); + setMensaje(`Diploma enviado por correo a ${alumno.correo}.`); } else { - setMensaje("Error enviando el diploma por correo."); + setMensaje("Error enviando el diploma."); } + setEnviando(false); }; + if (!alumno) return null; + return ( - + Diploma @@ -117,15 +186,35 @@ function VistaPreviaDiplomaDialog({
Fecha: {fecha || new Date().toLocaleDateString()}
-
- Vista previa -
-
+ {/* Campos de mensaje */} +
+
+