'use client'; import { useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { Table } from '@/components/ui/Table'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { listContacts, type ContactResponse, type ContactListParams, } from '@/lib/contacts'; import type { PaginatedResponse } from '@/lib/api'; const ROLE_OPTIONS = ['kaeufer', 'verkaeufer', 'beide']; const SORT_OPTIONS = [ { value: '-created_at', label: 'Newest First' }, { value: 'created_at', label: 'Oldest First' }, { value: 'company_name', label: 'Company A-Z' }, { value: '-company_name', label: 'Company Z-A' }, { value: 'address_city', label: 'City A-Z' }, ]; export function ContactList() { const router = useRouter(); const [contacts, setContacts] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [pageSize] = useState(20); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [filters, setFilters] = useState({ page: 1, page_size: 20, }); const fetchContacts = useCallback(async () => { setLoading(true); setError(null); try { const data: PaginatedResponse = await listContacts(filters); setContacts(data.items); setTotal(data.total); setPage(data.page); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Failed to load contacts'); } finally { setLoading(false); } }, [filters]); useEffect(() => { fetchContacts(); }, [fetchContacts]); const handleFilterChange = (key: keyof ContactListParams, value: string) => { setFilters(prev => ({ ...prev, page: 1, [key]: value || undefined, })); }; const handleEuToggle = (value: string) => { if (value === '') { setFilters(prev => ({ ...prev, page: 1, is_eu: undefined })); } else { setFilters(prev => ({ ...prev, page: 1, is_eu: value === 'eu' })); } }; const handlePageChange = (newPage: number) => { setFilters(prev => ({ ...prev, page: newPage })); }; const columns = [ { key: 'company_name', label: 'Company', render: (row: ContactResponse) => ( ), }, { key: 'address_city', label: 'City' }, { key: 'address_country', label: 'Country' }, { key: 'role', label: 'Role' }, { key: 'vat_id', label: 'VAT ID', render: (row: ContactResponse) => row.vat_id || '—', }, { key: 'vat_id_status', label: 'VAT Status', render: (row: ContactResponse) => ( {row.vat_id_status} ), }, { key: 'contact_persons', label: 'Persons', render: (row: ContactResponse) => String(row.contact_persons?.length || 0), }, ]; const totalPages = Math.ceil(total / pageSize); return (

Kontakte

handleFilterChange('search', e.target.value)} />
{error && (
{error}
)} {loading ? (
Loading contacts...
) : ( row.id} /> )} {totalPages > 1 && (
Page {page} of {totalPages} ({total} total)
)} ); }