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;