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 [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');
let hasAdvanced = false;
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('');
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 (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, 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 (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, 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 (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,
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 (
{t('connect_vetted_workers_desc')}
Select "In Country" to enable this filter
)}{t('adjust_filters_desc')}