diff --git a/app/layout.tsx b/app/layout.tsx index da3f14d..af4963b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -11,6 +11,9 @@ export const metadata: Metadata = { description: "Exploring how we can decompose the excesses of capitalism and cultivate regenerative (com)post-capitalist systems that work for the many, not the few.", generator: "v0.app", + icons: { + icon: "data:image/svg+xml,💩", + }, } export default function RootLayout({ diff --git a/app/page.tsx b/app/page.tsx index 51d4555..47e2dd5 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -4,6 +4,7 @@ import { ZombifiedInstitutions } from "@/components/zombified-institutions" import { ResourcesForChange } from "@/components/resources-for-change" import { NetworkLinks } from "@/components/network-links" import { MycelialMentions } from "@/components/mycelial-mentions" +import { NewsletterSignup } from "@/components/newsletter-signup" import { Footer } from "@/components/footer" export default function Home() { @@ -15,6 +16,7 @@ export default function Home() { + ) diff --git a/components/newsletter-signup.tsx b/components/newsletter-signup.tsx new file mode 100644 index 0000000..3e97ec3 --- /dev/null +++ b/components/newsletter-signup.tsx @@ -0,0 +1,96 @@ +"use client" + +import { useState } from "react" +import { Button } from "@/components/ui/button" + +const LISTMONK_URL = "https://newsletter.jeffemmett.com" +const LIST_UUID = "fc27ffbd-400c-436b-ae23-2aa2776d8010" // Compost Capitalism 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(`${LISTMONK_URL}/subscription/form`, { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + email: email, + list: LIST_UUID, + name: "", + }), + }) + + if (response.ok) { + setStatus("success") + setMessage("Check your email to confirm your subscription!") + setEmail("") + } else { + throw new Error("Subscription failed") + } + } catch { + setStatus("error") + setMessage("Something went wrong. Please try again.") + } + } + + return ( + + + + + + Join the Mycelial Network + + + Subscribe for updates on regenerative economics, composting capitalism, + and building post-capitalist futures. + + + + {status === "success" ? ( + + {message} + + ) : ( + + setEmail(e.target.value)} + required + className="flex-1 px-4 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary/50" + /> + + {status === "loading" ? "Subscribing..." : "Subscribe"} + + + )} + + {status === "error" && ( + {message} + )} + + + No spam, unsubscribe anytime. We respect your privacy. + + + + + ) +}
+ Subscribe for updates on regenerative economics, composting capitalism, + and building post-capitalist futures. +
{message}
+ No spam, unsubscribe anytime. We respect your privacy. +