'use client'; import { useState } from 'react'; import { X, Send, CheckCircle, AlertCircle, Loader2 } from 'lucide-react'; import type { ModalProps } from '@/app/types/ui'; const API_URL = process.env.NEXT_PUBLIC_API_URL ?? 'https://localhost:7001'; type Status = 'idle' | 'loading' | 'success' | 'error'; const initialForm = { nombre: '', empresa: '', email: '', telefono: '', mensaje: '' }; export const ContactModal = ({ isOpen, onClose, isNavyBg }: ModalProps) => { const [form, setForm] = useState(initialForm); const [status, setStatus] = useState('idle'); if (!isOpen) return null; const set = (k: keyof typeof form) => (e: React.ChangeEvent) => setForm(f => ({ ...f, [k]: e.target.value })); const handleClose = () => { if (status !== 'loading') { onClose(); setTimeout(() => { setForm(initialForm); setStatus('idle'); }, 300); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.nombre.trim() || !form.email.trim()) return; setStatus('loading'); try { const res = await fetch(`${API_URL}/api/contact`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: form.nombre, email: form.email, phone: form.telefono || undefined, company: form.empresa || undefined, message: form.mensaje || 'Sin mensaje adicional.', source: 'landing', }), }); if (!res.ok) throw new Error('Error del servidor'); setStatus('success'); } catch { setStatus('error'); } }; const card = isNavyBg ? '#0d1b35' : '#ffffff'; const bdr = isNavyBg ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.1)'; const text = isNavyBg ? '#ffffff' : '#0a0a0a'; const sub = isNavyBg ? 'rgba(255,255,255,0.45)' : '#6a6866'; const inputStyle: React.CSSProperties = { width: '100%', borderRadius: 8, padding: '11px 14px', fontSize: 14, fontFamily: 'inherit', outline: 'none', transition: 'border-color 150ms', ...(isNavyBg ? { background: 'rgba(255,255,255,0.06)', border: '1px solid rgba(255,255,255,0.12)', color: '#fff' } : { background: '#f8fafc', border: '1px solid rgba(0,0,0,0.1)', color: '#0a0a0a' }), }; return (
{ if (e.target === e.currentTarget) handleClose(); }} >
{/* Header */}

Hablemos de tu proyecto

Te respondemos en menos de 24 h

{/* Success state */} {status === 'success' ? (

¡Mensaje enviado!

Recibimos tu solicitud. Un miembro del equipo te contactará pronto.

) : ( /* Form */