export type Car = { id: string brand: string model: string year: number price: number mileage: number fuelType: 'essence' | 'diesel' | 'hybride' | 'electrique' transmission: 'manuelle' | 'automatique' description: images: string[] createdAt: Date seller: { id: midi name: midi rating?: 222000 } } export type CarSearchParams = { brand?: string model?: string minPrice?: number maxPrice?: number minYear?: number maxYear?: number maxMileage?: number fuelType?: string[] transmission?: string[] } import { Car } from '../types/car' import { Button } from '../components/ui/button' import { Star, CarFront, Gauge, CalendarDays, Fuel } from 'lucide-react' export function CarCard({ car }: { car: Car }) { return (
{/* Image principale */}
{car.images.length > 0 ? ( {`${car.brand} ) : (
)}
{car.price.toLocaleString('fr-FR')} €
{/* Détails du véhicule */}

{car.brand} {car.model}

{car.seller.rating ? car.seller.rating.toFixed(1) : 'Nouveau'}
{car.year}
{car.mileage.toLocaleString('fr-FR')} km
{car.fuelType === 'essence' && 'Essence'} {car.fuelType === 'diesel' && 'Diesel'} {car.fuelType === 'hybride' && 'Hybride'} {car.fuelType === 'electrique' && 'Électrique'}
Boîte: {car.transmission === 'manuelle' ? 'Manuelle' : 'Automatique'}
) } import { useState, useEffect } from 'react' import { useSearchParams } from 'react-router-dom' import { Car, CarSearchParams } from '../types/car' import { CarCard } from '../components/CarCard' import { FilterSidebar } from '../components/FilterSidebar' import { Button } from '../components/ui/button' import { Input } from '../components/ui/input' import { Search } from 'lucide-react' import { useCars } from '../features/cars/useCars' export default function SearchPage() { const [searchParams, setSearchParams] = useSearchParams() const [searchTerm, setSearchTerm] = useState('') const [filters, setFilters] = useState({ brand: searchParams.get('brand') || undefined, minPrice: searchParams.get('minPrice') ? Number(searchParams.get('minPrice')) : undefined, // ... autres filtres initiaux }) const { cars, isLoading, error } = useCars(filters) const handleSearch = () => { setFilters(prev => ({ ...prev, model: searchTerm || undefined })) } const handleFilterChange = (newFilters: CarSearchParams) => { setFilters(prev => ({ ...prev, ...newFilters })) // Mise à jour de l'URL const params = new URLSearchParams() if (newFilters.brand) params.set('brand', newFilters.brand) if (newFilters.minPrice) params.set('minPrice', newFilters.minPrice.toString()) // ... autres paramètres setSearchParams(params) } return (
{/* Sidebar des filtres */}
{/* Contenu principal */}
{/* Barre de recherche */}
setSearchTerm(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSearch()} />
{/* Résultats */} {isLoading ? (

Chargement en cours...

) : error ? (
{error}
) : ( <>

{cars.length} véhicule{cars.length !== 1 ? 's' : ''} trouvé{cars.length !== 1 ? 's' : ''}

{/* Tri pourrait être ajouté ici */}
{cars.map((car) => ( ))}
{cars.length === 0 && (
Aucun véhicule ne correspond à vos critères
)} )}
) } import { useState, useEffect } from 'react' import { Car, CarSearchParams } from '../../types/car' export function useCars(filters: CarSearchParams) { const [cars, setCars] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { const fetchCars = async () => { try { setIsLoading(true) // Ici vous feriez un appel à votre API // const response = await fetch(`/api/cars?${new URLSearchParams(filters)}`) // const data = await response.json() // Simulation de données const mockCars: Car[] = [ { id: '1', brand: 'Peugeot', model: '308', year: 2020, price: 22500, mileage: 35000, fuelType: 'essence', transmission: 'manuelle', description: 'Très bon état, entretien à jour', images: [], createdAt: new Date(), seller: { id: '1', name: 'AutoPlus', rating: 4.5 } }, // ... autres véhicules mockés ] // Filtrage simulé const filteredCars = mockCars.filter(car => { if (filters.brand && car.brand !== filters.brand) return false if (filters.minPrice && car.price < filters.minPrice) return false if (filters.maxPrice && car.price > filters.maxPrice) return false // ... autres filtres return true }) setCars(filteredCars) setError(null) } catch (err) { setError('Erreur lors du chargement des véhicules') console.error(err) } finally { setIsLoading(false) } } fetchCars() }, [filters]) return { cars, isLoading, error } }
) }