import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import { useQuery } from 'react-query'; import axios from 'axios'; import { useAuth } from '../contexts/AuthContext'; import { Search, MapPin, Clock, DollarSign, Briefcase, Plus } from 'lucide-react'; const Jobs = () => { const { user } = useAuth(); const [filters, setFilters] = useState({ search: '', location: '', employmentType: '', experienceLevel: '' }); const { data, isLoading, isError, error, refetch } = useQuery(['jobs', filters], async () => { const params = new URLSearchParams(); Object.entries(filters).forEach(([key, value]) => { if (value) params.append(key, value); }); const response = await axios.get(`/api/jobs?${params.toString()}`); return response.data; }); const handleFilterChange = (e) => { setFilters({ ...filters, [e.target.name]: e.target.value }); }; const handleSearch = (e) => { e.preventDefault(); refetch(); }; const formatSalary = (min, max, currency = 'USD') => { if (!min && !max) return 'Salary not specified'; if (!min) return `Up to ${currency} ${max?.toLocaleString()}`; if (!max) return `From ${currency} ${min?.toLocaleString()}`; return `${currency} ${min?.toLocaleString()} - ${max?.toLocaleString()}`; }; const getStatusColor = (status) => { switch (status) { case 'active': return 'bg-green-100 text-green-800'; case 'paused': return 'bg-yellow-100 text-yellow-800'; case 'closed': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; if (isLoading) { return (
); } if (isError) { return (

Unable to load jobs

{error?.message || 'Please try again later.'}

); } return (

Job Postings

Find your next career opportunity

{(user?.role === 'employer' || user?.role === 'recruiter') && ( Post a Job )}
{/* Filters */}
{/* Jobs List */}
{data?.jobs?.length > 0 ? ( data.jobs.map((job) => (

{job.title}

{job.status}
{job.company_name}
{job.location} {job.remote_allowed && (Remote OK)}
{formatSalary(job.salary_min, job.salary_max, job.currency)}
{new Date(job.created_at).toLocaleDateString()}

{job.description}

{job.skills_required && job.skills_required.length > 0 && (
{job.skills_required.slice(0, 5).map((skill, index) => ( {skill} ))} {job.skills_required.length > 5 && ( +{job.skills_required.length - 5} more )}
)}
)) ) : (

No jobs found

Try adjusting your search criteria

)}
{/* Pagination */} {data?.pagination && data.pagination.pages > 1 && (

Showing{' '} {((data.pagination.page - 1) * data.pagination.limit) + 1} {' '} to{' '} {Math.min(data.pagination.page * data.pagination.limit, data.pagination.total)} {' '} of{' '} {data.pagination.total}{' '} results

)}
); }; export default Jobs;