import { useEffect } from 'react' import { useOverlayDismiss } from '../../hooks/useOverlayDismiss' import type { CalendarEvent } from '../../api/client' const weekdayLong = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] const monthLabels = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', ] export interface DayEvent extends CalendarEvent { calendarId: string /** Endgültige Farbe: eigene Farbe des Termins, sonst die des Kalenders. */ color: string calendarName: string startsAt: Date endsAt: Date | null } /** * Ein angeklickter Tag wird erst **geöffnet**, statt sofort einen neuen * Termin anzulegen. * * Vorher legte jeder Klick auf eine Tageszelle direkt einen neuen Termin an – * auch der Klick, mit dem man eigentlich nachsehen wollte, was an dem Tag * ansteht. Hier steht zuerst, was da ist; einen neuen Termin gibt es auf * Ansage. */ export default function DayDialog({ day, events, onPick, onCreate, onClose }: { day: Date events: DayEvent[] onPick: (ev: DayEvent) => void onCreate: () => void onClose: () => void }) { const overlay = useOverlayDismiss(onClose) useEffect(() => { function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose() } window.addEventListener('keydown', onKey) return () => window.removeEventListener('keydown', onKey) }, [onClose]) const timeLabel = (ev: DayEvent) => { if (ev.all_day) return 'all day' const from = ev.startsAt.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) if (!ev.endsAt) return from const to = ev.endsAt.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) return `${from} – ${to}` } return (
{weekdayLong[day.getDay()]}
{day.getDate()}. {monthLabels[day.getMonth()]} {day.getFullYear()}
{events.length === 0 && (

Nichts an diesem Tag.

)} {events.map(ev => ( ))}
) }