import { useEffect, useState } from "react"; import { toast } from "sonner"; import { ModelConfig, settingCoverageTypes, nezhaLang } from "@/types"; import { SettingsTab } from "@/components/settings-tab"; import { z } from "zod"; import { asOptionalField } from "@/lib/utils"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { getSettings, updateSettings } from "@/api/settings"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; const settingFormSchema = z.object({ custom_nameservers: 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), install_host: asOptionalField(z.string()), custom_code: asOptionalField(z.string()), custom_code_dashboard: asOptionalField(z.string()), real_ip_header: asOptionalField(z.string()), enable_ip_change_notification: asOptionalField(z.boolean()), enable_plain_ip_in_notification: asOptionalField(z.boolean()), }); export default function SettingsPage() { const [config, setConfig] = useState(); const [error, setError] = useState(); useEffect(() => { if (error) toast("Error", { description: `Error fetching resource: ${error.message}.`, }); }, [error]); useEffect(() => { (async () => { try { const c = await getSettings(); setConfig(c); } catch (e) { if (e instanceof Error) setError(e); } })(); }, []); const form = useForm>({ resolver: zodResolver(settingFormSchema), defaultValues: config ? config : { ip_change_notification_group_id: 0, cover: 1, site_name: "", language: "", }, resetOptions: { keepDefaultValues: false, }, }); useEffect(() => { if (config) { form.reset(config); } }, [config, form]); const onSubmit = async (values: z.infer) => { try { await updateSettings(values); const newConfig = await getSettings(); setConfig(newConfig); form.reset(); } catch (e) { if (e instanceof Error) setError(e); return; } finally { toast("Success", { description: "Config updated successfully.", }); } }; return (
( Site Name )} /> ( Language )} /> ( Custom Codes (Style and Script)