"use client" import { useRef, useEffect, useMemo } from "react" import Link from "next/link" import { Search, ExternalLink, X, Plus } from "lucide-react" import { Button } from "@/components/ui/button" import { ScrollArea } from "@/components/ui/scroll-area" import { useContactsStore } from "@/lib/contacts/contacts-store" import { searchContacts } from "@/lib/contacts/fuzzy-search" import { fullContactDisplayName } from "@/lib/contacts/types" import { CONTACTS_PANEL_CREATE_ROW_CLASS, CONTACTS_PANEL_HEADER_CLASS, CONTACTS_PANEL_HEADER_SEARCH_CLASS, CONTACTS_PANEL_ICON_BTN_CLASS, CONTACTS_PANEL_LETTER_CLASS, CONTACTS_PANEL_LINK_TEXT_CLASS, CONTACTS_PANEL_MUTED_ICON_CLASS, CONTACTS_PANEL_SEARCH_INPUT_CLASS, CONTACTS_PANEL_SECTION_LABEL_CLASS, CONTACTS_PANEL_SHELL_CLASS, } from "@/lib/contacts-chrome-classes" import { cn } from "@/lib/utils" import { ContactRow } from "./contact-row" import { ContactsPanelLogo } from "./contacts-panel-logo" export function ContactsListView() { const { contacts, searchMode, searchQuery, setSearchMode, setSearchQuery, setView, showContactsList, closePanel, } = useContactsStore() const searchInputRef = useRef(null) useEffect(() => { if (searchMode) { searchInputRef.current?.focus() } }, [searchMode]) const filteredContacts = useMemo(() => { if (searchMode && searchQuery) { return searchContacts(contacts, searchQuery) } return contacts }, [contacts, searchMode, searchQuery]) const groupedContacts = useMemo(() => { const sorted = [...filteredContacts].sort((a, b) => { const nameA = fullContactDisplayName(a) || a.emails[0]?.value || "" const nameB = fullContactDisplayName(b) || b.emails[0]?.value || "" return nameA.localeCompare(nameB, "fr") }) const normalize = (ch: string) => ch.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toUpperCase() || "?" const groups: { letter: string; items: typeof sorted }[] = [] for (const contact of sorted) { const name = fullContactDisplayName(contact) || contact.emails[0]?.value || "?" const letter = normalize(name.charAt(0)) const last = groups[groups.length - 1] if (last && last.letter === letter) { last.items.push(contact) } else { groups.push({ letter, items: [contact] }) } } return groups }, [filteredContacts]) function exitSearch() { showContactsList() } if (searchMode) { return (
setSearchQuery(e.target.value)} placeholder="Recherche..." className={CONTACTS_PANEL_SEARCH_INPUT_CLASS} />
setView("create")} /> {filteredContacts.map((contact) => ( setView("view", contact.id)} /> ))}
) } return (
setView("create")} />
Contacts ({contacts.length})
{groupedContacts.map((group) => (
{group.letter}
{group.items.map((contact) => ( setView("view", contact.id)} /> ))}
))}
) } function CreateContactButton({ onClick }: { onClick: () => void }) { return ( ) }