"use client"; import { useActionState, useEffect, useState, useTransition } from "react"; import { Loader2, Plus, Save, Trash2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { addInvoiceItemAction, deleteInvoiceItemAction, updateInvoiceItemAction, } from "@/lib/appwrite/invoice-actions"; import { initialInvoiceState } from "@/lib/appwrite/invoice-types"; import { formatTRY } from "@/lib/format"; export type InvoiceItemRow = { id: string; description: string; quantity: number; unitPrice: number; vatRate: number; lineTotal: number; }; type Props = { invoiceId: string; items: InvoiceItemRow[] }; export function InvoiceItemsEditor({ invoiceId, items }: Props) { const [formOpen, setFormOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [busy, startTransition] = useTransition(); const handleDelete = () => { if (!deleting) return; startTransition(async () => { const fd = new FormData(); fd.set("id", deleting.id); const result = await deleteInvoiceItemAction(fd); if (result.ok) { toast.success("Kalem silindi."); setDeleting(null); } else { toast.error(result.error ?? "Silme başarısız."); } }); }; return ( <>

Kalemler ({items.length})

Açıklama Miktar Birim fiyat KDV % Toplam {items.length ? ( items.map((it) => ( { setEditing(it); setFormOpen(true); }} > {it.description} {it.quantity} {formatTRY(it.unitPrice)} {it.vatRate}% {formatTRY(it.lineTotal)} )) ) : (

Henüz kalem eklenmemiş. Yukarıdan ekleyin.

)}
{ setFormOpen(v); if (!v) setEditing(null); }} invoiceId={invoiceId} item={editing} /> !v && setDeleting(null)}> Kalemi sil {deleting?.description} kalemini silmek istediğinize emin misiniz? ); } function ItemFormSheet({ open, onOpenChange, invoiceId, item, }: { open: boolean; onOpenChange: (v: boolean) => void; invoiceId: string; item?: InvoiceItemRow | null; }) { const isEdit = Boolean(item); const action = isEdit ? updateInvoiceItemAction : addInvoiceItemAction; const [state, formAction, isPending] = useActionState(action, initialInvoiceState); useEffect(() => { if (state.ok) { toast.success(isEdit ? "Kalem güncellendi." : "Kalem eklendi."); onOpenChange(false); } else if (state.error) { toast.error(state.error); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [state]); return ( {isEdit ? "Kalemi düzenle" : "Yeni kalem"}
{isEdit && item && } {!isEdit && }
); }