"use client"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { normalizeImageUrl } from "@/lib/normalize"; import { Post } from "@/types/post"; export function EditPostForm({ post }: { post: Post }) { const router = useRouter(); const [title, setTitle] = useState(post.title); const [cover, setCover] = useState(post.cover || ""); const [tags, setTags] = useState(post.tags ? post.tags.join(", ") : ""); const [markdown, setMarkdown] = useState(post.markdown); const [loading, setLoading] = useState(false); async function handleSave(e: React.FormEvent) { e.preventDefault(); setLoading(true); try { const normalizedCover = normalizeImageUrl(cover); const res = await fetch(`/api/posts/${post.slug}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title, markdown, cover: normalizedCover || null, tags: Array.from( new Set( tags .split(",") .map((t) => t.trim()) .filter(Boolean) ) ) }) }); if (!res.ok) { const data = await res.json().catch(() => ({})); alert(data.error ? JSON.stringify(data.error) : "保存失败"); return; } router.push("/admin"); router.refresh(); } finally { setLoading(false); } } async function handleDelete() { if (!window.confirm("确定要删除这篇文章吗?此操作不可恢复。")) return; const res = await fetch(`/api/posts/${post.slug}`, { method: "DELETE" }); if (!res.ok) { const data = await res.json().catch(() => ({})); alert(data.error || "删除失败"); return; } router.push("/admin"); router.refresh(); } return (

编辑文章

保存后会立即更新到前台。