import { useCallback, useEffect, useRef } from 'react'; import { KanbanCard } from '@/components/ui/shadcn-io/kanban'; import { CheckCircle, Loader2, XCircle } from 'lucide-react'; import type { TaskWithAttemptStatus } from 'shared/types'; import { ActionsDropdown } from '@/components/ui/ActionsDropdown'; type Task = TaskWithAttemptStatus; interface TaskCardProps { task: Task; index: number; status: string; onViewDetails: (task: Task) => void; isOpen?: boolean; } export function TaskCard({ task, index, status, onViewDetails, isOpen, }: TaskCardProps) { const handleClick = useCallback(() => { onViewDetails(task); }, [task, onViewDetails]); const localRef = useRef(null); useEffect(() => { if (!isOpen || !localRef.current) return; const el = localRef.current; requestAnimationFrame(() => { el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth', }); }); }, [isOpen]); return (

{task.title}

{/* In Progress Spinner */} {task.has_in_progress_attempt && ( )} {/* Merged Indicator */} {task.has_merged_attempt && ( )} {/* Failed Indicator */} {task.last_attempt_failed && !task.has_merged_attempt && ( )} {/* Actions Menu */}
e.stopPropagation()} onMouseDown={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()} >
{task.description && (

{task.description.length > 130 ? `${task.description.substring(0, 130)}...` : task.description}

)}
); }