diff --git a/app/calendar/page.tsx b/app/calendar/page.tsx index 651d4c30..c876b973 100644 --- a/app/calendar/page.tsx +++ b/app/calendar/page.tsx @@ -4,12 +4,37 @@ import { redirect } from "next/navigation"; import { prisma } from "@/lib/prisma"; import { CalendarClient } from "@/components/calendar/calendar-client"; import { Metadata } from "next"; +import { CalendarDays, Users, Bookmark, Clock } from "lucide-react"; +import Image from "next/image"; +import { Button } from "@/components/ui/button"; +import { add } from 'date-fns'; export const metadata: Metadata = { - title: "Enkun - Calendrier", - description: "Gérez vos rendez-vous et événements", + title: "Enkun - Calendrier | Gestion d'événements professionnelle", + description: "Plateforme avancée pour la gestion de vos rendez-vous, réunions et événements professionnels", + keywords: "calendrier, rendez-vous, événements, gestion du temps, enkun", }; +interface Event { + id: string; + title: string; + description?: string | null; + start: Date; + end: Date; + location?: string | null; + isAllDay: boolean; + type?: string; + attendees?: { id: string; name: string }[]; +} + +interface Calendar { + id: string; + name: string; + color: string; + description?: string | null; + events: Event[]; +} + export default async function CalendarPage() { const session = await getServerSession(authOptions); @@ -18,11 +43,11 @@ export default async function CalendarPage() { } const userId = session.user.username || session.user.email || ''; - - // Get user's calendars - const userCalendars = await prisma.calendar.findMany({ + + // Get all calendars for the user + let calendars = await prisma.calendar.findMany({ where: { - userId: userId, + userId: session?.user?.id || '', }, include: { events: { @@ -30,43 +55,62 @@ export default async function CalendarPage() { start: 'asc' } } - }, - orderBy: { - createdAt: "desc", - }, + } }); - // Create default calendar if none exists - let calendars = userCalendars; + // If no calendars exist, create default ones if (calendars.length === 0) { - const defaultCalendar = await prisma.calendar.create({ - data: { - name: "Calendrier principal", - color: "#0082c9", - description: "Calendrier par défaut", - userId: userId, - }, - include: { - events: true + const defaultCalendars = [ + { + name: "Default", + color: "#4F46E5", + description: "Your default calendar" } - }); - calendars = [defaultCalendar]; + ]; + + calendars = await Promise.all( + defaultCalendars.map(async (cal) => { + return prisma.calendar.create({ + data: { + ...cal, + userId: session?.user?.id || '', + }, + include: { + events: true + } + }); + }) + ); } + const now = new Date(); + const nextWeek = add(now, { days: 7 }); + + const upcomingEvents = calendars.flatMap(cal => + cal.events.filter(event => + new Date(event.start) >= now && + new Date(event.start) <= nextWeek + ) + ).sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime()); + + // Calculate statistics + const totalEvents = calendars.flatMap(cal => cal.events).length; + + const totalMeetingHours = calendars + .flatMap(cal => cal.events) + .reduce((total, event) => { + const start = new Date(event.start); + const end = new Date(event.end); + const hours = (end.getTime() - start.getTime()) / (1000 * 60 * 60); + return total + (isNaN(hours) ? 0 : hours); + }, 0); + return ( -
- Gérez vos rendez-vous et événements -
-