"use client"; import { useState, useRef, useEffect } from "react"; import { HugeiconsIcon } from "@hugeicons/react"; import { Delete02Icon } from "@hugeicons/core-free-icons"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import type { TaskItem, TaskStatus } from "@/types"; interface TaskCardProps { task: TaskItem; onUpdate: (id: string, updates: { title?: string; status?: TaskStatus }) => void; onDelete: (id: string) => void; } const statusColors: Record = { pending: "bg-yellow-500", in_progress: "bg-blue-500", completed: "bg-green-500", failed: "bg-red-500", }; const nextStatus: Record = { pending: "in_progress", in_progress: "completed", completed: "pending", failed: "pending", }; function formatTime(dateStr: string): string { const date = new Date(dateStr.includes("T") ? dateStr : dateStr + "Z"); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMin = Math.floor(diffMs / 60000); const diffHr = Math.floor(diffMin / 60); if (diffMin < 1) return "just now"; if (diffMin < 60) return `${diffMin}m ago`; if (diffHr < 24) return `${diffHr}h ago`; return date.toLocaleDateString(); } export function TaskCard({ task, onUpdate, onDelete }: TaskCardProps) { const [editing, setEditing] = useState(false); const [editTitle, setEditTitle] = useState(task.title); const [hovered, setHovered] = useState(false); const inputRef = useRef(null); useEffect(() => { if (editing && inputRef.current) { inputRef.current.focus(); inputRef.current.select(); } }, [editing]); const handleStatusClick = () => { onUpdate(task.id, { status: nextStatus[task.status] }); }; const handleTitleSubmit = () => { const trimmed = editTitle.trim(); if (trimmed && trimmed !== task.title) { onUpdate(task.id, { title: trimmed }); } else { setEditTitle(task.title); } setEditing(false); }; return (
setHovered(true)} onMouseLeave={() => setHovered(false)} > {/* Status dot */} {/* Content */}
{editing ? ( setEditTitle(e.target.value)} onBlur={handleTitleSubmit} onKeyDown={(e) => { if (e.key === "Enter") handleTitleSubmit(); if (e.key === "Escape") { setEditTitle(task.title); setEditing(false); } }} className="w-full rounded border-none bg-transparent p-0 text-xs font-medium outline-none ring-1 ring-ring/30 px-1" /> ) : (

setEditing(true)} > {task.title}

)} {task.description && (

{task.description}

)}

{formatTime(task.updated_at)}

{/* Delete button */} {hovered && ( )}
); }