'use client'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useMemo, useState } from 'react'; import { Cloud, Plus, Trash2 } from 'lucide-react'; import { toast } from 'sonner'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { EmptyStateWithBorder } from '@/components/layout/empty'; import { ErrorInline } from '@/components/layout/error'; import { LoadingStateWithBorder } from '@/components/layout/loading'; import type { DnsAccountItem } from '@/lib/services/openflare'; import { DnsAccountService } from '@/lib/services/openflare'; import { formatDateTime } from '@/lib/utils'; import { useTranslations } from 'next-intl'; import { DnsAccountCreateDialog } from '../websites/components/dns-account-create-dialog'; import { getErrorMessage } from '../websites/components/website-utils'; const dnsAccountsQueryKey = ['openflare', 'dns-accounts']; export default function DnsAccountsPage() { const t = useTranslations('dnsAccounts'); const tc = useTranslations('common'); const queryClient = useQueryClient(); const [createOpen, setCreateOpen] = useState(false); const [deleteTarget, setDeleteTarget] = useState(null); const dnsAccountsQuery = useQuery({ queryKey: dnsAccountsQueryKey, queryFn: () => DnsAccountService.list(), }); const deleteMutation = useMutation({ mutationFn: (id: number) => DnsAccountService.deleteById(id), onSuccess: async () => { toast.success(t('deleted')); setDeleteTarget(null); await queryClient.invalidateQueries({ queryKey: dnsAccountsQueryKey }); }, onError: (error) => toast.error(getErrorMessage(error, t('requestFailed'))), }); const accounts = useMemo( () => dnsAccountsQuery.data ?? [], [dnsAccountsQuery.data], ); return (

{t('title')}

{t('listTitle')} {t('listDesc')} {dnsAccountsQuery.isLoading ? ( ) : dnsAccountsQuery.isError ? (
void dnsAccountsQuery.refetch()} className='justify-center' />
) : accounts.length === 0 ? ( ) : (
{accounts.map((account) => (

{account.name}{' '} ({account.type})

{t('createdAt', { date: formatDateTime(account.created_at), })}

))}
)}
toast.success(t('created'))} /> !open && setDeleteTarget(null)} > {t('deleteTitle')} {t('deleteDesc', { name: deleteTarget?.name ?? '' })} {tc('cancel')} deleteTarget && deleteMutation.mutate(deleteTarget.id) } > {tc('delete')}
); }