import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useIsMobile } from '@/hooks/use-mobile'; import MobileShell from '@/components/MobileShell'; import { useAuth } from '@/contexts/AuthContext'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { Save, CreditCard, BookOpen, Camera } from 'lucide-react'; // ── Types ── interface IdentityData { fullName: string; fatherName: string; motherName: string; dateOfBirth: string; placeOfBirth: string; gender: 'M' | 'F' | ''; bloodType: string; citizenNumber: string; passportNumber: string; photo: string; // base64 data URL } const DEFAULT_DATA: IdentityData = { fullName: '', fatherName: '', motherName: '', dateOfBirth: '', placeOfBirth: '', gender: '', bloodType: '', citizenNumber: '', passportNumber: '', photo: '', }; const STORAGE_KEY = 'pezkuwi_identity_data'; // ── Helpers ── function generatePassportNo(citizenNo: string): string { if (!citizenNo) return 'KRD-000000'; return `KRD-${citizenNo.replace(/\D/g, '').slice(0, 6).padStart(6, '0')}`; } function formatMRZ(data: IdentityData): [string, string] { const name = data.fullName.toUpperCase().replace(/[^A-Z ]/g, '').replace(/ /g, '<') || 'SURNAME< = { avatar1: '👨🏻', avatar2: '👨🏼', avatar3: '👨🏽', avatar4: '👨🏾', avatar5: '👩🏻', avatar6: '👩🏼', avatar7: '👩🏽', avatar8: '👩🏾', avatar9: '🧔🏻', avatar10: '🧔🏼', avatar11: '🧔🏽', avatar12: '🧔🏾', avatar13: '👳🏻‍♂️', avatar14: '👳🏼‍♂️', avatar15: '👳🏽‍♂️', avatar16: '🧕🏻', avatar17: '🧕🏼', avatar18: '🧕🏽', }; // ── Main Component ── export default function Identity() { const { t } = useTranslation(); const navigate = useNavigate(); const isMobile = useIsMobile(); const { user } = useAuth(); const { selectedAccount } = usePezkuwi(); const [tab, setTab] = useState<'id' | 'passport'>('id'); const [data, setData] = useState(DEFAULT_DATA); const [saved, setSaved] = useState(false); // Load from localStorage useEffect(() => { try { const raw = localStorage.getItem(STORAGE_KEY); if (raw) setData(JSON.parse(raw)); } catch { /* ignore */ } }, []); // Auto-fill citizen number from wallet useEffect(() => { if (selectedAccount && !data.citizenNumber) { const short = selectedAccount.address.slice(-8).toUpperCase(); setData(prev => ({ ...prev, citizenNumber: short, passportNumber: generatePassportNo(short), })); } }, [selectedAccount, data.citizenNumber]); const photoInputRef = React.useRef(null); const handlePhotoSelect = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; // Resize to max 300px and compress const reader = new FileReader(); reader.onload = () => { const img = new Image(); img.onload = () => { const canvas = document.createElement('canvas'); const maxSize = 300; let w = img.width, h = img.height; if (w > h) { h = (h / w) * maxSize; w = maxSize; } else { w = (w / h) * maxSize; h = maxSize; } canvas.width = w; canvas.height = h; const ctx = canvas.getContext('2d')!; ctx.drawImage(img, 0, 0, w, h); const dataUrl = canvas.toDataURL('image/jpeg', 0.8); setData(prev => ({ ...prev, photo: dataUrl })); setSaved(false); }; img.src = reader.result as string; }; reader.readAsDataURL(file); }; const handleChange = (field: keyof IdentityData, value: string) => { setData(prev => { const next = { ...prev, [field]: value }; if (field === 'citizenNumber') { next.passportNumber = generatePassportNo(value); } return next; }); setSaved(false); }; const handleSave = () => { localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); setSaved(true); setTimeout(() => setSaved(false), 2000); }; const [mrzLine1, mrzLine2] = formatMRZ(data); const content = (
{/* Tab switcher */}
{/* Hidden file input for photo */} {/* ── CARD PREVIEW ── */} {tab === 'id' ? ( photoInputRef.current?.click()} /> ) : ( photoInputRef.current?.click()} /> )} {/* ── FORM ── */}

{t('identity.personalInfo', 'Personal Information')}

handleChange('fullName', v)} placeholder="Azad Kurdistanî" /> handleChange('fatherName', v)} placeholder="Rêber" /> handleChange('motherName', v)} placeholder="Jîn" />
handleChange('dateOfBirth', v)} type="date" />
handleChange('placeOfBirth', v)} placeholder="Hewlêr" />
handleChange('citizenNumber', v)} placeholder="KRD-000000" /> {/* Save button */}

{t('identity.localOnly', 'Data is stored only on your device. Never uploaded.')}

); if (isMobile) { return ( {content} ); } // Desktop: simple centered layout return (
{content}
); } // ── ID Card Preview ── function IDCardPreview({ data, onPhotoClick }: { data: IdentityData; onPhotoClick: () => void }) { return (
{/* Top stripe - Kurdistan flag colors */}
{/* Header */}

KOMARA KURDISTANÊ

KURDISTAN REPUBLIC

{/* Sun emblem */}
☀️

کۆماری کوردستان

NASNAMA / ID CARD

{/* Divider */}
{/* Body */}
{/* Photo area - clickable */} {/* Info */}
{/* Bottom bar */}

JIM / NO

{data.citizenNumber || 'KRD-000000'}

XWÎNê / Blood

{data.bloodType || '—'}

DERBASDAR / Expiry

{expiryDate}

); } // ── Passport Preview ── function PassportPreview({ data, mrzLine1, mrzLine2, onPhotoClick }: { data: IdentityData; mrzLine1: string; mrzLine2: string; onPhotoClick: () => void; }) { return (
{/* Top ornament */}
{/* Header */}

KOMARA KURDISTANÊ

KURDISTAN REPUBLIC

{/* Emblem */}
☀️

پاسپۆرت

PASSPORT

{/* Divider */}
{/* Data page */}
{/* Photo - clickable */}
{/* MRZ Zone */}

{mrzLine1}

{mrzLine2}

); } // ── Shared sub-components ── function IDField({ label, value, bold }: { label: string; value: string; bold?: boolean }) { return (

{label}

{value}

); } function PassField({ label, value, bold, mono }: { label: string; value: string; bold?: boolean; mono?: boolean }) { return (

{label}

{value}

); } function FormField({ label, value, onChange, placeholder, type = 'text' }: { label: string; value: string; onChange: (v: string) => void; placeholder?: string; type?: string; }) { return (
onChange(e.target.value)} placeholder={placeholder} className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-green-500 focus:outline-none transition-colors" />
); }