'use client'; import { useState, useEffect, useCallback } from 'react'; import { Calendar, dateFnsLocalizer, View } from 'react-big-calendar'; import { format, parse, startOfWeek, getDay, addMonths, subMonths } from 'date-fns'; import { de } from 'date-fns/locale'; import 'react-big-calendar/lib/css/react-big-calendar.css'; import DashboardSidebar from '@/components/DashboardSidebar'; import { useSession } from 'next-auth/react'; import { FiChevronLeft, FiChevronRight, FiCalendar } from 'react-icons/fi'; const locales = { de: de, }; const localizer = dateFnsLocalizer({ format, parse, startOfWeek: () => startOfWeek(new Date(), { locale: de }), getDay, locales, }); interface CalendarEvent { id: string; title: string; start: Date; end: Date; resource: { bookingId: string; status: string; customerName: string; customerEmail: string; locationName: string; photoboxName: string; tourId?: string; eventType: string; }; } export default function KalenderPage() { const { data: session } = useSession(); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [selectedEvent, setSelectedEvent] = useState(null); const [view, setView] = useState('month'); const [date, setDate] = useState(new Date()); const fetchEvents = useCallback(async (start?: Date, end?: Date) => { setLoading(true); try { const params = new URLSearchParams(); if (start) params.append('start', start.toISOString()); if (end) params.append('end', end.toISOString()); const response = await fetch(`/api/calendar?${params.toString()}`); const data = await response.json(); const parsedEvents = data.events.map((event: any) => ({ ...event, start: new Date(event.start), end: new Date(event.end), })); setEvents(parsedEvents); } catch (error) { console.error('Error fetching calendar events:', error); } finally { setLoading(false); } }, []); useEffect(() => { fetchEvents(); }, [fetchEvents]); const handleNavigate = (newDate: Date) => { setDate(newDate); }; const handleViewChange = (newView: View) => { setView(newView); }; const eventStyleGetter = (event: CalendarEvent) => { let backgroundColor = '#6b7280'; switch (event.resource.status) { case 'PENDING': backgroundColor = '#f59e0b'; break; case 'RESERVED': backgroundColor = '#3b82f6'; break; case 'CONFIRMED': backgroundColor = '#10b981'; break; case 'TOUR_CREATED': backgroundColor = '#8b5cf6'; break; case 'COMPLETED': backgroundColor = '#6b7280'; break; case 'CANCELLED': backgroundColor = '#ef4444'; break; } return { style: { backgroundColor, borderRadius: '4px', opacity: 0.9, color: 'white', border: '0px', display: 'block', }, }; }; const CustomToolbar = ({ label, onNavigate }: any) => { return (

{label}

); }; return (
{loading ? (
) : ( <>
setSelectedEvent(event)} eventPropGetter={eventStyleGetter} view={view} onView={handleViewChange} date={date} onNavigate={handleNavigate} components={{ toolbar: CustomToolbar, }} messages={{ next: 'Weiter', previous: 'Zurück', today: 'Heute', month: 'Monat', week: 'Woche', day: 'Tag', agenda: 'Agenda', date: 'Datum', time: 'Zeit', event: 'Event', noEventsInRange: 'Keine Events in diesem Zeitraum', showMore: (total) => `+ ${total} mehr`, }} />
Pending
Reserviert
Bestätigt
Tour erstellt
Abgeschlossen
Storniert
)}
{selectedEvent && (
setSelectedEvent(null)} >
e.stopPropagation()} >

Buchungsdetails

Kunde:{' '} {selectedEvent.resource.customerName}
E-Mail:{' '} {selectedEvent.resource.customerEmail}
Standort:{' '} {selectedEvent.resource.locationName}
Fotobox:{' '} {selectedEvent.resource.photoboxName}
Event-Typ:{' '} {selectedEvent.resource.eventType}
Status:{' '} {selectedEvent.resource.status}
Datum:{' '} {format(selectedEvent.start, 'PPP', { locale: de })}
Zeit:{' '} {format(selectedEvent.start, 'HH:mm', { locale: de })} -{' '} {format(selectedEvent.end, 'HH:mm', { locale: de })}
Buchung öffnen {selectedEvent.resource.tourId && ( Tour anzeigen )}
)}
); }