bsd/app/showcase/page.tsx
2024-12-13 19:46:49 +08:00

81 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use client'
import { useState } from 'react'
import Image from 'next/image'
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
import { ChevronLeft, ChevronRight } from 'lucide-react'
import { useConfig } from '../hooks/useConfig'
const ITEMS_PER_PAGE = 6
export default function Showcase() {
const { config } = useConfig()
const [currentPage, setCurrentPage] = useState(1)
const [searchTerm, setSearchTerm] = useState('')
const filteredShowcase = config.showcase.filter(photo =>
photo.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
photo.author.toLowerCase().includes(searchTerm.toLowerCase())
)
const totalPages = Math.ceil(filteredShowcase.length / ITEMS_PER_PAGE)
const startIndex = (currentPage - 1) * ITEMS_PER_PAGE
const endIndex = startIndex + ITEMS_PER_PAGE
const currentPhotos = filteredShowcase.slice(startIndex, endIndex)
return (
<main className="min-h-screen bg-gray-100 py-16">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h1 className="text-3xl font-bold mb-8 text-center"></h1>
<div className="mb-6">
<Input
type="text"
placeholder="搜索作品或作者..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="max-w-md mx-auto"
/>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{currentPhotos.map((photo, index) => (
<div key={index} className="bg-white shadow-lg rounded-lg overflow-hidden">
<div className="relative h-64">
<Image
src={photo.image}
alt={photo.title}
layout="fill"
objectFit="cover"
/>
</div>
<div className="p-6">
<h2 className="text-xl font-semibold mb-2">{photo.title}</h2>
<p className="text-gray-600 mb-2">{photo.author}</p>
<p className="text-gray-500 text-sm">{photo.date}</p>
</div>
</div>
))}
</div>
<div className="mt-8 flex justify-center items-center space-x-4">
<Button
onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))}
disabled={currentPage === 1}
>
<ChevronLeft className="h-4 w-4 mr-2" />
</Button>
<span> {currentPage} {totalPages} </span>
<Button
onClick={() => setCurrentPage(prev => Math.min(prev + 1, totalPages))}
disabled={currentPage === totalPages}
>
<ChevronRight className="h-4 w-4 ml-2" />
</Button>
</div>
</div>
</main>
)
}