import { updateServer } from "@/api/server" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { ScrollArea } from "@/components/ui/scroll-area" import { Textarea } from "@/components/ui/textarea" import { IconButton } from "@/components/xui/icon-button" import { conv } from "@/lib/utils" import { asOptionalField } from "@/lib/utils" import { ModelServer } from "@/types" import { zodResolver } from "@hookform/resolvers/zod" import { useState, useEffect } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { toast } from "sonner" import { KeyedMutator } from "swr" import { z } from "zod" interface ServerCardProps { data: ModelServer mutate: KeyedMutator } const serverFormSchema = z.object({ name: z.string().min(1), note: asOptionalField(z.string()), public_note: asOptionalField(z.string()), display_index: z.coerce.number().int(), hide_for_guest: asOptionalField(z.boolean()), enable_ddns: asOptionalField(z.boolean()), ddns_profiles: asOptionalField(z.array(z.number())), ddns_profiles_raw: asOptionalField(z.string()), override_ddns_domains: asOptionalField(z.record(z.coerce.number().int(), z.array(z.string()))), override_ddns_domains_raw: asOptionalField( z.string().refine( (val) => { try { JSON.parse(val) return true } catch (e) { return false } }, { message: "Invalid JSON string", }, ), ), billing_data: z.object({ registrar: asOptionalField(z.string()), endDate: asOptionalField(z.string()), notes: asOptionalField(z.string()), }).optional(), }) export const ServerCard: React.FC = ({ data, mutate }) => { const { t } = useTranslation() const form = useForm>({ resolver: zodResolver(serverFormSchema) as any, defaultValues: { ...data, ddns_profiles_raw: data.ddns_profiles ? conv.arrToStr(data.ddns_profiles) : undefined, override_ddns_domains_raw: data.override_ddns_domains ? JSON.stringify(data.override_ddns_domains) : undefined, }, resetOptions: { keepDefaultValues: false, }, }) const [open, setOpen] = useState(false) useEffect(() => { const handleMessage = (e: MessageEvent) => { if (e.data?.type === 'NZCFG_JSON') { if (e.data.target === 'public_note') { form.setValue('public_note', e.data.payload); toast(t("Success"), { description: "配置已通过可视化构建器自动填入" }); } } }; window.addEventListener('message', handleMessage); return () => window.removeEventListener('message', handleMessage); }, [form, t]); const onSubmit = async (values: any) => { try { values.ddns_profiles = values.ddns_profiles_raw ? conv.strToArr(values.ddns_profiles_raw).map(Number) : undefined values.override_ddns_domains = values.override_ddns_domains_raw ? JSON.parse(values.override_ddns_domains_raw) : undefined await updateServer(data!.id!, values) } catch (e) { console.error(e) toast(t("Error"), { description: t("Results.UnExpectedError"), }) return } setOpen(false) await mutate() form.reset() } return (
{t("EditServer")}
( {t("Name")} )} /> ( {t("Weight")} )} /> {form.watch("enable_ddns") ? ( <> ( {t("DDNSProfiles") + t("SeparateWithComma")} )} /> ( {t("OverrideDDNSDomains")}