'use client'; import { useQuery } from '@tanstack/react-query'; import { Copy, Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { EmptyStateWithBorder } from '@/components/layout/empty'; import { ErrorInline } from '@/components/layout/error'; import { LoadingStateWithBorder } from '@/components/layout/loading'; import { TlsCertificateService } from '@/lib/services/openflare'; import { formatDateTime } from '@/lib/utils'; import { WebsiteStatusBadge } from './status-badge'; import { getCertificateStatus, getErrorMessage } from './website-utils'; interface CertificateDetailDialogProps { certificateId: number | null; open: boolean; onOpenChange: (open: boolean) => void; onEdit: () => void; onDelete: () => void; deleting?: boolean; } export function CertificateDetailDialog({ certificateId, open, onOpenChange, onEdit, onDelete, deleting = false, }: CertificateDetailDialogProps) { const certificateQuery = useQuery({ queryKey: ['openflare', 'tls-certificates', 'detail', certificateId], queryFn: () => TlsCertificateService.getById(certificateId as number), enabled: open && certificateId !== null, }); const contentQuery = useQuery({ queryKey: ['openflare', 'tls-certificates', 'content', certificateId], queryFn: () => TlsCertificateService.getContent(certificateId as number), enabled: open && certificateId !== null, }); const certificate = certificateQuery.data; const content = contentQuery.data; const status = certificate ? getCertificateStatus(certificate) : null; const loading = certificateQuery.isLoading || contentQuery.isLoading; const hasError = certificateQuery.isError || contentQuery.isError; const handleCopy = async (value: string, message: string) => { try { await navigator.clipboard.writeText(value); toast.success(message); } catch (error) { toast.error(getErrorMessage(error)); } }; return ( 证书详情 查看证书元信息、备注以及当前保存的 PEM 内容。 {loading ? ( ) : hasError ? ( ) : !certificate || !content ? ( ) : (

证书名称

{certificate.name}

状态

{status ? ( ) : null}

生效时间

{formatDateTime(certificate.not_before)}

到期时间

{formatDateTime(certificate.not_after)}

备注

{certificate.remark || '暂无备注'}

证书 PEM

                  {content.cert_pem}
                

私钥 PEM

                  {content.key_pem}
                
)}
); }