"use client"; import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { RefreshCw, Calendar as CalendarIcon } from "lucide-react"; import { useRouter } from "next/navigation"; interface Event { id: string; title: string; start: string; end: string; allDay: boolean; calendar: string; calendarColor: string; } export function Calendar() { const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const router = useRouter(); const fetchEvents = async () => { console.log('🔍 Calendar Widget - Starting fetchEvents'); setLoading(true); try { console.log('📡 Calendar Widget - Making API request to /api/calendars'); const response = await fetch('/api/calendars', { credentials: 'include' }); console.log('📥 Calendar Widget - Response status:', response.status); if (!response.ok) { const errorText = await response.text(); console.error('❌ Calendar Widget - API Error:', { status: response.status, statusText: response.statusText, errorText }); throw new Error(`Failed to fetch events: ${response.status} ${response.statusText}`); } const calendarsData = await response.json(); console.log('📊 Calendar Widget - Raw API Response:', calendarsData); // Get current date at the start of the day const now = new Date(); now.setHours(0, 0, 0, 0); console.log('📅 Calendar Widget - Current date:', now.toISOString()); // Extract and process events from all calendars console.log('🔄 Calendar Widget - Processing events from calendars'); const allEvents = calendarsData.flatMap((calendar: any) => { console.log(`📋 Processing calendar: ${calendar.name} (${calendar.id})`); return (calendar.events || []).map((event: any) => { console.log(`📝 Processing event: ${event.title} (${event.id})`); return { id: event.id, title: event.title, start: event.start, end: event.end, allDay: event.isAllDay, calendar: calendar.name, calendarColor: calendar.color }; }); }); console.log('📈 Calendar Widget - Total events before filtering:', allEvents.length); // Filter for upcoming events const upcomingEvents = allEvents .filter((event: any) => { const eventDate = new Date(event.start); const isUpcoming = eventDate >= now; console.log(`⏰ Event ${event.title}: ${eventDate.toISOString()} is ${isUpcoming ? 'upcoming' : 'past'}`); return isUpcoming; }) .sort((a: any, b: any) => { const dateA = new Date(a.start); const dateB = new Date(b.start); return dateA.getTime() - dateB.getTime(); }) .slice(0, 7); console.log('✅ Calendar Widget - Final processed events:', upcomingEvents); setEvents(upcomingEvents); setError(null); } catch (err) { console.error('❌ Calendar Widget - Error in fetchEvents:', err); setError(err instanceof Error ? err.message : 'Failed to load events'); } finally { console.log('🏁 Calendar Widget - fetchEvents completed'); setLoading(false); } }; useEffect(() => { console.log('🔄 Calendar Widget - Component mounted, fetching events'); fetchEvents(); }, []); const formatDate = (dateString: string) => { const date = new Date(dateString); return new Intl.DateTimeFormat('fr-FR', { day: '2-digit', month: 'short' }).format(date); }; const formatTime = (dateString: string) => { const date = new Date(dateString); return new Intl.DateTimeFormat('fr-FR', { hour: '2-digit', minute: '2-digit', }).format(date); }; return ( Agenda {loading ? (
) : error ? (
{error}
) : events.length === 0 ? (
No upcoming events
) : (
{events.map((event) => (
{formatDate(event.start)} {formatTime(event.start)}

{event.title}

{!event.allDay && ( {formatTime(event.start)} - {formatTime(event.end)} )}
{event.calendar}
))}
)} ); }