From 55fb734708dddaab614284b1cdc9f5cb238e5703 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Tue, 23 Dec 2025 08:02:12 +0100 Subject: [PATCH] Use newsletter-api for immediate welcome emails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- components/newsletter-signup.tsx | 94 ++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 components/newsletter-signup.tsx diff --git a/components/newsletter-signup.tsx b/components/newsletter-signup.tsx new file mode 100644 index 0000000..851e997 --- /dev/null +++ b/components/newsletter-signup.tsx @@ -0,0 +1,94 @@ +"use client" + +import { useState } from "react" + +const NEWSLETTER_API = "https://newsletter.jeffemmett.com/api/subscribe" +const LIST_UUID = "3856d3c3-fbae-452d-acb1-523ab7932ceb" // Psilo Cybernetics list + +export function NewsletterSignup() { + const [email, setEmail] = useState("") + const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle") + const [message, setMessage] = useState("") + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + if (!email) return + + setStatus("loading") + + try { + const response = await fetch(`${NEWSLETTER_API}/subscribe`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: email, + list_uuid: LIST_UUID, + }), + }) + + if (response.ok) { + setStatus("success") + setMessage("Welcome to a more adaptive future. The network grows.") + setEmail("") + } else { + throw new Error("Subscription failed") + } + } catch { + setStatus("error") + setMessage("Something went wrong. Please try again.") + } + } + + return ( +
+
+
+
+

+ JOIN THE NETWORK +

+

+ Subscribe for updates on institutional neuroplasticity, + distributed intelligence, and collective consciousness. +

+
+ + {status === "success" ? ( +
+ {message} +
+ ) : ( +
+ setEmail(e.target.value)} + required + className="flex-1 px-4 py-2 bg-black/50 border border-cyan-500/30 text-cyan-100 placeholder:text-cyan-500/50 focus:outline-none focus:border-cyan-400 font-mono" + /> + +
+ )} + + {status === "error" && ( +

{message}

+ )} + +

+ NO SPAM. UNSUBSCRIBE ANYTIME. +

+
+
+
+ ) +}