import { useState, type FormEvent } from 'react'; import { motion } from 'motion/react'; import emailjs from '@emailjs/browser'; import { useTranslation } from '../i18n'; import { config } from '../config'; import { Button, Input, Textarea } from '../components/ui'; import styles from './Contact.module.css'; interface FormData { name: string; email: string; subject: string; message: string; } interface FormErrors { name?: string; email?: string; subject?: string; message?: string; } export function Contact() { const { t } = useTranslation(); const [formData, setFormData] = useState({ name: '', email: '', subject: '', message: '', }); const [errors, setErrors] = useState({}); const [isSubmitting, setIsSubmitting] = useState(false); const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle'); const validateForm = (): boolean => { const newErrors: FormErrors = {}; if (!formData.name.trim()) { newErrors.name = 'Required'; } if (!formData.email.trim()) { newErrors.email = 'Required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = 'Invalid email'; } if (!formData.subject.trim()) { newErrors.subject = 'Required'; } if (!formData.message.trim()) { newErrors.message = 'Required'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!validateForm()) return; setIsSubmitting(true); setSubmitStatus('idle'); try { const templateParams = { name: formData.name, email: formData.email, title: formData.subject, message: formData.message, }; await Promise.all([ // Send to Admin emailjs.send( config.emailJs.serviceId, config.emailJs.templateIdAdmin, templateParams, { publicKey: config.emailJs.publicKey } ), // Send Auto-reply to User emailjs.send( config.emailJs.serviceId, config.emailJs.templateIdUser, templateParams, { publicKey: config.emailJs.publicKey } ), ]); setSubmitStatus('success'); setFormData({ name: '', email: '', subject: '', message: '' }); } catch { setSubmitStatus('error'); } finally { setIsSubmitting(false); } }; const handleChange = (field: keyof FormData, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); if (errors[field]) { setErrors((prev) => ({ ...prev, [field]: undefined })); } }; return (
{/* Hero */}

{t.contact.title}

{t.contact.subtitle}

{/* Content */}
{/* Form */}

{t.contact.intro}

handleChange('name', e.target.value)} error={errors.name} /> handleChange('email', e.target.value)} error={errors.email} /> handleChange('subject', e.target.value)} error={errors.subject} />