import type { ControlType, PropertyControls } from "framer" import { motion } from "framer-motion" import { useState, FormEvent } from "react" interface FormField { id: string label: string type: "text" | "email" | "checkbox" | "radio" | "select" | "textarea" required: boolean placeholder?: string options?: string[] } interface Props { webhookUrl: string redirectUrl?: string fields: FormField[] submitButtonText: string successMessage: string errorMessage: string } export default function ContactForm({ webhookUrl = "https://", redirectUrl = "", fields = [ { id: "fullName", label: "Full Name", type: "text", required: true, placeholder: "Enter your full name" }, { id: "email", label: "Email", type: "email", required: true, placeholder: "Enter your email" }, { id: "services", label: "What services are you interested in?", type: "checkbox", required: true, options: ["Marketing Assets", "Display Ads", "Video Ads", "Video", "Something else"] }, { id: "companySize", label: "Company Size", type: "radio", required: true, options: ["0-50", "50-100", "100-500"] } ], submitButtonText = "Submit", successMessage = "Form submitted successfully!", errorMessage = "There was an error submitting the form. Please try again." }: Props) { const [formData, setFormData] = useState>({}) const [isSubmitting, setIsSubmitting] = useState(false) const [submitStatus, setSubmitStatus] = useState<"idle" | "success" | "error">("idle") const handleChange = (fieldId: string, value: any) => { setFormData(prev => ({ ...prev, [fieldId]: value })) } const handleSubmit = async (e: FormEvent) => { e.preventDefault() setIsSubmitting(true) try { const response = await fetch(webhookUrl, { method: "POST", mode: "no-cors", headers: { "Content-Type": "application/json", }, body: JSON.stringify(formData), }) setSubmitStatus("success") setFormData({}) if (redirectUrl) { setTimeout(() => { window.location.href = redirectUrl }, 1500) } } catch (error) { setSubmitStatus("error") console.error("Form submission error:", error) } finally { setIsSubmitting(false) } } const renderField = (field: FormField) => { const commonLabelStyles = { display: "block", fontSize: "0.875rem", fontWeight: 500, marginBottom: "0.5rem", } const commonInputStyles = { width: "100%", padding: "0.5rem", border: "1px solid #e5e7eb", borderRadius: "0.25rem", } const pillStyles = { display: "inline-flex", alignItems: "center", padding: "0.5rem 1rem", borderRadius: "9999px", border: "1px solid #e5e7eb", cursor: "pointer", transition: "all 0.2s ease", } switch (field.type) { case "checkbox": return (
{field.options?.map(option => { const isChecked = Array.isArray(formData[field.id]) && formData[field.id]?.includes(option) const currentValues = formData[field.id] || [] return ( ) })}
) case "radio": return (
{field.options?.map(option => ( ))}
) case "select": return (
) case "textarea": return (