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