'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import React, { useRef } from 'react'; import { Button } from '@/components/ui/button'; import { ActionResponse } from '@/lib/types/actionResponse'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; import { sonnerContent } from '@/components/ui/sonner'; import { Category, Entity, Payment } from '@prisma/client'; import { paymentFormSchema } from '@/lib/form-schemas/paymentFormSchema'; import CurrencyInput from '@/components/ui/currency-input'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { cn } from '@/lib/utils'; import { CalendarIcon } from 'lucide-react'; import { format } from 'date-fns'; import { Calendar } from '@/components/ui/calendar'; import { Textarea } from '@/components/ui/textarea'; import { AutoCompleteInput } from '@/components/ui/auto-complete-input'; export default function PaymentForm({value, entities, categories, onSubmit, className}: { value: Payment | undefined, entities: Entity[], categories: Category[], onSubmit: (data: z.infer) => Promise className?: string }) { const router = useRouter(); const form = useForm>({ resolver: zodResolver(paymentFormSchema), defaultValues: { id: value?.id ?? undefined, amount: value?.amount ?? 0, date: value?.date ?? new Date(), payorId: value?.payorId ?? undefined, payeeId: value?.payeeId ?? undefined, categoryId: value?.categoryId ?? undefined, note: value?.note ?? '', }, }); const handleSubmit = async (data: z.infer) => { const response = await onSubmit(data); toast(sonnerContent(response)); if (response.redirect) { router.push(response.redirect); } }; const entitiesMapped = entities?.map((entity) => { return { label: entity.name, value: entity.id, }; }) ?? []; const categoriesMapped = categories?.map((category) => { return { label: category.name, value: category.id, }; }) ?? []; const payeeRef = useRef({} as HTMLInputElement); const categoryRef = useRef({} as HTMLInputElement); const submitRef = useRef({} as HTMLButtonElement); return (
( )} />
( Date { field.onChange(e); }} initialFocus /> )} /> ( Payor { field.onChange(e); if (e && e.target.value) { payeeRef && payeeRef.current.focus(); } }}/> )} /> ( Payee { field.onChange(e); if (e && e.target.value) { const entity = entities.find((entity) => entity.id === Number(e.target.value)); // only focus category input if payee has no default category if (entity?.defaultCategoryId !== null) { form.setValue('categoryId', entity?.defaultCategoryId); submitRef && submitRef.current.focus(); } else { categoryRef && categoryRef.current.focus(); } } }}/> )} /> ( Category { field.onChange(e); if (e && e.target.value) { submitRef && submitRef.current.focus(); } }} /> )} />
( Note