"use client"; import { ArrowUpRight, Mail, MapPin } from "lucide-react"; import type { FormEvent } from "react"; import { useEffect, useState } from "react"; import { trackEmailClick, trackWhatsAppOpen } from "@/lib/analytics"; import { CONTACT_EMAIL } from "@/lib/site-navigation"; import { buildWhatsAppUrl, getWhatsAppDisplayNumber } from "@/lib/whatsapp"; import "./conversion.css"; import WhatsAppLink from "./WhatsAppLink"; import { WhatsAppMark } from "./WhatsAppMark"; type ContactField = "name" | "email" | "message"; type FieldErrors = Partial>; const FIELD_ERRORS: Record = { name: "Informe seu nome para eu saber com quem falo.", email: "Confira o e-mail: ele precisa ter o formato nome@empresa.com.br.", message: "Conte em poucas palavras o que você precisa resolver.", }; const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; const FIELD_ORDER: ContactField[] = ["name", "email", "message"]; /** E-mail é opcional: só é erro se vier preenchido e fora do formato. */ function validate(data: { name: string; email: string; message: string; }): FieldErrors { const errors: FieldErrors = {}; if (!data.name.trim()) errors.name = FIELD_ERRORS.name; const email = data.email.trim(); if (email && !EMAIL_PATTERN.test(email)) errors.email = FIELD_ERRORS.email; if (!data.message.trim()) errors.message = FIELD_ERRORS.message; return errors; } /** Mesmo texto para o WhatsApp e para o e-mail; a linha do e-mail só entra se a pessoa informou um. */ function buildProjectMessage(data: { name: string; email: string; subject: string; message: string; }) { const email = data.email.trim(); return `Olá, Evandro! Quero conversar sobre um projeto.\n\nNome: ${data.name.trim()}\n${email ? `E-mail: ${email}\n` : ""}Tipo de projeto: ${data.subject}\n\nContexto, objetivo e prazo:\n${data.message.trim()}\n\nContato iniciado pelo site evandro.dev.br.`; } function buildMailtoUrl(message: string) { return `mailto:${CONTACT_EMAIL}?subject=${encodeURIComponent("Projeto pelo site")}&body=${encodeURIComponent(message)}`; } export default function Contact() { const [whatsAppDisplay, setWhatsAppDisplay] = useState("WhatsApp"); useEffect(() => { setWhatsAppDisplay(getWhatsAppDisplayNumber()); }, []); const fieldClassName = "mt-sp-2 w-full min-w-0 rounded-lg border border-white/15 bg-black/25 px-sp-4 py-sp-3 !font-display text-base leading-6 text-white placeholder:text-white/40 focus-visible:border-[var(--slash)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--slash)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--ink)] aria-[invalid=true]:border-[#ff8a80]"; const labelClassName = "block font-display text-sm font-medium text-white/85"; const errorClassName = "mt-sp-2 font-display text-sm leading-6 text-[#ff9d94]"; const [formData, setFormData] = useState({ name: "", email: "", subject: "Site para empresa", message: "", }); const [errors, setErrors] = useState({}); const updateField = (field: ContactField | "subject", value: string) => { setFormData((current) => ({ ...current, [field]: value })); if (field !== "subject" && errors[field]) { setErrors((current) => ({ ...current, [field]: undefined })); } }; const handleSubmit = (e: FormEvent) => { e.preventDefault(); const form = e.currentTarget; const found = validate(formData); setErrors(found); const firstInvalid = FIELD_ORDER.find((field) => found[field]); if (firstInvalid) { form.querySelector(`[name="${firstInvalid}"]`)?.focus(); return; } window.open( buildWhatsAppUrl(buildProjectMessage(formData)), "_blank", "noopener,noreferrer", ); trackWhatsAppOpen({ service: "Contato", placement: "contact_form" }); }; return (

Contato

Vamos conversar sobre o que sua empresa precisa.

Conte o que você quer resolver. Pode ser um projeto novo, uma melhoria ou uma integração. Não precisa chegar com a solução definida.

Você fala direto com quem desenvolve.

Sou Evandro. A primeira conversa é para entender sua necessidade; escopo, prazo e proposta vêm depois.

Prepare sua mensagem

Você revisa no WhatsApp antes de enviar.

updateField("name", e.target.value)} className={fieldClassName} /> {errors.name && (

{errors.name}

)}
updateField("email", e.target.value)} className={fieldClassName} /> {errors.email && (

{errors.email}

)}