import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Progress } from "@/components/ui/progress"; import { Badge } from "@/components/ui/badge"; import { RefreshCw, Play, Pause, CheckCircle, XCircle, Clock } from "lucide-react"; import { apiClient } from "@/lib/api"; import type { TasksResponse } from "@/types/api"; import { Spinner } from "@/components/ui/spinner" export function TaskMonitor() { const [statusFilter, setStatusFilter] = useState("all"); // Fetch tasks const { data: tasksData, isLoading: tasksLoading, refetch: refetchTasks } = useQuery({ queryKey: ["tasks", statusFilter], queryFn: () => { const params = statusFilter === "all" ? {} : { status: statusFilter }; return apiClient.getTasks(params.status, 50); }, refetchInterval: 5000 // Refresh every 5 seconds }); const getStatusIcon = (status: string) => { switch (status) { case "running": return ; case "completed": return ; case "failed": return ; case "pending": return ; default: return ; } }; const getStatusBadgeVariant = (status: string) => { switch (status) { case "running": return "default"; case "completed": return "secondary"; case "failed": return "destructive"; case "pending": return "outline"; default: return "outline"; } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleString("en-US"); }; const formatDuration = (start: string, end?: string) => { const startTime = new Date(start).getTime(); const endTime = end ? new Date(end).getTime() : Date.now(); const duration = Math.floor((endTime - startTime) / 1000); if (duration < 60) return `${duration}s`; if (duration < 3600) return `${Math.floor(duration / 60)}m ${duration % 60}s`; return `${Math.floor(duration / 3600)}h ${Math.floor((duration % 3600) / 60)}m`; }; if (tasksLoading) { return (
); } return (
{/* Controls */}
{/* Tasks List */}
{tasksData?.tasks && tasksData.tasks.length > 0 ? ( tasksData.tasks.map((task: any) => (
{getStatusIcon(task.status)} {task.task_id.slice(0, 8)}... {task.status}
{formatDate(task.created_at)}
{task.progress && (
{task.progress.message} {task.progress.percentage.toFixed(1)}%
Step {task.progress.completed_steps}/ {task.progress.total_steps}:{" "} {task.progress.current_step}
)}
{task.started_at && (
Start Time:
{formatDate(task.started_at)}
)} {task.completed_at && (
Complete Time:
{formatDate(task.completed_at)}
)}
Duration:
{formatDuration( task.started_at || task.created_at, task.completed_at )}
{task.result && (
Result:
{task.result.dataset_id ? `Dataset: ${task.result.dataset_id.slice(0, 8)}...` : "None"}
)}
{task.error && (
Error: {task.error}
)}
)) ) : (

No Tasks

{statusFilter === "all" ? "No tasks found" : `No ${statusFilter} tasks found`}

)}
); }