import React, { useState, useEffect } from 'react'; import { useAuth } from '../context/AuthContext'; import Sidebar from '../components/Sidebar'; import { Calendar as CalendarIcon, Clock, Plus, Settings, RefreshCw, Menu, FileText } from 'lucide-react'; import NewLeaveRequestModal from '../components/NewLeaveRequestModal'; import { useMsal } from "@azure/msal-react"; import { loginRequest } from "../authConfig"; const Dashboard = () => { const { user } = useAuth(); const [graphToken, setGraphToken] = useState(null); const [sidebarOpen, setSidebarOpen] = useState(false); const [leaveCounters, setLeaveCounters] = useState({ availableCP: 0, availableRTT: 0, availableABS: 0, rttInProcess: 0, absenteism: 0 }); const [showNewRequestModal, setShowNewRequestModal] = useState(false); const [showAdminPanel, setShowAdminPanel] = useState(false); const [isLoading, setIsLoading] = useState(true); const [recentRequests, setRecentRequests] = useState([]); const [allRequests, setAllRequests] = useState([]); const { instance, accounts } = useMsal(); // Récupération du bon ID utilisateur (CollaborateurAD) const userId = user?.id || user?.CollaborateurADId || user?.ID; useEffect(() => { console.log("🔎 Utilisateur chargé dans Dashboard:", user); }, [user]); useEffect(() => { if (accounts.length > 0) { const request = { ...loginRequest, account: accounts[0], }; instance.acquireTokenSilent(request) .then((response) => { console.log("✅ Token Graph récupéré (silent):", response.accessToken); setGraphToken(response.accessToken); }) .catch(async (err) => { console.warn("⚠️ Silent échoué, on tente un popup:", err); try { const tokenResponse = await instance.acquireTokenPopup(request); console.log("✅ Token Graph récupéré (popup):", tokenResponse.accessToken); setGraphToken(tokenResponse.accessToken); } catch (popupErr) { console.error("❌ Impossible d'obtenir un token:", popupErr); } }); } }, [accounts, instance]); // Vérification rapide du token useEffect(() => { if (graphToken) { console.log("🔎 Token prêt ?", graphToken.split(".").length === 3 ? "✅ JWT valide" : "❌ Token invalide: " + graphToken ); } }, [graphToken]); // 🔄 Récupération compteurs et demandes useEffect(() => { if (userId) { fetchLeaveCounters(); fetchAllRequests(); } }, [userId]); const fetchLeaveCounters = async () => { try { const url = `http://localhost/GTA/project/public/php/getLeaveCounters.php?user_id=${userId}`; const response = await fetch(url); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); const text = await response.text(); console.log("🔎 Réponse brute getLeaveCounters:", text); let data; try { data = JSON.parse(text); } catch (e) { throw new Error("Le serveur PHP ne renvoie pas un JSON valide"); } if (data.success) { setLeaveCounters(data.counters); } else { throw new Error(data.message || "Erreur lors de la récupération des compteurs"); } } catch (error) { console.error("💥 Erreur compteurs:", error); setLeaveCounters({ availableCP: 25, availableRTT: 10, availableABS: 0, rttInProcess: 0, absenteism: 0 }); } finally { setIsLoading(false); } }; const fetchAllRequests = async () => { try { const url = `http://localhost/GTA/project/public/php/getRequests.php?user_id=${userId}`; const response = await fetch(url); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); const text = await response.text(); console.log("🔎 Réponse brute getRequests:", text); let data; try { data = JSON.parse(text); } catch { throw new Error("Le serveur PHP ne renvoie pas un JSON valide"); } if (data.success) { setAllRequests(data.requests || []); setRecentRequests(data.requests?.slice(0, 3) || []); } else { throw new Error(data.message || "Erreur lors de la récupération des demandes"); } } catch (error) { console.error("💥 Erreur demandes:", error); setAllRequests([]); setRecentRequests([]); } }; const handleResetCounters = async () => { if (!confirm("⚠️ Voulez-vous vraiment réinitialiser les compteurs ?")) return; try { const response = await fetch('http://localhost/GTA/project/public/php/resetLeaveCounters.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ manual_reset: true }), }); const data = await response.json(); if (data.success) { alert("✅ Réinitialisation réussie !"); fetchLeaveCounters(); } else { alert(`❌ Erreur : ${data.message}`); } } catch (error) { console.error("Erreur:", error); alert("❌ Erreur serveur"); } }; const getStatusColor = (status) => { switch (status) { case 'Approuvé': case 'Validée': return 'bg-green-100 text-green-800'; case 'En attente': return 'bg-yellow-100 text-yellow-800'; case 'Refusé': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; if (isLoading) { return (
setSidebarOpen(!sidebarOpen)} />

Chargement des données...

); } return (
setSidebarOpen(!sidebarOpen)} />
{/* Mobile menu button */}
{/* Header */}

Bonjour, {user?.name || user?.prenom || 'Utilisateur'} 👋

Voici un aperçu de vos congés et demandes récentes

{(user?.role === 'Admin' || user?.role === 'RH') && ( )}
{/* Admin Panel */} {showAdminPanel && (

Administration

⚠️ Zone d'administration

Ces actions affectent tous les utilisateurs du système. Utilisez avec précaution.

)} {/* Stats Cards */}

CP restants

{leaveCounters.availableCP}

jours

RTT restants

{leaveCounters.availableRTT}

jours

{/* Requests Section */}
{/* Recent Requests */}

Demandes récentes

{recentRequests.length === 0 ? (

Aucune demande récente

) : (
{recentRequests.map((request) => (

{request.type}

{request.dateDisplay}

{request.status}

{request.days}j

))}
)}
{/* All Requests Summary */}

Toutes les demandes

{allRequests.length === 0 ? (

Aucune demande

) : (
{allRequests.map((request) => (

{request.type}

{request.dateDisplay}

Soumis le {request.submittedDisplay}

{request.status}

{request.days}j

))}
)}
{/* Modal nouvelle demande */} {showNewRequestModal && ( setShowNewRequestModal(false)} availableLeaveCounters={leaveCounters} accessToken={graphToken} userId={userId} userEmail={user.email} userName={`${user.prenom} ${user.nom}`} onRequestSubmitted={() => { fetchLeaveCounters(); fetchAllRequests(); }} /> )}
); }; export default Dashboard;