'use client' import { useState, useEffect, useCallback } from 'react' import { Button } from '@/components/ui/button' import { BookmarkCard } from '@/components/bookmark-card' import { BookmarkDetailSheet } from '@/components/bookmark-detail-sheet' import { Users, RefreshCw, Mail, Phone } from 'lucide-react' import { toast } from 'sonner' import type { Bookmark } from '@/components/app-shell' import { fetchBookmarks } from '@/lib/bookmarks' interface Contact { id: string uid: string displayName: string email: string | null phone: string | null _count?: { bookmarks: number } } export function ContactsClient() { const [contacts, setContacts] = useState([]) const [selectedContact, setSelectedContact] = useState(null) const [bookmarks, setBookmarks] = useState([]) const [selectedBookmark, setSelectedBookmark] = useState(null) const [syncing, setSyncing] = useState(false) const [loading, setLoading] = useState(true) const loadContacts = useCallback(async () => { setLoading(true) try { const res = await fetch('/api/contacts') if (res.ok) setContacts(await res.json()) } catch { toast.error('Could not load contacts') } finally { setLoading(false) } }, []) const loadBookmarks = useCallback(async (contactId: string) => { try { setBookmarks(await fetchBookmarks(new URLSearchParams({ contactId }))) } catch { toast.error('Could not load bookmarks') } }, []) useEffect(() => { const timer = setTimeout(loadContacts, 0); return () => clearTimeout(timer) }, [loadContacts]) useEffect(() => { const timer = setTimeout(() => { if (selectedContact) loadBookmarks(selectedContact) }, 0); return () => clearTimeout(timer) }, [selectedContact, loadBookmarks]) useEffect(() => { const reload = () => { loadContacts(); if (selectedContact) loadBookmarks(selectedContact) }; window.addEventListener('computer:bookmarks-changed', reload); return () => window.removeEventListener('computer:bookmarks-changed', reload) }, [loadContacts, loadBookmarks, selectedContact]) const syncContacts = async () => { setSyncing(true) toast.info('Configure your Nextcloud settings in Settings → Nextcloud to sync contacts') setSyncing(false) } return (

Contacts

{loading ? (
{Array.from({ length: 5 }).map((_, i) =>
)}
) : contacts.length === 0 ? (

No contacts yet

Sync from Nextcloud in Settings

) : (
{contacts.map((c: Contact) => (
setSelectedContact(c.id)} onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setSelectedContact(c.id) } }} className={`flex items-center gap-3 rounded-lg px-3 py-2.5 cursor-pointer transition-colors focus-visible:outline-2 focus-visible:outline-primary ${ selectedContact === c.id ? 'bg-accent' : 'hover:bg-muted' }`} >
{(c.displayName ?? '?')[0]?.toUpperCase()}

{c.displayName}

{c.email &&

{c.email}

}
{c._count?.bookmarks ?? 0}
))}
)}
{selectedContact ? (

Bookmarks for {contacts.find(c => c.id === selectedContact)?.displayName}

{bookmarks.length === 0 ? (

No bookmarks linked to this contact

) : (
{bookmarks.map((b: Bookmark) => setSelectedBookmark(b)} />)}
)}
) : (

Select a contact to view linked bookmarks

)}
setSelectedBookmark(null)} onUpdate={() => { if (selectedContact) loadBookmarks(selectedContact) }} />
) }