import { useParams, useNavigate } from 'react-router-dom'; import { useQuery, useMutation } from '@tanstack/react-query'; import { getIssuer, testIssuerConnection, getCertificates } from '../api/client'; import PageHeader from '../components/PageHeader'; import StatusBadge from '../components/StatusBadge'; import DataTable from '../components/DataTable'; import type { Column } from '../components/DataTable'; import ErrorState from '../components/ErrorState'; import { formatDateTime } from '../api/utils'; import type { Certificate, Issuer } from '../api/types'; import { typeLabels, redactConfig } from '../config/issuerTypes'; function InfoRow({ label, value }: { label: string; value: React.ReactNode }) { return (
{label} {value}
); } /** Derive display status from backend enabled boolean */ function issuerStatus(issuer: Issuer): string { if (issuer.enabled !== undefined) { return issuer.enabled ? 'Enabled' : 'Disabled'; } return issuer.status || 'Unknown'; } export default function IssuerDetailPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { data: issuer, isLoading, error, refetch } = useQuery({ queryKey: ['issuer', id], queryFn: () => getIssuer(id!), enabled: !!id, }); const { data: certsData } = useQuery({ queryKey: ['certificates', { issuer_id: id }], queryFn: () => getCertificates({ issuer_id: id! }), enabled: !!id, }); const testMutation = useMutation({ mutationFn: () => testIssuerConnection(id!), }); if (error) { return ( <> refetch()} /> ); } if (isLoading || !issuer) { return ( <>
Loading issuer...
); } const safeConfig = issuer.config ? redactConfig(issuer.config) : {}; const certColumns: Column[] = [ { key: 'name', label: 'Certificate', render: (c) => (
{c.common_name}
{c.id}
), }, { key: 'status', label: 'Status', render: (c) => }, { key: 'expires', label: 'Expires', render: (c) => {formatDateTime(c.expires_at)} }, ]; return ( <> } />
{testMutation.isSuccess && (
Connection test passed.
)} {testMutation.isError && (
Connection test failed: {(testMutation.error as Error).message}
)}
{/* Issuer info */}

Issuer Information

{issuer.id}} /> } />
{/* Config (redacted) */}

Configuration

{Object.keys(safeConfig).length > 0 ? (
{Object.entries(safeConfig).map(([key, val]) => ( {String(val)} } /> ))}
) : (
No configuration data
)}
{/* Issued certificates */}

Issued Certificates {certsData ? `(${certsData.total})` : ''}

); }