| import type { AgentTask } from '../../types'; |
|
|
| interface AgentTaskListProps { |
| tasks: AgentTask[]; |
| } |
|
|
| const statusConfig: Record< |
| AgentTask['status'], |
| { label: string; dotClass: string } |
| > = { |
| queued: { label: 'λκΈ°', dotClass: 'bg-ink-light' }, |
| processing: { label: 'μ²λ¦¬ μ€', dotClass: 'bg-ink-black animate-pulse' }, |
| done: { label: 'μλ£', dotClass: 'bg-status-success' }, |
| failed: { label: 'μ€ν¨', dotClass: 'bg-status-error' }, |
| }; |
|
|
| export default function AgentTaskList({ tasks }: AgentTaskListProps) { |
| return ( |
| <div> |
| <h4 className="text-sm font-semibold text-ink-black mb-3">νμ€ν¬ ν</h4> |
| {tasks.length === 0 ? ( |
| <p className="text-xs text-ink-light py-4 text-center"> |
| λ±λ‘λ νμ€ν¬κ° μμ΅λλ€. |
| </p> |
| ) : ( |
| <ul className="divide-y divide-border-default"> |
| {tasks.map((task) => { |
| const cfg = statusConfig[task.status]; |
| return ( |
| <li key={task.id} className="py-3 flex items-start gap-3"> |
| <span |
| className={`mt-1.5 w-2 h-2 rounded-full shrink-0 ${cfg.dotClass}`} |
| /> |
| <div className="flex-1 min-w-0"> |
| <p className="text-sm text-ink-dark truncate">{task.title}</p> |
| <div className="flex items-center gap-3 mt-1"> |
| <span className="text-xs text-ink-light font-mono"> |
| {task.createdAt} |
| </span> |
| <span className="text-xs text-ink-medium font-medium"> |
| {cfg.label} |
| </span> |
| {task.completedAt && ( |
| <span className="text-xs text-ink-light"> |
| β {task.completedAt} |
| </span> |
| )} |
| </div> |
| </div> |
| </li> |
| ); |
| })} |
| </ul> |
| )} |
| </div> |
| ); |
| } |
|
|