"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" ); const [userName, setUserName] = useState(""); const [userEmail, setUserEmail] = useState(""); const [userPhone, setUserPhone] = useState(""); const [userCompany, setUserCompany] = useState(""); const [howFound, setHowFound] = useState(""); const [projectType, setProjectType] = useState(""); const [otherProjectType, setOtherProjectType] = useState(""); // Novo estado para "Outro" tipo de projeto const [desiredDeadline, setDesiredDeadline] = useState(""); const [budgetValue, setBudgetValue] = useState(""); // Novo estado para o valor do orçamento const [technicalComplexity, setTechnicalComplexity] = useState(""); const [hasInternalTeam, setHasInternalTeam] = useState(""); const [customMessage, setCustomMessage] = useState(""); 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 baseMessage = (name: string) => { if (hour >= 8 && hour < 12) { // Manhã return `Bom dia Evandro, meu nome é ${name}. Vi seu portfólio e estou interessado nos seus serviços. Podemos conversar?`; } else if (hour >= 13 && hour < 18) { // Tarde return `Boa tarde Evandro, meu nome é ${name}. Vi seu portfólio e estou interessado nos seus serviços. Podemos conversar?`; } else { // Noite return `Olá Evandro, meu nome é ${name}. Vi seu portfólio e estou interessado nos seus serviços. Podemos conversar quando estiver disponível?`; } }; return baseMessage(userName); }; const generateAdvancedMessage = () => { if (customMessage) return customMessage; let message = `Olá Evandro,\n\n`; message += `Meu nome é ${userName}`; if (userCompany) { message += ` e sou de ${userCompany}`; } if (howFound) { message += `. Conheci seu trabalho via ${howFound}`; } message += `.\n\n`; message += `Estou entrando em contato para discutir um projeto de `; if (projectType === "outro" && otherProjectType) { message += `${otherProjectType}`; } else if (projectType) { message += `${projectType}`; } else { message += `[Tipo de Projeto Não Especificado]`; } message += `.\n`; if (desiredDeadline) { message += `O prazo desejado é ${desiredDeadline}.\n`; } if (budgetValue) { message += `O orçamento disponível é ${budgetValue}.\n`; } if (technicalComplexity) { message += `A complexidade técnica estimada é ${technicalComplexity}.\n`; } if (hasInternalTeam) { message += `Já possuímos uma equipe técnica ${hasInternalTeam}.\n`; } message += `\nMeus contatos:\n`; if (userEmail) { message += `Email: ${userEmail}\n`; } if (userPhone) { message += `Telefone: ${userPhone}\n`; } message += `\nAguardamos seu retorno para discutir os próximos passos.`; return message; }; const handleNameChange = (e: ChangeEvent) => { setUserName(e.target.value); if (e.target.value.trim() !== "") setNameError(null); }; const handleEmailChange = (e: ChangeEvent) => { setUserEmail(e.target.value); if (e.target.value.trim() !== "") setEmailError(null); }; const handlePhoneChange = (e: ChangeEvent) => { setUserPhone(e.target.value); if (e.target.value.trim() !== "") setPhoneError(null); }; const handleNameFocus = () => setNameFocused(true); const handleEmailFocus = () => setEmailFocused(true); const handlePhoneFocus = () => setPhoneFocused(true); const handleCompanyChange = (e: ChangeEvent) => { setUserCompany(e.target.value); }; const handleHowFoundChange = (e: ChangeEvent) => { setHowFound(e.target.value); }; const handleProjectTypeChange = (e: ChangeEvent) => { setProjectType(e.target.value); }; const handleDesiredDeadlineChange = (e: ChangeEvent) => { setDesiredDeadline(e.target.value); }; const handleBudgetValueChange = (e: ChangeEvent) => { setBudgetValue(e.target.value); }; const handleTechnicalComplexityChange = ( e: ChangeEvent ) => { setTechnicalComplexity(e.target.value); }; const handleHasInternalTeamChange = (e: ChangeEvent) => { setHasInternalTeam(e.target.value); }; const handleMessageChange = (e: ChangeEvent) => { setCustomMessage(e.target.value); }; const generateWhatsAppUrl = () => { const message = encodeURIComponent( formType === "advanced" ? generateAdvancedMessage() : 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: ${userName}\nEmail: ${userEmail}\nTelefone: ${userPhone}\nEmpresa/Posição: ${userCompany}\nComo conheceu: ${howFound}\n\nTipo de Projeto: ${projectType}\nPrazo Desejado: ${desiredDeadline}\nOrçamento Disponível: ${budgetValue}\nComplexidade Técnica: ${technicalComplexity}\nTem equipe interna: ${hasInternalTeam}\n\nMensagem: ${ customMessage || getGreetingMessageWithUserName() }` ); return `mailto:${data.contact.email}?subject=${subject}&body=${body}`; }; const handleSubmit = (e: FormEvent) => { e.preventDefault(); let hasError = false; if (userName.trim() === "") { setNameError("Por favor, insira seu nome."); hasError = true; } else { setNameError(null); } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(userEmail)) { setEmailError("Por favor, insira um email válido."); hasError = true; } else { setEmailError(null); } if (userPhone.trim() === "") { setPhoneError("Por favor, insira seu telefone."); hasError = true; } else { setPhoneError(null); } if (projectType === "outro" && 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 } // Validação de tempo de preenchimento (mínimo de 3 segundos) const timeElapsed = Date.now() - startTime; if (timeElapsed < 3000) { console.log("Formulário preenchido muito rápido, provável bot."); return; // Ignora a submissão } if (hasError) return; // Verificação de interação mínima if (!nameFocused || !emailFocused || !phoneFocused) { console.log("Campos principais não foram focados, provável bot."); // Opcional: exibir uma mensagem de erro para o usuário return; } if (contactMethod === "whatsapp") { window.open(generateWhatsAppUrl(), "_blank"); } else { window.open(generateEmailUrl(), "_blank"); } }; const getCtaMessage = () => { if (projectType === "consultoria") { return "Agendar Consultoria Gratuita"; } if (budgetValue && parseFloat(budgetValue.replace(/\D/g, "")) < 2000) { return "Discutir Soluções de Baixo Custo"; } if (projectType && desiredDeadline && budgetValue) { return "Receber Proposta Personalizada"; } return "Enviar Formulário"; }; const getEstimatedValue = () => { let value = 0; // Lógica de estimativa baseada nas respostas switch (projectType) { case "web-app": value += 10000; break; case "landing-page": value += 2000; break; case "mvp": value += 5000; break; case "iot-app": value += 15000; break; case "integracao": value += 7000; break; case "manutencao": value += 1000; break; case "consultoria": value += 500; break; default: break; } switch (desiredDeadline) { case "1-3-weeks": value *= 1.2; // Urgência aumenta o valor break; case "1-2-months": value *= 1.1; break; case "6-plus-months": value *= 0.9; // Prazo longo pode reduzir o valor break; default: break; } switch (technicalComplexity) { case "alta": value *= 1.3; break; case "muito-alta": value *= 1.5; break; default: break; } if (hasInternalTeam === "nao") { value *= 1.1; // Sem equipe interna pode indicar mais trabalho } // Ajustar pelo valor do orçamento, se aplicável if (budgetValue) { const parsedBudget = parseFloat(budgetValue.replace(/\D/g, "")); if (!isNaN(parsedBudget)) { // Se o valor estimado for maior que o orçamento fornecido, ajusta para o orçamento value = Math.min(value, parsedBudget); } } return value > 0 ? `Estimativa: R$ ${value.toFixed(2)}` : "Estimativa: N/A"; }; 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

{projectType === "outro" && (
{ setOtherProjectType(e.target.value); if (e.target.value.trim() !== "") setOtherProjectTypeError(null); }} required /> {otherProjectTypeError && (

{otherProjectTypeError}

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

{getEstimatedValue()}

)}
)}
); }