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 start = searchParams.get("start");
|
||||||
const end = searchParams.get("end");
|
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: {
|
where: {
|
||||||
userId: session.user.id,
|
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 && end
|
||||||
? {
|
? {
|
||||||
start: {
|
start: {
|
||||||
@ -31,16 +41,27 @@ export async function GET(req: Request) {
|
|||||||
}
|
}
|
||||||
: {}),
|
: {}),
|
||||||
},
|
},
|
||||||
|
include: {
|
||||||
|
calendar: true,
|
||||||
|
},
|
||||||
orderBy: {
|
orderBy: {
|
||||||
start: "asc",
|
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) {
|
} catch (error) {
|
||||||
console.error("Error fetching events:", error);
|
console.error("Error fetching events:", error);
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ error: "Error fetching events" },
|
{ error: "Erreur lors du chargement des événements" },
|
||||||
{ status: 500 }
|
{ status: 500 }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
import { format, isToday, isTomorrow, addDays } from "date-fns";
|
import { format, isToday, isTomorrow, addDays } from "date-fns";
|
||||||
import { fr } from "date-fns/locale";
|
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 { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
@ -12,8 +12,8 @@ import { useSession } from "next-auth/react";
|
|||||||
type Event = {
|
type Event = {
|
||||||
id: string;
|
id: string;
|
||||||
title: string;
|
title: string;
|
||||||
start: string;
|
start: Date;
|
||||||
end: string;
|
end: Date;
|
||||||
isAllDay: boolean;
|
isAllDay: boolean;
|
||||||
calendarId: string;
|
calendarId: string;
|
||||||
calendarName?: string;
|
calendarName?: string;
|
||||||
@ -32,49 +32,31 @@ export function CalendarWidget() {
|
|||||||
const fetchUpcomingEvents = async () => {
|
const fetchUpcomingEvents = async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
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 now = new Date();
|
||||||
const nextWeek = addDays(now, 7);
|
const nextWeek = addDays(now, 7);
|
||||||
|
|
||||||
const allEventsPromises = calendars.map(async (calendar: any) => {
|
// Fetch events directly from the calendar API
|
||||||
const eventsRes = await fetch(
|
const eventsRes = await fetch(
|
||||||
`/api/calendars/${calendar.id}/events?start=${now.toISOString()}&end=${nextWeek.toISOString()}`
|
`/api/calendar?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()
|
|
||||||
);
|
);
|
||||||
|
|
||||||
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) {
|
} catch (err) {
|
||||||
console.error("Erreur lors du chargement des événements:", err);
|
console.error("Erreur lors du chargement des événements:", err);
|
||||||
setError("Impossible de charger les événements à venir");
|
setError("Impossible de charger les événements à venir");
|
||||||
@ -84,22 +66,26 @@ export function CalendarWidget() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
fetchUpcomingEvents();
|
fetchUpcomingEvents();
|
||||||
|
|
||||||
|
// Set up an interval to refresh events every minute
|
||||||
|
const intervalId = setInterval(fetchUpcomingEvents, 60000);
|
||||||
|
|
||||||
|
return () => clearInterval(intervalId);
|
||||||
}, [session]);
|
}, [session]);
|
||||||
|
|
||||||
const formatEventDate = (date: string, isAllDay: boolean) => {
|
const formatEventDate = (date: Date, isAllDay: boolean) => {
|
||||||
const eventDate = new Date(date);
|
|
||||||
let dateString = "";
|
let dateString = "";
|
||||||
|
|
||||||
if (isToday(eventDate)) {
|
if (isToday(date)) {
|
||||||
dateString = "Aujourd'hui";
|
dateString = "Aujourd'hui";
|
||||||
} else if (isTomorrow(eventDate)) {
|
} else if (isTomorrow(date)) {
|
||||||
dateString = "Demain";
|
dateString = "Demain";
|
||||||
} else {
|
} else {
|
||||||
dateString = format(eventDate, "EEEE d MMMM", { locale: fr });
|
dateString = format(date, "EEEE d MMMM", { locale: fr });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isAllDay) {
|
if (!isAllDay) {
|
||||||
dateString += ` · ${format(eventDate, "HH:mm", { locale: fr })}`;
|
dateString += ` · ${format(date, "HH:mm", { locale: fr })}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dateString;
|
return dateString;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user