"use client" import { useState, useEffect, useMemo } from "react" import { PhotoGallery } from "@/components/photo-gallery" import { PhotoModal } from "@/components/photo-modal" import { Navigation } from "@/components/navigation" import { FilterBar } from "@/components/filter-bar" import { LoadingSpinner } from "@/components/loading-spinner" import { TimelineView } from "@/components/timeline-view" import { AboutView } from "@/components/about-view" import { ContactView } from "@/components/contact-view" import { CategoryPage } from "@/components/category-page" import { TagCloud } from "@/components/tag-cloud" import { ApiStatus } from "@/components/api-status" import { useInfinitePhotos, type Photo } from "@/lib/queries" import { useToast } from "@/components/ui/use-toast" export default function HomePage() { const { data: photos = [], isLoading, error } = useInfinitePhotos() const { toast } = useToast() const [selectedPhoto, setSelectedPhoto] = useState(null) const [activeCategory, setActiveCategory] = useState("all") const [activeTab, setActiveTab] = useState("gallery") const [searchText, setSearchText] = useState("") const [sortBy, setSortBy] = useState("date_desc") const [selectedTags, setSelectedTags] = useState([]) useEffect(() => { if (error) { const isRealApi = process.env.NEXT_PUBLIC_USE_REAL_API === 'true' toast({ title: "数据加载失败", description: isRealApi ? "无法连接到后端API,请确保后端服务正在运行 (localhost:8080)" : "无法连接到Mock API,请确保Mock API正在运行 (localhost:3001)", variant: "destructive", }) } }, [error, toast]) const filteredPhotos = useMemo(() => { let filtered = [...photos] // 分类过滤 if (activeCategory !== "all") { filtered = filtered.filter((photo: Photo) => photo.category.toLowerCase() === activeCategory.toLowerCase() ) } // 搜索过滤 if (searchText.trim()) { const searchLower = searchText.toLowerCase() filtered = filtered.filter((photo: Photo) => photo.title.toLowerCase().includes(searchLower) || photo.description.toLowerCase().includes(searchLower) || photo.category.toLowerCase().includes(searchLower) ) } // 标签过滤 if (selectedTags.length > 0) { filtered = filtered.filter((photo: Photo) => selectedTags.some(tag => photo.tags.some(photoTag => photoTag.toLowerCase().includes(tag.toLowerCase()) ) ) ) } // 排序 switch (sortBy) { case "date_desc": filtered.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) break case "date_asc": filtered.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) break case "title_asc": filtered.sort((a, b) => a.title.localeCompare(b.title)) break case "title_desc": filtered.sort((a, b) => b.title.localeCompare(a.title)) break case "category": filtered.sort((a, b) => a.category.localeCompare(b.category)) break default: break } return filtered }, [photos, activeCategory, searchText, selectedTags, sortBy]) const handleFilter = (category: string) => { setActiveCategory(category) } const handleSearchChange = (search: string) => { setSearchText(search) } const handleSortChange = (sort: string) => { setSortBy(sort) } const handleTagToggle = (tag: string) => { setSelectedTags(prev => prev.includes(tag) ? prev.filter(t => t !== tag) : [...prev, tag] ) } const handleClearFilters = () => { setActiveCategory("all") setSearchText("") setSortBy("date_desc") setSelectedTags([]) } const handlePhotoClick = (photo: Photo) => { setSelectedPhoto(photo) } const handleCloseModal = () => { setSelectedPhoto(null) } const handlePrevPhoto = () => { if (!selectedPhoto) return const currentPhotos = activeTab === "gallery" ? filteredPhotos : photos const currentIndex = currentPhotos.findIndex((p: Photo) => p.id === selectedPhoto.id) const prevIndex = currentIndex > 0 ? currentIndex - 1 : currentPhotos.length - 1 setSelectedPhoto(currentPhotos[prevIndex]) } const handleNextPhoto = () => { if (!selectedPhoto) return const currentPhotos = activeTab === "gallery" ? filteredPhotos : photos const currentIndex = currentPhotos.findIndex((p: Photo) => p.id === selectedPhoto.id) const nextIndex = currentIndex < currentPhotos.length - 1 ? currentIndex + 1 : 0 setSelectedPhoto(currentPhotos[nextIndex]) } const handleTabChange = (tab: string) => { setActiveTab(tab) // Reset filters when switching tabs if (tab === "timeline" || tab === "categories" || tab === "tags") { setActiveCategory("all") setSearchText("") setSelectedTags([]) } } const handleCategorySelect = (category: string) => { setActiveCategory(category) setActiveTab("gallery") } const handleTagSelect = (tag: string) => { setSelectedTags([tag]) setActiveTab("gallery") } const handlePhotosView = () => { setActiveTab("gallery") } const handleContactClick = () => { setActiveTab("contact") } const getPageTitle = () => { switch (activeTab) { case "gallery": return "摄影作品集" case "categories": return "分类浏览" case "tags": return "标签云" case "timeline": return "创作时间线" case "about": return "关于我" case "contact": return "联系合作" default: return "摄影作品集" } } const getPageDescription = () => { switch (activeTab) { case "gallery": return "用镜头记录世界的美好瞬间,每一张照片都是时光的诗篇" case "categories": return "按分类探索摄影作品,发现不同主题下的精彩瞬间" case "tags": return "通过标签云发现相关主题,探索摄影作品的多样性" case "timeline": return "按时间顺序回顾摄影创作历程,见证技艺与视角的成长轨迹" case "about": return "分享我的摄影故事,探索光影背后的创作理念与人生感悟" case "contact": return "期待与您合作,共同创造独特而珍贵的视觉记忆" default: return "用镜头记录世界的美好瞬间,每一张照片都是时光的诗篇" } } if (isLoading) { return } return (
{(activeTab === "gallery" || activeTab === "timeline") && (

{getPageTitle()}

{getPageDescription()}

)} {activeTab === "gallery" && ( <> )} {activeTab === "categories" && ( )} {activeTab === "tags" && ( )} {activeTab === "timeline" && } {activeTab === "about" && } {activeTab === "contact" && }
{selectedPhoto && ( )} {/* API状态指示器 - 仅开发环境 */}
) }