From 1317a3666524df6c8c75736714ad2c9dd095f7c9 Mon Sep 17 00:00:00 2001 From: Alma Date: Sun, 13 Apr 2025 13:10:29 +0200 Subject: [PATCH] calendar 6 --- app/api/calendar/route.ts | 27 +++++++- components/calendar/calendar-widget.tsx | 82 ++++++++++--------------- 2 files changed, 58 insertions(+), 51 deletions(-) diff --git a/app/api/calendar/route.ts b/app/api/calendar/route.ts index 94e90e68..ca4df276 100644 --- a/app/api/calendar/route.ts +++ b/app/api/calendar/route.ts @@ -17,9 +17,19 @@ export async function GET(req: Request) { const start = searchParams.get("start"); const end = searchParams.get("end"); - const events = await prisma.event.findMany({ + // First get all calendars for the user + const calendars = await prisma.calendar.findMany({ where: { userId: session.user.id, + }, + }); + + // Then get events with calendar information + const events = await prisma.event.findMany({ + where: { + calendarId: { + in: calendars.map(cal => cal.id) + }, ...(start && end ? { start: { @@ -31,16 +41,27 @@ export async function GET(req: Request) { } : {}), }, + include: { + calendar: true, + }, orderBy: { start: "asc", }, }); - return NextResponse.json(events); + // Map the events to include calendar color and name + const eventsWithCalendarInfo = events.map(event => ({ + ...event, + calendarColor: event.calendar.color, + calendarName: event.calendar.name, + calendar: undefined, // Remove the full calendar object + })); + + return NextResponse.json(eventsWithCalendarInfo); } catch (error) { console.error("Error fetching events:", error); return NextResponse.json( - { error: "Error fetching events" }, + { error: "Erreur lors du chargement des événements" }, { status: 500 } ); } diff --git a/components/calendar/calendar-widget.tsx b/components/calendar/calendar-widget.tsx index d1797a16..9961eec1 100644 --- a/components/calendar/calendar-widget.tsx +++ b/components/calendar/calendar-widget.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from "react"; import { format, isToday, isTomorrow, addDays } from "date-fns"; import { fr } from "date-fns/locale"; -import { CalendarIcon, ClockIcon, ChevronRight } from "lucide-react"; +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"; @@ -12,8 +12,8 @@ import { useSession } from "next-auth/react"; type Event = { id: string; title: string; - start: string; - end: string; + start: Date; + end: Date; isAllDay: boolean; calendarId: string; calendarName?: string; @@ -32,49 +32,31 @@ export function CalendarWidget() { const fetchUpcomingEvents = async () => { try { setLoading(true); - - const calendarsRes = await fetch("/api/calendars"); - if (!calendarsRes.ok) { - throw new Error("Impossible de charger les calendriers"); - } - - const calendars = await calendarsRes.json(); - if (calendars.length === 0) { - setEvents([]); - setLoading(false); - return; - } - const now = new Date(); const nextWeek = addDays(now, 7); - const allEventsPromises = calendars.map(async (calendar: any) => { - const eventsRes = await fetch( - `/api/calendars/${calendar.id}/events?start=${now.toISOString()}&end=${nextWeek.toISOString()}` - ); - - if (!eventsRes.ok) { - console.warn( - `Impossible de charger les événements du calendrier ${calendar.id}` - ); - return []; - } - - const events = await eventsRes.json(); - return events.map((event: any) => ({ - ...event, - calendarName: calendar.name, - calendarColor: calendar.color, - })); - }); - - const allEventsArrays = await Promise.all(allEventsPromises); - const allEvents = allEventsArrays.flat(); - const sortedEvents = allEvents.sort( - (a, b) => new Date(a.start).getTime() - new Date(b.start).getTime() + // Fetch events directly from the calendar API + const eventsRes = await fetch( + `/api/calendar?start=${now.toISOString()}&end=${nextWeek.toISOString()}` ); - setEvents(sortedEvents.slice(0, 5)); + if (!eventsRes.ok) { + throw new Error("Impossible de charger les événements"); + } + + const eventsData = await eventsRes.json(); + + // Sort events by start date and limit to 5 + const sortedEvents = eventsData + .sort((a: Event, b: Event) => new Date(a.start).getTime() - new Date(b.start).getTime()) + .slice(0, 5) + .map((event: Event) => ({ + ...event, + start: new Date(event.start), + end: new Date(event.end), + })); + + setEvents(sortedEvents); } catch (err) { console.error("Erreur lors du chargement des événements:", err); setError("Impossible de charger les événements à venir"); @@ -84,22 +66,26 @@ export function CalendarWidget() { }; fetchUpcomingEvents(); + + // Set up an interval to refresh events every minute + const intervalId = setInterval(fetchUpcomingEvents, 60000); + + return () => clearInterval(intervalId); }, [session]); - const formatEventDate = (date: string, isAllDay: boolean) => { - const eventDate = new Date(date); + const formatEventDate = (date: Date, isAllDay: boolean) => { let dateString = ""; - if (isToday(eventDate)) { + if (isToday(date)) { dateString = "Aujourd'hui"; - } else if (isTomorrow(eventDate)) { + } else if (isTomorrow(date)) { dateString = "Demain"; } else { - dateString = format(eventDate, "EEEE d MMMM", { locale: fr }); + dateString = format(date, "EEEE d MMMM", { locale: fr }); } if (!isAllDay) { - dateString += ` · ${format(eventDate, "HH:mm", { locale: fr })}`; + dateString += ` · ${format(date, "HH:mm", { locale: fr })}`; } return dateString; @@ -170,4 +156,4 @@ export function CalendarWidget() { ); -} \ No newline at end of file +} \ No newline at end of file