import React, { useState } from 'react'; import { Head, Link, router } from '@inertiajs/react'; import axios from 'axios'; import { toast } from 'sonner'; import { compressImage } from '../../../lib/utils'; import { Loader2, ShieldAlert, ShieldCheck, UploadCloud, FileText, Users, TrendingUp, MessageSquare, ArrowLeft } from 'lucide-react'; export default function UploadEmiratesId({ email }) { const [frontFile, setFrontFile] = useState(null); const [backFile, setBackFile] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // Modal state for verification & editing const [showModal, setShowModal] = useState(false); const [modalData, setModalData] = useState({ name: '', emirates_id_number: '', expiry_date: '', date_of_birth: '', nationality: '', gender: '', card_number: '', occupation: '', employer: '', issue_place: '', issue_date: '', }); const [modalSaving, setModalSaving] = useState(false); const [modalError, setModalError] = useState(null); const handleModalChange = (field, value) => { setModalData(prev => ({ ...prev, [field]: value })); if (modalError) setModalError(null); }; const handleConfirmSubmit = async () => { if (!modalData.name.trim()) return setModalError('Full name is required.'); if (!modalData.emirates_id_number.trim()) return setModalError('Emirates ID number is required.'); if (!modalData.expiry_date.trim()) return setModalError('Expiry date is required.'); if (!modalData.date_of_birth.trim()) return setModalError('Date of birth is required.'); setModalSaving(true); setModalError(null); try { await axios.post('/employer/confirm-emirates-id', modalData); toast.success('Emirates ID details confirmed!'); setShowModal(false); router.visit('/employer/register-payment'); } catch (err) { if (err.response && err.response.data && err.response.data.errors) { const errors = err.response.data.errors; const firstError = Object.values(errors).flat()[0]; setModalError(firstError || 'Validation failed.'); } else { setModalError(err.response?.data?.error || 'Failed to save confirmed data.'); } } finally { setModalSaving(false); } }; const handleFrontFileChange = async (e) => { const selectedFile = e.target.files[0]; if (selectedFile) { if (selectedFile.size > 10240 * 1024) { setError('The document must not exceed 10MB.'); toast.error('The document must not exceed 10MB.'); return; } try { const compressedFile = await compressImage(selectedFile); setFrontFile(compressedFile); } catch (err) { setFrontFile(selectedFile); } setError(null); } }; const handleBackFileChange = async (e) => { const selectedFile = e.target.files[0]; if (selectedFile) { if (selectedFile.size > 10240 * 1024) { setError('The document must not exceed 10MB.'); toast.error('The document must not exceed 10MB.'); return; } try { const compressedFile = await compressImage(selectedFile); setBackFile(compressedFile); } catch (err) { setBackFile(selectedFile); } setError(null); } }; const handleSubmit = async (e) => { e.preventDefault(); if (!frontFile || !backFile) { setError('Please upload both the front and back side of your Emirates ID.'); toast.error('Please upload both sides of your Emirates ID.'); return; } setLoading(true); setError(null); const formData = new FormData(); formData.append('emirates_id_front', frontFile); formData.append('emirates_id_back', backFile); try { const res = await axios.post('/employer/upload-emirates-id', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); toast.success('Emirates ID scanned successfully!'); const extracted = res.data?.data || {}; setModalData({ name: extracted.name || '', emirates_id_number: extracted.emirates_id_number || '', expiry_date: extracted.expiry_date || '', date_of_birth: extracted.date_of_birth || '', nationality: extracted.nationality || '', gender: extracted.gender || '', card_number: extracted.card_number || '', occupation: extracted.occupation || '', employer: extracted.employer || '', issue_place: extracted.issue_place || '', issue_date: extracted.issue_date || '', }); setShowModal(true); } catch (err) { if (err.response && err.response.data && err.response.data.errors) { const errors = err.response.data.errors; const firstError = Object.values(errors).flat()[0]; const errorMsg = firstError || 'Validation failed.'; setError(errorMsg); toast.error(errorMsg); } else { const errorMsg = err.response?.data?.error || 'Scan extraction failed. Please try again.'; setError(errorMsg); toast.error(errorMsg); } } finally { setLoading(false); } }; const renderStepIndicator = () => (
{[ { step: 1, label: 'Register' }, { step: 2, label: 'Verify' }, { step: 3, label: 'Emirates ID' }, { step: 4, label: 'Payment' }, { step: 5, label: 'Password' } ].map((s) => (
{s.step}
{s.step === 3 && ( {s.label} )}
{s.step < 5 && (
)} ))}
); return (
{/* Left Brand Panel (Desktop Only) */}
M
Migrant Portal
Sponsor Registration

Find verified domestic workers directly.

Unlock direct access to top domestic candidates with a Migrant premium subscription. Find, interview, and hire directly without middlemen.

{/* Stat Row */}
3000+
Worker Profiles
550+
Avg Monthly Hires
Direct
Messaging
© 2026 Migrant. All rights reserved.
{/* Right Form Container */}
{renderStepIndicator()}

Emirates ID Verification

Upload your identity document for quick OCR scanning

{/* Security & Disclaimer Banner */}

Data Privacy Disclaimer

We do not store your physical Emirates ID document. Your card is temporarily scanned only to securely extract the ID number and expiry date via automated OCR, and the file is permanently deleted immediately after extraction.

{/* Front Side Upload */}
{!frontFile ? (

Click or Drag front image here

Supported: JPG, JPEG, PNG, PDF (Max 10MB)

) : (

{frontFile.name}

{(frontFile.size / (1024 * 1024)).toFixed(2)} MB • Front Ready

)}
{/* Back Side Upload */}
{!backFile ? (

Click or Drag back image here

Supported: JPG, JPEG, PNG, PDF (Max 10MB)

) : (

{backFile.name}

{(backFile.size / (1024 * 1024)).toFixed(2)} MB • Back Ready

)}
{error && (

{error}

)}
Change Email / Back
{/* Confirmation and Edit Modal */} {showModal && (
{/* Header */}

Confirm Extracted EID Data

Please verify and correct the scanned Emirates ID details before proceeding.

{/* Form Fields */}
{/* Full Name */}
handleModalChange('name', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Emirates ID Number */}
handleModalChange('emirates_id_number', e.target.value)} placeholder="784-XXXX-XXXXXXX-X" className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Expiry Date */}
handleModalChange('expiry_date', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Date of Birth */}
handleModalChange('date_of_birth', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Nationality */}
handleModalChange('nationality', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Gender */}
{/* Card Number */}
handleModalChange('card_number', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Occupation */}
handleModalChange('occupation', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Sponsor */}
handleModalChange('employer', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Issue Place */}
handleModalChange('issue_place', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{/* Issue Date */}
handleModalChange('issue_date', e.target.value)} className="w-full px-3 py-2 rounded-xl border border-slate-300 text-sm focus:outline-none focus:ring-2 focus:ring-[#185FA5]/20 focus:border-[#185FA5]" />
{modalError && (

{modalError}

)}
{/* Actions */}
)}
); }