'use client'; import { useEffect, useState } from 'react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area'; import { Calendar, MoreHorizontal } from 'lucide-react'; import { toast } from 'sonner'; import { TaskDetailPanel } from './task-detail-panel'; interface Task { id: string; title: string; description?: string; status: 'todo' | 'in_progress' | 'done'; priority: 'low' | 'medium' | 'high' | 'urgent'; domain: string; due_date?: string; project_id?: string; tags: string[]; } export function TasksListView() { const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [selectedTask, setSelectedTask] = useState(null); useEffect(() => { fetchTasks(); }, []); async function fetchTasks() { try { const response = await fetch('/api/tasks?sort=-created'); if (!response.ok) { throw new Error('Unable to load tasks'); } const data = await response.json(); setTasks(data.items || []); } catch (error) { console.error('Failed to fetch tasks:', error); toast.error('Unable to load tasks'); } finally { setLoading(false); } } async function toggleTaskComplete(task: Task) { const newStatus = task.status === 'done' ? 'todo' : 'done'; try { const response = await fetch(`/api/tasks/${task.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: newStatus }) }); if (!response.ok) throw new Error('Unable to update task'); await fetchTasks(); toast.success( `Marked ${task.title} as ${newStatus === 'done' ? 'complete' : 'incomplete'}` ); } catch (error) { console.error('Failed to toggle task:', error); toast.error(`Unable to update ${task.title}`); } } if (loading) { return

Loading tasks...

; } return ( <>
Task Priority Domain Due Date {tasks.map((task) => ( toggleTaskComplete(task)} aria-label={`Mark "${task.title}" as ${task.status === 'done' ? 'incomplete' : 'complete'}`} /> {task.priority} {task.domain} {task.due_date && ( {new Date(task.due_date).toLocaleDateString()} )} ))}
{selectedTask && ( !open && setSelectedTask(null)} onUpdate={fetchTasks} /> )} ); }