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 (
Chargement des données...
Voici un aperçu de vos congés et demandes récentes
Ces actions affectent tous les utilisateurs du système. Utilisez avec précaution.
CP restants
{leaveCounters.availableCP}
jours
RTT restants
{leaveCounters.availableRTT}
jours
Aucune demande récente
{request.type}
{request.dateDisplay}
{request.days}j
Aucune demande
{request.type}
{request.dateDisplay}
Soumis le {request.submittedDisplay}
{request.days}j