import { useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useExpensesContext } from "../ExpensesProvider"; import { DatePicker } from "@/components/ui/date-picker"; import { ResponsiveDialog, ResponsiveDialogContent, ResponsiveDialogHeader, ResponsiveDialogTitle, ResponsiveDialogFooter, } from "@/components/ui/responsive-dialog"; import { Button } from "@/components/ui/button"; const newExpenseSchema = z.object({ description: z.string().min(1, "La descripción es obligatoria").max(50, "Máximo 50 caracteres"), amount: z.number().positive("El monto debe ser mayor a 0"), dueDate: z.date({ message: "La fecha es obligatoria" }), }); type NewExpenseFormValues = z.infer; interface NewExpenseDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export function NewExpenseDialog({ open, onOpenChange }: NewExpenseDialogProps) { const { createNonPeriodicExpense } = useExpensesContext(); const { register, handleSubmit, control, formState: { errors, isSubmitting }, reset, } = useForm({ resolver: zodResolver(newExpenseSchema), defaultValues: { description: "", amount: 0, dueDate: new Date(), }, }); function handleClose(open: boolean) { onOpenChange(open); if (!open) reset(); } async function onSubmit(data: NewExpenseFormValues) { await createNonPeriodicExpense({ description: data.description, amount: data.amount, dueDate: data.dueDate.toISOString(), }); handleClose(false); } return ( Nuevo gasto
{errors.description && ( {errors.description.message} )}
{errors.amount && ( {errors.amount.message} )}
( )} /> {errors.dueDate && ( {errors.dueDate.message} )}
); }