pablo.shortman.me/src/components/contact-form.tsx

133 lines
3.7 KiB
TypeScript

"use client";
import React from "react";
import Heading from "./heading";
import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import { Button } from "@/ui/button";
import { Textarea } from "@/ui/textarea";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/ui/form";
import { Input } from "@/ui/input";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { cn } from "@/lib/utils";
const formSchema = z.object({
name: z.string().min(2).max(50),
email: z.string().email(),
budget: z.string(),
message: z.string().max(500),
});
function ContactForm() {
// 1. Define your form.
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
});
// 2. Define a submit handler.
function onSubmit(values: z.infer<typeof formSchema>) {
// Do something with the form values.
// ✅ This will be type-safe and validated.
console.log(values);
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<div className="flex gap-4 w-full">
<FormField
control={form.control}
name="name"
render={({ field }) => (
<FormItem className="w-full ">
<FormLabel>Name</FormLabel>
<FormControl>
<Input placeholder="John Doe" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem className="w-full">
<FormLabel>Email</FormLabel>
<FormControl>
<Input placeholder="email@example.com" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<FormField
control={form.control}
name="budget"
render={({ field }) => (
<FormItem>
<FormLabel>Budget</FormLabel>
<FormControl>
<Select
onValueChange={field.onChange}
defaultValue={field.value}
>
<SelectTrigger
className={cn(
"w-full",
field.value?.length
? "text-foreground"
: "text-muted-foreground"
)}
>
<SelectValue placeholder="Select your Budget" />
</SelectTrigger>
<SelectContent>
<SelectItem value="< €2k">{"less then $2k"}</SelectItem>
<SelectItem value="> €4k">{"more then $4k"}</SelectItem>
<SelectItem value="> €6k">{"more then $6k"}</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="message"
render={({ field }) => (
<FormItem>
<FormLabel>Message</FormLabel>
<FormControl>
<Textarea rows={4} placeholder="Message..." {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" className="w-full">
Submit
</Button>
</form>
</Form>
);
}
export default ContactForm;