"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Button } from "@/components/ui/button"; import { useToast } from "@/components/ui/use-toast"; const schema = z.object({ company: z.string().min(1, "Company name is required"), contactPerson: z.string().min(1, "Contact person is required"), email: z.string().email("Invalid email address"), phone: z.string().optional(), notes: z.string().optional(), }); type FormValues = z.infer; interface NewClientDialogProps { children: React.ReactNode; } export function NewClientDialog({ children }: NewClientDialogProps) { const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const router = useRouter(); const { toast } = useToast(); const { register, handleSubmit, reset, formState: { errors }, } = useForm({ resolver: zodResolver(schema), defaultValues: { company: "", contactPerson: "", email: "", phone: "", notes: "" }, }); const onSubmit = async (values: FormValues) => { setLoading(true); try { const res = await fetch("/api/clients", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(values), }); if (!res.ok) { const error = await res.json().catch(() => ({})); throw new Error(error.error ?? "Failed to create client"); } const data = await res.json(); toast({ title: `Client "${data.company}" created` }); setOpen(false); reset(); router.refresh(); } catch (e) { toast({ title: "Failed to create client", description: e instanceof Error ? e.message : undefined, variant: "destructive", }); } finally { setLoading(false); } }; return ( {children} New Client
{errors.company &&

{errors.company.message}

}
{errors.contactPerson &&

{errors.contactPerson.message}

}
{errors.email &&

{errors.email.message}

}