'use client' import { useState, useEffect } from 'react' import { ComponentCard } from '@/components/ComponentCard' import { Search, Filter } from 'lucide-react' interface Component { id: string name: string brand: string model: string price: number description?: string imageUrl?: string stock: number componentType: { id: string name: string } } interface ComponentType { id: string name: string _count: { components: number } } interface Pagination { page: number limit: number total: number totalPages: number hasNext: boolean hasPrev: boolean } export default function ComponentsPage() { const [components, setComponents] = useState([]) const [componentTypes, setComponentTypes] = useState([]) const [pagination, setPagination] = useState({ page: 1, limit: 12, total: 0, totalPages: 0, hasNext: false, hasPrev: false }) const [filters, setFilters] = useState({ search: '', type: '', brand: '', minPrice: '', maxPrice: '' }) const [isLoading, setIsLoading] = useState(true) const [showFilters, setShowFilters] = useState(false) useEffect(() => { fetchComponentTypes() }, []) useEffect(() => { fetchComponents() }, [filters, pagination.page]) const fetchComponentTypes = async () => { try { const response = await fetch('/api/component-types') if (response.ok) { const data = await response.json() setComponentTypes(data) } } catch (error) { console.error('Failed to fetch component types:', error) } } const fetchComponents = async () => { setIsLoading(true) try { const searchParams = new URLSearchParams() if (filters.search) searchParams.set('search', filters.search) if (filters.type) searchParams.set('type', filters.type) if (filters.brand) searchParams.set('brand', filters.brand) if (filters.minPrice) searchParams.set('minPrice', filters.minPrice) if (filters.maxPrice) searchParams.set('maxPrice', filters.maxPrice) searchParams.set('page', pagination.page.toString()) searchParams.set('limit', pagination.limit.toString()) const response = await fetch(`/api/components?${searchParams}`) if (response.ok) { const data = await response.json() setComponents(data.components) setPagination(data.pagination) } } catch (error) { console.error('Failed to fetch components:', error) } finally { setIsLoading(false) } } const handleFilterChange = (key: string, value: string) => { setFilters({ ...filters, [key]: value }) setPagination({ ...pagination, page: 1 }) } const handlePageChange = (newPage: number) => { setPagination({ ...pagination, page: newPage }) window.scrollTo({ top: 0, behavior: 'smooth' }) } const resetFilters = () => { setFilters({ search: '', type: '', brand: '', minPrice: '', maxPrice: '' }) } return (

电脑配件商城

{/* Search Bar */}
handleFilterChange('search', e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-blue-500 focus:border-blue-500" />
{/* Filters */} {showFilters && (
handleFilterChange('brand', e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500" />
handleFilterChange('minPrice', e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500" />
handleFilterChange('maxPrice', e.target.value)} className="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500" />
)}
{/* Results */}

共找到 {pagination.total} 个配件

{/* Loading */} {isLoading ? (
) : ( <> {/* Components Grid */} {components.length > 0 ? (
{components.map((component) => ( ))}
) : (

没有找到符合条件的配件

)} {/* Pagination */} {pagination.totalPages > 1 && (
{Array.from({ length: pagination.totalPages }, (_, i) => i + 1).map((page) => ( ))}
)} )}
) }