'use client' import { usePersonalUploadId } from './hooks/usePersonalUploadId' import PageLayout from '../../../components/PageLayout' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import useAuthStore from '../../../store/authStore' import { DocumentArrowUpIcon, XMarkIcon } from '@heroicons/react/24/outline' // Add back ID types for the dropdown const ID_TYPES = [ { value: 'national_id', label: 'National ID Card' }, { value: 'passport', label: 'Passport' }, { value: 'driver_license', label: "Driver's License" }, { value: 'other', label: 'Other' }, ] export default function PersonalIdUploadPage() { // NEW: guard company users from accessing personal page const user = useAuthStore(s => s.user) const router = useRouter() const [blocked, setBlocked] = useState(false) useEffect(() => { const ut = (user as any)?.userType || (user as any)?.role console.log('đź§­ UploadID Guard [personal]: userType =', ut) if (ut && ut !== 'personal') { console.warn('đźš« UploadID Guard [personal]: access denied for userType:', ut, '-> redirecting to company upload') setBlocked(true) router.replace('/quickaction-dashboard/register-upload-id/company') } else if (ut === 'personal') { console.log('âś… UploadID Guard [personal]: access granted') } }, [user, router]) if (blocked) { return (
Redirecting to the correct upload page…
) } const { idNumber, setIdNumber, idType, setIdType, expiry, setExpiry, hasBack, setHasBack, frontFile, backFile, frontPreview, backPreview, submitting, error, success, frontInputRef, backInputRef, handleFile, onDrop, clearFile, dropEvents, openPicker, submit, inputBase, } = usePersonalUploadId() return (
{/* Background */}

Personal Identity Verification

Please upload clear photos of both sides of your government‑issued ID

{/* Grid Fields: put all three inputs on the same line on md+ */}
setIdNumber(e.target.value)} placeholder="Enter your ID number" className={`${inputBase} ${idNumber ? 'text-gray-900' : 'text-gray-700'}`} required />

Enter the number exactly as shown on your ID

setExpiry(e.target.value)} placeholder="tt.mm jjjj" className={`${inputBase} ${expiry ? 'text-gray-900' : 'text-gray-700'} appearance-none [&::-webkit-calendar-picker-indicator]:opacity-80`} required />
{/* Back side toggle */}
Does ID have a Backside? {hasBack ? 'Yes' : 'No'}
{/* Upload Areas: full width, 1 col if no back, 2 cols if back */}
{/* Front */}
onDrop(e, 'front')} onClick={() => openPicker('front')} className="group relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed border-gray-300 bg-gray-50/60 px-4 py-6 sm:py-10 text-center hover:border-indigo-400 hover:bg-indigo-50/40 cursor-pointer transition" > { const f = e.target.files?.[0]; if (f) handleFile(f, 'front') }} /> {frontFile ? (
{/* NEW preview */} {frontPreview && ( Front ID preview )}

{frontFile.name}

) : ( <>

Click to upload front side

or drag and drop
PNG, JPG, JPEG up to 10MB

)}
{/* Back */} {hasBack && (
onDrop(e, 'back')} onClick={() => openPicker('back')} className="group relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed border-gray-300 bg-gray-50/60 px-4 py-6 sm:py-10 text-center hover:border-indigo-400 hover:bg-indigo-50/40 cursor-pointer transition" > { const f = e.target.files?.[0]; if (f) handleFile(f, 'back') }} /> {backFile ? (
{/* NEW preview */} {backPreview && ( Back ID preview )}

{backFile.name}

) : ( <>

Click to upload back side

or drag and drop
PNG, JPG, JPEG up to 10MB

)}
)}
{/* Info Box, errors, success, submit */}

Please ensure your ID documents:

  • Are clearly visible and readable
  • Show all four corners
  • Are not expired
  • Have good lighting (no shadows or glare)
  • {hasBack ? 'Both front and back sides are uploaded' : 'Front side is uploaded'}
{error && (
{error}
)} {success && (
Upload saved successfully.
)}
) }