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 (
{error?.message || 'Please try again later.'}
Find your next career opportunity
{job.description}
Try adjusting your search criteria
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