import { useEffect, useState, type FormEvent } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { API_URL } from "./constants"; import type { Blog } from "./types"; import { countWords } from "./countWords"; export function EditBlog() { const { slug } = useParams<{ slug: string }>(); const [blog, setBlog] = useState(null); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [body, setBody] = useState(""); const [authorName, setAuthorName] = useState(""); const navigate = useNavigate(); useEffect(() => { if (!slug) return; fetch(`${API_URL}/blogs/${slug}`, { method: "GET", headers: { "Content-Type": "application/json", }, }) .then((res) => res.json()) .then((data: Blog) => { setBlog(data); setTitle(data.title); setDescription(data.description); setBody(data.body); setAuthorName(data.author_name); }) .catch(console.error); }, [slug]); if (!blog) return

Loading…

; async function handleSubmit(e: FormEvent) { e.preventDefault(); const updatedBlog = { title, description, body, author_name: authorName, // from the form field updated_at: new Date().toISOString(), word_count: countWords(body), version: blog ? blog.version + 1 : 1, }; const res = await fetch(`${API_URL}/blogs/${slug}`, { method: "PUT", // or "PATCH" if your API prefers headers: { "Content-Type": "application/json" }, body: JSON.stringify(updatedBlog), }); if (res.ok) { navigate(`/blogs/${slug}`); // go back to the viewer } else { console.error("Update failed:", await res.text()); alert("Could not update the post. See console for details."); } } return (

Edit Blog Post

setTitle(e.target.value)} className="w-full border px-2 py-1 rounded" />