From 645e703600bc7ac3bac4bb62384191c1cd5fb23e Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Wed, 22 Apr 2026 01:23:09 +0300 Subject: [PATCH] fix: auto-read citizen number from NFT role card instead of wallet address Replaces the buggy useEffect that derived citizen number from wallet address (and re-triggered whenever user cleared the field) with a clean sync from DashboardContext's NFT-derived citizenNumber. Field is read-only when NFT data is present, preventing the refill loop entirely. --- web/src/pages/Identity.tsx | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/web/src/pages/Identity.tsx b/web/src/pages/Identity.tsx index ad6ea33d..7473ee62 100644 --- a/web/src/pages/Identity.tsx +++ b/web/src/pages/Identity.tsx @@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useIsMobile } from '@/hooks/use-mobile'; import MobileShell from '@/components/MobileShell'; -import { usePezkuwi } from '@/contexts/PezkuwiContext'; +import { useDashboard } from '@/contexts/DashboardContext'; import { Save, CreditCard, BookOpen, Camera } from 'lucide-react'; // ── Types ── @@ -61,7 +61,7 @@ export default function Identity() { const { t } = useTranslation(); const navigate = useNavigate(); const isMobile = useIsMobile(); - const { selectedAccount } = usePezkuwi(); + const { citizenNumber: nftCitizenNumber } = useDashboard(); const [tab, setTab] = useState<'id' | 'passport'>('id'); const [data, setData] = useState(DEFAULT_DATA); const [saved, setSaved] = useState(false); @@ -74,17 +74,16 @@ export default function Identity() { } catch { /* ignore */ } }, []); - // Auto-fill citizen number from wallet + // Sync citizen number from role card NFT useEffect(() => { - if (selectedAccount && !data.citizenNumber) { - const short = selectedAccount.address.slice(-8).toUpperCase(); + if (nftCitizenNumber && nftCitizenNumber !== 'N/A') { setData(prev => ({ ...prev, - citizenNumber: short, - passportNumber: generatePassportNo(short), + citizenNumber: nftCitizenNumber, + passportNumber: generatePassportNo(nftCitizenNumber), })); } - }, [selectedAccount, data.citizenNumber]); + }, [nftCitizenNumber]); const photoInputRef = React.useRef(null); @@ -230,7 +229,8 @@ export default function Identity() { handleChange('citizenNumber', v)} placeholder="KRD-000000" /> + onChange={v => handleChange('citizenNumber', v)} placeholder="KRD-000000" + readOnly={!!(nftCitizenNumber && nftCitizenNumber !== 'N/A')} /> {/* Save button */}