'use client' import { useEffect, useState } from 'react' import { useAgentStore } from '@/hooks/useAgentStore' import { getTasks, fetchAPI } from '@/lib/api' const cancelTask = (id: string) => fetchAPI('/api/v1/tasks/' + id + '/cancel', { method: 'POST' }) const retryTask = (id: string) => fetchAPI('/api/v1/tasks/' + id + '/retry', { method: 'POST' }) import { ListTodo, Play, Square, RefreshCw, Clock, CheckCircle2, XCircle, Loader2, Zap } from 'lucide-react' import { formatDistanceToNow } from 'date-fns' const STATUS_META: Record = { queued: { icon: Clock, color: '#94a3b8', label: 'Queued' }, executing: { icon: Loader2, color: '#6366f1', label: 'Running' }, completed: { icon: CheckCircle2, color: '#22c55e', label: 'Done' }, failed: { icon: XCircle, color: '#ef4444', label: 'Failed' }, cancelled: { icon: Square, color: '#64748b', label: 'Cancelled' }, } export default function TasksPanel() { const { sessionId, locale, setActiveTaskId, activeTaskId } = useAgentStore() const [tasks, setTasks] = useState([]) const [loading, setLoading] = useState(true) const load = async () => { setLoading(true) try { const data = await getTasks() setTasks(Array.isArray(data) ? data : data.tasks || []) } catch {} setLoading(false) } useEffect(() => { load() }, [sessionId]) useEffect(() => { const id = setInterval(load, 5000) return () => clearInterval(id) }, [sessionId]) const handleCancel = async (taskId: string, e: React.MouseEvent) => { e.stopPropagation() await cancelTask(taskId) load() } const handleRetry = async (taskId: string, e: React.MouseEvent) => { e.stopPropagation() await retryTask(taskId) load() } return (
{locale === 'my' ? 'လုပ်ငန်းများ' : 'Tasks'} {tasks.length > 0 && ( {tasks.length} )}
{loading && tasks.length === 0 ? (
{[...Array(3)].map((_, i) => (
))}
) : tasks.length === 0 ? (

{locale === 'my' ? 'လုပ်ငန်းမရှိသေးပါ' : 'No tasks yet'}

) : ( tasks.map(task => { const sm = STATUS_META[task.status] || STATUS_META.queued const Icon = sm.icon const isActive = task.id === activeTaskId const isRunning = task.status === 'executing' || task.status === 'queued' return ( )} {task.status === 'failed' && ( )}
{/* Progress bar for running tasks */} {isRunning && (
)} ) }) )}
) }