import { useEffect, useRef, useState, type FormEvent } from "react"; import { apiFetch, apiUpload } from "../../api/client"; import type { Media } from "../../api/types"; export default function MediaPage() { const [media, setMedia] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [uploading, setUploading] = useState(false); const [altText, setAltText] = useState(""); const fileInputRef = useRef(null); function load() { setLoading(true); apiFetch<{ media: Media[] }>("/api/admin/media") .then((data) => setMedia(data.media)) .catch(() => setError("Failed to load media.")) .finally(() => setLoading(false)); } useEffect(load, []); async function handleUpload(e: FormEvent) { e.preventDefault(); const file = fileInputRef.current?.files?.[0]; if (!file) return; setUploading(true); setError(null); try { const formData = new FormData(); formData.append("file", file); formData.append("alt_text", altText); await apiUpload("/api/admin/media", formData); setAltText(""); if (fileInputRef.current) fileInputRef.current.value = ""; load(); } catch { setError("Upload failed (check file type/size)."); } finally { setUploading(false); } } async function handleDelete(id: string) { if (!confirm("Delete this media file?")) return; try { await apiFetch(`/api/admin/media/${id}`, { method: "DELETE" }); load(); } catch { setError("Failed to delete media."); } } return (

Media

{error &&
{error}
}

Upload

setAltText(e.target.value)} />
{loading ? (
Loading…
) : (
{media.map((m) => (
{m.mime_type.startsWith("image/") ? ( {m.alt_text} ) : (
{m.mime_type}
)}

{m.filename}

))}
)}
); }