import { useState, useEffect, useMemo, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import Fuse from "fuse.js"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { ArrowLeft, Keyboard } from "lucide-react"; import { SearchResult } from "@/components/search/SearchResult"; import { features } from "@/features/registry"; export function Search() { const navigate = useNavigate(); const [query, setQuery] = useState(""); const [selectedIndex, setSelectedIndex] = useState(0); // 使用 Fuse.js 进行模糊搜索 const fuse = useMemo(() => { return new Fuse(features, { keys: [ { name: 'name', weight: 2 }, { name: 'description', weight: 1.5 }, { name: 'tags', weight: 1 }, ], threshold: 0.4, ignoreLocation: true, }); }, []); // 搜索结果 const searchResults = useMemo(() => { if (!query.trim()) { return features; } return fuse.search(query).map(result => result.item); }, [query, fuse]); // 键盘导航 useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'ArrowDown') { e.preventDefault(); setSelectedIndex((prev) => prev < searchResults.length - 1 ? prev + 1 : prev ); } else if (e.key === 'ArrowUp') { e.preventDefault(); setSelectedIndex((prev) => (prev > 0 ? prev - 1 : 0)); } else if (e.key === 'Enter' && searchResults.length > 0) { e.preventDefault(); const selected = searchResults[selectedIndex]; if (selected.implemented) { navigate(selected.route); } } else if (e.key === 'Escape') { navigate('/'); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [searchResults, selectedIndex, navigate]); // 重置选中索引 useEffect(() => { setSelectedIndex(0); }, [query]); const handleResultClick = useCallback((index: number) => { setSelectedIndex(index); }, []); return (
{/* 顶部导航栏 */}

功能搜索

{/* 大搜索框 */}
setQuery(e.target.value)} className="pl-12 h-14 text-lg" autoFocus />
{/* 主内容区 */}
{/* 结果统计 */}

{query.trim() ? ( <> 找到 {searchResults.length} 个匹配结果 ) : ( <> 共 {features.length} 个功能 )}

{/* 搜索结果列表 */}
{searchResults.length > 0 ? ( searchResults.map((feature, index) => ( handleResultClick(index)} /> )) ) : (
🔍

没有找到匹配的功能

尝试使用不同的关键词

)}
{/* 键盘提示 */} {searchResults.length > 0 && (

↑↓ 导航 • Enter 打开 • Esc 返回

)}
); }