import { useState, useEffect } from 'react'; import { Plus, Edit2, Trash2, Search, Copy, Check, AlertCircle, Tag, } from 'lucide-react'; import { useAddressBookStore, AddressBookEntry } from '../../store/addressbook'; export default function AddressBookPage() { const { entries, isLoading, error, clearError, fetchAll, addEntry, updateEntry, deleteEntry, } = useAddressBookStore(); const [searchQuery, setSearchQuery] = useState(''); const [showAddModal, setShowAddModal] = useState(false); const [editingEntry, setEditingEntry] = useState(null); const [copiedAddress, setCopiedAddress] = useState(null); // Form state const [formName, setFormName] = useState(''); const [formAddress, setFormAddress] = useState(''); const [formNotes, setFormNotes] = useState(''); const [formTags, setFormTags] = useState(''); useEffect(() => { fetchAll(); }, [fetchAll]); const filteredEntries = entries.filter( (entry) => entry.name.toLowerCase().includes(searchQuery.toLowerCase()) || entry.address.toLowerCase().includes(searchQuery.toLowerCase()) || entry.tags.some((t) => t.toLowerCase().includes(searchQuery.toLowerCase())) ); const resetForm = () => { setFormName(''); setFormAddress(''); setFormNotes(''); setFormTags(''); }; const handleAdd = async () => { if (!formName || !formAddress) return; try { const tags = formTags .split(',') .map((t) => t.trim()) .filter(Boolean); await addEntry(formName, formAddress, formNotes || undefined, tags); setShowAddModal(false); resetForm(); } catch { // Error handled by store } }; const handleEdit = async () => { if (!editingEntry || !formName || !formAddress) return; try { const tags = formTags .split(',') .map((t) => t.trim()) .filter(Boolean); await updateEntry(editingEntry.id, formName, formAddress, formNotes || undefined, tags); setEditingEntry(null); resetForm(); } catch { // Error handled by store } }; const handleDelete = async (id: string) => { if (!confirm('Are you sure you want to delete this contact?')) return; try { await deleteEntry(id); } catch { // Error handled by store } }; const copyAddress = (address: string) => { navigator.clipboard.writeText(address); setCopiedAddress(address); setTimeout(() => setCopiedAddress(null), 2000); }; const openEditModal = (entry: AddressBookEntry) => { setEditingEntry(entry); setFormName(entry.name); setFormAddress(entry.address); setFormNotes(entry.notes || ''); setFormTags(entry.tags.join(', ')); }; const renderEntryCard = (entry: AddressBookEntry) => (

{entry.name}

{entry.address}
{entry.notes && (

{entry.notes}

)} {entry.tags.length > 0 && (
{entry.tags.map((tag, i) => ( {tag} ))}
)}
); return (
{/* Header */}

Address Book

Manage your saved addresses

{/* Error Alert */} {error && (

{error}

)} {/* Search */}
setSearchQuery(e.target.value)} placeholder="Search by name, address, or tag..." className="w-full pl-10 pr-4 py-3 bg-gray-900 border border-gray-800 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-synor-500" />
{/* All Contacts */}

All Contacts ({filteredEntries.length})

{filteredEntries.length > 0 ? (
{filteredEntries.map(renderEntryCard)}
) : (
{searchQuery ? 'No contacts found' : 'No contacts yet'}
)}
{/* Add/Edit Modal */} {(showAddModal || editingEntry) && (

{editingEntry ? 'Edit Contact' : 'Add Contact'}

setFormName(e.target.value)} placeholder="Contact name" className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-synor-500" />
setFormAddress(e.target.value)} placeholder="synor1..." className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg text-white font-mono text-sm placeholder-gray-500 focus:outline-none focus:border-synor-500" />
setFormTags(e.target.value)} placeholder="e.g., Exchange, Friend, Business" className="w-full pl-10 pr-4 py-2 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-synor-500" />