"use client"; import { useEffect, useState } from "react"; import { format } from "date-fns"; interface Edition { id: string; date: string; pdfPath: string; generatedAt: string; } export function EditionsView() { const [editions, setEditions] = useState([]); const [generating, setGenerating] = useState(false); const [error, setError] = useState(null); async function load() { const res = await fetch("/api/editions"); if (res.ok) setEditions((await res.json()).editions); } useEffect(() => { void load(); }, []); async function generate() { setGenerating(true); setError(null); try { const res = await fetch("/api/edition", { method: "POST" }); if (!res.ok) { const msg = await res.json().catch(() => null); throw new Error(msg?.error?.message ?? `Generation failed (HTTP ${res.status})`); } await load(); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setGenerating(false); } } async function remove(id: string) { const res = await fetch(`/api/editions/${id}`, { method: "DELETE" }); if (res.ok) setEditions((prev) => prev.filter((e) => e.id !== id)); } return (

The Paper

Preview
{error && (

{error}

)} {editions.length === 0 ? (

No editions yet. Generate one — it builds a printable PDF from your current dashboard.

) : (
    {editions.map((e) => (
  • {format(new Date(e.generatedAt), "EEEE, MMMM d, yyyy")}
    {format(new Date(e.generatedAt), "h:mm a")}
    Open PDF
  • ))}
)}
); }