import { useState } from "react"; import ScrollReveal from "@/components/ui/ScrollReveal"; import TextAnimation from "@/components/ui/TextAnimation"; import ImageOrVideo from "@/components/ui/ImageOrVideo"; import { sendContactEmail } from "@/lib/api/email"; type InputField = { name: string; type: string; placeholder: string; required?: boolean; }; type TextareaField = { name: string; placeholder: string; rows?: number; required?: boolean; }; type ContactSplitFormProps = { tag: string; title: string; description: string; inputs: InputField[]; textarea?: TextareaField; buttonText: string; onSubmit?: (data: Record) => void; } & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never }); const ContactSplitForm = ({ tag, title, description, inputs, textarea, buttonText, onSubmit, imageSrc, videoSrc, }: ContactSplitFormProps) => { const [formData, setFormData] = useState>(() => { const initial: Record = {}; inputs.forEach((input) => { initial[input.name] = ""; }); if (textarea) { initial[textarea.name] = ""; } return initial; }); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); setError(null); try { await sendContactEmail({ formData }); onSubmit?.(formData); const reset: Record = {}; inputs.forEach((input) => { reset[input.name] = ""; }); if (textarea) { reset[textarea.name] = ""; } setFormData(reset); } catch (err) { setError(err instanceof Error ? err.message : "Failed to send. Please try again."); } finally { setIsLoading(false); } }; return (

{tag}

{inputs.map((input) => ( setFormData({ ...formData, [input.name]: e.target.value })} required={input.required} aria-label={input.placeholder} className="w-full px-5 py-3 text-base bg-transparent placeholder:opacity-75 focus:outline-none card rounded" /> ))} {textarea && (