"use client"; import { FolderPlus, Search } from "lucide-react"; import { type UIEvent, useEffect, useState } from "react"; import { App, Button, Empty, Input, Spin, Tag } from "antd"; import { PromptCard } from "@/components/prompts/prompt-card"; import { PromptDetailDialog } from "@/components/prompts/prompt-detail-dialog"; import { usePromptList } from "@/components/prompts/use-prompt-list"; import { useCopyText } from "@/hooks/use-copy-text"; import { cn } from "@/lib/utils"; import { useAssetStore } from "@/stores/use-asset-store"; import { ALL_PROMPTS_OPTION, type Prompt } from "@/services/api/prompts"; export default function PromptsPage() { const { message } = App.useApp(); const [titleKeyword, setTitleKeyword] = useState(""); const [selectedTags, setSelectedTags] = useState([]); const [selectedCategory, setSelectedCategory] = useState(ALL_PROMPTS_OPTION); const [selectedPrompt, setSelectedPrompt] = useState(null); const addAsset = useAssetStore((state) => state.addAsset); const copyText = useCopyText(); const { query, items: promptItems, tags: promptTags, categories: promptCategoryOptions, total: totalPrompts } = usePromptList({ keyword: titleKeyword, tags: selectedTags, category: selectedCategory }); useEffect(() => { if (query.isError) { message.error(query.error instanceof Error ? query.error.message : "获取提示词失败"); } }, [message, query.error, query.isError]); const toggleTag = (tag: string) => { if (tag === ALL_PROMPTS_OPTION) return setSelectedTags([]); setSelectedTags((items) => items.includes(tag) ? items.filter((item) => item !== tag) : [...items, tag]); }; const savePromptAsset = (item: Prompt) => { addAsset({ kind: "text", title: item.title, coverUrl: item.coverUrl, tags: item.tags, source: item.category, data: { content: item.prompt }, metadata: { source: "prompt-library", promptId: item.id, githubUrl: item.githubUrl } }); message.success("已加入我的素材"); }; const handleListScroll = (event: UIEvent) => { const target = event.currentTarget; if (query.hasNextPage && !query.isFetchingNextPage && target.scrollTop + target.clientHeight >= target.scrollHeight - 160) { void query.fetchNextPage(); } }; return (

提示词中心

共 {totalPrompts} 条提示词,按标题、标签与分类快速查找灵感。

{query.isLoading ?
: null} {!query.isLoading ? ( <>
} value={titleKeyword} placeholder="按标题查询" onChange={(event) => setTitleKeyword(event.target.value)} />
分类
{promptCategoryOptions.map((category) => ( setSelectedCategory(category)}> {category} ))}
标签
{promptTags.map((tag) => ( toggleTag(tag)}> {tag} ))}
) : null}
{!query.isLoading ? (
{promptItems.map((item) => ( setSelectedPrompt(item)} onCopy={() => copyText(item.prompt, "提示词已复制")} extraAction={} /> ))}
{promptItems.length === 0 ? : null}
{query.isFetchingNextPage ? "加载中..." : query.hasNextPage ? "继续向下滚动加载更多" : promptItems.length > 0 ? "已经到底了" : null}
) : null}
setSelectedPrompt(null)} onCopy={(prompt) => copyText(prompt, "提示词已复制")} onSaveAsset={savePromptAsset} />
); }