"use client";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import { z } from "zod";
import { Button } from "@/components/ui/button";
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
} from "@/components/ui/form";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Switch } from "@/components/ui/switch";
export const title = "Settings Form";
const formSchema = z.object({
language: z.string(),
theme: z.string(),
emailNotifications: z.boolean(),
marketingEmails: z.boolean(),
securityAlerts: z.boolean(),
twoFactorAuth: z.boolean(),
});
const Example = () => {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
language: "en",
theme: "system",
emailNotifications: true,
marketingEmails: false,
securityAlerts: true,
twoFactorAuth: false,
},
});
function onSubmit(values: z.infer<typeof formSchema>) {
console.log(values);
}
return (
<div className="w-full max-w-2xl">
<Form {...form}>
<form className="space-y-8" onSubmit={form.handleSubmit(onSubmit)}>
<div>
<h3 className="text-lg font-medium">Preferences</h3>
<p className="text-sm text-muted-foreground">
Manage your application preferences
</p>
</div>
<div className="space-y-4">
<FormField
control={form.control}
name="language"
render={({ field }) => (
<FormItem>
<FormLabel>Language</FormLabel>
<Select
defaultValue={field.value}
onValueChange={field.onChange}
>
<FormControl>
<SelectTrigger className="bg-background">
<SelectValue />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value="en">English</SelectItem>
<SelectItem value="es">Spanish</SelectItem>
<SelectItem value="fr">French</SelectItem>
<SelectItem value="de">German</SelectItem>
</SelectContent>
</Select>
<FormDescription>
Choose your preferred language.
</FormDescription>
</FormItem>
)}
/>
<FormField
control={form.control}
name="theme"
render={({ field }) => (
<FormItem>
<FormLabel>Theme</FormLabel>
<Select
defaultValue={field.value}
onValueChange={field.onChange}
>
<FormControl>
<SelectTrigger className="bg-background">
<SelectValue />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value="light">Light</SelectItem>
<SelectItem value="dark">Dark</SelectItem>
<SelectItem value="system">System</SelectItem>
</SelectContent>
</Select>
<FormDescription>
Select your preferred theme.
</FormDescription>
</FormItem>
)}
/>
</div>
<div>
<h3 className="mb-4 text-lg font-medium">Notifications</h3>
<div className="space-y-4">
<FormField
control={form.control}
name="emailNotifications"
render={({ field }) => (
<FormItem className="flex flex-row items-center justify-between rounded-lg border p-4">
<div className="space-y-0.5">
<FormLabel className="text-base">
Email Notifications
</FormLabel>
<FormDescription>
Receive notifications via email
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
<FormField
control={form.control}
name="marketingEmails"
render={({ field }) => (
<FormItem className="flex flex-row items-center justify-between rounded-lg border p-4">
<div className="space-y-0.5">
<FormLabel className="text-base">
Marketing Emails
</FormLabel>
<FormDescription>
Receive emails about new products and features
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
<FormField
control={form.control}
name="securityAlerts"
render={({ field }) => (
<FormItem className="flex flex-row items-center justify-between rounded-lg border p-4">
<div className="space-y-0.5">
<FormLabel className="text-base">
Security Alerts
</FormLabel>
<FormDescription>
Receive alerts about account security
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
</div>
</div>
<div>
<h3 className="mb-4 text-lg font-medium">Security</h3>
<FormField
control={form.control}
name="twoFactorAuth"
render={({ field }) => (
<FormItem className="flex flex-row items-center justify-between rounded-lg border p-4">
<div className="space-y-0.5">
<FormLabel className="text-base">
Two-Factor Authentication
</FormLabel>
<FormDescription>
Add an extra layer of security to your account
</FormDescription>
</div>
<FormControl>
<Switch
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
</FormItem>
)}
/>
</div>
<Button type="submit">Save Settings</Button>
</form>
</Form>
</div>
);
};
export default Example;