'use client'; import { useQuery } from '@tanstack/react-query'; import { useState } from 'react'; import { EmptyState } from '@/components/feedback/empty-state'; import { ErrorState } from '@/components/feedback/error-state'; import { InlineMessage } from '@/components/feedback/inline-message'; import { LoadingState } from '@/components/feedback/loading-state'; import { AppModal } from '@/components/ui/app-modal'; import { StatusBadge } from '@/components/ui/status-badge'; import { getTlsCertificate, getTlsCertificateContent, } from '@/features/tls-certificates/api/tls-certificates'; import { getCertificateStatus, getErrorMessage, } from '@/features/websites/utils'; import { CodeBlock, DangerButton, PrimaryButton, SecondaryButton, } from '@/features/shared/components/resource-primitives'; import { formatDateTime } from '@/lib/utils/date'; interface CertificateDetailModalProps { certificateId: number | null; isOpen: boolean; onClose: () => void; onEdit: () => void; onDelete: () => void; deleting?: boolean; } export function CertificateDetailModal({ certificateId, isOpen, onClose, onEdit, onDelete, deleting = false, }: CertificateDetailModalProps) { const [copyMessage, setCopyMessage] = useState(null); const certificateQuery = useQuery({ queryKey: ['tls-certificates', 'detail', certificateId], queryFn: () => getTlsCertificate(certificateId as number), enabled: isOpen && certificateId !== null, }); const contentQuery = useQuery({ queryKey: ['tls-certificates', 'content', certificateId], queryFn: () => getTlsCertificateContent(certificateId as number), enabled: isOpen && certificateId !== null, }); const certificate = certificateQuery.data; const content = contentQuery.data; const status = certificate ? getCertificateStatus(certificate) : null; const handleCopy = async (value: string, message: string) => { try { await navigator.clipboard.writeText(value); setCopyMessage(message); } catch (error) { setCopyMessage(getErrorMessage(error)); } }; return ( { setCopyMessage(null); onClose(); }} title="证书详情" description="查看证书元信息、备注以及当前保存的 PEM 内容。" size="xl" footer={
关闭 编辑证书 {deleting ? '删除中...' : '删除证书'}
} > {copyMessage ? ( ) : null} {certificateQuery.isLoading || contentQuery.isLoading ? ( ) : certificateQuery.isError || contentQuery.isError ? ( ) : !certificate || !content ? ( ) : (

证书名称

{certificate.name}

状态

{status ? ( ) : null}

生效时间

{formatDateTime(certificate.not_before)}

到期时间

{formatDateTime(certificate.not_after)}

备注

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

证书 PEM

void handleCopy(content.cert_pem, '证书 PEM 已复制。') } > 复制
{content.cert_pem}

私钥 PEM

void handleCopy(content.key_pem, '私钥 PEM 已复制。') } > 复制
{content.key_pem}
)}
); }