diff --git a/app/page.tsx b/app/page.tsx
index 81d22369..68eef8c5 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -5,6 +5,7 @@ import { CalendarWidget } from "@/components/calendar-widget";
import { News } from "@/components/news";
import { Duties } from "@/components/flow";
import { Parole } from "@/components/parole";
+import { CourrierWidget } from "@/components/mail/courrier-widget";
import { useSession } from "next-auth/react";
import { useEffect, useState } from "react";
@@ -46,6 +47,9 @@ export default function Home() {
+
+
+
diff --git a/components/mail/courrier-widget.tsx b/components/mail/courrier-widget.tsx
new file mode 100644
index 00000000..a4f8a8ab
--- /dev/null
+++ b/components/mail/courrier-widget.tsx
@@ -0,0 +1,138 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { RefreshCw, Mail } from "lucide-react";
+import { useRouter } from "next/navigation";
+import { useSession } from "next-auth/react";
+
+interface Email {
+ id: string;
+ subject: string;
+ from: string;
+ fromName: string;
+ date: string;
+ read: boolean;
+ starred: boolean;
+ hasAttachments: boolean;
+}
+
+export function CourrierWidget() {
+ const [emails, setEmails] = useState([]);
+ const [error, setError] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [refreshing, setRefreshing] = useState(false);
+ const router = useRouter();
+ const { status } = useSession();
+
+ const fetchEmails = async (isRefresh = false) => {
+ try {
+ if (isRefresh) {
+ setRefreshing(true);
+ }
+
+ const response = await fetch('/api/courrier');
+ if (!response.ok) {
+ throw new Error('Failed to fetch emails');
+ }
+
+ const data = await response.json();
+ if (Array.isArray(data.emails)) {
+ setEmails(data.emails.slice(0, 5));
+ } else {
+ console.warn('Unexpected data format:', data);
+ setEmails([]);
+ }
+ setError(null);
+ } catch (err) {
+ console.error('Error fetching emails:', err);
+ const errorMessage = err instanceof Error ? err.message : 'Failed to fetch emails';
+ setError(errorMessage);
+ } finally {
+ setLoading(false);
+ setRefreshing(false);
+ }
+ };
+
+ useEffect(() => {
+ if (status === 'authenticated') {
+ fetchEmails();
+ }
+ }, [status]);
+
+ const formatDate = (dateString: string) => {
+ const date = new Date(dateString);
+ const now = new Date();
+ const diff = now.getTime() - date.getTime();
+ const days = Math.floor(diff / (1000 * 60 * 60 * 24));
+
+ if (days === 0) {
+ return date.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' });
+ } else if (days === 1) {
+ return 'Hier';
+ } else if (days < 7) {
+ return date.toLocaleDateString('fr-FR', { weekday: 'long' });
+ } else {
+ return date.toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit', year: '2-digit' });
+ }
+ };
+
+ return (
+ router.push('/courrier')}
+ >
+
+
+
+ Courrier
+
+
+
+
+ {loading ? (
+
+ ) : error ? (
+ {error}
+ ) : emails.length === 0 ? (
+ No emails found
+ ) : (
+
+ {emails.map((email) => (
+
+
+
+ {formatDate(email.date)}
+
+
+ {email.subject}
+
+
+ {email.fromName}
+
+
+
+ ))}
+
+ )}
+
+
+ );
+}
\ No newline at end of file