"use client"; import { Loader2, Trash2 } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { MoneyInput } from "@/components/money-input"; import { ResponsiveDialog } from "@/components/responsive-dialog"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Textarea } from "@/components/ui/textarea"; import { getTransactionFormOptionsAction, setTransactionDeletedAction, } from "@/features/transactions/actions"; import { AccountSelect } from "@/features/transactions/components/transaction-form"; import type { TransactionFormOptions, TransactionListItem } from "@/features/transactions/service"; import { tr } from "@/i18n/tr"; import { CONTACT_ENTRY_KINDS, CONTACT_RELATIONS, isOutgoing, type ContactEntryKind, type ContactRelation, } from "@/shared/contacts"; import { todayIstanbul } from "@/shared/dates"; import { formatMoneyInput } from "@/shared/money"; import { saveContactAction, saveContactEntryAction } from "../actions"; import type { ContactView } from "../service"; const t = tr.contacts; type Errors = Record; /** Cari oluştur / düzenle. */ export function ContactFormDialog({ open, contact, onOpenChange, }: { open: boolean; contact: ContactView | null; onOpenChange: (open: boolean) => void; }) { return open ? ( onOpenChange(false)} /> ) : null; } function ContactForm({ contact, onClose }: { contact: ContactView | null; onClose: () => void }) { const [v, setV] = useState({ name: contact?.name ?? "", relation: (contact?.relation ?? "friend") as ContactRelation, phone: contact?.phone ?? "", note: contact?.note ?? "", openingBalance: contact?.openingBalanceMinor ? formatMoneyInput(contact.openingBalanceMinor) : "", openingDate: contact?.openingDate ?? todayIstanbul(), dueDate: contact?.dueDate ?? "", reminderDays: String(contact?.reminderDays ?? 3), isPrivate: contact?.isPrivate ?? false, }); const [errors, setErrors] = useState({}); const [busy, setBusy] = useState(false); const set = (k: K, value: (typeof v)[K]) => setV((x) => ({ ...x, [k]: value })); async function submit(e: React.FormEvent) { e.preventDefault(); setBusy(true); const r = await saveContactAction(contact?.id ?? null, v); setBusy(false); if (r.ok) { toast.success(contact ? t.toast.updated : t.toast.created); onClose(); } else setErrors({ ...r.fieldErrors, root: r.fieldErrors ? undefined : r.error }); } const f = t.fields; return ( !o && onClose()} title={contact ? t.editTitle : t.createTitle} footer={ <> } >
{f.name} set("name", e.target.value)} aria-invalid={Boolean(errors.name)} autoFocus /> {errors.name ? {errors.name} : null}
{f.relation} {f.phone} set("phone", e.target.value)} aria-invalid={Boolean(errors.phone)} /> {errors.phone ? {errors.phone} : null}
{f.openingBalance} set("openingBalance", x)} allowNegative /> {errors.openingBalance ? {errors.openingBalance} : null} {tr.transactions.fields.date} set("openingDate", e.target.value)} />
{f.openingHint} setV((x) => ({ ...x, dueDate: d, reminderDays: r }))} errors={errors} /> {f.note}