"use client"; import { Invoice, InvoiceSchema } from "@/models/invoice"; import { zodResolver } from "@hookform/resolvers/zod"; import { useFieldArray, useForm, useWatch, SubmitHandler, } from "react-hook-form"; import { Input } from "./ui/input"; import React from "react"; import { cn } from "@/utils/cn"; import { Button } from "./ui/button"; const defaultItem = { description: "", quantity: 1, rate: 0, }; const defaultValues: Invoice = { invoice_number: 0, from: "", line_items: [defaultItem], currency: "USD", }; export const InvoiceGenerator = () => { const { register, handleSubmit, control, watch, formState: { errors }, } = useForm({ resolver: zodResolver(InvoiceSchema), defaultValues, }); const { fields, append, remove } = useFieldArray({ control, name: "line_items", }); const lineItems = useWatch({ control, name: "line_items" }); const currency = watch("currency", "USD"); const onSubmit: SubmitHandler = (data) => { console.log(data); }; return (
{errors["from"] && (

{errors["from"].message ?? "Error"}

)}

Your Items

Item

Quantity

Rate

Amount

Actions

{fields.map((f, ind) => (

{(lineItems[ind]?.rate ?? 0) * (lineItems[ind]?.quantity ?? 0)}{" "} {currency}

))}
Subtotal:{" "} {lineItems.reduce( (acc, cur) => acc + (cur.rate ?? 0) * (cur.quantity ?? 0), 0, )}{" "} {currency}
); };