"use client" import { useState, useEffect, useRef } from "react" import { useRouter } from "next/navigation" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Search, X, ChevronRight, FileText, Hash } from "lucide-react" interface SearchResult { id: string title: string partTitle: string chapterTitle: string price: number isFree: boolean matchType: 'title' | 'content' snippet?: string score: number } interface SearchModalProps { open: boolean onOpenChange: (open: boolean) => void } export function SearchModal({ open, onOpenChange }: SearchModalProps) { const router = useRouter() const inputRef = useRef(null) const [query, setQuery] = useState("") const [results, setResults] = useState([]) const [isLoading, setIsLoading] = useState(false) const [keywords, setKeywords] = useState([]) // 热门搜索词 const hotKeywords = ["私域", "流量", "赚钱", "电商", "AI", "社群"] // 搜索防抖 useEffect(() => { if (!query.trim()) { setResults([]) setKeywords([]) return } const timer = setTimeout(async () => { setIsLoading(true) try { const res = await fetch(`/api/search?q=${encodeURIComponent(query)}&type=all`) const data = await res.json() if (data.success) { setResults(data.data.results || []) setKeywords(data.data.keywords || []) } } catch (error) { console.error("Search error:", error) } finally { setIsLoading(false) } }, 300) return () => clearTimeout(timer) }, [query]) // 打开时聚焦输入框 useEffect(() => { if (open && inputRef.current) { setTimeout(() => inputRef.current?.focus(), 100) } }, [open]) const handleResultClick = (result: SearchResult) => { onOpenChange(false) router.push(`/read/${result.id}`) } const handleKeywordClick = (keyword: string) => { setQuery(keyword) } return ( {/* 搜索输入 */}
setQuery(e.target.value)} placeholder="搜索章节标题或内容..." className="pl-10 pr-10 bg-[#2c2c2e] border-white/5 text-white placeholder:text-gray-500 focus:border-[#00CED1]/50" /> {query && ( )}
{/* 搜索结果 */}
{/* 热门搜索 */} {!query && (

热门搜索

{hotKeywords.map((keyword) => ( ))}
)} {/* 加载状态 */} {isLoading && (

搜索中...

)} {/* 搜索结果列表 */} {!isLoading && query && results.length > 0 && (

找到 {results.length} 个结果

{results.map((result) => ( ))}
)} {/* 相关关键词 */} {!isLoading && query && keywords.length > 0 && (

相关标签

{keywords.slice(0, 8).map((keyword) => ( ))}
)} {/* 无结果 */} {!isLoading && query && results.length === 0 && (

未找到相关内容

试试其他关键词

)}
) }