'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 { useTranslations } from 'next-intl'; import { getErrorMessage } from './website-utils'; const dnsAccountsQueryKey = ['openflare', 'dns-accounts']; type DnsAccountFormValues = { name: string; type: string; authorization: string; }; interface DnsAccountCreateDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onCreated?: () => void; } export function DnsAccountCreateDialog({ open, onOpenChange, onCreated, }: DnsAccountCreateDialogProps) { const t = useTranslations('dnsAccounts'); const tc = useTranslations('common'); const queryClient = useQueryClient(); const [error, setError] = useState(''); const dnsAccountSchema = z.object({ name: z.string().trim().min(1, t('nameRequired')).max(255), type: z.string().min(1), authorization: z.string().trim().min(1, t('tokenRequired')), }); 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, t('requestFailed'))), }); 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()}> {t('createTitle')} {t('createDesc')}
{error ?

{error}

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

{form.formState.errors.name.message}

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

{form.formState.errors.authorization.message}

) : null}
); }