"use client"; import type { Deadline } from "@/lib/types"; import { format, startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, isSameMonth, isToday, parseISO, isPast, isThisWeek, addMonths, subMonths, } from "date-fns"; import { de } from "date-fns/locale"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { useState, useMemo } from "react"; interface DeadlineCalendarViewProps { deadlines: Deadline[]; } function getUrgency(deadline: Deadline): "red" | "amber" | "green" { if (deadline.status === "completed") return "green"; const due = parseISO(deadline.due_date); if (isPast(due)) return "red"; if (isThisWeek(due, { weekStartsOn: 1 })) return "amber"; return "green"; } const dotColors = { red: "bg-red-500", amber: "bg-amber-500", green: "bg-green-500", }; export function DeadlineCalendarView({ deadlines }: DeadlineCalendarViewProps) { const [currentMonth, setCurrentMonth] = useState(new Date()); const monthStart = startOfMonth(currentMonth); const monthEnd = endOfMonth(currentMonth); const calStart = startOfWeek(monthStart, { weekStartsOn: 1 }); const calEnd = endOfWeek(monthEnd, { weekStartsOn: 1 }); const days = eachDayOfInterval({ start: calStart, end: calEnd }); const deadlinesByDay = useMemo(() => { const map = new Map(); for (const d of deadlines) { if (d.status === "completed") continue; const key = d.due_date.slice(0, 10); const existing = map.get(key) || []; existing.push(d); map.set(key, existing); } return map; }, [deadlines]); const weekDays = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]; return (
{/* Header */}
{format(currentMonth, "MMMM yyyy", { locale: de })}
{/* Weekday labels */}
{weekDays.map((d) => (
{d}
))}
{/* Days grid */}
{days.map((day, i) => { const key = format(day, "yyyy-MM-dd"); const dayDeadlines = deadlinesByDay.get(key) || []; const inMonth = isSameMonth(day, currentMonth); const today = isToday(day); return (
{today ? ( {format(day, "d")} ) : ( format(day, "d") )}
{dayDeadlines.slice(0, 3).map((dl) => { const urgency = getUrgency(dl); return (
{dl.title}
); })} {dayDeadlines.length > 3 && (
+{dayDeadlines.length - 3} mehr
)}
); })}
); }