File size: 2,901 Bytes
b700c24
2fc4361
b700c24
6bda4a6
 
 
 
 
 
 
 
 
 
b700c24
6bda4a6
 
 
 
 
b700c24
6bda4a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b700c24
 
 
 
 
6bda4a6
 
 
 
 
 
 
 
 
 
 
 
 
 
b700c24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6bda4a6
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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 <LoadingDisplay />;
  }

  if (error) {
    return <ErrorDisplay error={error} />;
  }

  return (
    <div className={`debug-umap-container ${darkMode ? 'dark-mode' : ''}`}>
      <ConfigDisplay />
      <MapContainer ref={svgRef} />

      {/* Panneau de calcul UMAP en direct */}
      {showLivePanel && (
        <LiveUMAPPanel onResult={handleLiveResult} />
      )}

      {/* Bouton pour afficher/masquer le panneau */}
      <button
        onClick={() => setShowLivePanel(!showLivePanel)}
        style={{
          position: 'fixed',
          bottom: '20px',
          right: '20px',
          padding: '12px 20px',
          background: '#4CAF50',
          color: 'white',
          border: 'none',
          borderRadius: '6px',
          cursor: 'pointer',
          fontSize: '14px',
          fontWeight: '600',
          zIndex: 10001,
          boxShadow: '0 2px 8px rgba(0,0,0,0.2)'
        }}
      >
        {showLivePanel ? '🙈 Hide Live UMAP' : '🧪 Show Live UMAP'}
      </button>
    </div>
  );
};

export default DebugUMAP;