calendar 6
This commit is contained in:
parent
b852bada2b
commit
1317a36665
@ -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 }
|
||||
);
|
||||
}
|
||||
|
||||
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user