import React, { useState } from 'react'; import { Head, Link, router } from '@inertiajs/react'; import AdminLayout from '@/Layouts/AdminLayout'; import { Users, Search, Filter, MoreHorizontal, CheckCircle2, XCircle, UserCheck, UserX, Mail, Globe, Briefcase, Download, Phone, FileText, AlertTriangle, Eye, ShieldAlert, Clock, Ban, FileEdit, CheckSquare, MapPin } from 'lucide-react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; const locationData = { 'United Arab Emirates': { 'Dubai': ['Dubai Marina', 'Downtown Dubai', 'Al Barsha', 'Jumeirah', 'Al Quoz', 'JLT'], 'Abu Dhabi': ['Yas Island', 'Al Reem Island', 'Khalifa City', 'Al Khalidiyah'], 'Sharjah': ['Al Nahda', 'Al Majaz', 'Muwaileh', 'Al Khan'] }, 'Saudi Arabia': { 'Riyadh': ['Al Olaya', 'Al Malaz', 'Al Yasmin', 'Al Mursalat'], 'Jeddah': ['Al Hamra', 'Al Naeem', 'Al Safa', 'Al Khalidiyah'] } }; export default function WorkerManagement({ workers }) { const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); // Dialog / Worker selection state const [selectedWorker, setSelectedWorker] = useState(null); const [isDetailDialogOpen, setIsDetailDialogOpen] = useState(false); const [isEditMode, setIsEditMode] = useState(false); // Form inputs for Profile Moderation const [editForm, setEditForm] = useState({ name: '', phone: '', language: '', experience: '', bio: '', country: '', city: '', area: '', preferred_location: '', live_in_out: '', nationality: '', visa_status: '', religion: '', age: '', in_country: true, preferred_job_type: '', }); const [adminNotes, setAdminNotes] = useState(''); const handleToggleStatus = (id, newStatus) => { router.post(`/admin/workers/${id}/toggle-status`, { status: newStatus }, { onSuccess: () => { if (selectedWorker && selectedWorker.id === id) { setSelectedWorker({ ...selectedWorker, status: newStatus }); } } }); }; const handleAvailabilityOverride = (id, availability) => { router.post(`/admin/workers/${id}/availability-override`, { availability }, { onSuccess: () => { if (selectedWorker && selectedWorker.id === id) { setSelectedWorker({ ...selectedWorker, availability }); } } }); }; const handleFlagFraud = (id, isFraud, reason) => { router.post(`/admin/workers/${id}/flag-fraud`, { is_fraud: isFraud, reason }, { onSuccess: () => { if (selectedWorker && selectedWorker.id === id) { setSelectedWorker({ ...selectedWorker, is_fraud: isFraud, fraud_notes: reason }); } } }); }; const handleProfileSubmit = (e) => { e.preventDefault(); router.post(`/admin/workers/${selectedWorker.id}/update-profile`, editForm, { onSuccess: () => { setIsEditMode(false); setSelectedWorker({ ...selectedWorker, name: editForm.name, phone: editForm.phone, gender: editForm.gender, language: editForm.language, experience: editForm.experience, salary: editForm.salary, bio: editForm.bio, country: editForm.country, city: editForm.city, area: editForm.area, preferred_location: editForm.preferred_location, live_in_out: editForm.live_in_out, nationality: editForm.nationality, visa_status: editForm.visa_status, religion: editForm.religion, age: editForm.age, in_country: editForm.in_country, preferred_job_type: editForm.preferred_job_type }); } }); }; const handleVerifyAction = (id, action) => { router.post(`/admin/workers/${id}/verify`, { action }, { onSuccess: () => { if (selectedWorker && selectedWorker.id === id) { setSelectedWorker({ ...selectedWorker, verified: action === 'approve' }); } } }); }; const openWorkerDetails = (worker) => { const fullWorker = { ...worker, phone: worker.phone || '+971 52 489 1209', age: worker.age || 28, bio: worker.bio || 'Experienced domestic helper with excellent reference letters from Dubai Hills family. Specialist in childcare, Arabic cooking, and pet sitting.', verified: worker.verified !== undefined ? worker.verified : true, availability: worker.availability || 'Available Now', is_fraud: worker.is_fraud || false, fraud_notes: worker.fraud_notes || '', admin_notes: worker.admin_notes || 'Profile reviewed during initial batch. OCR extraction was successful.' }; setSelectedWorker(fullWorker); setEditForm({ name: fullWorker.name, phone: fullWorker.phone, gender: fullWorker.gender || 'Female', language: fullWorker.language || 'English', experience: fullWorker.experience, salary: fullWorker.salary || '', bio: fullWorker.bio, country: fullWorker.country || '', city: fullWorker.city || '', area: fullWorker.area || '', preferred_location: fullWorker.preferred_location || '', live_in_out: fullWorker.live_in_out || '', nationality: fullWorker.nationality || '', visa_status: fullWorker.visa_status || '', religion: fullWorker.religion || '', age: fullWorker.age || '', in_country: fullWorker.in_country ?? true, preferred_job_type: fullWorker.preferred_job_type || '', }); setAdminNotes(fullWorker.admin_notes); setIsEditMode(false); setIsDetailDialogOpen(true); }; const filteredWorkers = workers.map(w => ({ ...w, availability: w.availability || 'Available Now', verified: w.verified !== undefined ? w.verified : (w.status === 'active') })).filter(worker => { const matchesSearch = worker.name.toLowerCase().includes(searchTerm.toLowerCase()) || worker.email.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || worker.status === statusFilter; return matchesSearch && matchesStatus; }); return (
{/* Header Section */}

