"use client" import { z } from "zod" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { Plus, Save } from "lucide-react" import { Button } from "@/shared/components/ui/button" import { FieldGroup } from "@/shared/components/ui/field" import { Rhform, RhfTextField, RhfAsyncSelectField, RhfCheckboxField } from "@/shared/components/form" import { toast } from "sonner" import { useAuthApi } from "@/shared/useApi" import { useEffect } from "react" import { DEPARTMENT_ROUTES } from "@garage/api" const invoiceSequenceSchema = z.object({ title: z.string().min(1, "Title is required"), sequence_title: z.string().optional(), prefix: z.string().optional(), start_number: z.coerce.number().int().min(1).optional(), auto_generate: z.boolean().optional(), department: z.object({ value: z.string(), label: z.string() }).nullable().optional(), }) type InvoiceSequenceFormValues = z.infer const STORE_OBJECT = { getOptionValue: (o: any) => o, getOptionLabel: (o: any) => o.label } type InvoiceSequenceFormProps = { resourceId?: string | null initialData?: any onSuccess?: () => void } export function InvoiceSequenceForm({ resourceId, initialData, onSuccess }: InvoiceSequenceFormProps) { const api = useAuthApi() const isEditing = !!resourceId const form = useForm({ resolver: zodResolver(invoiceSequenceSchema), defaultValues: { title: "", sequence_title: "", prefix: "", start_number: 1, auto_generate: false, department: null, }, }) useEffect(() => { if (initialData) { const d = initialData?.data ?? initialData form.reset({ title: d.title ?? "", sequence_title: d.sequence_title ?? "", prefix: d.prefix ?? "", start_number: d.start_number ?? 1, auto_generate: d.auto_generate ?? false, department: d.department_id ? { value: String(d.department_id), label: d.department_name ?? `#${d.department_id}` } : null, }) } }, [initialData, form]) const handleSubmit = async (values: InvoiceSequenceFormValues) => { try { const payload = { title: values.title, sequence_title: values.sequence_title || undefined, prefix: values.prefix || undefined, start_number: values.start_number, auto_generate: values.auto_generate, department_id: values.department ? Number(values.department.value) : undefined, } const promise = isEditing ? api.invoiceSequences.update(resourceId!, payload) : api.invoiceSequences.create(payload) toast.promise(promise, { loading: isEditing ? "Updating..." : "Creating...", success: isEditing ? "Updated successfully" : "Created successfully", error: isEditing ? "Failed to update" : "Failed to create", }) await promise form.reset() onSuccess?.() } catch { // toast already shown } } return (
api.departments.list()} mapOption={(item: any) => ({ value: String(item.id), label: item.name ?? item.title ?? `#${item.id}`, })} {...STORE_OBJECT} />
) }