import React, { useState, useMemo, useEffect } from 'react';
import { Head, Link, router } from '@inertiajs/react';
import EmployerLayout from '../../../Layouts/EmployerLayout';
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 = {} }) {
// 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 (
Instantly connect with UAE vetted, background-checked domestic workers.
Try adjusting your salary limit, adding additional languages, or broadening nationality preferences.
"{previewWorker.bio}"