'use client'; import { useState, useEffect } from 'react'; import { usePathname } from 'next/navigation'; import { getDictionary } from '@/lib/i18n'; import { Card, CardBody, CardHeader, Button } from '@/components/ui'; import { FormField, FormInput, FormTextarea, FormError, FormSuccess } from '@/components/forms'; interface FormData { name: string; email: string; phone: string; subject: string; message: string; } export function ContactForm() { const pathname = usePathname(); const locale = pathname.split('/')[1] || 'en'; const [dict, setDict] = useState({}); const [formData, setFormData] = useState({ name: '', email: '', phone: '', subject: '', message: '', }); const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle'); const [errors, setErrors] = useState>({}); // Load dictionary on component mount and when locale changes useEffect(() => { const loadDict = async () => { try { const loadedDict = await getDictionary(locale as 'en' | 'de'); setDict(loadedDict); } catch (error) { console.error('Error loading dictionary:', error); // Set empty dictionary to prevent infinite loading setDict({}); } }; loadDict(); }, [locale]); const t = (key: string): string => { if (!dict || Object.keys(dict).length === 0) return key; const keys = key.split('.'); let value: any = dict; for (const k of keys) { value = value?.[k]; if (value === undefined) return key; } return value || key; }; const validateForm = (): boolean => { const newErrors: Partial = {}; if (!formData.name.trim()) { newErrors.name = t('contact.errors.nameRequired'); } if (!formData.email.trim()) { newErrors.email = t('contact.errors.emailRequired'); } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = t('contact.errors.emailInvalid'); } if (!formData.message.trim()) { newErrors.message = t('contact.errors.messageRequired'); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } setStatus('loading'); try { const response = await fetch(`/${locale}/api/contact`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ...formData, locale, }), }); if (response.ok) { setStatus('success'); setFormData({ name: '', email: '', phone: '', subject: '', message: '', }); } else { setStatus('error'); } } catch (error) { console.error('Contact form error:', error); setStatus('error'); } }; const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value, })); // Clear error when user starts typing if (errors[name as keyof FormData]) { setErrors(prev => ({ ...prev, [name]: undefined, })); } }; return (
setFormData(prev => ({ ...prev, name: value }))} disabled={status === 'loading'} placeholder={t('contact.name')} /> setFormData(prev => ({ ...prev, email: value }))} disabled={status === 'loading'} placeholder={t('contact.email')} />
setFormData(prev => ({ ...prev, phone: value }))} disabled={status === 'loading'} placeholder={t('contact.phone')} /> setFormData(prev => ({ ...prev, subject: value }))} disabled={status === 'loading'} placeholder={t('contact.subject')} /> setFormData(prev => ({ ...prev, message: value }))} disabled={status === 'loading'} placeholder={t('contact.message')} rows={6} />

{t('contact.requiredFields')}

); }