import { Component, createSignal, onMount } from 'solid-js'; import { trackWaitlistSignup } from '../hooks/useAnalytics'; interface WaitlistFormProps { variant?: 'hero' | 'inline'; placeholder?: string; buttonText?: string; } function getUtmParams() { if (typeof window === 'undefined') return {}; const params = new URLSearchParams(window.location.search); return { utmSource: params.get('utm_source') || undefined, utmMedium: params.get('utm_medium') || undefined, utmCampaign: params.get('utm_campaign') || undefined, }; } const WaitlistForm: Component = (props) => { const [email, setEmail] = createSignal(''); const [name, setName] = createSignal(''); const [tier, setTier] = createSignal('basic'); const [utm, setUtm] = createSignal>({}); const [submitted, setSubmitted] = createSignal(false); const [loading, setLoading] = createSignal(false); const [error, setError] = createSignal(''); onMount(() => { setUtm(getUtmParams()); }); const variant = props.variant || 'hero'; const handleSubmit = async (e: Event) => { e.preventDefault(); setError(''); if (!email() || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email())) { setError('Please enter a valid email'); return; } setLoading(true); try { const res = await fetch('/api/waitlist/signup', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: email(), name: name() || undefined, tier: tier() !== 'basic' ? tier() : undefined, ...utm(), }), }); if (!res.ok) { const data = await res.json(); throw new Error(data.error || 'Signup failed'); } trackWaitlistSignup(email(), 'landing_page', tier()); setSubmitted(true); } catch (err) { setError(err instanceof Error ? err.message : 'Something went wrong'); } finally { setLoading(false); } }; if (submitted()) { return (

You're on the list!

We'll keep you updated on our launch and send early access invites.

); } if (variant === 'hero') { return (
setEmail(e.currentTarget.value)} placeholder={props.placeholder || 'Enter your email'} required aria-label="Email address" />
setName(e.currentTarget.value)} placeholder="Your name (optional)" aria-label="Your name" />
{error() &&

{error()}

}
); } return (
setEmail(e.currentTarget.value)} placeholder={props.placeholder || 'Your email'} required aria-label="Email address" />
{error() &&

{error()}

}
); }; export default WaitlistForm;