"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import api from "@/services/api"; import { Media, PagedMedia } from "@/services/types"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Upload, Trash2, Copy } from "lucide-react"; import { useToast } from "@/components/ui/use-toast"; import Image from "next/image"; import { format } from "date-fns"; import { Card, CardContent } from "@/components/ui/card"; export default function MediaPage() { const [uploading, setUploading] = useState(false); const queryClient = useQueryClient(); const { toast } = useToast(); const { data, isLoading } = useQuery({ queryKey: ["media"], queryFn: async () => { return api.get("/media"); }, }); const uploadMutation = useMutation({ mutationFn: async (file: File) => { const formData = new FormData(); formData.append("file", file); // Assuming API endpoint is /media/upload or similar, checking API docs // API.md might specify. Assuming standard POST /media with multipart return api.post("/media", formData, { headers: { "Content-Type": "multipart/form-data" }, }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["media"] }); toast({ title: "上传成功" }); setUploading(false); }, onError: () => { setUploading(false); toast({ title: "上传失败", variant: "destructive" }); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => api.delete(`/media/${id}`), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["media"] }); toast({ title: "删除成功" }); }, }); const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { setUploading(true); uploadMutation.mutate(e.target.files[0]); } }; const handleCopyUrl = (url: string) => { navigator.clipboard.writeText(url); toast({ title: "链接已复制" }); }; const handleDelete = (id: string) => { if (confirm("确定要删除吗?")) { deleteMutation.mutate(id); } }; if (isLoading) { return (
加载中...
); } const mediaItems = data?.items || []; return (

媒体库

{mediaItems.map((item: Media) => ( {item.id}
{format(new Date(item.created_at), "yyyy-MM-dd")}
))} {mediaItems.length === 0 && (
暂无图片
)}
); }