import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { getJobs, cancelJob } 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 { Job } from '../api/types'; export default function JobsPage() { const [statusFilter, setStatusFilter] = useState(''); const [typeFilter, setTypeFilter] = useState(''); const queryClient = useQueryClient(); const params: Record = {}; if (statusFilter) params.status = statusFilter; if (typeFilter) params.type = typeFilter; const { data, isLoading, error, refetch } = useQuery({ queryKey: ['jobs', params], queryFn: () => getJobs(params), refetchInterval: 10000, }); const cancelMutation = useMutation({ mutationFn: cancelJob, onSuccess: () => queryClient.invalidateQueries({ queryKey: ['jobs'] }), }); const columns: Column[] = [ { key: 'id', label: 'Job', render: (j) => (
{j.id}
{j.type}
), }, { key: 'status', label: 'Status', render: (j) => }, { key: 'cert', label: 'Certificate', render: (j) => {j.certificate_id} }, { key: 'attempts', label: 'Attempts', render: (j) => {j.attempts}/{j.max_attempts}, }, { key: 'scheduled', label: 'Scheduled', render: (j) => {formatDateTime(j.scheduled_at)} }, { key: 'completed', label: 'Completed', render: (j) => {formatDateTime(j.completed_at)} }, { key: 'actions', label: '', render: (j) => ( j.status === 'Pending' || j.status === 'Running' ? ( ) : null ), }, ]; return ( <>
{error ? ( refetch()} /> ) : ( )}
); }