import React, { useState, useMemo, useEffect } from 'react'; import { Head, Link, router } from '@inertiajs/react'; import EmployerLayout from '../../../Layouts/EmployerLayout'; import { useTranslation } from '../../../lib/LanguageContext'; import { Search, SlidersHorizontal, CheckCircle2, MapPin, Briefcase, DollarSign, Calendar, Bookmark, RotateCcw, HeartHandshake, Globe2, Sparkles, Filter, ArrowUpDown, Check, X, Eye, ChevronDown, Layers, AlertTriangle, Star, CheckCircle, ShieldCheck, User } from 'lucide-react'; const getLanguageFlag = (lang) => { const flags = { 'English': '🇬🇧', 'Arabic': '🇦🇪', 'Tagalog': '🇵🇭', 'Hindi': '🇮🇳', 'Swahili': '🇰🇪', 'French': '🇫🇷', 'Indonesian': '🇮🇩' }; return flags[lang] || '🌐'; }; export default function Index({ initialWorkers = [], initialShortlistedIds = [], filtersMetadata = {} }) { const { t } = useTranslation(); // Basic Filters const [searchQuery, setSearchQuery] = useState(''); const [selectedCategory, setSelectedCategory] = useState('All Categories'); const [selectedNationality, setSelectedNationality] = useState('All Nationalities'); const [selectedAvailability, setSelectedAvailability] = useState('All Availabilities'); const [selectedExperience, setSelectedExperience] = useState('All Experience'); const [selectedReligion, setSelectedReligion] = useState('All Religions'); const [maxSalary, setMaxSalary] = useState(3000); // Advanced Multi-Select Filters & Sorting const [selectedLanguages, setSelectedLanguages] = useState([]); const [selectedVisaStatuses, setSelectedVisaStatuses] = useState([]); const [selectedSkills, setSelectedSkills] = useState([]); const [selectedWorkTypes, setSelectedWorkTypes] = useState([]); const [sortBy, setSortBy] = useState('default'); // UI Helpers const [isLangOpen, setIsLangOpen] = useState(false); const [isVisaOpen, setIsVisaOpen] = useState(false); const [isSkillsOpen, setIsSkillsOpen] = useState(false); const [isWorkTypeOpen, setIsWorkTypeOpen] = useState(false); // Pagination const [visibleCount, setVisibleCount] = useState(6); // Shortlist / Favorites const [shortlistedIds, setShortlistedIds] = useState(initialShortlistedIds || []); // Saved Presets const [savedPresets, setSavedPresets] = useState([ { id: 1, name: 'Live-in Baby Care', category: 'Childcare', workType: 'Live-in', minSalary: 1200 }, { id: 2, name: 'Experienced Driver', category: 'Driver', experience: '5+ Years' } ]); const [presetNameInput, setPresetNameInput] = useState(''); const [showPresetModal, setShowPresetModal] = useState(false); // Worker Comparison & Quick Preview const [comparisonIds, setComparisonIds] = useState([]); const [previewWorker, setPreviewWorker] = useState(null); // Retrieve active preset query if present useEffect(() => { const params = new URLSearchParams(window.location.search); const cat = params.get('category'); const nat = params.get('nationality'); const avail = params.get('availability'); const sal = params.get('max_salary'); if (cat) setSelectedCategory(cat); if (nat) setSelectedNationality(nat); if (avail) setSelectedAvailability(avail); if (sal) setMaxSalary(Number(sal)); }, []); const toggleShortlist = (id) => { if (shortlistedIds.includes(id)) { setShortlistedIds(shortlistedIds.filter(i => i !== id)); } else { setShortlistedIds([...shortlistedIds, id]); } router.post('/employer/shortlist/toggle', { worker_id: id }, { preserveScroll: true, onSuccess: (page) => { if (page.props.initialShortlistedIds) { setShortlistedIds(page.props.initialShortlistedIds); } } }); }; const toggleMultiSelect = (item, selectedList, setSelectedList) => { if (selectedList.includes(item)) { setSelectedList(selectedList.filter(x => x !== item)); } else { setSelectedList([...selectedList, item]); } }; const applyPreset = (preset) => { resetFilters(); if (preset.category) setSelectedCategory(preset.category); if (preset.workType) setSelectedWorkTypes([preset.workType]); if (preset.experience) setSelectedExperience(preset.experience); }; const saveCurrentPreset = (e) => { e.preventDefault(); if (!presetNameInput.trim()) return; const newPreset = { id: Date.now(), name: presetNameInput, category: selectedCategory !== 'All Categories' ? selectedCategory : null, workType: selectedWorkTypes.length > 0 ? selectedWorkTypes[0] : null, experience: selectedExperience !== 'All Experience' ? selectedExperience : null, }; setSavedPresets([...savedPresets, newPreset]); setPresetNameInput(''); setShowPresetModal(false); }; const resetFilters = () => { setSearchQuery(''); setSelectedCategory('All Categories'); setSelectedNationality('All Nationalities'); setSelectedAvailability('All Availabilities'); setSelectedExperience('All Experience'); setSelectedReligion('All Religions'); setMaxSalary(3000); setSelectedLanguages([]); setSelectedVisaStatuses([]); setSelectedSkills([]); setSelectedWorkTypes([]); setSortBy('default'); setVisibleCount(6); }; // Filter and Sort Worker List const filteredWorkers = useMemo(() => { let workers = initialWorkers.filter(worker => { // Search Query if (searchQuery.trim() !== '') { const query = searchQuery.toLowerCase(); const matchName = worker.name.toLowerCase().includes(query); const matchBio = worker.bio?.toLowerCase().includes(query) || false; const matchSkills = worker.skills?.some(s => s.toLowerCase().includes(query)) || false; if (!matchName && !matchBio && !matchSkills) return false; } // Dropdown filters if (selectedCategory !== 'All Categories' && worker.category !== selectedCategory) return false; if (selectedNationality !== 'All Nationalities' && worker.nationality !== selectedNationality) return false; if (selectedAvailability !== 'All Availabilities' && worker.availability_status !== selectedAvailability) return false; if (selectedExperience !== 'All Experience' && worker.experience !== selectedExperience) return false; if (selectedReligion !== 'All Religions' && worker.religion !== selectedReligion) return false; if (worker.salary > maxSalary) return false; // Multi-select filters if (selectedLanguages.length > 0) { const hasLang = worker.languages?.some(l => selectedLanguages.includes(l)); if (!hasLang) return false; } if (selectedSkills.length > 0) { const hasSkill = worker.skills?.some(s => selectedSkills.includes(s.toLowerCase())); if (!hasSkill) return false; } if (selectedVisaStatuses.length > 0) { if (!selectedVisaStatuses.includes(worker.visa_status)) return false; } if (selectedWorkTypes.length > 0 && !selectedWorkTypes.includes(worker.preferred_job_type)) return false; return true; }); // Sorting if (sortBy === 'salary_asc') { workers.sort((a, b) => a.salary - b.salary); } else if (sortBy === 'salary_desc') { workers.sort((a, b) => b.salary - a.salary); } else if (sortBy === 'rating') { workers.sort((a, b) => b.rating - a.rating); } else if (sortBy === 'experience') { workers.sort((a, b) => b.age - a.age); // approximate experience by age } return workers; }, [ initialWorkers, searchQuery, selectedCategory, selectedNationality, selectedAvailability, selectedExperience, selectedReligion, maxSalary, selectedLanguages, selectedVisaStatuses, selectedSkills, selectedWorkTypes, sortBy ]); const paginatedWorkers = useMemo(() => { return filteredWorkers.slice(0, visibleCount); }, [filteredWorkers, visibleCount]); const handleToggleComparison = (id) => { if (comparisonIds.includes(id)) { setComparisonIds(comparisonIds.filter(i => i !== id)); } else { if (comparisonIds.length >= 3) { alert('You can compare a maximum of 3 candidates.'); return; } setComparisonIds([...comparisonIds, id]); } }; const comparedWorkers = useMemo(() => { return initialWorkers.filter(w => comparisonIds.includes(w.id)); }, [initialWorkers, comparisonIds]); return (
{/* 1. Header Banner */}
{t('no_middlemen_platform')}

{t('find_verified_candidates')}

{t('connect_vetted_workers_desc')}

{/* Filter and Search Panel */}
{/* Core Search bar */}
setSearchQuery(e.target.value)} placeholder={t('search_by_name_skills_bio')} className="w-full pl-11 pr-4 py-3 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Sort & Reset Actions */}
{/* Sort Selector */}
{/* Primary filters grid */}
{/* Nationality */}
{/* Skills */}
{isSkillsOpen && (
{filtersMetadata.skills?.slice(1).map(skill => ( ))}
)}
{/* Language */}
{isLangOpen && (
{filtersMetadata.languages?.slice(1).map(lang => ( ))}
)}
{/* Availability */}
{/* Visa Status */}
{isVisaOpen && (
{filtersMetadata.visaStatuses?.slice(1).map(status => ( ))}
)}
{/* Listing metadata bar */}
{t('found_workers_matching').split('{count}')[0]} {filteredWorkers.length} {t('found_workers_matching').split('{count}')[1]}
{t('direct_sponsoring_active')}
{/* Marketplace Workers Grid */} {paginatedWorkers.length > 0 ? (
{paginatedWorkers.map((worker) => { const isShortlisted = shortlistedIds.includes(worker.id); const isComparing = comparisonIds.includes(worker.id); return (
{/* Card Header with Photo Option and Availability indicator */}
{/* Photo (optional) container */}
{worker.photo ? ( {worker.name} ) : ( )}
{worker.name} {worker.verified && ( {t('verified')} )}
{/* Emirates ID Status Verification Badge & Visa Status */}
{worker.emirates_id_status}
{worker.visa_status && (worker.visa_status.toLowerCase().includes('tourist') || worker.visa_status.toLowerCase().includes('visit')) ? (
{worker.visa_status} ({t('warning', 'Warning')})
) : worker.visa_status && worker.visa_status.toLowerCase().includes('cancelled') ? (
{worker.visa_status} ({t('warning', 'Warning')})
) : (
{worker.visa_status}
)}
{worker.nationality} {worker.age} {t('yrs', 'yrs')}
{/* Top Right Availability status and bookmark */}
{worker.availability_status}
{/* Card Body */}
{/* Category Pill, Ratings & Cost */}
{worker.category}
{worker.salary} {t('aed', 'AED')} /{t('mo', 'mo')}
{/* Details Table */}
{t('experience', 'Exp')}: {worker.experience}
{worker.preferred_job_type}
{worker.rating} ({worker.reviews_count} {t('reviews', 'reviews')})
{/* Core exact platform Skills List */}
{t('platform_skills', 'Platform Skills')}
{worker.skills?.map(skill => ( {skill} ))}
{/* Languages Badges with Visual Flags */}
{t('languages_spoken', 'Languages Spoken')}
{worker.languages?.map(lang => ( {getLanguageFlag(lang)} {lang} ))}
{/* Actions block */}
{t('open_full_profile')}
); })}
) : (

{t('no_candidates_matching')}

{t('adjust_filters_desc')}

)} {/* Load More Pagination */} {filteredWorkers.length > visibleCount && (
)} {/* 5. Worker Comparison Drawer (Col 12 Fixed bottom) */} {comparisonIds.length > 0 && (

{t('comparing_workers_count').replace('{count}', comparedWorkers.length)}

{comparedWorkers.map(w => (
{w.photo ? ( {w.name} ) : ( {w.name.charAt(0)} )}
{w.name}
{w.nationality} • {w.category}
{t('salary', 'Salary')}: {w.salary} {t('aed', 'AED')}
{t('age', 'Age')}: {w.age} {t('yrs', 'yrs')}
{t('job_type', 'Job Type')}: {w.preferred_job_type}
{t('status', 'Status')}: {w.availability_status}
{t('skills')}
{w.skills?.map(skill => ( {skill} ))}
))}
)} {/* 6. Quick Preview Modal overlay */} {previewWorker && (
{previewWorker.photo ? ( {previewWorker.name} ) : ( )}

{previewWorker.name}

{previewWorker.verified && }
{previewWorker.emirates_id_status}
{previewWorker.nationality} • {previewWorker.category}

"{previewWorker.bio}"

{t('expectations', 'Expectations')}
{previewWorker.salary} {t('aed', 'AED')} / {t('mo', 'mo')}
{t('languages_spoken', 'Languages')}
{previewWorker.languages?.map(lang => ( {getLanguageFlag(lang)} {lang} ))}
{t('availability_status', 'Availability Status')}
{previewWorker.availability_status}
{t('job_preference', 'Job Preference')}
{previewWorker.preferred_job_type}
{/* Core Platform Skills inside Quick Preview */}
{t('platform_skills', 'Platform Skills')}
{previewWorker.skills?.map(skill => ( {skill} ))}
{t('view_full_details', 'View Full Details')}
)} {/* Preset Modal */} {showPresetModal && (

Name this search preset

setPresetNameInput(e.target.value)} className="w-full p-2.5 border border-slate-300 rounded-xl text-xs focus:outline-none focus:border-[#185FA5]" required />
)}
); }