import { Search } from "lucide-react"; import { type UIEvent, useEffect, useState } from "react"; import { App, Empty, Input, Modal, Spin, Tag } from "antd"; import { useTranslation } from "react-i18next"; 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 { t } = useTranslation(); 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 : t("prompts.loadFailed")); }, [message, query.error, query.isError, t]); 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={880} centered>
event.stopPropagation()}>
} value={keyword} onChange={(event) => setKeyword(event.target.value)} placeholder={t("prompts.searchTitle")} />
event.stopPropagation()}> {query.isLoading ? (
) : null}
{items.map((item) => ( selectPrompt(item.prompt)} onCopy={() => selectPrompt(item.prompt)} compact /> ))}
{!query.isLoading && items.length === 0 ? : null} {query.isFetchingNextPage ? (
) : null}
); }