import Link from 'next/link'; import { useState, useMemo } from 'react'; import { NewsItem } from '../lib/content'; import { Search, Filter, Calendar, Tag, ArrowRight, Clock } from 'lucide-react'; export default function NewsList({ news }: { news: NewsItem[] }) { const [searchTerm, setSearchTerm] = useState(''); const [selectedCategory, setSelectedCategory] = useState('全部'); const [sortBy, setSortBy] = useState('date'); // 获取所有分类 const categories = useMemo(() => { const allTags = news.flatMap(item => item.tags || []); const uniqueTags = Array.from(new Set(allTags)); return ['全部', ...uniqueTags]; }, [news]); // 过滤和排序新闻 const filteredNews = useMemo(() => { let filtered = news.filter(item => { const matchesSearch = item.title.toLowerCase().includes(searchTerm.toLowerCase()) || item.summary?.toLowerCase().includes(searchTerm.toLowerCase()) || item.tags?.some(tag => tag.toLowerCase().includes(searchTerm.toLowerCase())); const matchesCategory = selectedCategory === '全部' || item.tags?.includes(selectedCategory); return matchesSearch && matchesCategory; }); // 排序 filtered.sort((a, b) => { switch (sortBy) { case 'date': return new Date(b.date).getTime() - new Date(a.date).getTime(); case 'title': return a.title.localeCompare(b.title); default: return 0; } }); return filtered; }, [news, searchTerm, selectedCategory, sortBy]); return (
{/* 搜索和筛选区域 */}
{/* 搜索框 */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-accent focus:border-transparent outline-none" />
{/* 分类筛选 */}
{/* 排序选择 */}
{/* 搜索结果统计 */}

找到 {filteredNews.length} 条新闻 {searchTerm && ( ,关键词:"{searchTerm}" )} {selectedCategory !== '全部' && ( ,分类:{selectedCategory} )}

{/* 新闻列表 */} {filteredNews.length === 0 ? (

未找到相关新闻

请尝试调整搜索条件或筛选器

) : (
{filteredNews.map((item, index) => (
{/* 新闻头部 */}
{index < 3 && ( 热门 )}
{/* 新闻标题 */}

{item.title}

{/* 新闻摘要 */} {item.summary && (

{item.summary}

)} {/* 标签 */} {item.tags && item.tags.length > 0 && (
{item.tags.map(tag => ( setSelectedCategory(tag)} > {tag} ))}
)} {/* 阅读更多按钮 */}
阅读全文
{Math.ceil(Math.random() * 5) + 1} 分钟阅读
))}
)} {/* 加载更多按钮(如果新闻很多的话) */} {filteredNews.length > 6 && (
)}
); }