import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { getIssuers, testIssuerConnection, deleteIssuer } from '../api/client'; import PageHeader from '../components/PageHeader'; import DataTable from '../components/DataTable'; import type { Column } from '../components/DataTable'; import StatusBadge from '../components/StatusBadge'; import ErrorState from '../components/ErrorState'; import { formatDateTime } from '../api/utils'; import type { Issuer } from '../api/types'; const typeLabels: Record = { local_ca: 'Local CA', acme: 'ACME', vault: 'Vault PKI', manual: 'Manual', }; export default function IssuersPage() { const queryClient = useQueryClient(); const [testResult, setTestResult] = useState<{ id: string; ok: boolean; msg: string } | null>(null); const { data, isLoading, error, refetch } = useQuery({ queryKey: ['issuers'], queryFn: () => getIssuers(), }); const testMutation = useMutation({ mutationFn: testIssuerConnection, onSuccess: (_data, id) => setTestResult({ id, ok: true, msg: 'Connection successful' }), onError: (err: Error, id) => setTestResult({ id, ok: false, msg: err.message }), }); const deleteMutation = useMutation({ mutationFn: deleteIssuer, onSuccess: () => queryClient.invalidateQueries({ queryKey: ['issuers'] }), }); const columns: Column[] = [ { key: 'name', label: 'Issuer', render: (i) => (
{i.name}
{i.id}
), }, { key: 'type', label: 'Type', render: (i) => ( {typeLabels[i.type] || i.type} ), }, { key: 'status', label: 'Status', render: (i) => , }, { key: 'config', label: 'Config', render: (i) => { if (!i.config || Object.keys(i.config).length === 0) return ; return ( {JSON.stringify(i.config).slice(0, 60)} ); }, }, { key: 'created', label: 'Created', render: (i) => {formatDateTime(i.created_at)}, }, { key: 'actions', label: '', render: (i) => (
), }, ]; return ( <> {testResult && (
{testResult.id}: {testResult.msg}
)}
{error ? ( refetch()} /> ) : ( )}
); }