import type { JpathLegendField, LegendField, PredefinedLegendField, Spectrum1D, Spectrum, } from '@zakodium/nmrium-core'; import dlv from 'dlv'; import { xFindClosestIndex } from 'ml-spectra-processing'; import type { CSSProperties } from 'react'; import { get1DDataXY } from '../../data/data1d/Spectrum1D/index.js'; import { useMouseTracker } from '../EventsTrackers/MouseTracker.js'; import { useChartData } from '../context/ChartContext.js'; import { useScale } from '../context/ScaleContext.js'; import { SVGGroup } from '../elements/SVGGroup.js'; import { useActiveSpectra } from '../hooks/useActiveSpectra.js'; import { usePanelPreferences } from '../hooks/usePanelPreferences.js'; import { convertPathArrayToString } from '../utility/convertPathArrayToString.js'; import { useIsInset } from './inset/InsetProvider.js'; const styles: Record<'text' | 'colorIndicator', CSSProperties> = { text: { fontSize: '12px', fill: 'black', }, colorIndicator: { width: '10px', height: '2px', }, }; interface YTrackerProps { datum: { x: Float64Array; y: Float64Array; }; } function YTracker({ datum }: YTrackerProps) { const { scaleX } = useScale(); const position = useMouseTracker(); if (!scaleX || !position) { return null; } const xIndex = xFindClosestIndex(datum.x, scaleX().invert(position.x)); return ( {datum.y[xIndex]} ); } interface InnerSpectraLegendsProps { spectra: Spectrum[]; legendsFields: LegendField[]; } function InnerSpectraLegends({ spectra, legendsFields, }: InnerSpectraLegendsProps) { const visibleLegendsFields = legendsFields.filter((legend) => legend.visible); return ( {spectra.map((spectrum, index) => ( {visibleLegendsFields.map((field) => { const { name } = field as PredefinedLegendField; switch (name) { case 'intensity': return ( ); case 'name': return ( {spectrum.info.name} ); default: { const jpath = (field as JpathLegendField).jpath; const value = dlv(spectrum, jpath, ''); return ( {value} ); } } })} ))} ); } function SpectraLegends() { const { data, view: { spectra: { activeTab, showLegend }, }, xDomains, } = useChartData(); const isInset = useIsInset(); const { legendsFields } = usePanelPreferences( 'multipleSpectraAnalysis', activeTab, ); const selectedSpectra = useActiveSpectra() || []; const selectedSpectraIDs = new Set( selectedSpectra.map((spectrum) => spectrum.id), ); if (!showLegend || isInset) return null; const spectra = data.filter( (spectrum) => spectrum.display.isVisible && xDomains[spectrum.id] && spectrum.info.nucleus === activeTab && (selectedSpectraIDs.size === 0 || selectedSpectraIDs.has(spectrum.id)), ); return ( ); } export default SpectraLegends;