'use client'; import {useMutation, useQueryClient} from '@tanstack/react-query'; import {zodResolver} from '@hookform/resolvers/zod'; import {useState} from 'react'; import {useForm} from 'react-hook-form'; import {Loader2} from 'lucide-react'; 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 {Select, SelectContent, SelectItem, SelectTrigger, SelectValue,} from '@/components/ui/select'; import {DnsAccountService} from '@/lib/services/openflare'; import type {DnsAccountMutationPayload} from '@/lib/services/openflare'; import {getErrorMessage} from './website-utils'; const dnsAccountsQueryKey = ['openflare', 'dns-accounts']; const dnsAccountSchema = z.object({ name: z.string().trim().min(1, '请输入名称').max(255), type: z.string().min(1), authorization: z.string().trim().min(1, '请输入 Token'), }); type DnsAccountFormValues = z.infer; interface DnsAccountCreateDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onCreated?: () => void; } export function DnsAccountCreateDialog({ open, onOpenChange, onCreated, }: DnsAccountCreateDialogProps) { const queryClient = useQueryClient(); const [error, setError] = useState(''); const form = useForm({ resolver: zodResolver(dnsAccountSchema), defaultValues: {name: '', type: 'cloudflare', authorization: ''}, }); const createMutation = useMutation({ mutationFn: (payload: DnsAccountMutationPayload) => DnsAccountService.create(payload), onSuccess: async () => { await queryClient.invalidateQueries({queryKey: dnsAccountsQueryKey}); form.reset(); setError(''); onCreated?.(); onOpenChange(false); }, onError: (err) => setError(getErrorMessage(err)), }); const onSubmit = form.handleSubmit((values) => { setError(''); let auth = values.authorization.trim(); if (!auth.startsWith('{')) { auth = JSON.stringify({api_token: values.authorization}); } createMutation.mutate({...values, authorization: auth}); }); const handleClose = () => { form.reset(); setError(''); onOpenChange(false); }; return ( !next && handleClose()}> 添加 DNS 账号 统一管理 DNS 服务商账号,用于 ACME 证书的 DNS 验证申请。
{error ?

{error}

: null}
{form.formState.errors.name ? (

{form.formState.errors.name.message}

) : null}
{form.formState.errors.authorization ? (

{form.formState.errors.authorization.message}

) : null}
); }