import { defineRouteConfig } from "@medusajs/admin-sdk" import { EnvelopeSolid } from "@medusajs/icons" import { Badge, Button, Container, Heading, Table, Text } from "@medusajs/ui" import { useEffect, useState } from "react" type Subscriber = { id: string email: string status: "subscribed" | "unsubscribed" source: string | null created_at: string } const PAGE_SIZE = 25 const NewsletterPage = () => { const [subscribers, setSubscribers] = useState([]) const [count, setCount] = useState(0) const [offset, setOffset] = useState(0) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { setIsLoading(true) fetch( `/admin/newsletter/subscribers?limit=${PAGE_SIZE}&offset=${offset}`, { credentials: "include" } ) .then((res) => { if (!res.ok) throw new Error(`Request failed (${res.status})`) return res.json() }) .then((data) => { setSubscribers(data.subscribers ?? []) setCount(data.count ?? 0) setError(null) }) .catch((err) => setError(err.message)) .finally(() => setIsLoading(false)) }, [offset]) const pageCount = Math.max(Math.ceil(count / PAGE_SIZE), 1) const page = Math.floor(offset / PAGE_SIZE) + 1 return (
Newsletter {count} subscriber{count === 1 ? "" : "s"} signed up from the storefront footer.
{error && ( Could not load subscribers: {error} )} Email Status Source Date {!isLoading && subscribers.length === 0 && ( No subscribers yet. )} {subscribers.map((s) => ( {s.email} {s.status} {s.source ?? "-"} {new Date(s.created_at).toLocaleString()} ))}
0} canNextPage={offset + PAGE_SIZE < count} previousPage={() => setOffset(Math.max(offset - PAGE_SIZE, 0))} nextPage={() => setOffset(offset + PAGE_SIZE)} />
) } export const config = defineRouteConfig({ label: "Newsletter", icon: EnvelopeSolid, }) export default NewsletterPage