import React, { useEffect, useCallback, useState, useMemo, ReactElement } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import WindowLevelHistogram from './WindowLevelHistogram'; import InputRange from '../InputRange'; import InputDoubleRange from '../InputDoubleRange'; import { VOI, Colormap, Histogram, voiPropType, histogramPropType, colormapPropType, } from './types'; const convertVOItoVOIRange = voi => { return { min: voi.windowCenter - voi.windowWidth / 2, max: voi.windowCenter + voi.windowWidth / 2, }; }; const WindowLevel = ({ step = 1, histogram, voi: voiProp, opacity: opacityProp = 1, showOpacitySlider = false, colormap, style = 'polygon', fillColor = '#3f3f3f', lineColor = '#707070', containerClassName, onVOIChange, onOpacityChange, }: { step: number; histogram: Histogram; voi: VOI; opacity: number; showOpacitySlider: boolean; colormap: Colormap; style: string; fillColor: string; lineColor: string; containerClassName: string; onVOIChange: (voi: VOI) => void; onOpacityChange: (opacity: number) => void; }): ReactElement => { const [opacity, setOpacity] = useState(opacityProp); const range = useMemo( () => ({ min: histogram.range.min, max: histogram.range.max, }), [histogram] ); const [voiRange, setVOIRange] = useState( voiProp ? convertVOItoVOIRange(voiProp) : { min: range.min, max: range.max, } ); const handleVOIRangeChange = useCallback( newRange => { if (newRange[0] === voiRange.min && newRange[1] === voiRange.max) { return; } const windowWidth = newRange[1] - newRange[0]; const windowCenter = newRange[0] + windowWidth / 2; setVOIRange({ min: newRange[0], max: newRange[1], }); if (onVOIChange) { onVOIChange({ windowWidth, windowCenter }); } }, [onVOIChange, voiRange] ); const handleOpacityChange = useCallback( value => { if (onOpacityChange) { onOpacityChange(value); } }, [onOpacityChange] ); useEffect(() => setVOIRange(convertVOItoVOIRange(voiProp)), [voiProp]); useEffect(() => setOpacity(opacityProp), [opacityProp]); return (