"use client" import { deleteTransactionAction, saveTransactionAction } from "@/app/(app)/transactions/actions" import { FormError } from "@/components/forms/error" import { FormSelectCategory } from "@/components/forms/select-category" import { FormSelectCurrency } from "@/components/forms/select-currency" import { FormSelectProject } from "@/components/forms/select-project" import { FormSelectType } from "@/components/forms/select-type" import { FormInput, FormTextarea } from "@/components/forms/simple" import { Button } from "@/components/ui/button" import { Category, Currency, Field, Project, Transaction } from "@/prisma/client" import { format } from "date-fns" import { Loader2, Save, Trash2 } from "lucide-react" import { useRouter } from "next/navigation" import { startTransition, useActionState, useEffect, useMemo, useState } from "react" export default function TransactionEditForm({ transaction, categories, projects, currencies, fields, settings, }: { transaction: Transaction categories: Category[] projects: Project[] currencies: Currency[] fields: Field[] settings: Record }) { const router = useRouter() const [deleteState, deleteAction, isDeleting] = useActionState(deleteTransactionAction, null) const [saveState, saveAction, isSaving] = useActionState(saveTransactionAction, null) const extraFields = fields.filter((field) => field.isExtra) const [formData, setFormData] = useState({ name: transaction.name || "", merchant: transaction.merchant || "", description: transaction.description || "", total: transaction.total ? transaction.total / 100 : 0.0, currencyCode: transaction.currencyCode || settings.default_currency, convertedTotal: transaction.convertedTotal ? transaction.convertedTotal / 100 : 0.0, convertedCurrencyCode: transaction.convertedCurrencyCode, type: transaction.type || "expense", categoryCode: transaction.categoryCode || settings.default_category, projectCode: transaction.projectCode || settings.default_project, issuedAt: transaction.issuedAt ? format(transaction.issuedAt, "yyyy-MM-dd") : "", note: transaction.note || "", ...extraFields.reduce( (acc, field) => { acc[field.code] = transaction.extra?.[field.code as keyof typeof transaction.extra] || "" return acc }, {} as Record ), }) const fieldMap = useMemo(() => { return fields.reduce( (acc, field) => { acc[field.code] = field return acc }, {} as Record ) }, [fields]) const handleDelete = async () => { if (confirm("Are you sure? This will delete the transaction with all the files permanently")) { startTransition(async () => { await deleteAction(transaction.id) router.back() }) } } useEffect(() => { if (saveState?.success) { router.back() } }, [saveState, router]) return (
{ setFormData({ ...formData, currencyCode: value }) }} currencies={currencies} isRequired={fieldMap.currencyCode.isRequired} />
{formData.currencyCode !== settings.default_currency || formData.convertedTotal !== 0 ? ( <> {formData.convertedTotal !== null && ( )} {(!formData.convertedCurrencyCode || formData.convertedCurrencyCode !== settings.default_currency) && ( )} ) : ( <> )}
{extraFields.map((field) => ( ))}
{deleteState?.error && ⚠️ {deleteState.error}} {saveState?.error && ⚠️ {saveState.error}}
) }