From 722873fdac3c46b6afd531bd59059b3461eba217 Mon Sep 17 00:00:00 2001 From: alma Date: Fri, 16 Jan 2026 12:14:43 +0100 Subject: [PATCH] Pages corrections --- app/pages/page.tsx | 54 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/app/pages/page.tsx b/app/pages/page.tsx index 3373728..e0369c1 100644 --- a/app/pages/page.tsx +++ b/app/pages/page.tsx @@ -195,24 +195,55 @@ export default function CarnetPage() { // Extract contact properties with proper type handling const uid = vcard.uid?.[0]?.value; - const fullName = vcard.fn?.[0]?.value; - const email = vcard.email?.[0]?.value; - const phone = vcard.tel?.[0]?.value; - const organization = vcard.org?.[0]?.value; - const address = vcard.adr?.[0]?.value; - const notes = vcard.note?.[0]?.value; - const group = vcard.categories?.[0]?.value; + let fullName = vcard.fn?.[0]?.value; - console.log(`[parseVCardContent] Parsed contact ${index + 1}:`, { uid, fullName, email, phone }); + // If FN is not available, try to construct name from N field (Family;Given;Additional;Prefix;Suffix) + if (!fullName && vcard.n?.[0]?.value) { + const nameParts = vcard.n[0].value.split(';').filter(Boolean); + // N format: Family;Given;Additional;Prefix;Suffix + // Construct: Given Family or Family Given + if (nameParts.length >= 2) { + fullName = `${nameParts[1]} ${nameParts[0]}`.trim() || nameParts[0] || nameParts[1]; + } else if (nameParts.length === 1) { + fullName = nameParts[0]; + } + } + + // Fallback: try to extract from raw content if parser didn't work + if (!fullName) { + const fnMatch = section.match(/FN[;:]?([^\r\n]+)/i); + if (fnMatch) { + fullName = fnMatch[1].trim(); + } else { + const nMatch = section.match(/N[;:]?([^\r\n]+)/i); + if (nMatch) { + const nameParts = nMatch[1].split(';').filter(Boolean); + if (nameParts.length >= 2) { + fullName = `${nameParts[1]} ${nameParts[0]}`.trim() || nameParts[0] || nameParts[1]; + } else if (nameParts.length === 1) { + fullName = nameParts[0].trim(); + } + } + } + } + + const email = vcard.email?.[0]?.value || vcard.email?.[0]; + const phone = vcard.tel?.[0]?.value || vcard.tel?.[0]; + const organization = vcard.org?.[0]?.value || vcard.org?.[0]; + const address = vcard.adr?.[0]?.value || (vcard.adr?.[0] ? JSON.stringify(vcard.adr[0]) : ''); + const notes = vcard.note?.[0]?.value || vcard.note?.[0]; + const group = vcard.categories?.[0]?.value || vcard.categories?.[0]; + + console.log(`[parseVCardContent] Parsed contact ${index + 1}:`, { uid, fullName, email, phone, rawVCard: vcard }); // Create a clean contact object const contact: Contact = { id: uid || Math.random().toString(36).substr(2, 9), - fullName: fullName || 'Unknown Contact', + fullName: fullName || email || 'Sans nom', email: email || '', phone: phone || '', organization: organization || '', - address: address || '', + address: typeof address === 'string' ? address : '', notes: notes || '', group: group || '' }; @@ -279,8 +310,9 @@ export default function CarnetPage() { const contentResponse = await fetch(`/api/storage/files/content?path=${encodeURIComponent(fileKey)}`); if (contentResponse.ok) { const { content } = await contentResponse.json(); + console.log(`[fetchContacts] VCF content preview (first 500 chars):`, content.substring(0, 500)); const contacts = parseVCardContent(content); - console.log(`[fetchContacts] Parsed ${contacts.length} contacts from ${fileKey}`); + console.log(`[fetchContacts] Parsed ${contacts.length} contacts from ${fileKey}`, contacts); return contacts.map(contact => ({ ...contact, group: (file.name || file.key?.split('/').pop() || 'contacts')?.replace('.vcf', '')