import { useNavigate } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { format, parseISO, isPast, isToday } from 'date-fns'; import { FolderKanban } from 'lucide-react'; import api from '@/lib/api'; import type { TrackedTask } from '@/types'; import { useSettings } from '@/hooks/useSettings'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ScrollArea } from '@/components/ui/scroll-area'; import { cn } from '@/lib/utils'; const priorityColors: Record = { high: 'bg-red-400', medium: 'bg-yellow-400', low: 'bg-green-400', none: 'bg-gray-400', }; const statusBadgeColors: Record = { pending: 'bg-gray-500/10 text-gray-400', in_progress: 'bg-purple-500/10 text-purple-400', blocked: 'bg-red-500/10 text-red-400', review: 'bg-yellow-500/10 text-yellow-400', on_hold: 'bg-orange-500/10 text-orange-400', }; const statusLabels: Record = { pending: 'Pending', in_progress: 'Active', blocked: 'Blocked', review: 'Review', on_hold: 'Hold', }; export default function TrackedProjectsWidget() { const navigate = useNavigate(); const { settings } = useSettings(); const days = settings?.upcoming_days || 7; const { data: tasks } = useQuery({ queryKey: ['tracked-tasks', days], queryFn: async () => { const { data } = await api.get(`/projects/tracked-tasks?days=${days}`); return data; }, enabled: !!settings, }); if (!tasks || tasks.length === 0) return null; return (
Tracked Projects
{days} days
{tasks.map((task) => { const dueDate = parseISO(task.due_date); const overdue = isPast(dueDate) && !isToday(dueDate); return (
navigate(`/projects/${task.project_id}`)} >
{task.parent_task_title && ( )} {task.title} {task.parent_task_title && ( {task.parent_task_title} )}
{task.project_name} {isToday(dueDate) ? 'Today' : format(dueDate, 'MMM d')} {statusLabels[task.status] || task.status}
); })}
); }