"use client" import { useEffect, useMemo, useState } from "react" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { ContactAvatar } from "@/components/gmail/contacts/contact-avatar" import { mergeManyContacts, pickContactMergePrimary } from "@/lib/contacts/merge-contacts" import { fullContactDisplayName, type FullContact } from "@/lib/contacts/types" import { CONTACTS_MUTED_TEXT, CONTACTS_PRIMARY_BTN_CLASS, } from "@/lib/contacts-chrome-classes" import { cn } from "@/lib/utils" interface ContactsBulkMergeDialogProps { open: boolean onOpenChange: (open: boolean) => void contacts: FullContact[] onMerge: (primaryId: string) => void isMerging?: boolean } function contactListLabel(contact: FullContact): string { return ( fullContactDisplayName(contact) || contact.emails[0]?.value || contact.phones[0]?.value || "Contact sans nom" ) } export function ContactsBulkMergeDialog({ open, onOpenChange, contacts, onMerge, isMerging = false, }: ContactsBulkMergeDialogProps) { const defaultPrimary = useMemo(() => pickContactMergePrimary(contacts), [contacts]) const [primaryId, setPrimaryId] = useState(defaultPrimary?.id ?? "") useEffect(() => { if (!open) return setPrimaryId(defaultPrimary?.id ?? contacts[0]?.id ?? "") }, [open, defaultPrimary, contacts]) const preview = useMemo( () => (primaryId ? mergeManyContacts(contacts, primaryId) : null), [contacts, primaryId], ) const canMerge = contacts.length >= 2 && !!primaryId && !!preview?.primary.etag return ( Fusionner les contacts

{contacts.length} contacts sélectionnés → 1 contact. Les autres seront supprimés après fusion.

Contact principal

{contacts.map((contact) => { const label = contactListLabel(contact) return ( ) })} {preview && (

Résultat fusionné

  • {preview.merged.emails.length} e-mail{preview.merged.emails.length > 1 ? "s" : ""}
  • {preview.merged.phones.length} téléphone{preview.merged.phones.length > 1 ? "s" : ""}
  • {(preview.merged.labels?.length ?? 0) > 0 && (
  • {preview.merged.labels!.length} libellé{(preview.merged.labels!.length > 1 ? "s" : "")}
  • )}
)} {!preview?.primary.etag && (

Version du contact principal inconnue. Rechargez la liste avant de fusionner.

)}
) }