'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 { listSales, type SaleResponse, type SaleListParams, } from '@/lib/sales'; import type { PaginatedResponse } from '@/lib/api'; const STATUS_OPTIONS = ['draft', 'completed', 'cancelled']; export function SaleList() { const router = useRouter(); const [sales, setSales] = 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 fetchSales = useCallback(async () => { setLoading(true); setError(null); try { const data: PaginatedResponse = await listSales(filters); setSales(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 sales'); } finally { setLoading(false); } }, [filters]); useEffect(() => { fetchSales(); }, [fetchSales]); const handleFilterChange = (key: keyof SaleListParams, value: string) => { setFilters(prev => ({ ...prev, page: 1, [key]: value || undefined, })); }; const handlePageChange = (newPage: number) => { setFilters(prev => ({ ...prev, page: newPage })); }; const columns = [ { key: 'sale_date', label: 'Datum', render: (row: SaleResponse) => new Date(row.sale_date).toLocaleDateString('de-DE'), }, { key: 'vehicle', label: 'Fahrzeug', render: (row: SaleResponse) => row.vehicle ? `${row.vehicle.make} ${row.vehicle.model}` : 'N/A', }, { key: 'buyer', label: 'Käufer', render: (row: SaleResponse) => row.buyer?.company_name || 'N/A', }, { key: 'sale_price', label: 'Preis', render: (row: SaleResponse) => new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(row.sale_price), }, { key: 'status', label: 'Status', render: (row: SaleResponse) => ( {row.status} ), }, { key: 'is_gwg', label: 'GwG', render: (row: SaleResponse) => row.is_gwg ? ( Ja ) : 'Nein', }, { key: 'actions', label: 'Aktionen', render: (row: SaleResponse) => ( ), }, ]; const totalPages = Math.ceil(total / pageSize); return (

Verkäufe

{/* Filters */}
handleFilterChange('date_from', e.target.value)} />
handleFilterChange('date_to', e.target.value)} />
{error && (
{error}
)} {loading ? (
Wird geladen...
) : ( row.id} /> )} {/* Pagination */} {totalPages > 1 && (
Seite {page} von {totalPages}
)} ); }