"use client" import { useState } from "react" import { useJobs, useStartJob, useFailJob, useCompleteJob, JOBS_PAGE_SIZE, } from "@/hooks/use-jobs" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible" import { Card, CardContent, CardHeader, CardTitle, } from "@/components/ui/card" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { Spinner } from "@/components/ui/spinner" import { toast } from "sonner" import { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, PlayIcon, CheckIcon, XIcon, } from "lucide-react" const STATUS_FILTERS = [ { value: undefined, label: "All" }, { value: "queued", label: "Queued" }, { value: "running", label: "Running" }, { value: "completed", label: "Completed" }, { value: "failed", label: "Failed" }, ] function statusVariant(status: string) { switch (status.toLowerCase()) { case "queued": return "secondary" as const case "running": return "default" as const case "completed": return "default" as const case "failed": return "destructive" as const default: return "secondary" as const } } export default function JobsPage() { const [filter, setFilter] = useState(undefined) const [offset, setOffset] = useState(0) const jobs = useJobs(filter, offset) const startJob = useStartJob() const failJob = useFailJob() const completeJob = useCompleteJob() const total = jobs.data?.total ?? 0 const page = Math.floor(offset / JOBS_PAGE_SIZE) + 1 const totalPages = Math.ceil(total / JOBS_PAGE_SIZE) const handleFilterChange = (v: string) => { setFilter(v === "all" ? undefined : v) setOffset(0) } return (

Job Queue

{total > 0 && ( {total} total )}
{STATUS_FILTERS.map((f) => ( {f.label} ))} Jobs {jobs.isLoading ? ( ) : ( <> ID Type Status Priority Created Actions {(jobs.data?.jobs ?? []).map((job) => ( <> {job.error_message && ( )} {job.job_id.slice(0, 8)}... {job.job_type} {job.status} {job.priority} {new Date(job.created_at).toLocaleString()}
{job.status.toLowerCase() === "queued" && ( )} {job.status.toLowerCase() === "running" && ( <> )}
{job.error_message && (
)} ))}
                                  {job.error_message}
                                
{totalPages > 1 && (
Page {page} of {totalPages}
)} )}
) }