import React, { useRef, useEffect, useState, useCallback } from 'react'; import { useLeva, useZoom, useGlyphRenderer, useConfigs, useKeyboardNavigation } from './hooks'; import { ConfigDisplay, MapContainer, ErrorDisplay, LoadingDisplay, LiveUMAPPanel } from './components'; import { useDebugUMAPStore } from './store'; import './styles/index.css'; /** * Composant principal DebugUMAP - Version refactorisée avec Zustand */ const DebugUMAP = () => { console.log('DebugUMAP: Composant rendu'); const svgRef = useRef(null); const [svgReady, setSvgReady] = useState(false); const [showLivePanel, setShowLivePanel] = useState(true); const error = useDebugUMAPStore((state) => state.error); const loading = useDebugUMAPStore((state) => state.loading); const baseGlyphSize = useDebugUMAPStore((state) => state.baseGlyphSize); const darkMode = useDebugUMAPStore((state) => state.darkMode); const setLiveResult = useDebugUMAPStore((state) => state.setLiveResult); // Hook pour charger les configurations useConfigs(); // Détecter quand le SVG est monté useEffect(() => { if (svgRef.current && !svgReady) { console.log('DebugUMAP: SVG détecté, marqué comme prêt'); setSvgReady(true); } }, [svgReady]); // Hook pour le rendu des glyphes useGlyphRenderer({ svgRef, enabled: svgReady }); // Hook pour le zoom const { resetZoom } = useZoom(svgRef, baseGlyphSize, svgReady, darkMode); // Hook pour Leva useLeva({ onResetZoom: resetZoom }); // Hook pour la navigation au clavier useKeyboardNavigation(); // Gestion du résultat UMAP calculé en direct const handleLiveResult = useCallback((result) => { console.log('✅ Résultat UMAP reçu:', result); setLiveResult(result); }, [setLiveResult]); // États de chargement et d'erreur if (loading) { return ; } if (error) { return ; } return (
{/* Panneau de calcul UMAP en direct */} {showLivePanel && ( )} {/* Bouton pour afficher/masquer le panneau */}
); }; export default DebugUMAP;