import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import type { PeriodicExpense } from "@/lib/api"; const months = [ { value: 1, label: "Ene" }, { value: 2, label: "Feb" }, { value: 3, label: "Mar" }, { value: 4, label: "Abr" }, { value: 5, label: "May" }, { value: 6, label: "Jun" }, { value: 7, label: "Jul" }, { value: 8, label: "Ago" }, { value: 9, label: "Sep" }, { value: 10, label: "Oct" }, { value: 11, label: "Nov" }, { value: 12, label: "Dic" }, ]; const periodicExpenseFormSchema = z.object({ description: z .string() .min(1, "La descripción es obligatoria") .max(50, "Máximo 50 caracteres"), defaultDueDay: z .number() .int() .min(1, "Día entre 1 y 31") .max(31, "Día entre 1 y 31"), defaultAmount: z.number().positive("El monto debe ser mayor a 0"), periods: z.array(z.number()).min(1, "Seleccioná al menos un mes"), }); type PeriodicExpenseFormValues = z.infer; interface PeriodicExpenseFormProps { initialData?: PeriodicExpense; onSubmit: (data: PeriodicExpenseFormValues) => Promise; onCancel: () => void; } export function PeriodicExpenseForm({ initialData, onSubmit, onCancel, }: PeriodicExpenseFormProps) { const { register, handleSubmit, watch, setValue, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(periodicExpenseFormSchema), defaultValues: initialData ? { description: initialData.description, defaultDueDay: initialData.defaultDueDay, defaultAmount: Number(initialData.defaultAmount), periods: initialData.periods, } : { description: "", defaultDueDay: 15, defaultAmount: 0, periods: [], }, }); const selectedPeriods = watch("periods"); function toggleMonth(month: number) { if (selectedPeriods.includes(month)) { setValue( "periods", selectedPeriods.filter((m) => m !== month), { shouldValidate: true }, ); } else { setValue("periods", [...selectedPeriods, month], { shouldValidate: true, }); } } return (
{errors.description && ( {errors.description.message} )}
{errors.defaultAmount && ( {errors.defaultAmount.message} )}
{errors.defaultDueDay && ( {errors.defaultDueDay.message} )}
Meses de aplicación
{months.map((m) => ( ))}
{errors.periods && ( {errors.periods.message} )}
); }