"use client"; import { useState } from "react"; import { usePathname } from "next/navigation"; import { X, Database, Minimize2, Maximize2, Clock, CircleDot, Layout, RefreshCw, Globe, Filter, Calendar, } from "lucide-react"; import type { RequestTiming } from "@/types/debug"; import { useTranslation } from "react-i18next"; import { useDebug } from "@/contexts/DebugContext"; function formatTime(timestamp: string) { const date = new Date(timestamp); return date.toLocaleTimeString("fr-FR", { hour: "2-digit", minute: "2-digit", second: "2-digit", }); } function formatDuration(duration: number) { return Math.round(duration); } type FilterType = "all" | "current-page" | "api" | "cache" | "mongodb" | "page-render"; export function DebugInfo() { const { logs, setLogs, clearLogs, isRefreshing, setIsRefreshing } = useDebug(); const [isMinimized, setIsMinimized] = useState(false); const [filter, setFilter] = useState("all"); const [showFilters, setShowFilters] = useState(false); const pathname = usePathname(); const { t } = useTranslation(); const fetchLogs = async () => { try { setIsRefreshing(true); const response = await fetch("/api/debug"); if (response.ok) { const data = await response.json(); setLogs(data); } } catch (error) { console.error("Erreur lors de la récupération des logs:", error); } finally { setIsRefreshing(false); } }; // Fonction pour déterminer si une requête appartient à la page courante const isCurrentPageRequest = (log: RequestTiming): boolean => { if (log.pageRender) { return log.pageRender.page === pathname; } // Pour les requêtes API, on considère qu'elles appartiennent à la page courante // si elles ont été faites récemment (dans les 30 dernières secondes) const logTime = new Date(log.timestamp).getTime(); const now = Date.now(); return now - logTime < 30000; // 30 secondes }; // Filtrer les logs selon le filtre sélectionné const filteredLogs = logs.filter((log) => { switch (filter) { case "current-page": return isCurrentPageRequest(log); case "api": return !log.fromCache && !log.mongoAccess && !log.pageRender; case "cache": return log.fromCache; case "mongodb": return log.mongoAccess; case "page-render": return log.pageRender; default: return true; } }); const sortedLogs = [...filteredLogs].reverse(); return (

{t("debug.title")}

{!isMinimized && ( {sortedLogs.length} {t("debug.entries", { count: sortedLogs.length })} )}
{!isMinimized && ( )}
{!isMinimized && showFilters && (
{[ { key: "all", label: "Toutes", icon: Calendar }, { key: "current-page", label: "Page courante", icon: Layout }, { key: "api", label: "API", icon: Globe }, { key: "cache", label: "Cache", icon: Database }, { key: "mongodb", label: "MongoDB", icon: CircleDot }, { key: "page-render", label: "Rendu", icon: Layout }, ].map(({ key, label, icon: Icon }) => ( ))}
)} {!isMinimized && (
{sortedLogs.length === 0 ? (

{t("debug.noRequests")}

) : ( sortedLogs.map((log, index) => { const isCurrentPage = isCurrentPageRequest(log); return (
{log.fromCache && (
)} {log.mongoAccess && (
)} {log.pageRender && (
)} {!log.fromCache && !log.mongoAccess && !log.pageRender && (
)} {log.url}
{formatTime(log.timestamp)}
{formatDuration(log.duration)}ms {log.mongoAccess && ( +{formatDuration(log.mongoAccess.duration)}ms )}
{log.mongoAccess && (
)}
); }) )}
)}
); }