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'; import FilterDrawer, { FilterSection, FilterSelect, FilterInput, FilterChips, FilterCheckboxList } from '../../../components/Employer/FilterDrawer'; 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 [selectedProfession, setSelectedProfession] = useState('All Professions'); const [selectedNationalities, setSelectedNationalities] = useState([]); const [selectedGender, setSelectedGender] = useState('All Genders'); const [selectedExperience, setSelectedExperience] = useState('All Experience'); const [selectedReligion, setSelectedReligion] = useState('All Religions'); const [maxSalary, setMaxSalary] = useState(5000); // 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'); // Advanced Filters Toggle & Details const [showAdvancedFilters, setShowAdvancedFilters] = useState(false); const [filterLocation, setFilterLocation] = useState('All'); const [filterJobType, setFilterJobType] = useState('All'); const [filterAccommodation, setFilterAccommodation] = useState('All'); const [filterInCountry, setFilterInCountry] = useState('All'); const [filterVisaType, setFilterVisaType] = useState('All'); // 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', workType: 'Live-in', minSalary: 1200 }, { id: 2, name: 'Experienced Driver', experience: '5+ Years' } ]); const [presetNameInput, setPresetNameInput] = useState(''); const [showPresetModal, setShowPresetModal] = useState(false); // Drawer const [drawerOpen, setDrawerOpen] = 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 sal = params.get('max_salary'); const loc = params.get('preferred_location'); const job = params.get('job_type') || params.get('preferred_job_type'); const acc = params.get('live_in_out') || params.get('accommodation_type') || params.get('accomadation_type'); const inCountryVal = params.get('in_country'); const outCountryVal = params.get('out_country'); const visa = params.get('visa_status') || params.get('next_visa_type') || params.get('visa_type'); const gender = params.get('gender'); const prof = params.get('main_profession') || params.get('profession'); let hasAdvanced = false; if (prof) { setSelectedProfession(prof); } if (nat) { setSelectedNationalities(nat.split(',').map(x => x.trim()).filter(Boolean)); } if (gender) { setSelectedGender(gender.toLowerCase() === 'male' ? 'Male' : (gender.toLowerCase() === 'female' ? 'Female' : 'All Genders')); } if (sal) setMaxSalary(Number(sal)); if (loc) { setFilterLocation(loc); hasAdvanced = true; } if (job) { setFilterJobType(job); hasAdvanced = true; } if (acc) { setFilterAccommodation(acc); hasAdvanced = true; } if (inCountryVal) { const isTrue = inCountryVal === 'true' || inCountryVal === '1' || inCountryVal === 'yes' || inCountryVal === 'in' || inCountryVal === 'In Country'; setFilterInCountry(isTrue ? 'In Country' : 'Out of Country'); hasAdvanced = true; } else if (outCountryVal) { const isTrue = outCountryVal === 'true' || outCountryVal === '1' || outCountryVal === 'yes' || outCountryVal === 'out' || outCountryVal === 'Out of Country'; setFilterInCountry(isTrue ? 'Out of Country' : 'In Country'); hasAdvanced = true; } if (visa) { setFilterVisaType(visa); hasAdvanced = true; } if (hasAdvanced) { setShowAdvancedFilters(true); } }, []); 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, setSelectedList) => { setSelectedList(prev => prev.includes(item) ? prev.filter(x => x !== item) : [...prev, item] ); }; const applyPreset = (preset) => { resetFilters(); 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, workType: selectedWorkTypes.length > 0 ? selectedWorkTypes[0] : null, experience: selectedExperience !== 'All Experience' ? selectedExperience : null, }; setSavedPresets([...savedPresets, newPreset]); setPresetNameInput(''); setShowPresetModal(false); }; const resetFilters = () => { setSearchQuery(''); setSelectedProfession('All Professions'); setSelectedNationalities([]); setSelectedGender('All Genders'); setSelectedExperience('All Experience'); setSelectedReligion('All Religions'); setMaxSalary(5000); setSelectedLanguages([]); setSelectedVisaStatuses([]); setSelectedSkills([]); setSelectedWorkTypes([]); setSortBy('default'); setVisibleCount(6); setFilterLocation('All'); setFilterJobType('All'); setFilterAccommodation('All'); setFilterInCountry('All'); setFilterVisaType('All'); }; const activeFilterCount = useMemo(() => { let count = 0; if (filterLocation !== 'All' && filterLocation.trim() !== '') count++; if (filterJobType !== 'All') count++; if (filterAccommodation !== 'All') count++; if (selectedNationalities.length > 0) count++; if (selectedGender !== 'All Genders') count++; if (selectedProfession !== 'All Professions') count++; if (filterInCountry !== 'All') count++; if (filterInCountry === 'In Country' && filterVisaType !== 'All') count++; if (selectedSkills.length > 0) count++; if (selectedLanguages.length > 0) count++; if (maxSalary < 5000) count++; return count; }, [filterLocation, filterJobType, filterAccommodation, selectedNationalities, selectedGender, selectedProfession, filterInCountry, filterVisaType, selectedSkills, selectedLanguages, maxSalary]); const activeFilterTags = useMemo(() => { const tags = []; if (filterLocation !== 'All' && filterLocation.trim()) tags.push({ key: 'loc', label: `📍 ${filterLocation}`, clear: () => setFilterLocation('All') }); if (filterJobType !== 'All') tags.push({ key: 'job', label: `💼 ${filterJobType}`, clear: () => setFilterJobType('All') }); if (filterAccommodation !== 'All') tags.push({ key: 'acc', label: `🏠 ${filterAccommodation.replace('_', '-')}`, clear: () => setFilterAccommodation('All') }); if (selectedNationalities.length > 0) tags.push({ key: 'nat', label: `🌍 ${selectedNationalities.length} Nat`, clear: () => setSelectedNationalities([]) }); if (selectedGender !== 'All Genders') tags.push({ key: 'gender', label: `🚻 ${selectedGender}`, clear: () => setSelectedGender('All Genders') }); if (selectedProfession !== 'All Professions') tags.push({ key: 'profession', label: `🧑‍🔧 ${selectedProfession}`, clear: () => setSelectedProfession('All Professions') }); if (filterInCountry !== 'All') tags.push({ key: 'country', label: `✈️ ${filterInCountry}`, clear: () => { setFilterInCountry('All'); setFilterVisaType('All'); } }); if (filterInCountry === 'In Country' && filterVisaType !== 'All') tags.push({ key: 'visa', label: `🪪 ${filterVisaType}`, clear: () => setFilterVisaType('All') }); if (selectedSkills.length > 0) tags.push({ key: 'skills', label: `🛠 ${selectedSkills.length} skill${selectedSkills.length > 1 ? 's' : ''}`, clear: () => setSelectedSkills([]) }); if (selectedLanguages.length > 0) tags.push({ key: 'lang', label: `🗣 ${selectedLanguages.length} lang`, clear: () => setSelectedLanguages([]) }); if (maxSalary < 5000) tags.push({ key: 'salary', label: `💰 ≤${maxSalary} AED`, clear: () => setMaxSalary(5000) }); return tags; }, [filterLocation, filterJobType, filterAccommodation, selectedNationalities, selectedGender, selectedProfession, filterInCountry, filterVisaType, selectedSkills, selectedLanguages, maxSalary]); // 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 (selectedProfession !== 'All Professions' && (!worker.main_profession || worker.main_profession.toLowerCase() !== selectedProfession.toLowerCase())) return false; if (selectedNationalities.length > 0 && (!worker.nationality || !selectedNationalities.map(n => n.toLowerCase()).includes(worker.nationality.toLowerCase()))) return false; if (selectedGender !== 'All Genders' && worker.gender && worker.gender.toLowerCase() !== selectedGender.toLowerCase()) return false; if (selectedExperience !== 'All Experience' && worker.experience !== selectedExperience) return false; if (selectedReligion !== 'All Religions' && worker.religion !== selectedReligion) return false; if (maxSalary < 5000 && 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; // Preferred Location if (filterLocation !== 'All' && filterLocation.trim() !== '') { const locKey = filterLocation.toLowerCase(); const locationMapping = { 'dubai': ['dubai', 'marina', 'barsha', 'nahda', 'jumeirah', 'deira', 'downtown', 'silicon', 'sports', 'motor', 'jlt', 'jbr', 'meydan', 'ranches', 'bay', 'mirdif', 'quoz'], 'abu dhabi': ['abu dhabi', 'yas', 'khalifa', 'reem', 'saadiyat', 'raha', 'mussafah', 'zahiyah', 'karamah'], 'oman': ['oman', 'muscat', 'salalah', 'sohar', 'nizwa', 'sur', 'ibri', 'rustaq'] }; const allowedKeywords = locationMapping[locKey] || [locKey]; if (!worker.preferred_location) return false; const wLoc = worker.preferred_location.toLowerCase(); const matched = allowedKeywords.some(keyword => wLoc.includes(keyword)); if (!matched) return false; } // Job Type if (filterJobType !== 'All') { if (!worker.preferred_job_type || worker.preferred_job_type.toLowerCase() !== filterJobType.toLowerCase()) return false; } // Accommodation if (filterAccommodation !== 'All') { if (!worker.live_in_out || worker.live_in_out.toLowerCase() !== filterAccommodation.toLowerCase()) return false; } // In/Out Country if (filterInCountry !== 'All') { const wantInCountry = filterInCountry === 'In Country'; const wVal = worker.in_country; if ((wVal === true || wVal === '1' || wVal === 1) !== wantInCountry) return false; } // Visa Type (if in country) if (filterInCountry === 'In Country' && filterVisaType !== 'All') { if (!worker.visa_status || !worker.visa_status.toLowerCase().includes(filterVisaType.toLowerCase())) 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, selectedProfession, selectedNationalities, selectedGender, selectedExperience, selectedReligion, maxSalary, selectedLanguages, selectedVisaStatuses, selectedSkills, selectedWorkTypes, sortBy, filterLocation, filterJobType, filterAccommodation, filterInCountry, filterVisaType ]); 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 Drawer ── */} setDrawerOpen(false)} onReset={resetFilters} activeCount={activeFilterCount} title="Filter Workers" > {/* Profession */} {filtersMetadata.professions && ( setSelectedProfession(e.target.value)} > {filtersMetadata.professions.map(prof => ( ))} )} {/* Preferred Location */} setFilterLocation(e.target.value)} > {/* Job Type */} {/* Accommodation */} {/* Nationality */} {filtersMetadata.nationalities?.length > 1 && ( n !== 'All Nationalities')} selected={selectedNationalities} onToggle={nat => toggleMultiSelect(nat, setSelectedNationalities)} /> )} {/* Gender */} {/* Country Status */} { setFilterInCountry(val); if (val !== 'In Country') setFilterVisaType('All'); }} /> {/* Visa Type */}
setFilterVisaType(e.target.value)} disabled={filterInCountry !== 'In Country'} > {filterInCountry !== 'In Country' && (

Select "In Country" to enable this filter

)}
{/* Skills */} {filtersMetadata.skills?.length > 1 && ( s.toLowerCase())} selected={selectedSkills} onToggle={skill => toggleMultiSelect(skill, setSelectedSkills)} /> )} {/* Languages */} {filtersMetadata.languages?.length > 1 && ( toggleMultiSelect(lang, setSelectedLanguages)} /> )} {/* Salary Range */} setMaxSalary(Number(e.target.value))} className="w-full accent-[#185FA5]" />
500 AED 5,000 AED
{/* Filter and Search Panel */}
{/* Search */}
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 */} {/* Filter Drawer button */}
{/* Active filter tags */} {activeFilterTags.length > 0 && (
Active: {activeFilterTags.map(tag => ( ))}
)}
{/* 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.main_profession && ( {worker.main_profession} )}
{/* Passport Status Verification Badge & Visa Status */}
{worker.visa_expiry_date ? (
Visa Exp: {worker.visa_expiry_date}
) : (
Visa Expiry Pending
)} {worker.visa_status && (worker.visa_status.toLowerCase().includes('tourist') || worker.visa_status.toLowerCase().includes('visit')) ? (
{worker.visa_status}
) : worker.visa_status && worker.visa_status.toLowerCase().includes('cancelled') ? (
{worker.visa_status}
) : (
{worker.visa_status}
)}
{worker.nationality} {worker.age} {t('yrs', 'yrs')}
{/* Top Right Actions & Salary */}
{worker.salary} {t('aed', 'AED')}
/{t('mo', 'mo')}
{/* Card Body */}
{/* Details Table */}
{t('experience', 'Exp')}: {worker.experience}
{worker.preferred_job_type}
{worker.preferred_location || 'Not Specified'}
{worker.rating} ({worker.reviews_count})
{/* Core exact platform Skills List */}
{t('platform_skills', 'Platform Skills')}
{worker.skills?.slice(0, 3).map(skill => ( {skill} ))} {worker.skills?.length > 3 && ( +{worker.skills.length - 3} More )}
{/* Languages Badges with Visual Flags */}
{t('languages_spoken', 'Languages Spoken')}
{worker.languages?.map(lang => ( {getLanguageFlag(lang)} {lang} ))}
{/* Actions block */}
View 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}
{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('location', 'Location')}: {w.preferred_location || 'Not Specified'}
{t('skills')}
{w.skills?.map(skill => ( {skill} ))}
))}
)} {/* 6. Quick Preview Modal overlay */} {previewWorker && (
{previewWorker.photo ? ( {previewWorker.name} ) : ( )}

{previewWorker.name}

{previewWorker.main_profession && (
{previewWorker.main_profession}
)} {previewWorker.visa_expiry_date ? (
Visa Exp: {previewWorker.visa_expiry_date}
) : (
Visa Expiry Pending
)}
{previewWorker.nationality}
{t('expectations', 'Expectations')}
{previewWorker.salary} {t('aed', 'AED')} / {t('mo', 'mo')}
{t('job_type', 'Job Type')}
{previewWorker.preferred_job_type}
{t('gender', 'Gender')}
{previewWorker.gender || 'Female'}
{t('visa_status', 'Visa Status')}
{previewWorker.visa_status || 'Residence Visa'}
{t('preferred_location', 'Preferred Location')}
{previewWorker.preferred_location || 'Not Specified'}
{t('languages_spoken', 'Languages')}
{previewWorker.languages?.map(lang => ( {getLanguageFlag(lang)} {lang} ))}
{/* 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 />
)}
); }