import { useState } from "react"; import { cn } from "@/lib/utils"; import { Typography } from "@/components/Typography"; 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 = (
setEmail(e.target.value)} placeholder="you@example.com" className="flex-1 bg-transparent py-3 text-sm placeholder:text-muted-foreground focus:outline-none" />
); if (layout === "split") { return (
{imageUrl ? ( ) : null}
{tagline ? (

{tagline}

) : null} {heading} {subheading ? ( {subheading} ) : null}
{submitted ? (

Thanks — we'll be in touch.

) : ( Form )}
); } return (
{tagline ? (

{tagline}

) : null} {heading} {subheading ? ( {subheading} ) : null}
{submitted ? (

Thanks — we'll be in touch.

) : ( Form )}
); }