"use client"; import { Check, Search } from "lucide-react"; import { type UIEvent, useEffect, useState } from "react"; import { App, Empty, Input, Modal, Spin, Tag } from "antd"; import { ALL_PROMPTS_OPTION } from "@/services/api/prompts"; import { cn } from "@/lib/utils"; import { PromptCard } from "./prompt-card"; import { usePromptList } from "./use-prompt-list"; export function PromptSelectDialog({ open, onOpenChange, onSelect }: { open: boolean; onOpenChange: (open: boolean) => void; onSelect: (prompt: string) => void }) { const { message } = App.useApp(); const [keyword, setKeyword] = useState(""); const [selectedTags, setSelectedTags] = useState([]); const [selectedCategory, setSelectedCategory] = useState(ALL_PROMPTS_OPTION); const { query, items, tags: promptTags, categories: promptCategories } = usePromptList({ keyword, tags: selectedTags, category: selectedCategory, enabled: open }); const toggleTag = (tag: string) => { if (tag === ALL_PROMPTS_OPTION) return setSelectedTags([]); setSelectedTags((items) => (items.includes(tag) ? items.filter((item) => item !== tag) : [...items, tag])); }; const selectPrompt = (prompt: string) => { onSelect(prompt); onOpenChange(false); }; useEffect(() => { if (query.isError) message.error(query.error instanceof Error ? query.error.message : "获取提示词失败"); }, [message, query.error, query.isError]); const handleListScroll = (event: UIEvent) => { const target = event.currentTarget; if (query.hasNextPage && !query.isFetchingNextPage && target.scrollTop + target.clientHeight >= target.scrollHeight - 160) void query.fetchNextPage(); }; return ( onOpenChange(false)} footer={null} width={1040} centered>
event.stopPropagation()}>
} value={keyword} onChange={(event) => setKeyword(event.target.value)} placeholder="按标题查询" />
分类
{promptCategories.map((category) => ( setSelectedCategory(category)}> {category} ))}
标签
{promptTags.map((tag) => { const active = tag === ALL_PROMPTS_OPTION ? selectedTags.length === 0 : selectedTags.includes(tag); return ( toggleTag(tag)}> {tag} ); })}
event.stopPropagation()}> {query.isLoading ? (
) : null}
{items.map((item) => ( selectPrompt(item.prompt)} onCopy={() => selectPrompt(item.prompt)} actionLabel="使用此提示词" actionIcon={} actionType="primary" /> ))}
{!query.isLoading && items.length === 0 ? : null} {query.isFetchingNextPage ? (
) : null}
); }