"use client"; import { useState, useEffect } from "react"; import { format, isToday, isTomorrow, addDays } from "date-fns"; import { fr } from "date-fns/locale"; import { CalendarIcon, ChevronRight } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import Link from "next/link"; import { useSession } from "next-auth/react"; type Event = { id: string; title: string; start: Date; end: Date; isAllDay: boolean; calendarId: string; calendarName?: string; calendarColor?: string; }; export function CalendarWidget() { const { data: session, status } = useSession(); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { if (status === "loading") { return; } if (status !== "authenticated" || !session) { setLoading(false); return; } const fetchUpcomingEvents = async () => { try { setLoading(true); const response = await fetch('/api/calendars'); if (!response.ok) { throw new Error("Impossible de charger les événements"); } const calendarsData = await response.json(); if (!Array.isArray(calendarsData)) { throw new Error("Format de données invalide"); } const now = new Date(); now.setHours(0, 0, 0, 0); const allEvents = calendarsData.flatMap((calendar) => { return (calendar.events || []).map((event: { id: string; title: string; start: string; end: string; isAllDay: boolean; calendarId: string; }) => { const startDate = new Date(event.start); const endDate = new Date(event.end); return { id: event.id, title: event.title, start: startDate, end: endDate, isAllDay: event.isAllDay, calendarId: event.calendarId, calendarColor: calendar.color, calendarName: calendar.name }; }); }); const upcomingEvents = allEvents .filter(event => event.start >= now) .sort((a, b) => a.start.getTime() - b.start.getTime()) .slice(0, 5); setEvents(upcomingEvents); setError(null); } catch (err) { setError("Impossible de charger les événements à venir"); } finally { setLoading(false); } }; fetchUpcomingEvents(); const intervalId = setInterval(fetchUpcomingEvents, 300000); return () => clearInterval(intervalId); }, [session, status]); const formatEventDate = (date: Date, isAllDay: boolean) => { let dateString = ""; if (isToday(date)) { dateString = "Aujourd'hui"; } else if (isTomorrow(date)) { dateString = "Demain"; } else { dateString = format(date, "EEEE d MMMM", { locale: fr }); } if (!isAllDay) { dateString += ` · ${format(date, "HH:mm", { locale: fr })}`; } return dateString; }; return ( Événements à venir {loading ? (
Chargement...
) : error ? (

{error}

) : events.length === 0 ? (

Aucun événement à venir cette semaine

) : (
{events.map((event) => (
{event.title}
{formatEventDate(event.start, event.isAllDay)}
))}
)} ); }