import { useState, useMemo } from 'react'; import Plot from 'react-plotly.js'; import { Node, DataWindow } from '../types'; interface SidebarProps { selectedNode: Node | null; dataWindow: DataWindow | null; loading: boolean; sampleRate: number; } type ViewMode = 'waveform' | 'rms'; function Sidebar({ selectedNode, dataWindow, loading, sampleRate }: SidebarProps) { const [viewMode, setViewMode] = useState('waveform'); const [showRaw, setShowRaw] = useState(false); const samples = dataWindow?.samples || []; const startTs = dataWindow?.startTimestamp || 0; // Calcul RMS glissant const rmsData = useMemo(() => { if (samples.length === 0) return []; const windowSize = 20; const result = []; for (let i = 0; i < samples.length; i++) { const start = Math.max(0, i - windowSize); const window = samples.slice(start, i + 1); const rms = Math.sqrt(window.reduce((a, b) => a + b*b, 0) / window.length); result.push(rms); } return result; }, [samples]); // Formatter pour le X (DD hh:mm:ss) const formatXAxis = (ts: number) => { const d = new Date(ts * 1000); const day = d.getDate().toString().padStart(2, '0'); const h = d.getHours().toString().padStart(2, '0'); const m = d.getMinutes().toString().padStart(2, '0'); const s = d.getSeconds().toString().padStart(2, '0'); return `${day} ${h}:${m}:${s}`; }; const xValues = useMemo(() => { return samples.map((_, i) => formatXAxis(startTs + i / sampleRate)); }, [samples, startTs, sampleRate]); const plotData: any[] = []; if (samples.length > 0) { if (viewMode === 'waveform') { plotData.push({ x: xValues, y: samples, type: 'scatter', mode: 'lines', name: 'ADC Brute', line: { color: '#4ade80', width: 1.5 } }); } else { plotData.push({ x: xValues, y: rmsData, type: 'scatter', mode: 'lines', name: 'RMS', line: { color: '#fbbf24', width: 2 } }); } } return ( ); } export default Sidebar;