import { useState, useMemo } from "react"; import { useTasks } from "../hooks/useTasks"; import { useCurrentUser } from "../hooks/useCurrentUser"; import { TaskCard } from "../components/TaskCard"; import { TaskDetailPanel } from "../components/TaskDetailPanel"; import { CreateTaskModal } from "../components/CreateTaskModal"; import { updateTask, reorderTasks, createTask } from "../lib/api"; import type { TaskStatus } from "../lib/types"; export function QueuePage() { const { tasks, loading, error, refresh } = useTasks(5000); const { isAuthenticated } = useCurrentUser(); const [showCreate, setShowCreate] = useState(false); const [showCompleted, setShowCompleted] = useState(false); const [selectedTask, setSelectedTask] = useState(null); const selectedTaskData = useMemo(() => { if (!selectedTask) return null; return tasks.find((t) => t.id === selectedTask) || null; }, [tasks, selectedTask]); const activeTasks = useMemo(() => tasks.filter((t) => t.status === "active"), [tasks]); const queuedTasks = useMemo(() => tasks.filter((t) => t.status === "queued"), [tasks]); const blockedTasks = useMemo(() => tasks.filter((t) => t.status === "blocked"), [tasks]); const completedTasks = useMemo( () => tasks.filter((t) => t.status === "completed" || t.status === "cancelled"), [tasks] ); const handleStatusChange = async (id: string, status: TaskStatus) => { try { await updateTask(id, { status }); refresh(); } catch (e) { alert("Failed to update task."); } }; const handleMoveUp = async (index: number) => { if (index === 0) return; const ids = queuedTasks.map((t) => t.id); [ids[index - 1], ids[index]] = [ids[index], ids[index - 1]]; await reorderTasks(ids); refresh(); }; const handleMoveDown = async (index: number) => { if (index >= queuedTasks.length - 1) return; const ids = queuedTasks.map((t) => t.id); [ids[index], ids[index + 1]] = [ids[index + 1], ids[index]]; await reorderTasks(ids); refresh(); }; const handleCreate = async (task: { title: string; description?: string; source?: string; priority?: string; }) => { await createTask(task); refresh(); }; return (
{/* Page Header */}

Task Queue

Manage what Hammer is working on

setShowCreate(false)} onCreate={handleCreate} />
{loading && (
Loading tasks...
)} {error && (
{error}
)} {/* Active Task */}

⚡ Currently Working On

{activeTasks.length === 0 ? (
No active task — Hammer is idle
) : (
{activeTasks.map((task) => ( setSelectedTask(task.id)} /> ))}
)}
{/* Blocked */} {blockedTasks.length > 0 && (

🚫 Blocked ({blockedTasks.length})

{blockedTasks.map((task) => ( setSelectedTask(task.id)} /> ))}
)} {/* Queue */}

📋 Queue ({queuedTasks.length})

{queuedTasks.length === 0 ? (
Queue is empty
) : (
{queuedTasks.map((task, i) => ( handleMoveUp(i)} onMoveDown={() => handleMoveDown(i)} isFirst={i === 0} isLast={i === queuedTasks.length - 1} onClick={() => setSelectedTask(task.id)} /> ))}
)}
{/* Completed */}
{showCompleted && (
{completedTasks.map((task) => ( setSelectedTask(task.id)} /> ))}
)}
{/* Task Detail Panel */} {selectedTaskData && ( setSelectedTask(null)} onStatusChange={(id, status) => { handleStatusChange(id, status); setSelectedTask(null); }} onTaskUpdated={refresh} hasToken={isAuthenticated} token="" /> )}
); }