import { updateSettings } from "@/api/settings" import { SettingsTab } from "@/components/settings-tab" import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" import { Checkbox } from "@/components/ui/checkbox" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import useSetting from "@/hooks/useSetting" import { asOptionalField } from "@/lib/utils" import { nezhaLang, settingCoverageTypes } from "@/types" import { zodResolver } from "@hookform/resolvers/zod" import { useEffect } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { toast } from "sonner" import { z } from "zod" const settingFormSchema = z.object({ dns_servers: asOptionalField(z.string()), ignored_ip_notification: asOptionalField(z.string()), ip_change_notification_group_id: z.coerce.number().int().min(0), cover: z.coerce.number().int().min(1), site_name: z.string().min(1), language: z.string().min(2), user_template: z.string().min(1), install_host: asOptionalField(z.string()), custom_code: asOptionalField(z.string()), custom_code_dashboard: asOptionalField(z.string()), real_ip_header: asOptionalField(z.string()), tls: asOptionalField(z.boolean()), enable_ip_change_notification: asOptionalField(z.boolean()), enable_plain_ip_in_notification: asOptionalField(z.boolean()), }) export default function SettingsPage() { const { t, i18n } = useTranslation() const { data: config, mutate } = useSetting() const form = useForm>({ resolver: zodResolver(settingFormSchema), defaultValues: config ? { ...config, language: config.language, site_name: config.site_name || "", user_template: config.user_template || Object.keys(config.frontend_templates.filter((t) => !t.is_admin) || {})[0] || "user-dist", } : { ip_change_notification_group_id: 0, cover: 1, site_name: "", language: "", user_template: "user-dist", }, resetOptions: { keepDefaultValues: false, }, }) useEffect(() => { if (config) { form.reset(config) } }, [config, form]) const onSubmit = async (values: z.infer) => { try { await updateSettings(values) await mutate() form.reset() } catch (e) { toast(t("Error"), { description: t("Results.ErrorFetchingResource", { error: e?.toString(), }), }) return } finally { if (values.language != i18n.language) { i18n.changeLanguage(values.language) } toast(t("Success")) } } return (
( {t("SiteName")} )} /> ( {t("Language")} )} /> ( {t("Theme")} {!config?.frontend_templates?.find( (t) => t.path === field.value, )?.is_official && (
{t("CommunityThemeWarning")}
{t("CommunityThemeDescription")}
)}
)} /> ( {t("CustomCodes")}