import type { Signal1D } from '@zakodium/nmr-types'; import type { Spectrum1D } from '@zakodium/nmrium-core'; import { scaleLinear } from 'd3-scale'; import { memo, useMemo } from 'react'; import type { CouplingLink } from '../../../data/data1d/Spectrum1D/generateJGraphData.js'; import generateJGraphData from '../../../data/data1d/Spectrum1D/generateJGraphData.js'; import { useChartData } from '../../context/ChartContext.js'; import { useActiveSpectrumRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState.js'; import { usePanelPreferences } from '../../hooks/usePanelPreferences.js'; import useSpectrum from '../../hooks/useSpectrum.js'; import { useIsInset } from '../inset/InsetProvider.js'; import { JGraphContextProvider } from './JGraphContext.js'; import { JGraphVerticalAxis } from './JGraphVerticalAxis.js'; import JCouplingLinks from './JsCouplingLinks.js'; import JsCouplings from './JsCouplings.js'; const marginTop = 50; interface innerJGraphProps { signals: Signal1D[]; links: CouplingLink[]; } function InnerJGraph(props: innerJGraphProps) { const { signals, links } = props; return ( ); } const MemoizedJGraph = memo(InnerJGraph); export default function JGraph() { const { height, view: { spectra: { activeTab }, }, } = useChartData(); const spectrum = useSpectrum() as Spectrum1D; const { showJGraph } = useActiveSpectrumRangesViewState(); const rangesPreferences = usePanelPreferences('ranges', activeTab); const isInset = useIsInset(); const graphHeight = height / 4; const { signals, jCouplingMax: maxValue, links, } = useMemo( () => generateJGraphData( spectrum?.ranges.values, rangesPreferences.jGraphTolerance, ) || { signals: [], jCouplingMax: 0, links: [], }, [rangesPreferences.jGraphTolerance, spectrum?.ranges.values], ); const scaleY = useMemo(() => { const maxRange = maxValue + maxValue * 0.1; return scaleLinear().range([graphHeight, 0]).domain([0, maxRange]); }, [graphHeight, maxValue]); const JGraphState = useMemo(() => { return { scaleY, height: graphHeight, maxValue }; }, [graphHeight, scaleY, maxValue]); if (!showJGraph || !spectrum?.display?.isVisible || isInset) return null; return ( ); }