"use client"; import { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { ParticipaSchema, ParticipaFormData } from "@/utils/validations"; import { Input } from "../ui/Input"; import { Button } from "../ui/Button"; import { Checkbox } from "../ui/Checkbox"; import { Textarea } from "../ui/Textarea"; import { motion, AnimatePresence } from "framer-motion"; import { useLanguage } from "@/context/LanguageContext"; import { supabase } from "@/lib/supabase/client"; export const ParticipaForm = () => { const { t, locale } = useLanguage(); const [isSubmitting, setIsSubmitting] = useState(false); const [success, setSuccess] = useState(false); const [errorMsg, setErrorMsg] = useState(null); const [campanas, setCampanas] = useState([]); // Estados para manejar las preguntas dinámicas (El Screener) const [preguntasDinamicas, setPreguntasDinamicas] = useState([]); const [respuestasDinamicas, setRespuestasDinamicas] = useState>({}); const { register, handleSubmit, watch, formState: { errors }, reset } = useForm({ resolver: zodResolver(ParticipaSchema), defaultValues: { interes: "" as any } }); // Vigila en tiempo real qué campaña ha seleccionado el usuario const campanaSeleccionadaId = watch("interes"); useEffect(() => { const fetchCampanas = async () => { try { const { data, error } = await supabase .from("campanas") .select(` id, nombre, encuestas ( configuracion ) `) .eq('estado', 'activa'); if (data && !error) { setCampanas(data); } } catch (err) { console.error("Error al cargar las campañas:", err); } }; fetchCampanas(); }, []); // Efecto que se dispara cuando el usuario cambia de campaña en el select useEffect(() => { if (campanaSeleccionadaId) { const campana = campanas.find(c => c.id === campanaSeleccionadaId); if (campana && campana.encuestas && campana.encuestas.length > 0) { const config = campana.encuestas[0].configuracion; if (config && config.preguntas_filtro) { setPreguntasDinamicas(config.preguntas_filtro); setRespuestasDinamicas({}); return; } } } setPreguntasDinamicas([]); setRespuestasDinamicas({}); }, [campanaSeleccionadaId, campanas]); // Manejador para los cambios en los inputs dinámicos const handleDynamicChange = (preguntaId: string, valor: any) => { setRespuestasDinamicas(prev => ({ ...prev, [preguntaId]: valor })); }; const onSubmit = async (data: ParticipaFormData) => { setIsSubmitting(true); setErrorMsg(null); const payload: any = { datos_participante: { nombre: data.nombre, apellidos: data.apellidos, email: data.email, telefono: data.telefono, perfil_demografico: { provincia: data.provincia, edad: Number(data.edad), mensaje: data.mensaje || "" } } }; if (data.interes && data.interes !== "") { payload.campana_id = data.interes; payload.datos_especificos = respuestasDinamicas; } try { const { data: responseData, error } = await supabase.functions.invoke('validate-participant-data', { body: payload }); if (error) { throw new Error(error.message || "Error al procesar la solicitud en el servidor."); } setSuccess(true); reset(); } catch (err: any) { console.error("Error en Screener:", err); setErrorMsg(err.message || "Hubo un problema de conexión al enviar tus datos."); } finally { setIsSubmitting(false); } }; return (
{success ? (

{t.participa.success.title}

{t.participa.success.desc}

) : (
{errors.interes && {errors.interes.message}}
{/* --- BLOQUE DINÁMICO MULTIDIOMA: EL SCREENER --- */} {preguntasDinamicas.length > 0 && (

{locale === 'en' ? "Specific Campaign Questions" : locale === 'ca' ? "Preguntes de la Campanya" : "Preguntas de la Campaña"}

{preguntasDinamicas.map((pregunta) => { // HELPER MULTIDIOMA: Lee el JSON para el idioma actual o usa el string antiguo const obtenerTexto = (campo: any) => { if (!campo) return ""; if (typeof campo === 'string') return campo; return campo[locale] || campo['es'] || ""; }; const obtenerOpciones = (campo: any): string[] => { if (!campo) return []; if (Array.isArray(campo)) return campo; return campo[locale] || campo['es'] || []; }; const etiquetaTraducida = obtenerTexto(pregunta.etiqueta); const opcionesTraducidas = obtenerOpciones(pregunta.opciones); return (
{pregunta.tipo === "select" && ( )} {pregunta.tipo === "checkbox" && (
{opcionesTraducidas.map((opt: string) => ( ))}
)}
); })}
)} {/* --- FIN BLOQUE DINÁMICO --- */}