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 } 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: '', category: '', experience: '', bio: '', country: '', city: '', area: '', preferred_location: '', live_in_out: '', }); 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, category: editForm.category, 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 }); } }); }; 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', category: fullWorker.category, 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 || '', }); 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 Information Placement Status Verification Status Category, Exp & Languages Location Details Lifecycle Actions {filteredWorkers.length > 0 ? ( filteredWorkers.map((worker) => (
{worker.name.charAt(0)}
{worker.name} {worker.id === 103 && ( Suspicious )}
{worker.phone} • {worker.email}
{worker.availability}
{worker.verified ? 'OCR Verified' : 'Pending Verification'}
{worker.category}
{worker.nationality} • {worker.experience}
Lang: {worker.language}
{worker.country ? ( <>
{worker.city}, {worker.country}
{worker.area}
) : ( Not set )}
{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 )} handleAvailabilityOverride(worker.id, 'Available Now')} className="flex items-center gap-2 p-2 rounded-lg cursor-pointer font-bold text-xs text-slate-700 hover:bg-slate-50" > Mark Available handleAvailabilityOverride(worker.id, 'Engaged')} className="flex items-center gap-2 p-2 rounded-lg cursor-pointer font-bold text-xs text-slate-700 hover:bg-slate-50" > Mark Engaged
)) ) : (
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?.nationality} • ID #{selectedWorker?.id}

{/* 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" />

Classification & Experience

setEditForm({ ...editForm, category: 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, 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}
)}