"use client"; import React, { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Career } from '@/app/types'; import { apiClient } from '@/app/utils/apiClient'; import { Box, Card, CardContent, Typography, Button, Divider, Grid, TextField, MenuItem, InputAdornment, Pagination, CircularProgress, Alert, Chip } from '@mui/material'; import SearchIcon from '@mui/icons-material/Search'; import LocationOnIcon from '@mui/icons-material/LocationOn'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import './Career.scss'; const CareerList: React.FC = () => { const router = useRouter(); const [careers, setCareers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [searchQuery, setSearchQuery] = useState(''); const [selectedLocation, setSelectedLocation] = useState(''); const [locations, setLocations] = useState([]); const fetchCareers = async () => { setLoading(true); try { const params = new URLSearchParams(); params.append('page', page.toString()); params.append('limit', '6'); // Show 6 jobs per page params.append('status', 'active'); // Only show active jobs if (searchQuery) { params.append('search', searchQuery); } if (selectedLocation) { params.append('location', selectedLocation); } const response = await apiClient(`/careers/listings?${params.toString()}`); if (response.success) { setCareers(response.data); setTotalPages(response.totalPages || 1); // Extract unique locations for filter dropdown const uniqueLocations = Array.from( new Set(response.data.map((career: Career) => career.location as string)) ) as string[]; // Check if we need to update the locations array if (locations.length === 0 && uniqueLocations.length > 0) { setLocations(uniqueLocations); } } else { setError('Failed to load job listings'); } } catch (err) { console.error('Error fetching careers:', err); setError('Failed to load job listings. Please try again.'); } finally { setLoading(false); } }; useEffect(() => { fetchCareers(); }, [page, selectedLocation]); const handleSearch = () => { setPage(1); // Reset to first page when searching fetchCareers(); }; const handleLocationChange = (event: React.ChangeEvent) => { setSelectedLocation(event.target.value); setPage(1); // Reset to first page when changing location }; const handlePageChange = (event: React.ChangeEvent, value: number) => { setPage(value); }; const handleCardClick = (careerId: number) => { router.push(`/careers/${careerId}`); }; return (
setSearchQuery(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSearch()} InputProps={{ startAdornment: ( ), }} /> All Locations {locations.map((location, index) => ( {location} ))} {error && ( {error} )} {loading ? ( ) : careers.length === 0 ? ( No job listings found Please try different search criteria or check back later for new opportunities ) : ( <> {careers.map((career) => ( handleCardClick(career.id)} sx={{ cursor: 'pointer', transition: 'transform 0.2s, box-shadow 0.2s', '&:hover': { transform: 'translateY(-4px)', boxShadow: '0 8px 16px rgba(0,0,0,0.1)' } }} > {career.title} {career.location} {career.salary && ( )} {career.description} Posted: {new Date(career.createdAt).toLocaleDateString()} ))} {totalPages > 1 && ( )} )}
); }; export default CareerList;