import React, { useState } from 'react'; import { Head, Link, router } from '@inertiajs/react'; import EmployerLayout from '../../../Layouts/EmployerLayout'; import { useTranslation } from '../../../lib/LanguageContext'; import { CheckCircle2, Globe2, Briefcase, DollarSign, Calendar, HeartHandshake, Languages, MessageSquare, Bookmark, ArrowLeft, Sparkles, FileText, ShieldCheck, Search, Star, Share2, Flag, X, UserCheck, AlertTriangle, User, Phone, MapPin, Clock } from 'lucide-react'; import { toast } from 'sonner'; const getLanguageFlag = (lang) => { const flags = { 'English': '🇬🇧', 'Arabic': '🇦🇪', 'Tagalog': '🇵🇭', 'Hindi': '🇮🇳', 'Swahili': '🇰🇪', 'French': '🇫🇷', 'Indonesian': '🇮🇩' }; return flags[lang] || '🌐'; }; const getExpiryStatus = (expiryDate) => { if (!expiryDate) return { text: 'Expiry Pending', color: 'text-slate-500 bg-slate-50 border-slate-200' }; const expiry = new Date(expiryDate); const today = new Date(); expiry.setHours(0,0,0,0); today.setHours(0,0,0,0); const diffTime = expiry.getTime() - today.getTime(); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); if (diffDays < 0) { return { text: 'Expired', color: 'text-rose-700 bg-rose-50 border-rose-200 font-black' }; } else if (diffDays === 0) { return { text: 'Expires today', color: 'text-amber-700 bg-amber-50 border-amber-200 font-black' }; } else { return { text: `Valid until ${expiryDate}`, color: 'text-emerald-700 bg-emerald-50 border-emerald-150 font-black' }; } }; const safeRender = (value, fallback = 'Not Extracted') => { if (value === null || value === undefined || String(value).trim() === '') return fallback; if (typeof value === 'object') { if (value.name) return String(value.name); if (value.full_name) return String(value.full_name); return JSON.stringify(value); } return String(value); }; export default function Show({ worker }) { const { t } = useTranslation(); const passportDoc = worker.documents?.find(d => d.type === 'passport'); const emiratesIdDoc = worker.documents?.find(d => d.type === 'emirates_id' || d.type === 'eid'); const visaDoc = worker.documents?.find(d => d.type === 'visa'); // Robust passport document fallbacks const passportOcr = passportDoc?.ocr_data || {}; const passportGivenNames = passportOcr.given_names || worker.name || 'Not Extracted'; const passportSurname = passportOcr.surname || ''; const passportNumber = passportOcr.passport_number || passportDoc?.number || 'Not Extracted'; const passportSex = passportOcr.sex || worker.gender || 'Not Extracted'; const passportDob = passportOcr.date_of_birth || (worker.age ? `Age ${worker.age}` : 'Not Extracted'); const passportPlaceOfBirth = passportOcr.place_of_birth || 'Not Extracted'; const passportNationality = passportOcr.nationality || worker.nationality || 'Not Extracted'; const passportIssuingCountry = passportOcr.issuing_country || 'Not Extracted'; const passportIssueDate = passportOcr.date_of_issue || passportDoc?.issue_date || 'Not Extracted'; const passportExpiryDate = passportOcr.date_of_expiry || passportDoc?.expiry_date || 'Not Extracted'; const passportAuthority = passportOcr.authority || 'Not Extracted'; const passportDocType = passportOcr.document_type || passportDoc?.type || 'Passport'; // Robust visa document fallbacks const visaOcr = visaDoc?.ocr_data || {}; const sponsorObj = visaOcr.sponsor; const isSponsorObj = sponsorObj && typeof sponsorObj === 'object' && !Array.isArray(sponsorObj); const sponsorName = isSponsorObj ? (sponsorObj.name || sponsorObj.sponsor_name) : (visaOcr.sponsor_name || (typeof sponsorObj === 'string' ? sponsorObj : '')); const sponsorPhone = isSponsorObj ? (sponsorObj.phone || sponsorObj.mobile || sponsorObj.mobile_number) : ''; const sponsorAddress = isSponsorObj ? (sponsorObj.address || '') : ''; const visaFullName = visaOcr.full_name || worker.name || 'Not Extracted'; const visaEntryPermitNo = visaOcr.entry_permit_no || visaDoc?.number || 'Not Extracted'; const visaUidNo = visaOcr.uid_no || 'Not Extracted'; const visaType = visaOcr.visa_type || worker.visa_status || 'Entry Permit'; const visaPassportNo = visaOcr.passport_no || visaOcr.passport_number || passportDoc?.number || 'Not Extracted'; const visaProfession = visaOcr.profession || worker.main_profession || 'Domestic Worker'; const visaSponsorName = sponsorName || visaOcr.sponsor_name || 'Not Extracted'; const visaSponsorPhone = sponsorPhone || 'Not Extracted'; const visaSponsorAddress = sponsorAddress || 'Not Extracted'; const visaNationality = visaOcr.nationality || worker.nationality || 'Not Extracted'; const visaCountry = visaOcr.country || 'United Arab Emirates'; const visaDob = visaOcr.date_of_birth || visaOcr.dob || 'Not Extracted'; const visaPlaceOfBirth = visaOcr.place_of_birth || 'Not Extracted'; const visaIssueDate = visaOcr.issue_date || visaDoc?.issue_date || 'Not Extracted'; const visaValidUntil = visaOcr.valid_until || visaOcr.expiry_date || visaDoc?.expiry_date || 'Not Extracted'; const visaDocType = visaOcr.document_type || visaDoc?.type || 'uae_visa'; const [showReportModal, setShowReportModal] = useState(false); const [reportReason, setReportReason] = useState(''); const [reportDetails, setReportDetails] = useState(''); const [isShortlisted, setIsShortlisted] = useState(false); // Hiring flow states const [availabilityStatus, setAvailabilityStatus] = useState(worker.availability_status); const [showHiredModal, setShowHiredModal] = useState(false); const [showHireConfirmModal, setShowHireConfirmModal] = useState(false); // Reviews state const [showReviewModal, setShowReviewModal] = useState(false); const [newRating, setNewRating] = useState(5); const [newComment, setNewComment] = useState(''); const [workerReviews, setWorkerReviews] = useState(worker.reviews || []); const handleShare = () => { navigator.clipboard.writeText(window.location.href); toast.success(t('profile_link_copied', 'Profile link copied to clipboard!'), { description: t('profile_link_copied_desc', 'You can now share this URL with your family or sponsor contacts.') }); }; const handleReportSubmit = (e) => { e.preventDefault(); if (!reportReason) { toast.error(t('select_report_reason', 'Please select a reason for reporting.')); return; } toast.success(t('report_submitted', 'Worker report submitted successfully'), { description: t('report_submitted_desc', "Our admin compliance team will investigate this worker's credentials within 24 hours.") }); setShowReportModal(false); setReportReason(''); setReportDetails(''); }; const handleReviewSubmit = (e) => { e.preventDefault(); if (!newComment.trim()) { toast.error(t('add_comment', 'Please add a comment.')); return; } const newReview = { id: Date.now(), employer_name: t('you_verified_sponsor', 'You (Verified Sponsor)'), rating: newRating, date: t('today', 'Today'), comment: newComment, }; setWorkerReviews([newReview, ...workerReviews]); toast.success(t('review_posted', 'Review posted successfully!'), { description: t('review_posted_desc', 'Your trust feedback is live and helps other sponsors hire securely.') }); setShowReviewModal(false); setNewComment(''); }; const handleToggleShortlist = () => { setIsShortlisted(!isShortlisted); router.post('/employer/shortlist/toggle', { worker_id: worker.id }, { preserveScroll: true, onSuccess: () => { toast.success(isShortlisted ? t('removed_from_shortlist', 'Removed from Shortlist') : t('added_to_shortlist', 'Added to Shortlist')); } }); }; const handleMarkHired = () => { router.post(`/employer/workers/${worker.id}/mark-hired`, {}, { preserveScroll: true, onSuccess: () => { if (availabilityStatus !== 'Waiting for Review') { setAvailabilityStatus('Waiting for Review'); setShowHireConfirmModal(false); toast.success(t('moved_to_review', 'Candidate moved to review!'), { description: t('moved_to_review_desc', 'Candidate status updated to Waiting for Review. Click Confirm Hire to proceed.') }); } else { setAvailabilityStatus('Pending Confirmation'); setShowHiredModal(true); toast.success(t('hire_request_sent', 'Hiring request sent successfully!'), { description: t('hire_request_sent_desc', 'Awaiting worker confirmation of the hiring offer.') }); setShowHireConfirmModal(false); } } }); }; return (
{/* Back Link */}
{t('back_to_find_workers', 'BACK TO FIND WORKERS')}
{/* Header Card with Clean Premium White BG */}
{worker.photo ? ( {worker.name} ) : ( )}

{worker.name}

{worker.main_profession && (
{worker.main_profession}
)} {/* Passport verification status bar & 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} ({t('warning', 'Warning')}: {t('visit_visa', 'Visit Visa')})
) : worker.visa_status && worker.visa_status.toLowerCase().includes('cancelled') ? (
{worker.visa_status} ({t('warning', 'Warning')}: {t('cancelled', 'Cancelled')})
) : (
{worker.visa_status}
)}
{worker.nationality} {worker.age} {t('years_old', 'Years Old')}
{workerReviews.length > 0 && (
{worker.rating} / 5.0 ({workerReviews.length} {t('reviews', 'reviews')})
)}
{/* Sponsor Actions Block */}
{/* Stage 3 Connect: Start In-App Chat */} {t('start_direct_chat', 'Start Direct Chat')} {/* Stage 4 Hire: Hire Worker Button */} {availabilityStatus !== 'Pending Confirmation' && availabilityStatus !== 'Hired' && ( )} {/* Stage 4 Hire: Pending Confirmation Indicator */} {availabilityStatus === 'Pending Confirmation' && (
{t('pending_confirmation', 'Pending Confirmation')}
)}
{/* Main Details Grid */}
{/* Left Column: Quick Stats */}

{t('worker_details_title', 'Worker Details')}

{t('name', 'Name')}
{worker.name}
{worker.main_profession && (
{t('main_profession', 'Main Profession')}
{worker.main_profession}
)}
{t('mobile', 'Mobile')}
{worker.phone}
{t('gender', 'Gender')}
{worker.gender}
{t('salary_expectations', 'Salary Expectations')}
{worker.salary} {t('aed', 'AED')} / {t('mo', 'mo')}
{t('work_experience', 'Work Experience')}
{worker.experience}
{t('job_type', 'Job Type')}
{worker.preferred_job_type}
{t('accommodation_preference', 'Accommodation Preference')}
{worker.live_in_out}
{t('current_location_status', 'Current Location')}
{worker.in_country ? t('in_country', 'In-Country') : t('out_country', 'Out-of-Country')}
{worker.in_country && (
{t('visa_type', 'Visa Type')}
{worker.visa_status || t('pending', 'Pending')}
)}
{/* Languages Spoken with visual flags */}
{t('languages_spoken', 'Languages Spoken')}
{worker.languages?.map(lang => ( {getLanguageFlag(lang)} {lang} ))}
{/* Right Column: Bio & Skills */}
{/* Verified Skills & Competencies */}

{t('verified_skills_competencies', 'Verified Skills & Competencies')}

{worker.skills?.map(skill => (
{skill}
))}
{/* Verified Documents Section */}

{t('verified_legal_docs', 'Verified Legal Documents (UAE MOHRE Vetted)')}

{/* Document Card: Passport */} {passportDoc ? (
{t('passport_details', 'Passport Details')} {(() => { const expiryStatus = getExpiryStatus(passportDoc.expiry_date); return ( {expiryStatus.text} ); })()}
{passportDoc.ocr_accuracy && ( {passportDoc.ocr_accuracy}% Match )}
{t('given_names', 'Given Names')}
{safeRender(passportGivenNames)}
{t('surname', 'Surname')}
{safeRender(passportSurname)}
{t('passport_number', 'Passport Number')}
{safeRender(passportNumber)}
{t('sex', 'Sex')}
{safeRender(passportSex)}
{t('date_of_birth', 'Date of Birth')}
{safeRender(passportDob)}
{t('place_of_birth', 'Place of Birth')}
{safeRender(passportPlaceOfBirth)}
{t('nationality', 'Nationality')}
{safeRender(passportNationality)}
{t('issuing_country', 'Issuing Country')}
{safeRender(passportIssuingCountry)}
{t('issue_date', 'Date of Issue')}
{safeRender(passportIssueDate)}
{t('expiry_date', 'Date of Expiry')}
{safeRender(passportExpiryDate)}
{t('authority', 'Authority')}
{safeRender(passportAuthority)}
{t('document_type', 'Document Type')}
{safeRender(passportDocType)}
UAE PDPL Compliant Scan Storage (Permanently Purged) {passportDoc.file_path && ( View Passport Scan )}
) : (
{t('passport_pending', 'Passport Pending')}

{t('passport_pending_desc', 'Candidate has not uploaded a passport document yet.')}

)} {/* Document Card: Emirates ID */} {emiratesIdDoc && (
{t('emirates_id_details', 'Emirates ID Details')} {(() => { const expiryStatus = getExpiryStatus(emiratesIdDoc.expiry_date); return ( {expiryStatus.text} ); })()}
{emiratesIdDoc.ocr_accuracy && ( {emiratesIdDoc.ocr_accuracy}% Match )}
{emiratesIdDoc.ocr_data ? (
{t('emirates_id_number', 'Emirates ID Number')}
{safeRender(emiratesIdDoc.ocr_data.emirates_id_number || emiratesIdDoc.number)}
{t('full_name', 'Full Name')}
{safeRender(emiratesIdDoc.ocr_data.name || emiratesIdDoc.ocr_data.full_name)}
{t('nationality', 'Nationality')}
{safeRender(emiratesIdDoc.ocr_data.nationality)}
{t('date_of_birth', 'Date of Birth')}
{safeRender(emiratesIdDoc.ocr_data.date_of_birth || emiratesIdDoc.ocr_data.dob)}
{t('gender', 'Gender')}
{safeRender(emiratesIdDoc.ocr_data.gender || emiratesIdDoc.ocr_data.sex)}
{t('occupation', 'Occupation')}
{safeRender(emiratesIdDoc.ocr_data.occupation || emiratesIdDoc.ocr_data.profession)}
{t('employer', 'Employer')}
{safeRender(emiratesIdDoc.ocr_data.employer)}
{t('issue_date', 'Issue Date')}
{safeRender(emiratesIdDoc.ocr_data.issue_date || emiratesIdDoc.issue_date)}
{t('expiry_date', 'Expiry Date')}
{safeRender(emiratesIdDoc.ocr_data.expiry_date || emiratesIdDoc.expiry_date)}
) : (
{t('document_id', 'Document ID')}
{emiratesIdDoc.number}
{t('issue_date', 'Issue')}
{emiratesIdDoc.issue_date || 'N/A'}
{t('expiry_date', 'Expiry')}
{emiratesIdDoc.expiry_date || 'N/A'}
)}
UAE PDPL Compliant Scan Storage (Permanently Purged) {emiratesIdDoc.file_path && ( View Emirates ID Scan )}
)} {/* Document Card: Visa */} {visaDoc ? (
{t('visa_details', 'Entry Visa Details')} {(() => { const expiryStatus = getExpiryStatus(visaDoc.expiry_date || worker.visa_expiry_date); return ( {expiryStatus.text} ); })()}
{worker.visa_status && (worker.visa_status.toLowerCase().includes('tourist') || worker.visa_status.toLowerCase().includes('visit') || worker.visa_status.toLowerCase().includes('cancelled')) ? ( {t('transfer_required', 'Transfer Required')} ) : ( {t('clear_records', 'Clear Records')} )}
{t('full_name', 'Full Name')}
{safeRender(visaFullName)}
{t('entry_permit_no', 'Entry Permit No')}
{safeRender(visaEntryPermitNo)}
{t('uid_no', 'UID No')}
{safeRender(visaUidNo)}
{t('visa_type', 'Visa Type')}
{safeRender(visaType)}
{t('passport_no', 'Passport No')}
{safeRender(visaPassportNo)}
{t('profession', 'Profession')}
{safeRender(visaProfession)}
{t('sponsor_name', 'Sponsor Name')}
{safeRender(visaSponsorName)}
{t('sponsor_phone', 'Sponsor Phone')}
{safeRender(visaSponsorPhone)}
{t('sponsor_address', 'Sponsor Address')}
{safeRender(visaSponsorAddress)}
{t('nationality', 'Nationality')}
{safeRender(visaNationality)}
{t('country', 'Country')}
{safeRender(visaCountry)}
{t('date_of_birth', 'Date of Birth')}
{safeRender(visaDob)}
{t('place_of_birth', 'Place of Birth')}
{safeRender(visaPlaceOfBirth)}
{t('issue_date', 'Issue Date')}
{safeRender(visaIssueDate)}
{t('valid_until', 'Valid Until')}
{safeRender(visaValidUntil)}
{t('document_type', 'Document Type')}
{safeRender(visaDocType)}
{t('ocr_accuracy', 'OCR Accuracy')}
{(visaDoc.ocr_accuracy || visaOcr.ocr_accuracy || 99)}%
UAE PDPL Compliant Scan Storage (Permanently Purged) {visaDoc.file_path && ( View Visa Scan )}
) : (
{t('visa_pending', 'Visa Pending')}

{t('visa_pending_desc', 'Candidate has not uploaded a visa document yet.')}

)}
{/* Star Ratings & Trust Review logs */}

{t('sponsor_reviews_star_ratings', 'Sponsor Reviews & Star Ratings')}

{t('reviews_posted_by_sponsors_desc', 'Ratings can only be posted by verified sponsors who completed verified direct hiring.')}

{/* Reviews List */}
{workerReviews.map((review) => (
{review.employer_name} {review.date}
{[...Array(5)].map((_, i) => ( ))}

"{review.comment}"

))} {workerReviews.length === 0 && (
{t('no_reviews_yet', 'No reviews posted yet.')}
)}
{/* Stage 4/5 Hired Flow Success Modal Overlay */} {showHiredModal && (
{availabilityStatus === 'Pending Confirmation' ? ( <>

{t('hire_request_sent_title', 'Hiring Request Sent')}

{t('hired_under_sponsorship_pending_desc', 'Your hiring request has been sent to {name}. The worker must accept the offer to finalize the placement.').replace('{name}', worker.name)}

) : ( <>

{t('direct_sponsoring_finalized', 'Direct Sponsoring Finalized!')}

{t('hired_under_sponsorship_desc', '{name} is successfully marked as Hired under your sponsorship! This direct matching conforms exactly with Stage 4 of our UAE MOHRE zero-middlemen flow.').replace('{name}', worker.name)}

{t('next_step_post_hire_review', 'Next Step: Stage 5 Post-Hire Review')}

{t('help_community_post_review', "Help the UAE community hire safely by posting an anonymous review describing {name}'s childcare, cooking, driving, or domestic skills.").replace('{name}', worker.name)}

{t('back_to_worker_directory', 'Back to Worker Directory')}
)}
)} {/* Confirm Hire Modal Overlay */} {showHireConfirmModal && (

{availabilityStatus === 'Waiting for Review' ? t('confirm_hire_title', 'Confirm Sponsoring / Hiring Offer') : t('initiate_hire_title', 'Initiate Sponsoring / Hiring')}

{availabilityStatus === 'Waiting for Review' ? t('confirm_hire_desc', 'Are you sure you want to hire this worker? This action will send a hiring request to the worker.') : t('initiate_hire_desc', 'Are you sure you want to initiate the hiring process for this worker? This will add them to your review list.')}

)} {/* Report Abuse Modal Overlay */} {showReportModal && (

{t('report_abuse_violation', 'Report Verification Abuse / Terms Violation')}

{t('zero_tolerance_abuse_desc', 'We maintain zero-tolerance for fake documentation, independent recruiters trading cash, or incorrect contact details.')}