"use client"; import { useState, FormEvent, useEffect } from 'react'; import { motion } from 'framer-motion'; import { MailIcon, PhoneIcon, MapPinIcon, SendIcon, CheckCircleIcon, AlertCircleIcon } from 'lucide-react'; import { toast } from 'react-hot-toast'; import emailjs from 'emailjs-com'; interface ContactProps { contact: { email: string; tel: string; social: { name: string; url: string; icon: any; }[]; }; location: string; } type FormData = { name: string; email: string; subject: string; message: string; }; type FormStatus = 'idle' | 'submitting' | 'success' | 'error'; const ContactSection: React.FC = ({ contact, location }) => { const [formData, setFormData] = useState({ name: '', email: '', subject: '', message: '', }); const [formStatus, setFormStatus] = useState('idle'); const [errors, setErrors] = useState>({}); const validateForm = (): boolean => { const newErrors: Partial = {}; if (!formData.name.trim()) { newErrors.name = 'Name is required'; } if (!formData.email.trim()) { newErrors.email = 'Email is required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = 'Email is invalid'; } if (!formData.subject.trim()) { newErrors.subject = 'Subject is required'; } if (!formData.message.trim()) { newErrors.message = 'Message is required'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); // Clear error when user types if (errors[name as keyof FormData]) { setErrors(prev => ({ ...prev, [name]: undefined })); } }; useEffect(() => { emailjs.init('k7Xbdqofx3sBAJf3I'); }, []); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!validateForm()) { toast.error('Please fix the errors in the form'); return; } setFormStatus('submitting'); try { await emailjs.send( 'service_s5tsk8o', 'template_9rbucml', { from_name: formData.name, from_email: formData.email, subject: formData.subject, message: formData.message, }, 'user_id' ); setFormStatus('success'); toast.success('Message sent successfully!'); setFormData({ name: '', email: '', subject: '', message: '' }); // Reset to idle after 3 seconds setTimeout(() => { setFormStatus('idle'); }, 3000); } catch (error) { setFormStatus('error'); toast.error('Failed to send message. Please try again.'); console.error('Email error:', error); // Reset to idle after 3 seconds setTimeout(() => { setFormStatus('idle'); }, 3000); } }; const containerVariants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.1, }, }, }; const itemVariants = { hidden: { y: 20, opacity: 0 }, visible: { y: 0, opacity: 1, transition: { type: "spring", stiffness: 100, }, }, }; return (

Get In Touch

I'm always open to discussing new projects, creative ideas, or opportunities to be part of your vision.

{/* Contact Info */}

Contact Information

Location

{location}

Connect with me

{contact.social.map((platform, index) => ( ))}
{/* Contact Form */}

Send Me a Message

{errors.name &&

{errors.name}

}
{errors.email &&

{errors.email}

}
{errors.subject &&

{errors.subject}

}