"use client" import { useState, useMemo } from "react" import { Card } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "@/components/ui/breadcrumb" import { Search, Grid, BarChart3, Camera, ArrowRight, Tag, Clock, Images } from "lucide-react" import { useCategories } from "@/lib/queries" import { Photo } from "@/lib/queries" interface CategoryPageProps { photos: Photo[] onCategorySelect: (category: string) => void onPhotosView: () => void } export function CategoryPage({ photos, onCategorySelect, onPhotosView }: CategoryPageProps) { const { data: _dynamicCategories = [] } = useCategories() const [searchQuery, setSearchQuery] = useState("") const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid') // 计算分类统计 const categoryStats = useMemo(() => { const stats = new Map() photos.forEach(photo => { const category = photo.category || '未分类' const existing = stats.get(category) if (existing) { existing.count++ existing.photos.push(photo) // 更新最后更新时间 if (photo.date > existing.lastUpdate) { existing.lastUpdate = photo.date } } else { stats.set(category, { name: category, count: 1, lastUpdate: photo.date, photos: [photo] }) } }) return Array.from(stats.values()).sort((a, b) => b.count - a.count) }, [photos]) // 搜索过滤 const filteredCategories = useMemo(() => { if (!searchQuery.trim()) return categoryStats const query = searchQuery.toLowerCase() return categoryStats.filter(category => category.name.toLowerCase().includes(query) ) }, [categoryStats, searchQuery]) // 获取分类颜色 const getCategoryColor = (index: number) => { const colors = [ 'bg-blue-100 text-blue-800', 'bg-green-100 text-green-800', 'bg-purple-100 text-purple-800', 'bg-yellow-100 text-yellow-800', 'bg-red-100 text-red-800', 'bg-indigo-100 text-indigo-800', 'bg-pink-100 text-pink-800', 'bg-gray-100 text-gray-800' ] return colors[index % colors.length] } // 获取分类预览图片 const getCategoryPreviewImages = (categoryPhotos: Photo[]) => { return categoryPhotos.slice(0, 4) } return (
{/* 面包屑导航 */} 摄影作品 分类浏览 {/* 页面标题和统计 */}

分类浏览

按分类探索 {photos.length} 张照片,共 {categoryStats.length} 个分类

{/* 统计卡片 */}

{photos.length}

总照片数

{categoryStats.length}

分类数量

{categoryStats.length > 0 ? Math.round(photos.length / categoryStats.length) : 0 }

平均每分类

{/* 搜索和视图控制 */}
setSearchQuery(e.target.value)} className="pl-10" />
{/* 分类网格 */} {viewMode === 'grid' ? (
{filteredCategories.map((category, index) => ( onCategorySelect(category.name)} > {/* 照片预览网格 */}
{getCategoryPreviewImages(category.photos).length > 0 ? (
{getCategoryPreviewImages(category.photos).map((photo, idx) => (
{photo.title}
))}
) : (
)} {/* 悬停叠加层 */}
{/* 分类信息 */}

{category.name}

{category.count} 张

最后更新: {new Date(category.lastUpdate).toLocaleDateString()}

点击查看所有照片
))}
) : ( /* 列表视图 */
{filteredCategories.map((category, index) => ( onCategorySelect(category.name)} >
{getCategoryPreviewImages(category.photos).slice(0, 3).map((photo, _idx) => (
{photo.title}
))}

{category.name}

{category.count} 张照片 • 最后更新: {new Date(category.lastUpdate).toLocaleDateString()}

{category.count}
))}
)} {/* 空状态 */} {filteredCategories.length === 0 && (

{searchQuery ? '未找到匹配的分类' : '暂无分类'}

{searchQuery ? '尝试使用不同的关键词搜索' : '开始上传照片并为其分类'}

{searchQuery && ( )}
)}
) }