← back to Trademarks Copyright
src/app/drops/unsubscribe/[token]/page.tsx
37 lines
"use client";
import { useEffect, useState } from "react";
import { useParams } from "next/navigation";
export default function UnsubscribePage() {
const params = useParams<{ token: string }>();
const [status, setStatus] = useState<"confirm" | "working" | "done" | "error">("confirm");
const [err, setErr] = useState<string | null>(null);
async function unsub() {
setStatus("working");
try {
const r = await fetch(`/api/drops/unsubscribe/${params.token}`, { method: "POST" });
if (!r.ok) throw new Error((await r.json()).error || `HTTP ${r.status}`);
setStatus("done");
} catch (e) { setErr((e as Error).message); setStatus("error"); }
}
useEffect(() => { /* require explicit click */ }, []);
return (
<div className="card p-6 max-w-xl">
<h1 className="text-2xl font-semibold">Unsubscribe from Drops</h1>
{status === "confirm" && (
<>
<p className="mt-3 text-sm text-ink/70">Are you sure? Your account will be cancelled immediately and you'll stop receiving drops.</p>
<button onClick={unsub} className="btn mt-4">Yes, unsubscribe</button>
</>
)}
{status === "working" && <p className="mt-3 text-sm">Unsubscribing…</p>}
{status === "done" && <p className="mt-3 text-sm text-emerald-700">Done. You've been unsubscribed.</p>}
{status === "error" && <p className="mt-3 text-sm text-red-700">Error: {err}</p>}
</div>
);
}