'use client'; import { useSession } from 'next-auth/react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Button } from '../../components/ui/button'; import { Input } from '../../components/ui/input'; import { Label } from '../../components/ui/label'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '../../components/ui/table'; import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card'; interface Hour { id: number; date: string; duration: number; reason: string; status: string; user: { email: string }; } export default function DashboardPage() { const { data: session, status } = useSession(); const router = useRouter(); const [hours, setHours] = useState([]); const [date, setDate] = useState(''); const [duration, setDuration] = useState(''); const [reason, setReason] = useState(''); const [hoursInput, setHoursInput] = useState(''); const [minutesInput, setMinutesInput] = useState(''); useEffect(() => { if (status === 'loading') return; if (!session) { router.push('/login'); return; } const isAdmin = session.user.role === 'ADMIN' || session.user.role === 'SUPER_ADMIN'; if (isAdmin) { router.push('/admin'); return; } fetchHours(); }, [session, status, router]); const fetchHours = async () => { const res = await fetch('/api/hours'); if (res.ok) { const data = await res.json(); setHours(data); } }; const handleAddHour = async (e: React.FormEvent) => { e.preventDefault(); const totalMinutes = parseInt(hoursInput) * 60 + parseInt(minutesInput); const res = await fetch('/api/hours', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ date, duration: totalMinutes, reason }), }); if (res.ok) { setDate(''); setHoursInput(''); setMinutesInput(''); setReason(''); fetchHours(); } }; const handleValidate = async (id: number, status: string) => { await fetch(`/api/hours/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status }), }); fetchHours(); }; if (status === 'loading') return
Chargement...
; const isAdmin = session?.user?.role === 'ADMIN' || session?.user?.role === 'SUPER_ADMIN'; const isMember = session?.user?.role === 'MEMBER'; const totalPending = hours .filter((h) => h.status === 'PENDING') .reduce((sum, h) => sum + h.duration, 0); const totalValidated = hours .filter((h) => h.status === 'VALIDATED') .reduce((sum, h) => sum + h.duration, 0); const totalRejected = hours .filter((h) => h.status === 'REJECTED') .reduce((sum, h) => sum + h.duration, 0); const formatHours = (minutes: number) => { const h = Math.floor(minutes / 60); const m = minutes % 60; return `${h}h ${m}min`; }; return (

Tableau de bord

{isMember && ( Ajouter une heure
setDate(e.target.value)} required />
setHoursInput(e.target.value)} required />
setMinutesInput(e.target.value)} required />
setReason(e.target.value)} required />
)} Liste des heures Date Durée Raison Statut {isAdmin && Utilisateur} {isAdmin && Actions} {hours.map((hour) => ( {new Date(hour.date).toLocaleDateString()} {hour.duration} min {hour.reason} {hour.status} {isAdmin && {hour.user.email}} {isAdmin && ( )} ))}

Totaux

En attente

{formatHours(totalPending)}

Validées

{formatHours(totalValidated)}

Rejetées

{formatHours(totalRejected)}

); }