import { useRouter } from '@/providers/RouterProvider'; import { getFeatureByKey } from '@/config/features'; import type { PageType } from '@/types/storage'; import { useMemo, useState } from 'react'; import { useI18n } from '@/utils/chromeI18n'; import { cn } from '@/lib/utils'; import { Search } from 'lucide-react'; export default function DashboardPage() { const { navigateTo, visiblePages, pageOrder, recentlyUsedTools } = useRouter(); const { t } = useI18n(['features']); const [searchQuery, setSearchQuery] = useState(''); const visibleSet = useMemo(() => new Set(visiblePages), [visiblePages]); const visibleFeatures = useMemo(() => { return pageOrder .filter((key) => visibleSet.has(key)) .map((key) => ({ key, feature: getFeatureByKey(key) })) .filter((item) => item.feature?.themeColorKey && item.feature.icon != null); }, [pageOrder, visibleSet]); const filteredFeatures = useMemo(() => { if (!searchQuery.trim()) return visibleFeatures; const query = searchQuery.toLowerCase(); return visibleFeatures.filter( (item) => t(item.feature!.labelKey).toLowerCase().includes(query) || t(item.feature!.descriptionKey).toLowerCase().includes(query), ); }, [visibleFeatures, searchQuery, t]); const recentFeatures = useMemo(() => { return recentlyUsedTools .filter((key) => visibleSet.has(key)) .map((key) => ({ key, feature: getFeatureByKey(key) })) .filter((item) => item.feature?.themeColorKey && item.feature.icon != null); }, [recentlyUsedTools, visibleSet]); const showRecent = !searchQuery.trim() && recentFeatures.length > 0; return (
{/* 搜索栏 */}
setSearchQuery(e.target.value)} placeholder={t('dashboard_searchPlaceholder')} className={cn( 'w-full h-9 pl-9 pr-3 rounded-lg border border-border/70 bg-background text-sm', 'placeholder:text-muted-foreground/50 outline-none', 'focus:border-primary/50 focus:ring-1 focus:ring-primary/20', 'transition-colors', )} />
{/* 最近使用 */} {showRecent && (

{t('dashboard_recentlyUsed')}

{recentFeatures.map(({ key, feature }) => { const IconComponent = feature!.icon!; return ( ); })}
)} {/* 全部工具 — 紧凑 Grid */}

{t('dashboard_allTools')}

{filteredFeatures.map(({ key, feature }) => { const IconComponent = feature!.icon!; return ( ); })}
); }