import { useEffect } from "react"; import { createFileRoute, Link, useNavigate } from "@tanstack/react-router"; import { Plus } from "lucide-react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useCreateCustomer, useUpdateCustomer, useGetCustomerById, trpc } from "shared-react"; import { Button, Input, BackLink, buttonVariants } from "#/components/ui"; const formSchema = z.object({ mobile: z.string().min(1, "Mobile is required"), name: z.string().nullable().optional(), added_on: z.string().min(1, "Date is required"), }); type FormValues = z.infer; export const Route = createFileRoute("/customers/add")({ component: AddCustomerPage, validateSearch: (search: Record) => ({ id: search.id ? Number(search.id) : undefined }), staticData: { title: "Add Customer", subtitle: "Register a new customer" }, }); function AddCustomerPage() { const navigate = useNavigate(); const { id: editId } = Route.useSearch(); const createMutation = useCreateCustomer(); const updateMutation = useUpdateCustomer(); const { data: existingCustomer } = useGetCustomerById(editId ?? 0); const utils = trpc.useUtils(); const isEditing = typeof editId === "number" && editId > 0; const { register, handleSubmit, reset, formState: { errors } } = useForm({ resolver: zodResolver(formSchema), defaultValues: { mobile: "", name: null, added_on: new Date().toISOString().slice(0, 10) }, }); useEffect(() => { if (isEditing && existingCustomer) { reset({ mobile: existingCustomer.mobile, name: existingCustomer.name, added_on: existingCustomer.added_on }); } }, [isEditing, existingCustomer, reset]); function onSubmit(values: FormValues) { if (isEditing) { updateMutation.mutate( { id: editId!, ...values }, { onSuccess: () => { utils.customers.list.invalidate(); utils.customers.byId.invalidate({ id: editId! }); navigate({ to: "/customers" }); } }, ); } else { createMutation.mutate(values, { onSuccess: () => { utils.customers.list.invalidate(); navigate({ to: "/customers" }); } }); } } const mutation = isEditing ? updateMutation : createMutation; return (

{isEditing ? "Edit Customer" : "New Customer"}

{isEditing ? "Update customer details." : "Register a new customer."}

{errors.mobile &&

{errors.mobile.message}

}
v || null })} placeholder="John Doe" />
{errors.added_on &&

{errors.added_on.message}

}
Cancel
{mutation.error &&

Failed to {isEditing ? "update" : "create"} customer.

}
); }