"use client"; import { Images, Loader2 } from "lucide-react"; import { useEffect, useState } from "react"; import Modal from "@/components/Modal"; import { apiMyMedia, type MediaAttachment } from "@/lib/api"; /** 书籍封面图库选择弹窗:列出本人媒体库图片,选中后由父组件复制一份作封面素材 */ export default function LibraryCoverPicker({ open, onClose, onPick, }: { open: boolean; onClose: () => void; onPick: (item: MediaAttachment) => void; }) { const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); useEffect(() => { if (!open) return; let cancelled = false; setLoading(true); setError(""); void apiMyMedia() .then((res) => { if (cancelled) return; if (res.error) { setError(res.error); setItems([]); return; } setItems((res.attachments || []).filter((item) => item.kind === "image")); }) .catch(() => { if (!cancelled) setError("加载媒体库失败"); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [open]); return ( {loading ? (

加载中

) : error ? (

{error}

) : items.length === 0 ? (

图库还没有图片。上传封面或发帖插图后,会自动出现在这里。

) : (
{items.map((item) => ( ))}
)}
); }