"use client" import { analyzeTransaction, retrieveAllAttachmentsForAI } from "@/app/ai/analyze" import { useNotification } from "@/app/context" import { deleteUnsortedFileAction, saveFileAsTransactionAction } from "@/app/unsorted/actions" 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, File, Project } from "@prisma/client" import { Brain, Loader2 } from "lucide-react" import { startTransition, useActionState, useState } from "react" import { FormConvertCurrency } from "../forms/convert-currency" export default function AnalyzeForm({ file, categories, projects, currencies, fields, settings, }: { file: File categories: Category[] projects: Project[] currencies: Currency[] fields: Field[] settings: Record }) { const { showNotification } = useNotification() const [isAnalyzing, setIsAnalyzing] = useState(false) const [analyzeStep, setAnalyzeStep] = useState("") const [analyzeError, setAnalyzeError] = useState("") const [deleteState, deleteAction, isDeleting] = useActionState(deleteUnsortedFileAction, null) const [isSaving, setIsSaving] = useState(false) const [saveError, setSaveError] = useState("") const extraFields = fields.filter((field) => field.isExtra) const [formData, setFormData] = useState({ name: file.filename, merchant: "", description: "", type: settings.default_type, total: 0.0, currencyCode: settings.default_currency, convertedTotal: 0.0, convertedCurrencyCode: settings.default_currency, categoryCode: settings.default_category, projectCode: settings.default_project, issuedAt: "", note: "", text: "", ...extraFields.reduce((acc, field) => { acc[field.code] = "" return acc }, {} as Record), }) async function saveAsTransaction(formData: FormData) { setSaveError("") setIsSaving(true) startTransition(async () => { const result = await saveFileAsTransactionAction(null, formData) setIsSaving(false) if (result.success) { showNotification({ code: "sidebar.transactions", message: "new" }) setTimeout(() => showNotification({ code: "sidebar.transactions", message: "" }), 3000) } else { setSaveError(result.error ? result.error : "Something went wrong...") } }) } const startAnalyze = async () => { setIsAnalyzing(true) setAnalyzeStep("Retrieving files...") setAnalyzeError("") try { const attachments = await retrieveAllAttachmentsForAI(file) setAnalyzeStep("Analyzing...") const results = await analyzeTransaction( settings.prompt_analyse_new_file || process.env.PROMPT_ANALYSE_NEW_FILE || "", settings, fields, categories, projects, attachments ) console.log("Analysis results:", results) if (!results.success) { setAnalyzeError(results.error ? results.error : "Something went wrong...") } else { const nonEmptyFields = Object.fromEntries( Object.entries(results.data || {}).filter( ([_, value]) => value !== null && value !== undefined && value !== "" ) ) console.log("Setting form data:", nonEmptyFields) setFormData({ ...formData, ...nonEmptyFields }) } } catch (error) { console.error("Analysis failed:", error) setAnalyzeError(error instanceof Error ? error.message : "Analysis failed") } finally { setIsAnalyzing(false) setAnalyzeStep("") } } return ( <> {analyzeError &&
⚠️ {analyzeError}
}
setFormData((prev) => ({ ...prev, name: e.target.value }))} /> setFormData((prev) => ({ ...prev, merchant: e.target.value }))} /> setFormData((prev) => ({ ...prev, description: e.target.value }))} hideIfEmpty={true} />
setFormData((prev) => ({ ...prev, total: parseFloat(e.target.value) }))} className="w-32" /> setFormData((prev) => ({ ...prev, currencyCode: value }))} /> setFormData((prev) => ({ ...prev, type: value }))} />
{formData.total != 0 && formData.currencyCode && formData.currencyCode !== settings.default_currency && ( <> setFormData((prev) => ({ ...prev, convertedTotal: value }))} /> )}
setFormData((prev) => ({ ...prev, issuedAt: e.target.value }))} hideIfEmpty={true} />
setFormData((prev) => ({ ...prev, categoryCode: value }))} placeholder="Select Category" /> {projects.length >= 0 && ( setFormData((prev) => ({ ...prev, projectCode: value }))} placeholder="Select Project" /> )}
setFormData((prev) => ({ ...prev, note: e.target.value }))} hideIfEmpty={true} /> {extraFields.map((field) => ( setFormData((prev) => ({ ...prev, [field.code]: e.target.value }))} hideIfEmpty={true} /> ))}
setFormData((prev) => ({ ...prev, text: e.target.value }))} hideIfEmpty={true} />
{deleteState?.error && ⚠️ {deleteState.error}} {saveError && ⚠️ {saveError}}
) }