import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import * as z from "zod"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import useLocale from "@/utils/hooks/use-locale"; import { useTranslation } from "next-i18next"; import { useTheme } from "next-themes"; import { useEffect } from "react"; import { toast } from "sonner"; const appearanceFormSchema = z.object({ theme: z.enum(["light", "dark", "system"], { required_error: "Please select a theme.", }), language: z.enum(["en", "pl", "ru", "de", "zh-Hant", "zh-Hans", "fa"], { required_error: "Please select a language.", }), }); type AppearanceFormValues = z.infer; // This can come from your database or API. const defaultValues: Partial = { theme: "system", language: "en", }; export function AppearanceForm() { const { setTheme, theme } = useTheme(); const { locale, setLocale } = useLocale(); const { t } = useTranslation("settings"); const form = useForm({ resolver: zodResolver(appearanceFormSchema), defaultValues, }); useEffect(() => { form.reset({ theme: (theme ?? "system") as AppearanceFormValues["theme"], language: locale, }); }, [form, theme, locale]); function onSubmit(data: AppearanceFormValues) { setTheme(data.theme); setLocale(data.language); toast.success("Preferences Updated"); } return ( {t("settings.appearance.title")} {t("settings.appearance.description")}
{ return ( {t("settings.appearance.theme")} {t( "settings.appearance.themeDescription" )}
light
{t( "settings.appearance.themes.light" )}
dark
{t( "settings.appearance.themes.dark" )}
system
{t( "settings.appearance.themes.system" )}
); }} /> { return ( {t("settings.appearance.language")} {t( "settings.appearance.languageDescription" )} ); }} />
); }