"use client"; import Link from "next/link"; import { format, parseISO, isToday, isTomorrow } from "date-fns"; import { de } from "date-fns/locale"; import { Clock, Calendar, MapPin, ChevronRight } from "lucide-react"; import type { UpcomingDeadline, UpcomingAppointment } from "@/lib/types"; interface Props { deadlines: UpcomingDeadline[]; appointments: UpcomingAppointment[]; } type TimelineItem = | { type: "deadline"; date: Date; data: UpcomingDeadline } | { type: "appointment"; date: Date; data: UpcomingAppointment }; function formatDayLabel(date: Date): string { if (isToday(date)) return "Heute"; if (isTomorrow(date)) return "Morgen"; return format(date, "EEEE, d. MMM", { locale: de }); } export function UpcomingTimeline({ deadlines, appointments }: Props) { const safeDeadlines = Array.isArray(deadlines) ? deadlines : []; const safeAppointments = Array.isArray(appointments) ? appointments : []; const items: TimelineItem[] = [ ...safeDeadlines.map((d) => ({ type: "deadline" as const, date: parseISO(d.due_date), data: d, })), ...safeAppointments.map((a) => ({ type: "appointment" as const, date: parseISO(a.start_at), data: a, })), ].sort((a, b) => a.date.getTime() - b.date.getTime()); // Group by day const grouped = new Map(); for (const item of items) { const key = format(item.date, "yyyy-MM-dd"); const group = grouped.get(key) ?? []; group.push(item); grouped.set(key, group); } const empty = items.length === 0; return (

Nächste 7 Tage

{empty ? (

Keine anstehenden Termine oder Fristen

) : (
{Array.from(grouped.entries()).map(([dateKey, dayItems]) => (

{formatDayLabel(dayItems[0].date)}

{dayItems.map((item, i) => ( ))}
))}
)}
); } function TimelineEntry({ item }: { item: TimelineItem }) { if (item.type === "deadline") { const d = item.data; const href = `/fristen/${d.id}`; return (

{d.title}

{d.case_id ? ( e.stopPropagation()} className="inline" > {d.case_number} {" · "} ) : ( <>{d.case_number} · )} {d.case_title}

Frist
); } const a = item.data; const href = `/termine/${a.id}`; return (

{a.title}

{format(item.date, "HH:mm")} Uhr {a.location && ( <> · {a.location} )} {a.case_number && a.case_id && ( <> · e.stopPropagation()}> {a.case_number} )} {a.case_number && !a.case_id && ( <> · {a.case_number} )}
Termin
); }