import { useState } from "react"; import { CheckSquare, Square, AlertTriangle, Calendar } from "lucide-react"; import type { TasksResponse, Task } from "../api"; interface TasksCardProps { data: TasksResponse; } type TabKey = "private" | "sams"; const TABS: { key: TabKey; label: string }[] = [ { key: "private", label: "Privat" }, { key: "sams", label: "Sam's" }, ]; /** Colour for task priority (1 = highest). */ function priorityIndicator(priority: number): { color: string; label: string } { if (priority <= 1) return { color: "bg-red-500", label: "Hoch" }; if (priority <= 2) return { color: "bg-amber-500", label: "Mittel" }; if (priority <= 3) return { color: "bg-blue-500", label: "Normal" }; return { color: "bg-slate-500", label: "Niedrig" }; } /** Format a due date string to a short German date. */ function formatDueDate(iso: string | null): string | null { if (!iso) return null; try { const d = new Date(iso); if (isNaN(d.getTime())) return null; const now = new Date(); const diffDays = Math.ceil((d.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)); if (diffDays < 0) return "Ueberfaellig"; if (diffDays === 0) return "Heute"; if (diffDays === 1) return "Morgen"; return d.toLocaleDateString("de-DE", { day: "2-digit", month: "short" }); } catch { return null; } } export default function TasksCard({ data }: TasksCardProps) { const [activeTab, setActiveTab] = useState("private"); if (!data) return null; if (data.error) { return (

Aufgaben nicht verfuegbar

Verbindung fehlgeschlagen

); } const group = activeTab === "private" ? data.private : data.sams; const tasks = group?.open ?? []; return (
{/* Header */}

Aufgaben

{/* Tab buttons */}
{TABS.map((tab) => { const tabGroup = tab.key === "private" ? data.private : data.sams; const openCount = tabGroup?.open_count ?? 0; const isActive = activeTab === tab.key; return ( ); })}
{/* Task list */} {tasks.length === 0 ? (

Alles erledigt!

) : (
{tasks.map((task) => ( ))}
)}
); } function TaskItem({ task }: { task: Task }) { const p = priorityIndicator(task.priority); const due = formatDueDate(task.due_date); const isOverdue = due === "Ueberfaellig"; return (
{/* Visual checkbox */}
{task.done ? ( ) : ( )}
{/* Content */}

{task.title}

{/* Project badge */} {task.project_name && ( {task.project_name} )} {/* Due date */} {due && ( {due} )}
{/* Priority dot */}
); }