Worker Profile Directory

Full profile moderation, availability overrides, fraud alerts, and suspension management.

Verification OCR Queue
{/* Filters & Search */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2.5 bg-slate-50 border border-slate-100 rounded-xl text-sm focus:bg-white focus:ring-4 focus:ring-[#0F6E56]/10 outline-none transition-all font-medium" />
Lifecycle Filter:
{['all', 'active', 'inactive', 'suspended'].map((f) => ( ))}
{/* Workers Table */}
Worker Languages Nationality Preferred Location Accommodation Salary Status Actions {filteredWorkers.length > 0 ? ( filteredWorkers.map((worker) => { const languages = worker.languages || (worker.language ? worker.language.split(',').map(l => l.trim()) : []); const isLiveIn = worker.live_in_out?.toLowerCase().includes('in') || worker.live_in_out?.toLowerCase().includes('stay'); return (
{worker.name.charAt(0)}
{worker.name} {worker.id === 103 && ( Suspicious )}
{worker.gender || 'Female'} {worker.age && • {worker.age} Yrs}
{worker.phone}
{languages.length > 0 ? languages.map((lang, idx) => ( {lang} )) : ( English )}
{worker.nationality}
{worker.preferred_location ? (
{worker.preferred_location}
) : worker.city ? (
{worker.city}
{worker.area}
) : ( Not set )}
{isLiveIn ? 'Live-in' : 'Live-out'}
{worker.salary ? `${worker.salary.toLocaleString()} AED` : 'N/A'} / month
{worker.status}
Quick Actions handleToggleStatus(worker.id, worker.status === 'active' ? 'suspended' : 'active')} className="flex items-center gap-2 p-2 rounded-lg cursor-pointer font-bold text-xs text-red-600 hover:bg-red-50" > {worker.status === 'active' ? ( <> Suspend Account ) : ( <> Activate Account )}
); }) ) : (
No workers found matching your criteria.
)}
{/* Worker Management & Moderation Dialog */} {/* Top Header Banner */}
{selectedWorker?.is_fraud && (
FRAUD WARNING
)}
{selectedWorker?.name ? selectedWorker.name.charAt(0) : ''}

{selectedWorker?.name}

{selectedWorker?.verified ? 'Verified' : 'Pending'}

{selectedWorker?.nationality}

{/* Scrollable details tab */}
{isEditMode ? (

Basic Information

setEditForm({ ...editForm, name: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" required />
setEditForm({ ...editForm, phone: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" required />
setEditForm({ ...editForm, language: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" />
setEditForm({ ...editForm, age: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" />
setEditForm({ ...editForm, nationality: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" />
setEditForm({ ...editForm, religion: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" />

Classification & Experience

setEditForm({ ...editForm, experience: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" required />
setEditForm({ ...editForm, salary: e.target.value })} className="w-full bg-white border border-slate-200 rounded-xl p-2.5 text-xs font-bold text-slate-700 outline-none focus:ring-2 focus:ring-[#0F6E56]/20" />
{/* Dependent Location Dropdowns */}

Preferred Location Settings

{editForm.preferred_location && (
Saved Location String: {editForm.preferred_location}
)}
) : ( <>
{/* Left/Middle Column (2/3) */}
{/* Verification banner if pending */} {!selectedWorker?.verified && (

Profile Pending Verification

Verify candidate's document credentials.

)} {/* Profile Information Card */}

Worker Profile Details

{selectedWorker?.gender || 'N/A'}
{selectedWorker?.salary ? `${selectedWorker.salary} AED / mo` : 'N/A'}
{selectedWorker?.experience}
{selectedWorker?.preferred_job_type || 'N/A'}
{selectedWorker?.live_in_out || 'N/A'}
{selectedWorker?.language || 'English'}
{selectedWorker?.nationality || 'N/A'}
{selectedWorker?.visa_status || 'N/A'}
{selectedWorker?.religion || 'N/A'}
{selectedWorker?.age || 'N/A'}
{selectedWorker?.in_country ? 'In Country (UAE)' : 'Out of Country'}
{selectedWorker?.skills?.map(skill => ( {skill} )) || 'N/A'}
{/* Passport Details */}

Passport Details

{(() => { const passportDoc = selectedWorker?.documents?.find(d => d.type === 'passport'); if (!passportDoc) { return (
No passport details available.
); } return (
Passport Number {passportDoc.ocr_data?.passport_number || passportDoc.number || 'N/A'}
Given Names {passportDoc.ocr_data?.given_names || 'N/A'}
Date of Birth {passportDoc.ocr_data?.date_of_birth || 'N/A'}
Nationality {passportDoc.ocr_data?.nationality || 'N/A'}
Issuing Country {passportDoc.ocr_data?.issuing_country || 'N/A'}
Place of Birth {passportDoc.ocr_data?.place_of_birth || 'N/A'}
Date of Issue {passportDoc.ocr_data?.date_of_issue || passportDoc.issue_date || 'N/A'}
Date of Expiry {passportDoc.ocr_data?.date_of_expiry || passportDoc.expiry_date || 'N/A'}
{passportDoc.file_path && ( )}
); })()}
{/* Visa Details */}

Visa Details

{(() => { const visaDoc = selectedWorker?.documents?.find(d => d.type === 'visa'); if (!visaDoc) { return (
No visa details available.
); } return (
File Number {visaDoc.ocr_data?.file_number || visaDoc.number || 'N/A'}
ID Number {visaDoc.ocr_data?.id_number || 'N/A'}
Issue Date {visaDoc.ocr_data?.issue_date || visaDoc.issue_date || 'N/A'}
Expiry Date {visaDoc.ocr_data?.expiry_date || visaDoc.expiry_date || 'N/A'}
Passport Number {visaDoc.ocr_data?.passport_number || 'N/A'}
Place of Issue {visaDoc.ocr_data?.place_of_issue || 'N/A'}
Sponsor {visaDoc.ocr_data?.sponsor || 'N/A'}
{visaDoc.file_path && ( )}
); })()}
{/* Compliance Notes */}