'use client' import {useEffect} from 'react' import {useMutation, useQueryClient} from '@tanstack/react-query' import {zodResolver} from '@hookform/resolvers/zod' import {useForm} from 'react-hook-form' import {Loader2} from 'lucide-react' import {toast} from 'sonner' import {z} from 'zod' import {Button} from '@/components/ui/button' import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle} from '@/components/ui/dialog' import {Input} from '@/components/ui/input' import {Label} from '@/components/ui/label' import {Textarea} from '@/components/ui/textarea' import {ZoneService, zoneQueryKey, type ZoneItem} from '@/lib/services/openflare' const schema = z.object({domain: z.string().trim().min(1, '请输入 Zone 根域').refine((value) => !/[*/?#@]|:\/\//.test(value), '请输入不含协议或通配符的根域'), remark: z.string().max(255)}) type Values = z.infer export function ZoneEditorDialog({open, onOpenChange, zone}: {open: boolean; onOpenChange(open: boolean): void; zone?: ZoneItem | null}) { const queryClient = useQueryClient(); const form = useForm({resolver: zodResolver(schema), defaultValues: {domain: '', remark: ''}}) useEffect(() => { if (open) form.reset({domain: zone?.domain ?? '', remark: zone?.remark ?? ''}) }, [form, open, zone]) const mutation = useMutation({mutationFn: (values: Values) => zone ? ZoneService.update(zone.id, values) : ZoneService.create(values), onSuccess: async () => { toast.success(zone ? 'Zone 已更新' : 'Zone 已创建'); await queryClient.invalidateQueries({queryKey: zoneQueryKey}); onOpenChange(false) }, onError: (error) => toast.error(error instanceof Error ? error.message : '保存失败')}) return {zone ? '编辑 Zone' : '新增 Zone'}Zone 仅接受可注册根域,例如 arctel.de。
mutation.mutate({domain: values.domain.toLowerCase(), remark: values.remark.trim()}))}>
{form.formState.errors.domain &&

{form.formState.errors.domain.message}

}