forked from emre/www_projectmycelium_com
- Renamed CallToAction components to full Page components for compute, storage and GPU sections - Added new waitlist form types: storage_waitlist, compute_waitlist, and gpu_waitlist - Updated form placeholder text to show relevant requirements based on waitlist type - Fixed string template syntax in Dropdown component CSS classes
227 lines
8.5 KiB
TypeScript
227 lines
8.5 KiB
TypeScript
'use client'
|
|
|
|
import { AnimatePresence, motion } from 'framer-motion'
|
|
import { useState, type ChangeEvent, type FormEvent } from 'react'
|
|
import emailjs from '@emailjs/browser'
|
|
import { CheckCircle, Send, X } from 'lucide-react'
|
|
|
|
interface ContactFormProps {
|
|
isOpen: boolean
|
|
onClose: () => void
|
|
title?: string
|
|
formType?: 'investor' | 'partner' | 'agent_waitlist' | 'storage_waitlist' | 'compute_waitlist' | 'gpu_waitlist'
|
|
}
|
|
|
|
const initialFormState = {
|
|
name: '',
|
|
email: '',
|
|
company: '',
|
|
message: '',
|
|
}
|
|
|
|
export default function ContactForm({
|
|
isOpen,
|
|
onClose,
|
|
title = 'Book a Meeting',
|
|
formType,
|
|
}: ContactFormProps) {
|
|
const [formData, setFormData] = useState(initialFormState)
|
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
const [isSubmitted, setIsSubmitted] = useState(false)
|
|
|
|
const handleInputChange = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
|
const { name, value } = e.target
|
|
setFormData((prev) => ({
|
|
...prev,
|
|
[name]: value,
|
|
}))
|
|
}
|
|
|
|
const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {
|
|
e.preventDefault()
|
|
setIsSubmitting(true)
|
|
|
|
try {
|
|
const templateParams = {
|
|
from_name: formData.name,
|
|
from_email: formData.email,
|
|
company: formData.company,
|
|
message: formData.message,
|
|
to_email: 'emre@incubaid.com',
|
|
form_type: formType || 'General Inquiry',
|
|
}
|
|
|
|
await emailjs.send(
|
|
'service_03d0vf8',
|
|
'template_6o6e8oe',
|
|
templateParams,
|
|
'bhkly3gzrO-SA9w7v',
|
|
)
|
|
|
|
setIsSubmitted(true)
|
|
setTimeout(() => {
|
|
setIsSubmitted(false)
|
|
setFormData(initialFormState)
|
|
onClose()
|
|
}, 3000)
|
|
} catch (error) {
|
|
console.error('Email sending failed:', error)
|
|
alert('Failed to send message. Please try again.')
|
|
} finally {
|
|
setIsSubmitting(false)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<AnimatePresence>
|
|
{isOpen && (
|
|
<motion.div
|
|
className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4 backdrop-blur-sm"
|
|
initial={{ opacity: 0 }}
|
|
animate={{ opacity: 1 }}
|
|
exit={{ opacity: 0 }}
|
|
>
|
|
<motion.div
|
|
className="relative w-full max-w-md overflow-hidden rounded-2xl bg-card shadow-2xl"
|
|
initial={{ scale: 0.9, opacity: 0 }}
|
|
animate={{ scale: 1, opacity: 1 }}
|
|
exit={{ scale: 0.9, opacity: 0 }}
|
|
transition={{ type: 'spring', damping: 25, stiffness: 300 }}
|
|
>
|
|
<div className="flex items-center justify-between border-b border-border p-6">
|
|
<h3 className="text-xl font-bold text-foreground">{title}</h3>
|
|
<button
|
|
onClick={onClose}
|
|
className="rounded-lg p-2 transition-colors hover:bg-muted"
|
|
aria-label="Close form"
|
|
>
|
|
<X className="h-5 w-5 text-muted-foreground" />
|
|
</button>
|
|
</div>
|
|
|
|
<div className="p-6">
|
|
{isSubmitted ? (
|
|
<motion.div
|
|
className="py-8 text-center"
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
>
|
|
<CheckCircle className="mx-auto mb-4 h-16 w-16 text-primary" />
|
|
<h4 className="mb-2 text-lg font-semibold text-foreground">Thank you!</h4>
|
|
<p className="text-muted-foreground">We'll get back to you soon.</p>
|
|
</motion.div>
|
|
) : (
|
|
<form onSubmit={handleSubmit} className="space-y-4">
|
|
<div>
|
|
<label
|
|
htmlFor="name"
|
|
className="mb-1 block text-sm font-medium text-muted-foreground"
|
|
>
|
|
Full Name *
|
|
</label>
|
|
<input
|
|
type="text"
|
|
id="name"
|
|
name="name"
|
|
value={formData.name}
|
|
onChange={handleInputChange}
|
|
required
|
|
className="w-full rounded-lg border border-border bg-muted/30 px-4 py-3 text-foreground placeholder:text-muted-foreground focus:border-transparent focus:outline-none focus:ring-2 focus:ring-primary"
|
|
placeholder="Your full name"
|
|
/>
|
|
</div>
|
|
|
|
<div>
|
|
<label
|
|
htmlFor="email"
|
|
className="mb-1 block text-sm font-medium text-muted-foreground"
|
|
>
|
|
Email Address *
|
|
</label>
|
|
<input
|
|
type="email"
|
|
id="email"
|
|
name="email"
|
|
value={formData.email}
|
|
onChange={handleInputChange}
|
|
required
|
|
className="w-full rounded-lg border border-border bg-muted/30 px-4 py-3 text-foreground placeholder:text-muted-foreground focus:border-transparent focus:outline-none focus:ring-2 focus:ring-primary"
|
|
placeholder="your.email@company.com"
|
|
/>
|
|
</div>
|
|
|
|
<div>
|
|
<label
|
|
htmlFor="company"
|
|
className="mb-1 block text-sm font-medium text-muted-foreground"
|
|
>
|
|
Company
|
|
</label>
|
|
<input
|
|
type="text"
|
|
id="company"
|
|
name="company"
|
|
value={formData.company}
|
|
onChange={handleInputChange}
|
|
className="w-full rounded-lg border border-border bg-muted/30 px-4 py-3 text-foreground placeholder:text-muted-foreground focus:border-transparent focus:outline-none focus:ring-2 focus:ring-primary"
|
|
placeholder="Your company name"
|
|
/>
|
|
</div>
|
|
|
|
<div>
|
|
<label
|
|
htmlFor="message"
|
|
className="mb-1 block text-sm font-medium text-muted-foreground"
|
|
>
|
|
Message
|
|
</label>
|
|
<textarea
|
|
id="message"
|
|
name="message"
|
|
value={formData.message}
|
|
onChange={handleInputChange}
|
|
rows={4}
|
|
className="w-full resize-none rounded-lg border border-border bg-muted/30 px-4 py-3 text-foreground placeholder:text-muted-foreground focus:border-transparent focus:outline-none focus:ring-2 focus:ring-primary"
|
|
placeholder={
|
|
formType === 'investor'
|
|
? 'Tell us about your investment interests and how we can collaborate.'
|
|
: formType === 'agent_waitlist'
|
|
? 'Tell us about your sovereign agent requirements.'
|
|
: formType === 'storage_waitlist'
|
|
? 'Tell us about your storage requirements.'
|
|
: formType === 'compute_waitlist'
|
|
? 'Tell us about your compute requirements.'
|
|
: formType === 'gpu_waitlist'
|
|
? 'Tell us about your GPU requirements.'
|
|
: 'Tell us about your project or how we can help.'
|
|
}
|
|
/>
|
|
</div>
|
|
|
|
<button
|
|
type="submit"
|
|
disabled={isSubmitting}
|
|
className="flex w-full items-center justify-center rounded-lg bg-primary px-6 py-3 font-semibold text-primary-foreground transition-opacity disabled:cursor-not-allowed disabled:opacity-50"
|
|
>
|
|
{isSubmitting ? (
|
|
<>
|
|
<div className="mr-2 h-5 w-5 animate-spin rounded-full border-2 border-primary-foreground/30 border-t-primary-foreground" />
|
|
Sending...
|
|
</>
|
|
) : (
|
|
<>
|
|
<Send className="h-5 w-5" />
|
|
<span className="ml-2">Send Message</span>
|
|
</>
|
|
)}
|
|
</button>
|
|
</form>
|
|
)}
|
|
</div>
|
|
</motion.div>
|
|
</motion.div>
|
|
)}
|
|
</AnimatePresence>
|
|
)
|
|
}
|