import { useState } from "react"; import { cn } from "@/lib/utils"; import { Container } from "@/components/layout/Container"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Heading } from "@/components/Heading"; export type EmailProvider = "none" | "mailchimp" | "klaviyo"; export type NewsletterCtaProps = { tagline: string; heading: string; subheading: string; buttonLabel: string; emailProvider: EmailProvider; endpoint?: string; mailchimpApiKey?: string; mailchimpServerPrefix?: string; mailchimpAudienceId?: string; klaviyoCompanyId?: string; klaviyoListId?: string; imageUrl: string; layout: "split" | "stacked"; }; export function NewsletterCta({ tagline, heading, subheading, buttonLabel, emailProvider, endpoint, mailchimpApiKey, mailchimpServerPrefix, mailchimpAudienceId, klaviyoCompanyId, klaviyoListId, imageUrl, layout, }: NewsletterCtaProps) { const [email, setEmail] = useState(""); const [submitted, setSubmitted] = useState(false); const [submitting, setSubmitting] = useState(false); const submit = async (e: React.FormEvent) => { e.preventDefault(); if (!email) return; setSubmitting(true); try { if (emailProvider === "mailchimp") { if (mailchimpServerPrefix && mailchimpAudienceId && mailchimpApiKey) { await fetch( `https://${mailchimpServerPrefix}.api.mailchimp.com/3.0/lists/${mailchimpAudienceId}/members`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${mailchimpApiKey}`, }, body: JSON.stringify({ email_address: email, status: "subscribed", }), }, ); } } else if (emailProvider === "klaviyo") { if (klaviyoCompanyId && klaviyoListId) { await fetch( `https://a.klaviyo.com/client/subscriptions/?company_id=${klaviyoCompanyId}`, { method: "POST", headers: { "Content-Type": "application/json", revision: "2024-10-15", }, body: JSON.stringify({ data: { type: "subscription", attributes: { profile: { data: { type: "profile", attributes: { email }, }, }, }, relationships: { list: { data: { type: "list", id: klaviyoListId } }, }, }, }), }, ); } } else if (endpoint) { await fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email }), }); } setSubmitted(true); } catch { setSubmitted(true); } finally { setSubmitting(false); } }; const Form = (
); const isStacked = layout === "stacked"; return (You're in. See you Monday at 5:30am.
) : ( Form )}