From 8c8af4b02879a309a82c7a03b1619e42575cf2de Mon Sep 17 00:00:00 2001 From: alma Date: Fri, 18 Apr 2025 10:33:04 +0200 Subject: [PATCH] clean sidebar calendar rest2 --- app/calendar/page.tsx | 122 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 110 insertions(+), 12 deletions(-) diff --git a/app/calendar/page.tsx b/app/calendar/page.tsx index 25ef6171..04c2fc5b 100644 --- a/app/calendar/page.tsx +++ b/app/calendar/page.tsx @@ -1,23 +1,121 @@ import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { redirect } from "next/navigation"; -import { ResponsiveIframe } from "@/app/components/responsive-iframe"; +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 default async function Page() { +export const metadata: Metadata = { + 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); - if (!session) { - redirect("/signin"); + if (!session?.user) { + redirect("/api/auth/signin"); } + const userId = session.user.username || session.user.email || ''; + + // Get all calendars for the user + let calendars = await prisma.calendar.findMany({ + where: { + userId: session?.user?.id || '', + }, + include: { + events: { + orderBy: { + start: 'asc' + } + } + } + }); + + // If no calendars exist, create default ones + if (calendars.length === 0) { + const defaultCalendars = [ + { + name: "Default", + color: "#4F46E5", + description: "Your default calendar" + } + ]; + + 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 ( -
-
- -
-
+
+ +
); }