import { useEffect, useMemo, useState } from "react"; import { Empty, Input, Modal, Pagination, Tag } from "antd"; import { Search } from "lucide-react"; import { cn } from "@/lib/utils"; import { useAssetStore, type Asset } from "@/stores/use-asset-store"; export type InsertAssetPayload = { kind: "text"; content: string; title: string } | { kind: "image"; dataUrl: string; title: string; storageKey?: string } | { kind: "video"; url: string; title: string; storageKey?: string; width?: number; height?: number }; type Props = { open: boolean; defaultTab?: string; onInsert: (payload: InsertAssetPayload) => void; onClose: () => void; }; export function AssetPickerModal({ open, onInsert, onClose }: Props) { return ( ); } const PAGE_SIZE = 8; const kindOptions = [ { label: "全部", value: "all" }, { label: "文本", value: "text" }, { label: "图片", value: "image" }, { label: "视频", value: "video" }, ]; function PickerCard({ title, kind, cover, onClick }: { title: string; kind: string; cover: string; onClick: () => void }) { return ( ); } function MyAssetsTab({ onInsert }: { onInsert: (payload: InsertAssetPayload) => void }) { const assets = useAssetStore((state) => state.assets); const [keyword, setKeyword] = useState(""); const [kindFilter, setKindFilter] = useState("all"); const [page, setPage] = useState(1); const filtered = useMemo(() => { const query = keyword.trim().toLowerCase(); return assets .filter((a) => a.kind === "text" || a.kind === "image" || a.kind === "video") .filter((a) => kindFilter === "all" || a.kind === kindFilter) .filter((a) => !query || [a.title, ...(a.tags || [])].join(" ").toLowerCase().includes(query)); }, [assets, keyword, kindFilter]); const visible = useMemo(() => filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE), [filtered, page]); useEffect(() => { const maxPage = Math.max(1, Math.ceil(filtered.length / PAGE_SIZE)); setPage((v) => Math.min(v, maxPage)); }, [filtered.length]); const handleInsert = (asset: Asset) => { if (asset.kind === "text") { onInsert({ kind: "text", content: asset.data.content, title: asset.title }); } else { onInsert(asset.kind === "video" ? { kind: "video", url: asset.data.url, storageKey: asset.data.storageKey, title: asset.title, width: asset.data.width, height: asset.data.height } : { kind: "image", dataUrl: asset.data.dataUrl, storageKey: asset.data.storageKey, title: asset.title }); } }; return (
} placeholder="搜索资产" value={keyword} allowClear onChange={(e) => { setPage(1); setKeyword(e.target.value); }} />
{kindOptions.map((opt) => ( { setPage(1); setKindFilter(opt.value); }} > {opt.label} ))}
{visible.length ? (
{visible.map((asset) => ( handleInsert(asset)} /> ))}
) : ( )} {filtered.length > PAGE_SIZE && (
)}
); }