import { useEffect, useState } from 'react' import useEmbedJobs from '~/hooks/useEmbedJobs' import HorizontalBarChart from './HorizontalBarChart' import StyledSectionHeader from './StyledSectionHeader' import { JOB_HEALTH_DISPLAY, computeJobHealth, formatTimeAgo, } from '~/lib/kb_job_health_display' interface ActiveEmbedJobsProps { withHeader?: boolean } const ActiveEmbedJobs = ({ withHeader = false }: ActiveEmbedJobsProps) => { const { data: jobs } = useEmbedJobs() // Re-render every 5s to keep per-job "last activity Xs ago" timestamps fresh. const [tick, setTick] = useState(() => Date.now()) useEffect(() => { const id = setInterval(() => setTick(Date.now()), 5000) return () => clearInterval(id) }, []) return ( <> {withHeader && ( )}
{jobs && jobs.length > 0 ? ( jobs.map((job) => { const health = computeJobHealth({ status: job.status, progress: job.progress, lastBatchAt: job.lastBatchAt, startedAt: job.startedAt, now: tick, }) const display = JOB_HEALTH_DISPLAY[health] const lastActivityMs = job.lastBatchAt ?? job.startedAt return (
{display.label} {lastActivityMs !== undefined && ( · last activity {formatTimeAgo(lastActivityMs, tick)} )} {typeof job.chunks === 'number' && job.chunks > 0 && ( · {job.chunks.toLocaleString()} chunks )}
) }) ) : (

No files are currently being processed

)}
) } export default ActiveEmbedJobs