"use client"; import { useState, useEffect, useCallback } from "react"; import { Trash2, RotateCcw, AlertTriangle } from "lucide-react"; interface RecycleItem { slug: string; title: string; deletedAt: string; daysRemaining: number; } export default function RecyclePage() { const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [message, setMessage] = useState<{ type: "success" | "error"; text: string } | null>(null); const fetchItems = useCallback(async () => { setLoading(true); try { const res = await fetch("/api/recycle"); setItems((await res.json()).items || []); } catch {} finally { setLoading(false); } }, []); useEffect(() => { fetchItems(); }, [fetchItems]); const handleRestore = async (slug: string, title: string) => { if (!confirm(`确定恢复「${title}」?`)) return; setMessage(null); try { const res = await fetch("/api/recycle", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ slug }) }); if (!res.ok) throw new Error("恢复失败"); setMessage({ type: "success", text: `已恢复「${title}」` }); fetchItems(); } catch (err: unknown) { setMessage({ type: "error", text: err instanceof Error ? err.message : "恢复失败" }); } }; const handlePermanentDelete = async (slug: string, title: string) => { if (!confirm(`永久删除「${title}」?此操作不可撤销!`)) return; setMessage(null); try { const res = await fetch(`/api/recycle?slug=${encodeURIComponent(slug)}`, { method: "DELETE" }); if (!res.ok) throw new Error("删除失败"); setMessage({ type: "success", text: `已永久删除「${title}」` }); fetchItems(); } catch (err: unknown) { setMessage({ type: "error", text: err instanceof Error ? err.message : "删除失败" }); } }; return (

回收站

删除的文章保留 30 天,到期自动清理

{message && (
{message.text}
)} {loading ? (
加载中...
) : items.length === 0 ? (

回收站为空

) : (
{items.map((item) => (
{item.title}
删除于 {new Date(item.deletedAt).toLocaleString("zh-CN")} {item.daysRemaining <= 3 ? ( 剩余 {item.daysRemaining} 天 ) : ( 剩余 {item.daysRemaining} 天 )}
))}
)}
); }