import type { Spectrum1D } from '@zakodium/nmrium-core';
import { xyIntegral, xyMaxY } from 'ml-spectra-processing';
import { getOpacityBasedOnSignalKind } from '../../../data/utilities/RangeUtilities.js';
import { useChartData } from '../../context/ChartContext.js';
import { useActiveSpectrumRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState.js';
import useIntegralPath from '../../hooks/useIntegralPath.js';
import useSpectrum from '../../hooks/useSpectrum.js';
interface IntegralData {
x: Float64Array;
y: Float64Array;
// eslint-disable-next-line react/no-unused-prop-types
id: string;
from: number;
to: number;
opacity: number;
}
interface IntegralProps extends IntegralData {
max: number;
}
function Integral(props: IntegralProps) {
const { x, y, max, from, to, opacity } = props;
const { integralsScaleRatio } = useActiveSpectrumRangesViewState();
const path = useIntegralPath({
x,
y,
max,
scaleRatio: integralsScaleRatio,
from,
to,
});
return (
);
}
const emptyData = { ranges: {}, info: {}, display: {} };
function RangesIntegrals() {
const {
xDomain: [from, to],
} = useChartData();
const spectrum = useSpectrum(emptyData) as Spectrum1D;
const integrals = useIntegrals();
if (
!spectrum.ranges?.values ||
!spectrum.display.isVisible ||
spectrum.info?.isFid ||
!integrals
) {
return null;
}
return (
{integrals.values.map((integral) => {
return (
);
})}
);
}
function useIntegrals() {
const spectrum = useSpectrum() as Spectrum1D;
const { showIntegrals } = useActiveSpectrumRangesViewState();
if (!spectrum || !showIntegrals) return;
let max = Number.NEGATIVE_INFINITY;
const values: IntegralData[] = [];
const {
data: { x, re },
ranges,
} = spectrum;
for (const range of ranges?.values || []) {
const { from, to, id } = range;
const opacity = getOpacityBasedOnSignalKind(range);
const integral = xyIntegral(
{ x, y: re },
{
from,
to,
reverse: true,
},
);
values.push({ ...integral, id, opacity } as IntegralData);
const value = xyMaxY(integral);
if (value > max) max = value;
}
return { max, values };
}
export default RangesIntegrals;