calendar 6

This commit is contained in:
Alma 2025-04-13 13:10:29 +02:00
parent b852bada2b
commit 1317a36665
2 changed files with 58 additions and 51 deletions

View File

@ -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 }
);
}

View File

@ -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() {
</CardContent>
</Card>
);
}
}