import type { TaskSummary, TaskStatus, ColumnDef } from '@kanban/contracts' import TaskCard from './TaskCard' interface Props { tasks: TaskSummary[] columns: ColumnDef[] onTaskTap: (task: TaskSummary) => void onRefresh: () => void } export default function KanbanBoard({ tasks, columns, onTaskTap, onRefresh }: Props) { // Group tasks by status const grouped: Record = {} as Record for (const col of columns) { grouped[col.status] = [] } for (const task of tasks) { const status = task.status as TaskStatus if (!grouped[status]) { grouped[status] = [] } grouped[status].push(task) } return (
{columns.map((col) => (
{/* Column header */}

{col.title}

{grouped[col.status]?.length || 0}
{/* Column content */}
{grouped[col.status]?.map((task) => ( onTaskTap(task)} /> ))} {(!grouped[col.status] || grouped[col.status].length === 0) && (
No tasks
)}
))}
{/* Pull to refresh hint */}
) } function StatusDot({ status }: { status: TaskStatus }) { const colors: Record = { triage: 'bg-gray-400', todo: 'bg-blue-400', ready: 'bg-yellow-400', running: 'bg-green-400', blocked: 'bg-red-400', done: 'bg-emerald-400', archived: 'bg-gray-500', } return
}