'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}
                
)}
); }