src/registry/default/templates/booking-request-form.tsx
"use client";
import { useForm, Controller } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { toast } from "sonner";
import { Textarea } from "@/components/ui/textarea";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const formSchema = z.object({
name: z.string().min(2, "Name is required"),
email: z.string().email("Invalid email"),
date: z.string().min(1, "Date is required"),
service: z.enum(["consultation", "demo", "support"]),
notes: z.string().optional(),
});
type FormValues = z.infer<typeof formSchema>;
export function BookingRequestForm() {
const form = useForm<FormValues>({
resolver: zodResolver(formSchema),
defaultValues: {
name: "",
email: "",
date: "",
service: "consultation",
notes: "",
},
});
const onSubmit = async (data: FormValues) => {
console.log("Form submitted:", data);
toast.success("Form submitted successfully!");
};
return (
<Card className="w-full max-w-md mx-auto">
<CardHeader>
<CardTitle>Booking Request</CardTitle>
<CardDescription>Request a booking or appointment</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<div className="space-y-2">
<Label htmlFor="name">Your Name</Label>
<Input
id="name"
type="text"
placeholder="John Doe"
{...form.register("name")}
/>
{form.formState.errors.name && (
<p className="text-sm text-destructive">{form.formState.errors.name.message}</p>
)}
</div>
<div className="space-y-2">
<Label htmlFor="email">Email Address</Label>
<Input
id="email"
type="email"
placeholder="john@example.com"
{...form.register("email")}
/>
{form.formState.errors.email && (
<p className="text-sm text-destructive">{form.formState.errors.email.message}</p>
)}
</div>
<div className="space-y-2">
<Label htmlFor="date">Preferred Date</Label>
<Input
id="date"
type="date"
placeholder=""
{...form.register("date")}
/>
{form.formState.errors.date && (
<p className="text-sm text-destructive">{form.formState.errors.date.message}</p>
)}
</div>
<div className="space-y-2">
<Label htmlFor="service">Service Type</Label>
<Controller
control={form.control}
name="service"
render={({ field }) => (
<Select onValueChange={field.onChange} defaultValue={field.value}>
<SelectTrigger id="service">
<SelectValue placeholder="Select an option" />
</SelectTrigger>
<SelectContent>
<SelectItem value="consultation">Consultation</SelectItem>
<SelectItem value="demo">Product Demo</SelectItem>
<SelectItem value="support">Technical Support</SelectItem>
</SelectContent>
</Select>
)}
/>
{form.formState.errors.service && (
<p className="text-sm text-destructive">{form.formState.errors.service.message}</p>
)}
</div>
<div className="space-y-2">
<Label htmlFor="notes">Additional Notes</Label>
<Textarea
id="notes"
placeholder="Any specific requirements?"
{...form.register("notes")}
/>
{form.formState.errors.notes && (
<p className="text-sm text-destructive">{form.formState.errors.notes.message}</p>
)}
</div>
<Button type="submit" className="w-full">Submit</Button>
</form>
</CardContent>
</Card>
);
}



























