"use client"; import { useState, ChangeEvent, FormEvent, useEffect } from "react"; import { usePortfolioData } from "@/lib/usePortfolioData"; import { motion } from "motion/react"; interface ContactFormProps { formType: "simple" | "advanced"; setFormType: (type: "simple" | "advanced") => void; } export function ContactForm({ formType, setFormType }: ContactFormProps) { const { data } = usePortfolioData(); const [contactMethod, setContactMethod] = useState<"whatsapp" | "email">( "whatsapp", ); // MENTORIA: Agrupamento de estado para reduzir complexidade e re-renders const [formData, setFormData] = useState({ userName: "", userEmail: "", userPhone: "", userCompany: "", howFound: "", projectType: "", otherProjectType: "", desiredDeadline: "", budgetValue: "", technicalComplexity: "", hasInternalTeam: "", customMessage: "", }); const [isDecisor, setIsDecisor] = useState(""); const [projectApproved, setProjectApproved] = useState(""); const [urgency, setUrgency] = useState(""); const [preferredModality, setPreferredModality] = useState(""); const [isExpanded, setIsExpanded] = useState(false); // Novo estado para controlar a expansão do formulário avançado const [nameError, setNameError] = useState(null); const [emailError, setEmailError] = useState(null); const [phoneError, setPhoneError] = useState(null); const [otherProjectTypeError, setOtherProjectTypeError] = useState< string | null >(null); // Novo estado de erro const [honeypot, setHoneypot] = useState(""); // Estado para o campo honeypot const [startTime, setStartTime] = useState(0); // Estado para o tempo de início do formulário const [nameFocused, setNameFocused] = useState(false); const [emailFocused, setEmailFocused] = useState(false); const [phoneFocused, setPhoneFocused] = useState(false); useEffect(() => { setStartTime(Date.now()); // Registra o tempo de carregamento do componente }, []); if (!data) { return null; // Ou um componente de carregamento/erro } const getGreetingMessageWithUserName = () => { const hour = new Date().getHours(); const dayPart = hour >= 8 && hour < 12 ? "manhã" : hour >= 12 && hour < 18 ? "tarde" : "noite"; return `Olá Evandro, espero que esta ${dayPart} esteja sendo produtiva. Meu nome é ${formData.userName} e entrei em contato pois vi seu portfólio e identifiquei que suas habilidades como Desenvolvedor Full-Stack podem agregar muito ao projeto que tenho em mente. Gostaria de agendar uma conversa para discutirmos detalhes e entender como podemos trabalhar juntos de forma eficiente e produtiva. Fico no aguardo do seu contato para marcarmos um horário que seja conveniente para ambos. Atenciosamente, ${formData.userName}`; }; const generateAdvancedMessage = () => { if (formData.customMessage) return formData.customMessage; // Saudação profissional let message = `Prezado Evandro,\n\n`; // Informações do contato message += `Meu nome é ${formData.userName}`; if (formData.userCompany) { message += `, represento a empresa ${formData.userCompany}`; } message += `.\n`; if (formData.howFound) { message += `Conheci seu trabalho através de ${formData.howFound}.\n`; } message += `\n`; // Detalhes do projeto message += `=== DETALHES DO PROJETO ===\n`; message += `Tipo de projeto: `; if (formData.projectType === "outro" && formData.otherProjectType) { message += `${formData.otherProjectType}\n`; } else if (formData.projectType) { message += `${formData.projectType}\n`; } else { message += `Não especificado\n`; } if (formData.desiredDeadline) { message += `Prazo desejado: ${formData.desiredDeadline}\n`; } if (formData.budgetValue) { message += `Orçamento disponível: ${formData.budgetValue}\n`; } if (formData.technicalComplexity) { message += `Complexidade técnica estimada: ${formData.technicalComplexity}\n`; } if (formData.hasInternalTeam) { message += `Equipe técnica interna: ${ formData.hasInternalTeam === "sim" ? "Sim" : formData.hasInternalTeam === "nao" ? "Não" : "Parcialmente" }\n`; } message += `\n`; // Contatos message += `=== INFORMAÇÕES PARA CONTATO ===\n`; if (formData.userEmail) { message += `📧 Email: ${formData.userEmail}\n`; } if (formData.userPhone) { message += `📱 Telefone/WhatsApp: ${formData.userPhone}\n`; } message += `\n`; // Mensagem final message += `Estou entrando em contato pois acredito que seus conhecimentos como Desenvolvedor Full-Stack podem agregar muito ao projeto que tenho em mente.\n\n`; message += `Fico no aguardo do seu contato para discutirmos detalhes e definirmos os próximos passos.\n\n`; message += `Atenciosamente,\n`; message += `${formData.userName}`; return message; }; const handleInputChange = (field: keyof typeof formData) => ( e: ChangeEvent< HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement >, ) => { setFormData((prev) => ({ ...prev, [field]: e.target.value })); // Clear specific errors if the user starts typing if (e.target.value.trim() !== "") { if (field === "userName") setNameError(null); if (field === "userEmail") setEmailError(null); if (field === "userPhone") setPhoneError(null); if (field === "otherProjectType") setOtherProjectTypeError(null); } }; const handleNameFocus = () => setNameFocused(true); const handleEmailFocus = () => setEmailFocused(true); const handlePhoneFocus = () => setPhoneFocused(true); const generateWhatsAppUrl = () => { const message = encodeURIComponent( formType === "advanced" ? generateAdvancedMessage() : formData.customMessage || getGreetingMessageWithUserName(), ); const phone = data.contact.whatsapp.replace(/\D/g, ""); // Remove caracteres não numéricos return `https://wa.me/${phone}?text=${message}`; }; const generateEmailUrl = () => { const subject = encodeURIComponent("Proposta de Projeto - Portfólio"); const body = encodeURIComponent( formType === "advanced" ? generateAdvancedMessage() : `Nome: ${formData.userName}\nEmail: ${formData.userEmail}\nTelefone: ${formData.userPhone}\nEmpresa/Posição: ${formData.userCompany}\nComo conheceu: ${formData.howFound}\n\nTipo de Projeto: ${formData.projectType}\nPrazo Desejado: ${formData.desiredDeadline}\nOrçamento Disponível: ${formData.budgetValue}\nComplexidade Técnica: ${formData.technicalComplexity}\nTem equipe interna: ${formData.hasInternalTeam}\n\nMensagem: ${ formData.customMessage || getGreetingMessageWithUserName() }`, ); return `mailto:${data.contact.email}?subject=${subject}&body=${body}`; }; const handleSubmit = (e: FormEvent) => { e.preventDefault(); let hasError = false; if (formData.userName.trim() === "") { setNameError("Por favor, insira seu nome."); hasError = true; } else { setNameError(null); } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(formData.userEmail)) { setEmailError("Por favor, insira um email válido."); hasError = true; } else { setEmailError(null); } if (formData.userPhone.trim() === "") { setPhoneError("Por favor, insira seu telefone."); hasError = true; } else { setPhoneError(null); } if ( formData.projectType === "outro" && formData.otherProjectType.trim() === "" ) { setOtherProjectTypeError("Por favor, especifique o tipo de projeto."); hasError = true; } else { setOtherProjectTypeError(null); } // Validação Honeypot if (honeypot) { console.log("Honeypot preenchido, provável bot."); return; // Ignora a submissão } // UX FIX: Validação de tempo com feedback ou limite menor const timeElapsed = Date.now() - startTime; // Reduzido para 1000ms para evitar falsos positivos com autofill if (timeElapsed < 1000) { console.log("Formulário preenchido muito rápido, provável bot."); // Opcional: Mostrar erro para humano real que digita muito rápido // alert("Por favor, verifique os dados antes de enviar."); return; // Ignora a submissão } if (hasError) return; // Verificação de interação mínima if (!nameFocused || !emailFocused || !phoneFocused) { // MENTORIA: Isso pode bloquear usuários de Screen Readers ou Autofill agressivo. // Considere remover ou tornar apenas um aviso no console. console.warn( "Campos principais não foram focados, verificando integridade.", ); } if (contactMethod === "whatsapp") { window.open(generateWhatsAppUrl(), "_blank"); } else { window.open(generateEmailUrl(), "_blank"); } }; const getCtaMessage = () => { if (formData.projectType === "consultoria") { return "Agendar Consultoria Gratuita"; } if ( formData.budgetValue && parseFloat(formData.budgetValue.replace(/\D/g, "")) < 2000 ) { return "Discutir Soluções de Baixo Custo"; } if ( formData.projectType && formData.desiredDeadline && formData.budgetValue ) { return "Receber Proposta Personalizada"; } return "Enviar Formulário"; }; const getEstimatedValue = () => { let hours = 0; let hourlyRate = 55; // Taxa base R$ 55/h // Estimativa de horas baseada no tipo de projeto switch (formData.projectType) { case "web-app": hours += 80; // Aplicação web completa break; case "landing-page": hours += 16; // Landing page simples break; case "mvp": hours += 40; // MVP básico break; case "iot-app": hours += 120; // Aplicação IoT complexa break; case "integracao": hours += 32; // Integração de sistemas break; case "manutencao": hours += 8; // Manutenção pontual break; case "consultoria": hours += 4; // Consultoria inicial break; default: break; } // Ajuste de horas baseado no prazo switch (formData.desiredDeadline) { case "1-3-weeks": hours *= 1.3; // Urgência aumenta horas break; case "1-2-months": hours *= 1.1; break; case "6-plus-months": hours *= 0.9; // Prazo longo pode reduzir horas break; default: break; } // Ajuste de horas baseado na complexidade switch (formData.technicalComplexity) { case "alta": hours *= 1.4; hourlyRate = 65; // Taxa maior para alta complexidade break; case "muito-alta": hours *= 1.7; hourlyRate = 70; // Taxa máxima para muito alta complexidade break; case "media": hourlyRate = 50; // Taxa média break; default: break; } if (formData.hasInternalTeam === "nao") { hours *= 1.2; // Sem equipe interna = mais horas necessárias } const totalValue = hours * hourlyRate; if (totalValue > 0) { return `Estimativa: ${Math.round( hours, )}h × R$ ${hourlyRate}/h = R$ ${totalValue.toFixed(0)}`; } return "Estimativa: Solicite orçamento personalizado"; }; return (

Preencha o Formulário

{formType === "simple" ? (
{/* Campo Honeypot */}
setHoneypot(e.target.value)} />
{/* Formulário Simples: Apenas Nome */}
{nameError && (

{nameError}

)}
{/* Botão de Contato para o formulário simples */}
) : (
{/* Campo Honeypot */}
setHoneypot(e.target.value)} />
{/* Dados Básicos */}

Dados Básicos

{nameError && (

{nameError}

)}
{emailError && (

{emailError}

)}
{phoneError && (

{phoneError}

)}
{/* Tile de Expandir/Recolher */}
setIsExpanded(!isExpanded)} className="p-4 rounded-lg bg-white/5 border border-white/10 text-white cursor-pointer hover:bg-white/10 transition-colors duration-300 mb-6 flex justify-between items-center" >

{isExpanded ? "Detalhes do Projeto (Recolher)" : "Detalhes do Projeto (Expandir)"}

{/* Conteúdo do Formulário Avançado */} {/* Sobre o Projeto */}

Sobre o Projeto

{formData.projectType === "outro" && (
{otherProjectTypeError && (

{otherProjectTypeError}

)}
)}
{/* Custom Message Input */}
{/* Contact Button */} {formData.projectType && formData.desiredDeadline && formData.budgetValue && (

{getEstimatedValue()}

)}
)}
); }