'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 type { DnsAccountMutationPayload } from '@/lib/services/openflare'; import { DnsAccountService } 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}
); }