"use client" import { useRef, useState } from "react" import { useQueryClient } from "@tanstack/react-query" import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Info, Smartphone } from "lucide-react" import { parseContactFile, type ContactImportInput } from "@/lib/contacts/import-parsers" import { bulkImportContacts, importInputToBulk } from "@/lib/api/contacts-bulk-import" import { deviceContactsAvailable, fetchDeviceContacts } from "@/lib/native/contacts" import { invalidateContactListCache } from "@/lib/api/contact-list-cache" import { useContactsList } from "@/lib/contacts/use-contacts-list" import { CONTACTS_HEADING_TEXT, CONTACTS_MUTED_TEXT, CONTACTS_PAGE_LINK_BTN_CLASS, CONTACTS_PANEL_MUTED_ICON_CLASS, CONTACTS_PRIMARY_BTN_CLASS, } from "@/lib/contacts-chrome-classes" import { cn } from "@/lib/utils" interface ImportDialogProps { open: boolean onOpenChange: (open: boolean) => void } export function ImportDialog({ open, onOpenChange }: ImportDialogProps) { const fileRef = useRef(null) const queryClient = useQueryClient() const { bookId } = useContactsList() const [pendingFile, setPendingFile] = useState(null) const [previewCount, setPreviewCount] = useState(0) const [error, setError] = useState(null) const [importing, setImporting] = useState(false) const [result, setResult] = useState(null) function resetState() { setPendingFile(null) setPreviewCount(0) setError(null) setImporting(false) setResult(null) if (fileRef.current) fileRef.current.value = "" } function handleOpenChange(next: boolean) { if (!next) resetState() onOpenChange(next) } function handleFileSelect() { fileRef.current?.click() } async function handleFileChange(e: React.ChangeEvent) { const file = e.target.files?.[0] if (!file) return setError(null) setPendingFile(file) try { const parsed = await parseContactFile(file) setPreviewCount(parsed.length) if (parsed.length === 0) { setError("Aucun contact trouvé dans ce fichier.") } } catch { setError("Impossible de lire ce fichier.") setPreviewCount(0) } } async function runImport(parsed: ContactImportInput[]) { if (parsed.length === 0) { setError("Aucun contact à importer.") return } setImporting(true) setError(null) setResult(null) try { const { created, failed } = await bulkImportContacts( bookId, parsed.map(importInputToBulk) ) invalidateContactListCache(bookId) void queryClient.invalidateQueries({ queryKey: ["contacts", bookId] }) if (failed.length > 0) { setResult(`${created} importé(s), ${failed.length} en échec.`) } else { handleOpenChange(false) } } catch { setError("L'import a échoué. Vérifiez le format du fichier.") } finally { setImporting(false) } } async function handleImport() { if (!pendingFile || previewCount === 0) return try { const parsed = await parseContactFile(pendingFile) await runImport(parsed) } catch { setError("L'import a échoué. Vérifiez le format du fichier.") } } async function handleDeviceImport() { setImporting(true) setError(null) try { const parsed = await fetchDeviceContacts() await runImport(parsed) } catch (err) { const msg = err instanceof Error ? err.message : "device_error" setError( msg === "contacts_unavailable" || msg.includes("denied") ? "Accès aux contacts du téléphone refusé." : "Impossible de lire les contacts du téléphone." ) setImporting(false) } } return (
Importer des contacts

Pour commencer, sélectionnez un fichier.
Utilisez le format CSV ou vCard (.vcf).

{deviceContactsAvailable() && ( )} {pendingFile && previewCount > 0 && (

{previewCount} contact{previewCount > 1 ? "s" : ""} prêt {previewCount > 1 ? "s" : ""} à importer depuis{" "} {pendingFile.name}

)} {result &&

{result}

} {error &&

{error}

}

Vous essayez de sauvegarder les contacts de votre mobile ?
Voici comment les synchroniser.

) }