import React, { useState, useEffect } from 'react'; import axios from 'axios'; import type { JobOffer, JobSearchResponse } from '../types'; // Importe les types définis const API_BASE_URL = 'http://localhost:3000/api/jobs'; // L'URL de votre API backend const JobSearch: React.FC = () => { const [jobs, setJobs] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [limit, setLimit] = useState(10); const [keyword, setKeyword] = useState(''); const [location, setLocation] = useState(''); const [contractType, setContractType] = useState(''); // Nouvel état pour le type de contrat const [sortBy, setSortBy] = useState('publicationDate'); // Nouvel état pour le tri par colonne const [sortOrder, setSortOrder] = useState('desc'); // Nouvel état pour l'ordre de tri (asc/desc) const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { const fetchJobs = async () => { setLoading(true); setError(null); try { const params = { page, limit, keyword: keyword || undefined, location: location || undefined, contractType: contractType || undefined, // Ajout du paramètre contractType sortBy: sortBy, // Ajout du paramètre sortBy sortOrder: sortOrder, // Ajout du paramètre sortOrder }; const response = await axios.get(API_BASE_URL, { params }); setJobs(response.data.jobs); setTotal(response.data.total); setPage(response.data.page); setLimit(response.data.limit); } catch (err) { console.error('Error fetching jobs:', err); setError('Failed to fetch job offers. Please try again later.'); } finally { setLoading(false); } }; fetchJobs(); }, [page, keyword, location, contractType, sortBy, sortOrder, limit]); // Mettre à jour les dépendances const handleSearch = (e: React.FormEvent) => { e.preventDefault(); setPage(1); // Réinitialise à la première page lors d'une nouvelle recherche // La fonction fetchJobs sera appelée par useEffect car les états keyword ou location auront changé. }; const totalPages = Math.ceil(total / limit); return (

Job Offers

setKeyword(e.target.value)} /> setLocation(e.target.value)} /> {/* Nouveau select pour le type de contrat */} {/* Nouveaux selects pour le tri */}
{/* ... (le reste de votre JSX pour l'affichage des résultats et la pagination reste inchangé) ... */} {loading &&

Loading job offers...

} {error &&

Error: {error}

} {!loading && !error && jobs.length === 0 && (

No job offers found for your search criteria.

)} {!loading && !error && jobs.length > 0 && (

Total offers: {total}

{jobs.map((job) => (

{job.title}

Company: {job.companyName || 'N/A'}

Location: {job.locationLabel || job.cityName || 'N/A'}

Contract: {job.contractLabel || job.contractType || 'N/A'}

Published: {new Date(job.publicationDate).toLocaleDateString()}

{job.description?.substring(0, 150)}...

))}
Page {page} of {totalPages}
)}
); }; export default JobSearch;