"use client"; import { z } from "zod"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { toast } from "@/hooks/useToast"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Purchase } from "../data/schema"; import { usePurchase } from "@/hooks/usePurchase"; const formSchema = z.object({ user_id: z.number({ invalid_type_error: "User ID must be a number." }), used_coupon_id: z.number().nullable().optional(), total: z .number({ invalid_type_error: "Total must be a number." }) .min(0, { message: "Total must be at least 0." }), date_purchased: z.coerce.date({ errorMap: () => ({ message: "Invalid date." }) }), isEdit: z.boolean() }); type PurchaseForm = z.infer; interface Props { currentRow?: Purchase; open: boolean; onOpenChange: (open: boolean) => void; } export function PurchasesActionDialog({ currentRow, open, onOpenChange }: Props) { const { createPurchase, updatePurchase } = usePurchase(currentRow?.id); const isEdit = !!currentRow; const form = useForm({ resolver: zodResolver(formSchema), defaultValues: isEdit ? { ...currentRow, date_purchased: new Date(currentRow.date_purchased), isEdit } : { user_id: 0, used_coupon_id: null, total: 0, date_purchased: new Date(), isEdit } }); const onSubmit = (values: PurchaseForm) => { try { const payload = { ...values, date_purchased: values.date_purchased.toISOString() }; if (isEdit) { updatePurchase.mutate({ ...currentRow, ...payload }); } else { createPurchase.mutate({...payload, used_coupon_id: payload.used_coupon_id ?? null }); } toast({ title: isEdit ? "Purchase updated" : "Purchase created", description: `User #${values.user_id} • ${values.total.toFixed(2)}€` }); form.reset(); onOpenChange(false); } catch (err) { toast({ title: "An error occurred", description: (err as Error).message, variant: "destructive" }); } }; return ( { form.reset(); onOpenChange(state); }}> {isEdit ? "Edit Purchase" : "Add New Purchase"} {isEdit ? "Update the purchase details below." : "Record a new purchase."}
( User ID field.onChange(Number(e.target.value))} /> )} /> ( Coupon ID (optional) { const value = e.target.value; field.onChange(value === "" ? null : Number(value)); }} /> )} /> ( Total (€) field.onChange(Number(e.target.value))} /> )} /> ( Purchase Date field.onChange(new Date(e.target.value)) } /> )} />
); }